シュトラッセンのアルゴリズムの証明
📂行列代数シュトラッセンのアルゴリズムの証明
アルゴリズム
k∈Nについてn=2kとしよう。A,B∈Rn×nに対してジョルダンブロックの行列表現を使って、以下の8つの2n×2n行列Ai、Biを考えよう。
AB=[A1A3A2A4][B1B3B2B4]=[C1C3C2C4]=C
C=ABを計算するため、以下を計算する。
P1=A1(B2−B4)P2=(A1+A2)B4P3=(A3+A4)B1P4=A4(B3−B1)P5=(A1+A4)(B1+B4)P6=(A2−A4)(B3+B4)P7=(A3−A1)(B1+B2)
C1=−P2+P4+P5+P6C2=P1+P2C3=P3+P4C4=P1−P3+P5+P7
AiBjを計算する時も同じ方法を繰り返すと、その時間複雑性はΘ(n2.807)である。
- もちろん、n=2kとして使えないわけではなく、サイズを調整してそのまま適応してもいい。
説明
当たり前で、すぐに思いつく行列の乗算は
C1=A1B1+A2B3C2=A1B2+A2B4C3=A3B1+A4B3C4=A3B2+A4B4
この計算を続ければいいが、ここにかかる時間がΘ(n3)だということは疑う余地がなかった。シュトラッセンが生まれる前まではね。
このアルゴリズムは非常に革新的で、本来は1つのCiを計算するのには必ず2回の行列乗算が必要だった。合わせて一度計算するたびに8回計算しなければならなかったが、シュトラッセンはこれを7回に減らした。そもそも別の方法があるかもしれないと考えたことからして異常なセンスで、本当に見つけたことは不思議とさえ言えるだろう。このアルゴリズムの開発によって、行列計算に使われたであろう資源を少しでも、いや、大量に節約できる。
証明
パート 1. 計算可能性
直接計算してみるしかない。
パート 1-1. C1=A1B1+A2B3
C1=====−P2+P4+P5+P6(−A1B4−A2B4)+P4+(A1B1+A1B4+A4B1+A4B4)+P6−A2B4+(A4B3−A4B1)+A1B1+A4B1+A4B4+P6−A2B4+A4B3+A1B1+A4B4+(A2B3+A2A4−A4B3−A4B4)A1B1+A2B3
パート 1-2. C2=A1B2+A2B4
C2===P1+P2(A1B2−A1B4)+(A1B4+A2B4)A1B2+A2B4
パート 1-3. C3=A3B1+A4B3
C3===P3+P4(A3B1+A4B1)+(A4B3−A4B1)A3B1+A4B3
パート 1-4. C4=A3B2+A4B4
C4=====P1−P3+P5+P7(A1B2−A1B4)−P3+(A1B1+A1B4+A4B1+A4B4)+P7A1B2+(−A3B1−A4B1)+A1B1+A4B1+A4B4+P7A1B2−A3B1+A1B1+A4B4+(A3B1+A3B2−A1B1−A1B2)A3B2+A4B4
パート 2. 時間複雑性
本質的には、元の計算法がΘ(n3)と認識されたことを証明した方法と同じだ。1回の計算にかかる時間がT(n)で、繰り返しの外での実行時間がcであれば、T(n)=7T(2n)+cであるため、
T(n)=====≈===7T(2n)+c7[7T(4n)+c]+c7[49T(8n)+7c+c]+c73T(8n)+(1+7+72)c73T(8n)+7−173−1c⋮7log2n(T(1)+c)nlog27(T(1)+c)n2.807(T(1)+c)Θ(n2.807)
■