分治法

史特拉森矩陣乘法(Strassen's matrix multiplication)

/ SHTRAH-sen /

用顯而易見的方法把兩個 n×n 矩陣相乘,會把 n^2 個輸出項各算成一個長度為 n 的內積,花費 n^3 次純量乘法。史特拉森 1969 年的演算法是個震撼結果:你能以少於 n^3 次運算完成——把卡拉楚巴式「用額外加法換取較少乘法」的同一技巧,套用到矩陣上。

把每個 n×n 矩陣切成四個 (n/2)×(n/2) 區塊。區塊乘積需要四個輸出區塊,用樸素方法計算它們需要八次半規模矩陣乘法:T(n) = 8 T(n/2) + O(n^2) = O(n^3),毫無改進。史特拉森找到一組七個精心挑選、由區塊之和與差構成的乘積(例如 M1 = (A11 + A22)(B11 + B22),以及另外六個類似的),只用加法與減法就能從中重建全部四個輸出區塊。七次遞迴乘法取代八次,給出 T(n) = 7 T(n/2) + O(n^2),主定理解得 O(n^(log2 7)) = O(n^2.807)。合併步驟(那個 O(n^2))就是組裝結果的矩陣加法。

史特拉森打破了長期假定的 n^3 壁壘,開啟了整個快速矩陣乘法領域;今日理論記錄約為 O(n^2.37),儘管那些演算法不切實際。史特拉森本身被用在高效能函式庫處理非常大的矩陣。要誠實面對代價:它需要額外記憶體存中間和,眾多加法略微損害數值穩定性,且常數因子意味它只在超過某交叉大小(常為數百列)時才勝過立方方法,在那之下簡單的三重迴圈獲勝。

對 2x2 區塊,史特拉森由區塊和/差構成 7 個乘積 M1..M7,然後 C11 = M1+M4-M5+M7、C12 = M3+M5、C21 = M2+M4、C22 = M1-M2+M3+M6——四個結果都來自 7 次乘法,而非 8 次。

七次遞迴區塊乘法取代八次,把指數從 3 降到 log2(7) ≈ 2.807。

史特拉森只在超過交叉大小時才勝出,並以一點數值穩定性與額外記憶體換取速度;門檻之下,樸素的 O(n^3) 三重迴圈更快也更準。

又稱
Strassen algorithm史特拉森演算法快速矩陣乘法