入門之後的一篇文章。
啊啊啊這玩意學了我一整天!這什麼菜狗啊!
在 \(n\) 階方陣 \(a=(a_)\) 中,刪去第 \(i\) 行和第 \(j\) 列後所留下的方陣的行列式稱為 \(a_\) 的余子式\(m_\),而 \(a_\) 的代數余子式為 \(a_=(-1)^m_.\)
代數余子式可以用來算行列式:
真不是因為我懶,主要是這個矩陣我不太會用 markdown 畫出來。懶得搜還不是懶
首先我們用高斯消元計算 \(a\) 的 rank,然後分情況討論。
有這樣乙個公式:\(aa^=|a|i\),那麼可得 \(a^=|a|a^\)。
我們試著感性證明一波 \(aa^=|a|i\)
首先我們根據左行乘右列,當左邊的行序數和右邊的列序數相等時,由一、代數余子式
中的公式可知算出來就是 \(|a|\)。
那麼不相等的時候呢?相當於算的是:\(\sum_^n a_a_(i\not=r)\),相當於計算將最初的方陣 \(a\) 的第 \(i\) 行換為第 \(r\) 行的方陣後,計算它的行列式,由於有兩行相等,\(a\) 不滿秩,行列式為 0,所以上面那個式子算出來就是 0。
顯然此時刪掉一行一列之後仍然不滿秩,所以 \(a^*=o,\operatorname(a^)=0\)。
麻煩的來了。
首先由 \(\operatorname(a)=n-1\) 可知 \(\dim\ker(a)=1\)。於是存在非零行向量和列向量 \(p,q\) 使得 \(pa=0,aq=0\),\(p,q\) 可以高斯消元求出。(這裡有點類似於高中數學求平面的法向量)
由於行列最後得出的結論類似,所以我們這裡只以列為例講解。
\(aq=0,\dim\ker(a)=1,\operatorname(a^*)=1\)
可得 \(a*\) 的每一行都是第一行的若干倍數,又因為 \(\operatorname(a),所以 \(|a|=0\)。
\(|a|=a_a_+a_a_+...+a_a_=0\)
\(a_q_1+a_q_2+...+a_q_n=0\)
由 \(\dim\ker(a)=1\) 可知 \(\frac}=\frac}=...=\frac}\)。(當然這裡如果有0就不能寫成分式形式,但是為了美觀還是這麼寫)
那麼行的結論同理可得:\(\frac}=\frac}=...=\frac}\)
所以為了求出所有的 \(a_\),我們需要找到 \(r,c\) 使得 \(p_r,q_c\not=0\),那麼可得 \(a_=\fracq_}}a_\),至於 \(a_\) 直接暴力 \(o(n^3)\) 求即可。
題目大意:求方陣的余子式。
vjudge
openjudge
差點就拿ddg的**開拍了
//12252024832524
#include #define tt templateusing namespace std;
typedef long long ll;
const int maxn = 200;
const int mod = 998244353;
int n;
ll read()
while(c >= '0' && c <= '9')
return x * f;
}tt void put1(t x)
tt void put(t x,char c = -1)
tt t max(t x,t y)
tt t min(t x,t y)
tt t abs(t x)
int qpow(int x,int y)
return ret;
}int tmp[maxn][maxn];
struct matrix
void get(int x)
void print()
void add(int r1,int r2,int k)
void mul(int r,int k)
void mul(int k)
void trans()
matrix transnd()
int det(bool ri = 1)//whether ruin the previous one
if(!a[i][i])
for(int j = i+1;j < n;++ j)
if(a[j][i])
ret = 1ll * ret * a[i][i] % mod;
} if(!ri) for(int i = 0;i < n;++ i) for(int j = 0;j < n;++ j) a[i][j] = tmp[i][j];
return (ret+mod)%mod; }
int rank(bool ri = 1)
if(!a[i][i])
for(int j = i+1;j < n;++ j)
if(a[j][i])
} if(!ri) for(int i = 0;i < n;++ i) for(int j = 0;j < n;++ j) a[i][j] = tmp[i][j];
return ret; }
matrix inv(bool ri = 1)
if(!a[i][i]) break;//impossible
for(int j = 0;j < n;++ j)
if((i^j) && a[j][i])
} for(int i = 0;i < n;++ i) ret.mul(i,qpow(a[i][i],mod-2));//a[i][i] = 1;
if(!ri) for(int i = 0;i < n;++ i) for(int j = 0;j < n;++ j) a[i][j] = tmp[i][j];
return ret; }
matrix getq(bool ri = 1)//aq = 0, to get q
if(!a[i][i])
break;
}for(int j = i+1;j < n;++ j)
if(a[j][i])
} if(!ri) for(int i = 0;i < n;++ i) for(int j = 0;j < n;++ j) a[i][j] = tmp[i][j];
return ret; }
matrix del(int r,int c)//delete row r & column c
}a,b,p,q;
int main()
else if(rk < n-1)
else
for(int i = 0;i < n;++ i) if(q.a[i][0])
b.n = n;
b.a[r][c] = ((r+c) & 1 ? mod-1ll : 1) * a.del(r,c).det() % mod;
int iv = 1ll * qpow(p.a[0][r],mod-2) * qpow(q.a[c][0],mod-2) % mod;
for(int i = 0;i < n;++ i)
for(int j = 0;j < n;++ j)
b.a[i][j] = 1ll * iv * p.a[0][i] % mod * q.a[j][0] % mod * b.a[r][c] % mod;
} for(int i = 0;i < n;++ i)
for(int j = 0;j < n;++ j)
put((b.a[i][j] * ((i+j) & 1 ? -1 : 1) + mod) % mod,j == (n-1) ? '\n' : ' ');
putchar('\n');
} return (0-0);
}
用余子式 代數余子式和伴隨 來求逆矩陣
注意 也去看看 用行運算來求逆矩陣 和 矩陣計算器。我們可以這樣去求逆矩陣 最好是用例項來解釋!要做四步。全都是簡單的算術,但有很多計算,所以要小心,不要犯錯!第一步是造乙個 余子式矩陣 這步有最多計算。為矩陣的每個元素 把行列式的結果放進乙個矩陣 余子式矩陣 2 2 矩陣 2行和2列 的行列式很容...
1 2線性代數之行列式,余子式及代數余子式
行列式的樣子?行列式通常用豎線來表示 或者det a 求行列式a的a23的余子式 通常用m來表示余子式 也就是去掉指定位置的行和列的小行列式,結果就是余子式.求行列式a的a23的代數余子式 通常用a來表示余子式 a23 1 的 行 列 次方 m2 行列式只是乙個數,是一組數按一定規則進行代數運算的值...
行列式公式和代數余子式
前一篇介紹了行列式 determinant 的10個性質,且簡單闡述了如何用消元法求行列式。今天簡單介紹求解行列式的2個一般公式,先看第乙個公式,以最簡單的2 2矩陣為例,對行列式的求法如下 整個求解思想就是盡量將矩陣化為對角矩陣,每次取一行,逐漸化簡矩陣,在化簡過程中,有很多矩陣出現零行或零列,行...