行列式:
行列式在數學中,是一個
函數,其定義域為det的矩陣A,取值為一個
標量,寫作det(A)或 | A | 。無論是在
線性代數、
多項式理論,還是在
微積分學中(比如說
換元積分法中),行列式作為基本的數學工具,都有着重要的應用。
——來自百度百科
舉個例子,這樣一個行列式,n=3:
它的值為1*5*0 + 4*8*3 + 7*2*6 -7*5*3 - 8*6*1 -0*4*2=27.
下面的才是重點,高斯消元要用的行列式的性質:
-
行列式與它的轉置行列式相等
比如上例的轉置行列式就這:
顯然。不證。
-
交換行列式的兩行,行列式取相反數
這個就是高斯消元的重點之一了,每次轉換相鄰兩行,值相應地取相反數。
因為轉換后順逆序會相反。既然相反就求相反數嘍。
-
行列式的某一行的所有元素都乘以同一數k,等於用數k乘此行列式
注意是只乘一行而不是全部。因為這一行的數字在每個項都出現提出來就行了。
-
行列式如果有兩行元素成比例,則此行列式等於零
很神奇,要用到上面兩個性質:
記f[i]=f[j]*k,那么行列式的值就等於轉換后的行列式*k,交換f[i]和f[j]該行列式等於相反數,但顯然值不變,所以它=0,0*k=0,得證。
-
把行列式的某一行的各元素乘以同一數然后加到另一行對應的元素上去,行列式不變
高斯消元的重點。
-
若行列式的某一行每一個元素都可以由兩個數相加得到,則這個行列式是對應兩個行列式的和。
舉個例子:
這個性質由乘法分配律可以容易得出,自行腦補。
高斯消元(Gauss)求行列式
高斯消元只需要上述強調過的兩個性質。
它把行列式下三角全變為0.依據性質,我們知道此時行列式的值就是對角線的積。
int Gauss() { double t; double ans; for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { t=f[i][i]/f[i][j]; for(int k=i;k<=m+1;k++) f[i][k]-=f[j][k]*t; swap(f[i],f[j]); ans*=-1; } }
for(int i=1;i<=n;i++)ans*=f[i][i]; return (int)(ans+0.5); }
我們發現,如果行列式要遍歷的行本來就是0,我們直接跳過就行了不用再遍歷;
int Gauss1() { for(int i=1;i<=n;i++){ int p=i; while(!f[p][i] and p<=n)p++; if(p>=n+1)return 0; if(p!=i)swap(f[i],f[p]); for(int j=i+1;j<=n;j++) { double tmp=f[j][i]/f[i][i]; for(int k=i;k<=n;k++) f[j][k]-=f[i][k]*tmp; } } double ans=1; for(int i=1;i<=n;i++) ans*=f[i][i]; return (int)(ans+0.5); }