行列式入门

定义

这是一个函数,符号为 d e t det det,施加于大小为 n × n n\times n n×n 的矩阵。

计算方式

首先,我们定义 τ \tau τ 表示一个数列的逆序数(在 O I OI OI 界咱们一般叫逆序对数),比如 τ ( 3 , 1 , 2 ) = 2 \tau(3,1,2)=2 τ(3,1,2)=2

而行列式的计算方式就是:从矩阵中拿出 n n n 个元素,要求他们都在不同的行和列上(换句话说,每行取一个元素,要求任意两个元素不在同一列上),然后它们的贡献就是 ( − 1 ) τ (-1)^\tau (1)τ(每个元素所在的列) × \times × 元素乘积之和。

要注意的是,每个元素所在的列是按照其所在行排序的。比如说,有三个元素,位置分别为 ( 1 , 2 ) , ( 2 , 3 ) , ( 3 , 1 ) (1,2),(2,3),(3,1) (1,2),(2,3),(3,1),那么将它们所在的列按行排序就是 2 , 3 , 1 2,3,1 2,3,1

然后将所有情况的贡献加起来,就得到了行列式的值。

举个栗子,对于这样一个矩阵,求它的行列式就是:
det ⁡ ∣ 1 0 2 0 3 0 2 0 1 ∣ = ( − 1 ) τ ( 1 , 2 , 3 ) × 1 × 3 × 1 + ( − 1 ) τ ( 3 , 2 , 1 ) × 2 × 3 × 2 = 3 − 12 = − 9 \det\left| \begin{matrix} 1 & 0 & 2\\ 0 & 3 & 0\\ 2 & 0 & 1 \end{matrix} \right|=(-1)^{\tau(1,2,3)}\times 1 \times 3 \times 1+(-1)^{\tau(3,2,1)}\times 2 \times 3 \times 2\\ =3-12=-9 det102030201=(1)τ(1,2,3)×1×3×1+(1)τ(3,2,1)×2×3×2=312=9

写成数学柿子就是: det ⁡ ( A ) = ∑ j 1 ≠ j 2 ≠ . . . ≠ j n ( − 1 ) τ ( j 1 , j 2 , . . . , j n ) × a 1 , j 1 × a 2 , j 2 × . . . × a n , j n \det(A)=\sum_{j_1\ne j_2\ne...\ne j_n} (-1)^{\tau(j_1,j_2,...,j_n)}\times a_{1,j_1} \times a_{2,j_2}\times ... \times a_{n,j_n} det(A)=j1=j2=...=jn(1)τ(j1,j2,...,jn)×a1,j1×a2,j2×...×an,jn

可能不太标准?能看就行了qwq

行列式的性质

性质1

交换任意两行会使得行列式的值变成相反数。

设原矩阵为 A A A,里面的元素记为 a i , j a_{i,j} ai,j

