代數余子式和伴隨矩陣

2022-09-19 17:51:09 字數 3933 閱讀 1404

入門之後的一篇文章。

啊啊啊這玩意學了我一整天!這什麼菜狗啊!

在 \(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矩陣為例,對行列式的求法如下 整個求解思想就是盡量將矩陣化為對角矩陣,每次取一行,逐漸化簡矩陣,在化簡過程中,有很多矩陣出現零行或零列,行...