行列式学习笔记
前置知识
部分内容摘自 OI-Wiki
排列
由
如果排列的逆序对个数是奇数,那么这是一个奇排列;如果排列的逆序对个数是偶数,那么这是一个偶排列。
置换
一个有限集合 的一个置换。集合
其中
对换
把
性质
- 一个排列一定能通过若干次对换转换成另一个排列。
- 一次对换会改变排列的奇偶性。
矩阵行列式
定义
对于一个矩阵:
其中,
性质
部分内容摘自 数学(5)——线性代数:行列式 - 洛谷专栏 (luogu.com.cn)。
转置矩阵行列式不变(1)
矩阵
原因是排列
交换矩阵的两行(列),行列式取反(2)
原因是对原先枚举的排列
对于列的证明,因为转置矩阵行列式不变,所以证明了行的性质也就证明了列的性质。
矩阵一行(列)所有元素同乘一个数,行列式也乘以这个数(3)
表示为
如果矩阵 中某一行是(列)矩阵 和矩阵 中对应行(列)的所有元素之和,那么 (4)
表示为
如果矩阵中某两行(列)成比例,那么其行列式为 (5)
表示为
可以这样理解:把上面的第
矩阵中一行(列)每个元素减去另一行(列)对应元素的若干倍,行列式不变(6)
表示为
利用性质(4):
最右边的矩阵第
上三角矩阵行列式为对角线的乘积(7)
其中上三角矩阵中指的是,只有在
可以根据行列式的定义理解,只有当所有
同样,对于只有在
计算
利用性质(6),可以把矩阵像高斯消元一样转换成上三角矩阵,然后根据性质(7)求值。
当模数为质数的时候可以直接高斯消元:
点击开 D
for(i=1;i<=n;++i) {
if(!a[i][i]) {
for(j=i+1;j<=n;++j) if(a[j][i]) { k=i; break; }
flag^=1,swap(a[i],a[k]);
}
Mul(ans,a[i][i]);
inver=inv(a[i][i]);
for(j=i+1;j<=n;++j) {
muler=mul(inver,a[j][i]);
for(k=i;k<=n;++k)
Sub(a[j][k],mul(a[i][k],muler));
}
}
if(flag) Mul(ans,moder-1);
但是当模数不是质数的时候,可能会出现
点击开 D
for(i=1;i<=n;++i) {
if(!a[i][i]) {
for(j=i+1;j<=n;++j) if(a[j][i]) { k=i; break; }
flag^=1,swap(a[k],a[i]);
}
for(j=i+1;j<=n;++j) {
if(a[i][i]>a[j][i])
flag^=1,swap(a[j],a[i]);
while(a[j][i]) {
flag^=1,swap(a[j],a[i]);
muler=moder-a[j][i]/a[i][i];
for(k=i;k<=n;++k)
a[j][k]=(a[j][k]+muler*a[i][k])%moder;
}
}
ans=ans*a[i][i]%moder;
}
if(flag) ans=(moder-ans)%moder;
<\details>
时间复杂度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示