假设交换了第 i i i 行和第 k k k 行,设交换后的矩阵为 A ′ A' A,里面的元素记为 a i , j ′ a'_{i,j} ai,j。(下面一定要区分开 A , a i , j A,a_{i,j} A,ai,j A ′ , a i , j ′ A',a'_{i,j} A,ai,j,另外说一句, a i , j ′ a'_{i,j} ai,j 下面没用到……只是为了做个区分qwq)

没交换时,柿子就像上面那样:

det ⁡ ( A ) = ∑ j 1 ≠ j 2 ≠ . . . ≠ j n ( − 1 ) τ ( . . . , j i , . . . , j k , . . . ) × a 1 , j 1 × . . . × a i , j i × . . . × a k , j k × . . . \det(A)=\sum_{j_1\ne j_2\ne...\ne j_n} (-1)^{\tau(...,j_i,...,j_k,...)}\times a_{1,j_1} \times ... \times a_{i,j_i} \times ... \times a_{k,j_k} \times ... det(A)=j1=j2=...=jn(1)τ(...,ji,...,jk,...)×a1,j1×...×ai,ji×...×ak,jk×...

交换后,柿子变成:

det ⁡ ( A ′ ) = ∑ j 1 ≠ j 2 ≠ . . . ≠ j n ( − 1 ) τ ( . . . , j i , . . . , j k , . . . ) × a 1 , j 1 × . . . × \det(A')=\sum_{j_1\ne j_2\ne...\ne j_n} (-1)^{\tau(...,j_i,...,j_k,...)}\times a_{1,j_1} \times ... \times det(A)=j1=j2=...=jn(1)τ(...,ji,...,jk,...)×a1,j1×...× a k , j i a_{k,j_i} ak,ji × . . . × \times ... \times ×...× a i , j k a_{i,j_k} ai,jk × . . . \times ... ×...

这其实等价于:

det ⁡ ( A ′ ) = ∑ j 1 ≠ j 2 ≠ . . . ≠ j n ( − 1 ) τ ( . . . , \det(A')=\sum_{j_1\ne j_2\ne...\ne j_n} (-1)^{\tau(...,} det(A)=j1=j2=...=jn(1)τ(..., j k ^{j_k} jk , . . . , ^{,...,} ,..., j i ^{j_i} ji , . . . ) × a 1 , j 1 × . . . × a i , j i × . . . × a k , j k × . . . ^{,...)}\times a_{1,j_1} \times ... \times a_{i,j_i} \times ... \times a_{k,j_k} \times ... ,...)×a1,j1×...×ai,ji×...×ak,jk×...

接下来看一下 j i j_i ji j k j_k jk 的位置调换会引发什么:

设他们之间(不包括 i , k i,k i,k)有 N N N 个元素,其中有 x x x 个比 j i j_i ji 小,有 y y y 个比 j k j_k jk 大。

如果只看与 j i j_i ji j k j_k jk 相关的逆序对,调换前 τ ( j i , . . .   , j k ) = x + y \tau(j_i,...~,j_k)=x+y τ(ji,... ,jk)=x+y,调换后 τ ( j k , . . .   , j i ) = 2 N − x − y \tau(j_k,...~,j_i)=2N-x-y τ(jk,... ,ji)=2Nxy,变化量为 2 N − 2 x − 2 y 2N-2x-2y 2N2x2y,另外,交换这两个元素肯定会使得逆序数 + 1 +1 +1 − 1 -1 1,所以变化量为 2 N − 2 x − 2 y ± 1 2N-2x-2y\pm1 2N2x2y±1,是个奇数,而 − 1 -1 1 的指数加上一个奇数的话,就相当于变成原来的相反数了。

性质2

同一行的元素的公因数可以提出来。

像这样:
det ⁡ ∣ a 1 , 1 a 1 , 2 ⋯ a 1 , n a 2 , 1 a 2 , 2 ⋯ a 2 , n ⋮ ⋯ ⋱ ⋮ a i , 1 × x a i , 2 × x ⋯ a i , n × x ⋮ ⋯ ⋱ ⋮ a n , 1 a n , 2 ⋯ a n , n ∣ = x × det ⁡ ∣ a 1 , 1 a 1 , 2 ⋯ a 1 , n a 2 , 1 a 2 , 2 ⋯ a 2 , n ⋮ ⋯ ⋱ ⋮ a i , 1 a i , 2 ⋯ a i , n ⋮ ⋯ ⋱ ⋮ a n , 1 a n , 2 ⋯ a n , n ∣ \det\left| \begin{matrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{i,1}\times x & a_{i,2} \times x & \cdots & a_{i,n}\times x\\ \vdots & \cdots & \ddots & \vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}\\ \end{matrix} \right|=x\times \det \left| \begin{matrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{i,1} & a_{i,2} & \cdots & a_{i,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}\\ \end{matrix} \right| deta1,1a2,1ai,1×xan,1a1,2a2,2ai,2×xan,2a1,na2,nai,n×xan,n=x×deta1,1a2,1ai,1an,1a1,2a2,2ai,2an,2a1,na2,nai,nan,n

就是简单的结合律,不证明了。

性质3

如果一个矩阵有两行相同,那么行列式的值为 0 0 0

证明很简单,设原矩阵为 A A A,交换相同的两行后的矩阵为 A ′ A' A,那么有 det ⁡ ( A ) = − det ⁡ ( A ′ ) \det(A)=-\det(A') det(A)=det(A),因为 A = A ′ A=A' A=A,所以 det ⁡ ( A ) = 0 \det(A)=0 det(A)=0

性质4

这个懒得描述了……直接上公式:
det ⁡ ∣ a 1 , 1 a 1 , 2 ⋯ a 1 , n a 2 , 1 a 2 , 2 ⋯ a 2 , n ⋮ ⋯ ⋱ ⋮ a i , 1 + b 1 a i , 2 + b 2 ⋯ a i , n + b n ⋮ ⋯ ⋱ ⋮ a n , 1 a n , 2 ⋯ a n , n ∣ = det ⁡ ∣ a 1 , 1 a 1 , 2 ⋯ a 1 , n a 2 , 1 a 2 , 2 ⋯ a 2 , n ⋮ ⋯ ⋱ ⋮ a i , 1 a i , 2 ⋯ a i , n ⋮ ⋯ ⋱ ⋮ a n , 1 a n , 2 ⋯ a n , n ∣ + det ⁡ ∣ a 1 , 1 a 1 , 2 ⋯ a 1 , n a 2 , 1 a 2 , 2 ⋯ a 2 , n ⋮ ⋯ ⋱ ⋮ b 1 b 2 ⋯ b n ⋮ ⋯ ⋱ ⋮ a n , 1 a n , 2 ⋯ a n , n ∣ \det\left| \begin{matrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{i,1}+b_1 & a_{i,2}+b_2 & \cdots & a_{i,n}+b_n\\ \vdots & \cdots & \ddots & \vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}\\ \end{matrix} \right|= \det\left| \begin{matrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{i,1} & a_{i,2} & \cdots & a_{i,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}\\ \end{matrix} \right|+ \det\left| \begin{matrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}\\ \vdots & \cdots & \ddots & \vdots\\ b_1 & b_2 & \cdots & b_n\\ \vdots & \cdots & \ddots & \vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}\\ \end{matrix} \right| deta1,1a2,1ai,1+b1an,1a1,2a2,2ai,2+b2an,2a1,na2,nai,n+bnan,n=deta1,1a2,1ai,1an,1a1,2a2,2ai,2an,2a1,na2,nai,nan,n+deta1,1a2,1b1an,1a1,2a2,2b2an,2a1,na2,nbnan,n

简单的分配律,也不证明了。

性质5

将矩阵的某一行加上另外一行乘以某个倍数的积,行列式的值不变。

证明的话结合上面的性质也很容易得出:
det ⁡ ∣ a 1 , 1 a 1 , 2 ⋯ a 1 , n a 2 , 1 a 2 , 2 ⋯ a 2 , n ⋮ ⋯ ⋱ ⋮ a i , 1 + a j , 1 × x a i , 2 + a j , 2 × x ⋯ a i , n + a j , n × x ⋮ ⋯ ⋱ ⋮ a n , 1 a n , 2 ⋯ a n , n ∣ = det ⁡ ∣ a 1 , 1 a 1 , 2 ⋯ a 1 , n a 2 , 1 a 2 , 2 ⋯ a 2 , n ⋮ ⋯ ⋱ ⋮ a i , 1 a i , 2 ⋯ a i , n ⋮ ⋯ ⋱ ⋮ a n , 1 a n , 2 ⋯ a n , n ∣ + det ⁡ ∣ a 1 , 1 a 1 , 2 ⋯ a 1 , n a 2 , 1 a 2 , 2 ⋯ a 2 , n ⋮ ⋯ ⋱ ⋮ a j , 1 × x a j , 2 × x ⋯ a j , n × x ⋮ ⋯ ⋱ ⋮ a n , 1 a n , 2 ⋯ a n , n ∣ = det ⁡ ∣ a 1 , 1 a 1 , 2 ⋯ a 1 , n a 2 , 1 a 2 , 2 ⋯ a 2 , n ⋮ ⋯ ⋱ ⋮ a i , 1 a i , 2 ⋯ a i , n ⋮ ⋯ ⋱ ⋮ a n , 1 a n , 2 ⋯ a n , n ∣ + x × det ⁡ ∣ a 1 , 1 a 1 , 2 ⋯ a 1 , n a 2 , 1 a 2 , 2 ⋯ a 2 , n ⋮ ⋯ ⋱ ⋮ a j , 1 a j , 2 ⋯ a j , n ⋮ ⋯ ⋱ ⋮ a n , 1 a n , 2 ⋯ a n , n ∣ = det ⁡ ∣ a 1 , 1 a 1 , 2 ⋯ a 1 , n a 2 , 1 a 2 , 2 ⋯ a 2 , n ⋮ ⋯ ⋱ ⋮ a i , 1 a i , 2 ⋯ a i , n ⋮ ⋯ ⋱ ⋮ a n , 1 a n , 2 ⋯ a n , n ∣ \det\left| \begin{matrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{i,1}+a_{j,1}\times x & a_{i,2}+a_{j,2}\times x & \cdots & a_{i,n}+a_{j,n}\times x\\ \vdots & \cdots & \ddots & \vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}\\ \end{matrix} \right|=\\ \det\left| \begin{matrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{i,1} & a_{i,2} & \cdots & a_{i,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}\\ \end{matrix} \right|+ \det\left| \begin{matrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{j,1}\times x & a_{j,2}\times x & \cdots & a_{j,n}\times x\\ \vdots & \cdots & \ddots & \vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}\\ \end{matrix} \right|=\\ \det\left| \begin{matrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{i,1} & a_{i,2} & \cdots & a_{i,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}\\ \end{matrix} \right|+ x\times\det\left| \begin{matrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{j,1} & a_{j,2} & \cdots & a_{j,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}\\ \end{matrix} \right|=\det\left| \begin{matrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{i,1} & a_{i,2} & \cdots & a_{i,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}\\ \end{matrix} \right| deta1,1a2,1ai,1+aj,1×xan,1a1,2a2,2ai,2+aj,2×xan,2a1,na2,nai,n+aj,n×xan,n=deta1,1a2,1ai,1an,1a1,2a2,2ai,2an,2a1,na2,nai,nan,n+deta1,1a2,1aj,1×xan,1a1,2a2,2aj,2×xan,2a1,na2,naj,n×xan,n=deta1,1a2,1ai,1an,1a1,2a2,2ai,2an,2a1,na2,nai,nan,n+x×deta1,1a2,1aj,1an,1a1,2a2,2aj,2an,2a1,na2,naj,nan,n=deta1,1a2,1ai,1an,1a1,2a2,2ai,2an,2a1,na2,nai,nan,n

求解

如果暴力按照上面的那条柿子来求解,时间绝对爆炸,我们需要一点小技巧,将时间优化到稳定的 O ( n 3 ) O(n^3) O(n3)

具体的操作就是:将矩阵转化为上三角矩阵,这样我们只需要将其主对角线上的元素乘起来就好了。

具体的转化方式我们可以参照高斯消元法,先让每一行减去第一行乘以某个倍数,使得每一行的第一个数变成 0 0 0,然后让第二行对下面的行做同样的事情,让他们的第二列变成 0 0 0,以此类推即可(如果看不懂,建议先学高斯消元 不对,你连高斯消元都不会学个毛线行列式??)。

根据性质 5 5 5,我们这样消元是不会导致这个矩阵的行列式改变的。

当然,这样会面临一个问题,有些元素会变成小数,而在很多题目中我们并不能接受小数。

于是接下来用到高端的辗转相除法来帮助消元,比如说现在处理到第 i i i 行,要用这一行的第 i i i 个元素消去第 j j j 行的第 i i i 个元素,我们分别记为 A , B A,B A,B,原本的操作是 B B B 减去 A × B A A \times \frac B A A×AB,现在改一下,像辗转相除一样,使他们变为 A , B   m o d   A A,B \bmod A A,BmodA,具体也就是让 B B B 减去 ⌊ B A ⌋ × A \lfloor \frac B A \rfloor \times A AB×A,然后交换 i , j i,j i,j 两行,重复这个操作,直到有一个变成了 0 0 0

代码如下:

int det(int l)
{
	int ans=1,fu=1;
	for(int i=1;i<=l;i++)
	{
		for(int j=i+1;j<=l;j++)
		while(f[j][i])
		{
			int p=f[i][i]/f[j][i];
			for(int k=i;k<=l;k++)
			f[i][k]=(1ll*f[i][k]-1ll*p*f[j][k]%mod+mod)%mod;
			swap(f[i],f[j]);
			fu=-fu;//每次交换两行之后行列式的值变为相反数
		}
		if(!f[i][i])return 0;
		ans=1ll*ans*f[i][i]%mod;//将对角线乘起来
	}
	ans=(1ll*ans*fu+mod)%mod;
	return ans;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值