特徵值和特徵向量
定義 \(n\times n\) 的矩陣 \(A\),非零 \(n\times 1\) 的列向量 \(v\),實數 \(\lambda\),若:
那麼稱 \(v\) 為 \(A\) 的特徵向量,\(\lambda\) 為特徵值。
求解特徵值
將定義式子移項得到:
其中 \(E\) 為單位矩陣,那麼又因為 \(v\) 為非零向量,可以得到 \((\lambda E-A)\) 不滿秩,換句話說也就是:
那麼行列式求值後得到的會是一個 \(n\) 次多項式,對應的 \(n\) 個根即為特徵值,稱這個多項式為矩陣 \(A\) 的特徵多項式。
直接把 \(\lambda\) 看成未知數做多項式操作複雜度為 \(O(n^5)\),或者直接插值能做到 \(O(n^4)\),但是可以做到更好。
定義相似矩陣:
對於可逆 矩陣 \(P\),\(B=PAP^{-1}\) ,則稱 \(B\) 為 \(A\) 的相似矩陣。
定理:相似矩陣的特徵多項式相同
其實相似矩陣的跡(主對角線上元素之和)以及矩陣的秩和原矩陣相同,但求解特徵多項式只需行列式相同即可。
這啟示我們可以將 \(A\) 利用類似初等行變換的手法去變成一個好算行列式矩陣(例如上三角矩陣) \(B\) 然後再算特徵多項式。
考慮用初等矩陣消元(初等矩陣都可逆)
定義 \(P(j,i(k))\) 表示將 \(E\) 的第 \(i\) 行的 \(k\) 倍加到第 \(j\) 行上。
那麼矩陣 \(P(j,i(k))\) 中只有矩陣主對角線的值為 \(1\),\((i,j)\) 為 \(k\),其他的元素均為 \(0\),即 \(P(j,i(-k))\)
那麼矩陣 \(P(j,i(k))^{-1}\) 中只有矩陣主對角線的值為 \(1\),\((i,j)\) 為 \(-k\),其他的元素均為 \(0\)。
假設對矩陣 \(A\) 的第 \(j\) 行加上 \(k\) 倍的第 \(i\) 行。
那麼在在行消後,第 \(j\) 行要減去第 \(i\) 的 \(k\) 倍。
交換兩行的操作也可以用類似的手法得到,如果交換了第 \(i\) 行和第 \(j\) 行,那麼在交換完成後,第 \(i\) 列和第 \(j\) 列也會交換。
其實也就是對原來高斯消元的每個操作多執行一次共軛操作。
手完幾個矩陣後你會發現大多數時候並不能消成上三角矩陣,退而求其次,你可以消成一個上海森堡矩陣 \(B\),即對於 \(\forall i>j+1,B_{i,j}=0\)
那麼現在的問題變成了如何在快速求解上海森堡矩陣的特徵多項式。
性質這麼好,考慮對最後一列拉普拉斯展開行列式
假設最後一列選擇的元素為 \(b_{i,n}\),那麼對於所有大於 \(i\) 的行,唯一能選擇的方案為 \(b_{j,j-1}\),那麼對於小於 \(i\) 的行列,又是一個遞迴的子問題 。
設 \(g_i\) 表示只考慮前 \(i\) 行 \(i\) 列的行列式。
後面要去負號的原因在於每加一個數逆序對個數加一。
設 \(f_i(x)\) 表示只考慮前 \(i\) 行前 \(i\) 列的特徵多項式。(注意到計算的是 \(det(\lambda E-A)\)),那麼 \(A\) 中的所有數要取反!
最後一列取值為 \(a_{i,i}\) 時需要特殊判一下,因為貢獻不一樣。
稍微再化簡一下得到:
其實可以做到 \(O(n^2)\),但是沒必要。
P7776 【模板】特徵多項式
那麼在 \(O(n^3)\) 求出了一個矩陣的特徵多項式。
其實算特徵多項式算的是 \(det(\lambda E-A)\),那能否推廣呢?
即能否在 \(O(n^3)\) 計算 \(det(A+Bx)\) 呢?
其實是可以的,首先你注意到。
嘗試用高斯消元 \(B\) 讓 \(B\) 最終變成單位矩陣(這裡不需要用那個共軛操作),然後就變成我們會的東西了,但是有可能 \(B\) 不滿秩。
如果當前在第 \(i\) 行找不到主元,將這一行全部乘以 \(x\),那麼最終多項式的係數也會向右平移一個單位,再用前 \(i-1\) 行確定的資訊去消元第 \(i\) 行。
如果還找不到就重新再來一遍,每次乘以 \(x\) 的代價為 \(O(n^2)\) 如果重複了大於 \(n\) 次說明多項式係數全為 \(0\) (向右平移了大於 \(n\) 個單位),那直接退出即可。
那麼用 \(O(n^3)\) 將 \(B\) 消元成了一個只有在主對角線上元素有值且每個值均非 \(0\)。那我們把每一行的係數全部提取出來,設他們的乘積為 \(w\),那麼現在就變成了求 \(det(A+xE)\)。
把 \(A\) 全部取反後就變成了特徵多項式板子題。
唯一要修改的地方就是將 \(f_0(0)\) 的值從 \(1\) 變成 \(w\)。
複雜度還是 \(O(n^3)\)
還能擴充套件嗎?比如說求 \(det(A+Bx+Cx^2)\) ?貌似是可以的,但是很複雜,筆者暫未學習。(坑 ,但是插值是一定能做的,複雜度劣一些)
[ABC323G] Inversion of Tree
題目想要區分逆序邊和順序邊,那直接將逆序邊的權值設為 \(x\),順序邊的權值設為 \(1\),放到矩陣樹上的矩陣中,去掉任意一行一列,求 \(det(A+Bx)\) 的每一項係數即可。
口胡的idea
給定一個無向圖,求有多少種方案選擇一些邊使得最終形成恰好 \(k\) 棵樹,即森林大小為 \(k\),對於 \(k=1\sim n\) 分別求解。
\(n\le 500\)
建一個虛點,又恰好 \(k\) 棵等價於所有恰好有 \(k\) 棵樹的根跟虛點連邊。
虛點跟其他每個點連一條權值為 \(x\) 的邊,其他邊正常連 \(1\) 的邊,跑矩陣樹即可。
特徵分解(對角化)
在矩陣快速冪中,計算 \(A^k\),每一次乘法都是 \(O(n^3)\),這不免讓人感到失落。
如果說矩陣是一個對角矩陣(只有主對角線有值的話),那麼乘法的效率會大大提高。
如果能找到一個對角矩陣 \(PBP^{-1}=A\)
那麼
\(PBP^{-1}=A\) 那麼可以得到 \(AP=PB\)
設 \(B\) 主對對角線上的元素分別為 \(\lambda_1,\lambda_2,\cdots,\lambda_n\),\(P\) 分成 \(n\) 個列向量 \(v_1,v_2,\cdots v_n\),那麼:
因為 \(P\) 可逆,所以 \(v_1,v_2,\cdots,v_n\) 非零。
這對應著特徵值和特徵向量。
又因為 \(v_1,v_2,\cdots v_n\) 線性無關,那麼一個矩陣可對角化的條件是矩陣滿秩。
那麼矩陣對角化的方法是:
1.先找到 \(n\) 個特徵值。
2.對於每一個特徵值找對應的特徵向量。
直接高斯消元可以求得 \(v\)。
將所有 \(v\) 豎著拼在依次一個矩陣 \(P\) 裡,\(\lambda_i\) 依次填入對角矩陣 \(B\)。
然後就得出了:\(PBP^{-1}=A\)
但是除非題目有特殊性質,否則根本沒用。
因為我需要對一個多項式求根,且還可能出現複數。
所以往往要用矩陣對角化的題目大機率是一個上三角/下三角矩陣。
Perpetual Subtraction
設 \(f_{k,i}\) 表示 \(k\) 次後 \(x=i\) 的機率。
設 \(f_{k,x}\) 看作列向量,那麼:
矩陣對角化!
首先這是一個上三角矩陣,對應的 \(\lambda_i=\dfrac{1}{i}\)。
由於矩陣真的非常優美,考慮手摸特徵向量。
把它轉換成線性方程組的語言:
倒著推算 \(v_j\),首先注意到 \(\forall j>i,v_j=0\)
來到第 \(i\) 行的時候,化簡後變成 \(v_i\times 0=0\)
注意到如果此時再將 \(v_i\) 設為 \(0\) 的話,那麼算出的向量 \(v\) 就只能是零向量了。
此時按理說是可以設為任意非零的值的,但是設為 \(1\) 能讓矩陣更加優美(最後特徵向量形成的矩陣比較有規律)
再根據已知的值推剩下的值 \(v_j\) 即可。
解出來(過程略,可手推)
把所有拼在一起得到矩陣 \(P\):
還需要求出 \(P^{-1}\),此時可以使用暴力矩陣求逆然後觀察規律。
實際上你仔細想想。
這個矩陣正好對應著二項式反演的係數矩陣!
上面的係數矩陣對應著 \(P\),那麼它的逆也就對應著下面的矩陣,即矩陣 \(P^{-1}\) 中 \((i,j)\) 的值為 \(\binom{j}{i}\)。\(B\) 對應的對角矩陣第 \(i\) 行第 \(i\) 列為 \(\dfrac{1}{i}\),其餘位置均為 \(0\)。
那麼現在就變為求
下面簡寫 \(f_{0,i}\) 為 \(f_i\)
考慮計算 \(P^{-1}f_0\)
這就是差卷積的板子。
也是同樣的套路,最後再成個對角矩陣就做完了。
Tasty Dishes
非常好的一道題,難道出題人真的來自外天空?太神了!
首先觀察到隨著時間增加 \(a_i\) 單調不降,如果 \(i\) 能從 \(j\) 轉移而來當且僅當 \(a_j>0\),設 \(d_j\) 為恰好在第 \(d_j\) 天后大於第一次零。
因為 \(a_i\ge -i\) ,所以 \(a_j\) 一定會在 \(d_j+1\) 天大於零。那麼:
考慮所有點對詢問的貢獻,設 \(A_{i,j}=j[j\to i]\),特別的,\(A_{i,i}=i\),\(e_i\) 為長度為 \(n\) 的列向量且恰好只有第 \(i\) 行的值為 \(1\)。
那麼答案為:
後一坨是煎蛋的,直接暴力掃一遍即可。
左邊還是困難的,主要問題在於 \(A\) 的矩陣大小太大了,做快速冪不能接受。
怎麼辦?還是考慮矩陣對角化!
\(A\) 矩陣是一個上三角矩陣,可以輕易地得到特徵值 \(\lambda_i=i\)。
跟上一道題一樣,找特徵向量。
此題中的 \(A\) 並不是確定的,那就只能倒著消元得到 \(v_i\),過程跟上題類似,不展開。有趣的點在於可以將 \(v_{i,i}\) 設定成任意你喜歡的非零數。
現在將 \(A\) 化成了 \(PBP^{-1}\),直接帶入式子,發現只能少個 log,沒啥用。
仔細觀察式子的核心,發現我們只在意矩陣的某一列的值而並非所有值。
考慮將每個 \(e_i\) 用 \(P[v_1,v_2,\cdots,v_n]\) 線性表示。
定睛一看,其實矩陣 \(c\) 就是 \(P^{-1}\) 的轉置。化簡左邊的一坨:
已經明晰了許多,考慮把前面一坨拿進來。
前面兩坨可以輕鬆的在 \(O(n)\) 的時間計算,只需考慮最後一坨。
考慮對每個 \(j\) 開一個樹狀陣列,下標維護 \(k\) 維度,每次相當於單點修改字首查詢。
注意到單點修改時,如果修改前 \(a_i\le 0\) 修改後 \(a_i>0\),那整個的 \(d\) 陣列需要重新計算,樹狀陣列也要全部修改。
但是一共最多重構 \(n\) 次,所以複雜度不會爆炸。
複雜度 \(O(n^3\log n+qn\log n)\),可以將前面的 log 去掉(\(O(n)\) 建樹狀陣列。)