行列式学习笔记(二)

上期回顾

上次介绍了行列式的基本性质,我们继续探索由性质得出的有用结论(以二阶行列式为基准)。

结论一#

如果行列式两行相同,则行列式的值是 0
证明:

|abcd|=|cdab||abab|=|abab|=0

结论二#

如果有一行是 0 则行列式值是 0
证明:
我们假设第一行是 0

|kakbcd|=k|abcd||00cd|=|0×a0×bcd|=0×|abcd|=0

结论三#

如果一行是另一行的 k 倍,则答案为 0
证明:
我们假设第一行是第二行的 k 倍。

det(A)=|kakbab|=k|abab|

由结论一可知:

|abab|=0det(A)=k|abab|=0

结论四#

如果某一行是其他行的线性组合,行列式的值是 0
证明:

det(A)=|abcdefk1a+k2dk1b+k2ek1c+k2f|=|abcdefk1ak1bk1c|+|abcdefk2dk2ek2f|=0+0=0

计算行列式#

先来介绍一个很好的性质。

一个行列式的一行加(减)另一行的 k 倍,行列式的值不变。

用数学公式表达:

|abcdefghi|=|abcdefgkahkbikc|

证明一下:

det(A)=|abcdefgkahkbikc|=|abcdefghi||abcdefkakbkc|=|abcdefghi|

直接对行列式进行 GaussJordan 消元。
之后矩阵变成这样的一个存在,也就是对角矩阵。

det(A)=|a1000a2000an|

考虑对角矩阵的行列式求法。

det(A)=|a1000a2000an|=a1×|1000a2000an|=a1a2×|10001000an|=a1a2a3an1an×|100010001|=a1a2a3an1an=i=1nai

进一步的,我们推广到上三角矩阵以及下三角矩阵
发现这样的情况:

我们定义对角线的值为 a1,a2,,an1,an
那么,行列式的值都是

i=1nai

所以不需要 GaussJordan 直接 Gauss 就可以啦!

Code#

#include <bits/stdc++.h>

#define file(a) freopen(a".in", "r", stdin), freopen(a".out", "w", stdout)

#define quad putchar(' ')
#define Enter putchar('\n')

#define int long long 
#define N 605

int n, mod, a[N][N], flag = 1;

signed main(void) {
//  file("P7112");
  std::cin >> n >> mod;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++)
      scanf("%lld", &a[i][j]);
  for (int i = 1; i <= n; i++) {
    for (int j = i + 1; j <= n; j++) {
      while (a[i][i]) {
        int x = a[j][i] / a[i][i];
        for (int k = i; k <= n; k++)
          a[j][k] = (a[j][k] - x * a[i][k] % mod + mod) % mod;
        std::swap(a[j], a[i]);
        flag *= (-1);
      }a
      std::swap(a[i], a[j]);
      flag *= -1;
    }
  }
  int ans = 1;
  for (int i = 1; i <= n; i++)
    ans = (ans * a[i][i]) % mod;
   std::cout << (ans * flag + mod) % mod<< std::endl; 
}

作者:Aonynation

出处:https://www.cnblogs.com/Oier-GGG/p/16105177.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Aonynation  阅读(201)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示