線性代數基礎
煎蛋的東西不再贅述。
\(n\) 個向量,若存在向量能被其他向量線性表示,則稱這些向量線性相關,否則線性無關。
矩陣的行秩,將矩陣看成若干個行向量,從這些向量中選取儘可能多的向量滿足這些向量線性無關,選取的個數 \(k\) 即為矩陣的秩。
矩陣的列秩同理,一般來說,矩陣的秩預設為行秩。
行列式常用定理
定義:對一個 \(n\times n\) 的矩陣 \(A\),其 \(n\) 階行列式寫作 \(det(A)\)。
\(p\) 為所有可能的排列,\(\tau(p)\) 表示一個排列 \(p\) 的逆序對個數。
定理一:\(det(^{t}A)=det(A)\),即矩陣轉置後值不變。
證明:考慮對於原來的每個排列 \(p\) ,在轉置後對應的 \(a_{i,p_i}\) 變成 \(a_{p_i,i}\),只需證明兩者的逆序對個數相同。
那麼考慮如果存在兩個下標 \(i,j\) 滿足 \(i< j\) 且 \(p_i>p_j\),會對有 \(1\) 的貢獻,那麼在轉置後 \(p_j<p_i\) 且 \(j>i\),也會有 \(1\) 的貢獻。
定理二:對換矩陣的某兩行行列式的值取相反數。
考慮對於任意一個排列 \(p\),對換矩陣兩行的影響相當於對換排列的兩個值。
如果這兩個值相鄰,無論兩者誰更大都會對逆序對個數造成 \(\pm 1\) 的貢獻。
考慮一般情況,如果中間間隔了 \(k\) 個數,那麼對換兩個值相當於在中間進行了 \(2m+1\) 次相鄰對換,每次相鄰對換均會造成 \(\pm 1\) 的貢獻,所以最終也會改變排列的奇偶性,即對行列式的貢獻取反。
推論:如果有矩陣有兩行相同,則行列式值為 \(0\)。
對換兩行,那麼行列式取值為負,又因為交換兩行後矩陣一模一樣,即 \(det(A)=-det(A)\),推出行列式為 \(0\)。
定理三:
把行列式展開,每一項都有 \((b_{p_i}+c_{p_i})\),再把括號開啟即可得到後者。
定理四:將矩陣的某一行乘上一個係數 \(k\),行列式的值也會乘上 \(k\)
證明:還是把行列式展開,把每一項的 \(k\) 都提取出出來即可。
定理五:將某一行加上另外一行常數倍,行列式的值不變。
證明:結合定理三和定理四即可,讀者自證不難。
定理六:上三角矩陣的行列式值為主對角線上所有值相乘。
證明:除了主對角線的排列以外其他值都有係數為 \(0\) 的值。
利用以上定理就可以利用高斯消元得到行列式的取值了!
定理七:降價行列式/行列式展開/拉普拉斯展開:行列式的值等於所有元素於他們的代數餘子式的乘積之和。
\(n\times n\) 的矩陣 \(a\),定義 \(A_{i,j}\) 為 \(a_{i,j}\) 的代數餘子式。
關於矩陣中一個位置 \(a_{i,j}\) 的餘子式指的是忽略第 \(i\) 行第 \(j\) 列,剩下的元素拼在一次的行列式的值。
代數餘子式指的是餘子式再乘 \((-1)^{i+j}\)。
即:
首先很好理解的是餘子式乘上當前元素的值,相當於給排列新增了一個元素。
唯一需要證明的是係數 \((-1)^{i+j}\)。
證明:先用定義式將行列式展開,考慮列舉第 \(i\) 行的 \(p_i\) 為 \(j\)。
設 \(1\sim i-1\) 中有 \(x\) 個 \(p_v\) 大於 \(j\),那 \(i+1\sim n\) 中有 \(j-1-(i-1-x)=j-i+x\) 個小於 \(j\) 的。那麼對逆序對的貢獻為 \(j-i+x+x\)。
那麼有 \((-1)^{j-i+x+x}=(-1)^{j-i}=(-1)^{i+j}\)。
有趣的小牛牛題,已知 \(1798,2139,3255,4867\) 為 \(31\) 的倍數,請在不暴力展開行列式的情況下證明其值為 \(31\) 的倍數。
將第一列乘上 \(1000\) 倍,第二列乘上 \(100\) 倍,第三列乘上 \(10\) 倍加到第四列上,再對第四列行列式展開,發現 \(a_{i,j}\) 都為 \(31\) 的倍數。
範德蒙德行列
證明:
用一些定理取化簡它,分兩步:
第一步:將 \(n-1\) 行的 \(-a_1\) 倍加到第 \(n\) 行,再將第 \(n-2\) 行的 \(-1\) 倍,第 \(1\) 行的 \(-x_1\) 倍加到第 \(2\) 行。 得到:
使用行列式展開把第一列展開,發現值其實是忽略第一行第一列的答案。
在對於右下角的那個矩形,每一列都提取出一個 \((a_i-a_1)\)。
再不斷對剩下的矩形做如此操作即可得到答案。
以及一個很優美的式子:
\(det(AB)=det(A)det(B)\)
這是著名的柯西–比內公式,筆者很想去仔細證明,但是各種細節討論最終放棄了,有興趣的讀者可以去看看。
煎蛋例題:
Random Forest Rank
重新審視矩陣的秩,矩陣的秩的意義,也可以理解為非零子式的最大階數,也就是說,我們要找到一個最大的子式使得其行列式不為零。
考慮行列式的定義。
這裡的矩陣 \(a\) 為鄰接矩陣,所以說如果 \(a_{i,p_i}\) 有值,那麼存在邊 \((i,p_i)\),又因為原圖不存在環,所以排列中只能存在長度為 \(2\) 的迴圈,換言之,每個 \(i\) 只能和一個對應的 \(p_i\) 匹配。
那麼就轉化為求森林的最大匹配數的兩倍的期望。
煎蛋樹形 dp 即可,設 \(f_x\) 表示 \(x\) 沒有被匹配的機率。
Matrix Rank
設 \(f_{i,j}\) 表示前 \(i\) 行秩為 \(j\) 的矩陣數量。
即兩種情況,當前秩不增加即為前面的行向量組合得來,有 \(p^j\) 中方案,或者當前秩增加,有 \((p^n-p^{j-1})\) 種方案。
最後求得是一行 \(f\) 的所有值。
放到二維平面上,每次可以從 \((i,j)\) 走到 \((i+1,j)\) 水平步,或者 \((i+1,j+1)\) 右上步。
那麼對於一個終點 \(f(n,j)\),一定恰好走了 \(j\) 次右上步,每次的貢獻都是確定的,考慮設 \(g_{i,j}\) 在 \(1\sim n\) 層走了若干次水平步,在第 \(i\) 層走水平步貢獻為 \(p^i\),恰好走了 \(j\) 次水平步的方案數。
那麼:
現在考慮求解 \(g\),對每一列直接上生成函式:\(G_i(x)=\sum_{j\ge 0}g_{i,j}x^j\)
記:這裡貌似可以使用科技很簡便地得到答案。
帶入第 \(r\) 次項的係數:
遞推從小到大維護 \(f_{n,i}\) 即可。
P10102 GDKOI2023 提高組] 矩陣
真心煎蛋題,考慮隨機一個 \(n\times 1\) 的向量 \(D\)(每一位值非零),我們只需要檢查 \(D\times A\times B=D\times C\)
錯誤機率分析:這個方法本質上檢驗了 \(D\times (A\times B-C)\) 是否為 \(0\),設 \(G=A\times B-C\)
首先如果 \(G\) 全零,那麼一定不會判錯。
否則假設最終答案 \((1,v)\) 判錯了,即:
先算得前 \(n-1\) 項的答案,最後一項 \(D_{1,i}\) 的取值對應著恰好一個答案的取值,那麼錯誤機率為 \(\dfrac{1}{998244353}\)