logo

シュトラッセンのアルゴリズムの証明 📂行列代数

シュトラッセンのアルゴリズムの証明

アルゴリズム

kNk \in \mathbb{N}についてn=2kn=2^{k}としよう。A,BRn×nA, B \in \mathbb{R}^{n \times n}に対してジョルダンブロックの行列表現を使って、以下の8つのn2×n2{{n} \over {2}} \times {{n} \over {2}}行列AiA_{i}BiB_{i}を考えよう。 AB=[A1A2A3A4][B1B2B3B4]=[C1C2C3C4]=C AB= \begin{bmatrix} A_{1} & A_{2} \\ A_{3} & A_{4} \end{bmatrix} \begin{bmatrix} B_{1} & B_{2} \\ B_{3} & B_{4} \end{bmatrix} = \begin{bmatrix} C_{1} & C_{2} \\ C_{3} & C_{4} \end{bmatrix} = C C=ABC = ABを計算するため、以下を計算する。 P1=A1(B2B4)P2=(A1+A2)B4P3=(A3+A4)B1P4=A4(B3B1)P5=(A1+A4)(B1+B4)P6=(A2A4)(B3+B4)P7=(A3A1)(B1+B2) P_{1} = A_{1} ( B_{2} - B_{4} ) \\ P_{2} = ( A_{1} + A_{2} ) B_{4} \\ P_{3} = ( A_{3} + A_{4} ) B_{1} \\ P_{4} = A_{4} ( B_{3} - B_{1} ) \\ P_{5} = (A_{1} + A_{4}) ( B_{1} + B_{4} ) \\ P_{6} = (A_{2} - A_{4}) ( B_{3} + B_{4} ) \\ P_{7} = (A_{3} - A_{1}) ( B_{1} + B_{2} )

C1=P2+P4+P5+P6C2=P1+P2C3=P3+P4C4=P1P3+P5+P7 C_{1} = -P_{2} + P_{4}+ P_{5} + P_{6} \\ C_{2} = P_{1} + P_{2} \\ C_{3} = P_{3} + P_{4} \\ C_{4} = P_{1} - P_{3} + P_{5} + P_{7} AiBjA_{i} B_{j}を計算する時も同じ方法を繰り返すと、その時間複雑性Θ(n2.807)\Theta ( n^{2.807} )である。


  • もちろん、n2kn \ne 2^{k}として使えないわけではなく、サイズを調整してそのまま適応してもいい。

説明

当たり前で、すぐに思いつく行列の乗算は C1=A1B1+A2B3C2=A1B2+A2B4C3=A3B1+A4B3C4=A3B2+A4B4 C_{1} = A_{1}B_{1} + A_{2} B_{3} \\ C_{2} = A_{1}B_{2} + A_{2} B_{4} \\ C_{3} = A_{3}B_{1} + A_{4} B_{3} \\ C_{4} = A_{3}B_{2} + A_{4} B_{4} この計算を続ければいいが、ここにかかる時間がΘ(n3)\Theta ( n^3 )だということは疑う余地がなかった。シュトラッセンが生まれる前まではね。

このアルゴリズムは非常に革新的で、本来は1つのCiC_{i}を計算するのには必ず2回の行列乗算が必要だった。合わせて一度計算するたびに8回計算しなければならなかったが、シュトラッセンはこれを7回に減らした。そもそも別の方法があるかもしれないと考えたことからして異常なセンスで、本当に見つけたことは不思議とさえ言えるだろう。このアルゴリズムの開発によって、行列計算に使われたであろう資源を少しでも、いや、大量に節約できる。

証明

パート 1. 計算可能性

直接計算してみるしかない。

パート 1-1. C1=A1B1+A2B3C_{1} = A_{1}B_{1} + A_{2} B_{3}

C1=P2+P4+P5+P6=(A1B4A2B4)+P4+(A1B1+A1B4+A4B1+A4B4)+P6=A2B4+(A4B3A4B1)+A1B1+A4B1+A4B4+P6=A2B4+A4B3+A1B1+A4B4+(A2B3+A2A4A4B3A4B4)=A1B1+A2B3 \begin{align*} C_{1} =& -P_{2} + P_{4} + P_{5} + P_{6} \\ =& ( {\color{red}- A_{1} B_{4}} - A_{2} B_{4} ) + P_{4} + ( A_{1}B_{1} + {\color{red} A_{1}B_{4} } + A_{4} B_{1} + A_{4}B_{4} ) + P_{6} \\ =& - A_{2} B_{4} + (A_{4} B_{3} {\color{red}- A_{4} B_{1} }) + A_{1}B_{1} + {\color{red} A_{4} B_{1} } + A_{4}B_{4} + P_{6} \\ =& {\color{red} - A_{2} B_{4} } + \color{blue}{A_{4} B_{3} } + A_{1}B_{1} + \color{green}{A_{4}B_{4}} + ( A_{2} B_{3} + {\color{red} A_{2} A_{4} } \color{blue}{ - A_{4} B_{3} }- \color{green}{A_{4} B_{4}}) \\ =& A_{1}B_{1} + A_{2} B_{3} \end{align*}

パート 1-2. C2=A1B2+A2B4C_{2} = A_{1}B_{2} + A_{2} B_{4}

C2=P1+P2=(A1B2A1B4)+(A1B4+A2B4)=A1B2+A2B4 \begin{align*} C_{2} =& P_{1} + P_{2} \\ =& (A_{1}B_{2} {\color{red}- A_{1} B_{4}}) + ( {\color{red}A_{1} B_{4}} + A_{2} B_{4}) \\ =& A_{1}B_{2} + A_{2} B_{4} \end{align*}

パート 1-3. C3=A3B1+A4B3C_{3} = A_{3}B_{1} + A_{4} B_{3}

C3=P3+P4=(A3B1+A4B1)+(A4B3A4B1)=A3B1+A4B3 \begin{align*} C_{3} =& P_{3} + P_{4} \\ =& (A_{3}B_{1} + {\color{red} A_{4}B_{1}}) + (A_{4}B_{3} {\color{red}- A_{4}B_{1}}) \\ =& A_{3}B_{1} + A_{4} B_{3} \end{align*}

パート 1-4. C4=A3B2+A4B4C_{4} = A_{3}B_{2} + A_{4} B_{4}

C4=P1P3+P5+P7=(A1B2A1B4)P3+(A1B1+A1B4+A4B1+A4B4)+P7=A1B2+(A3B1A4B1)+A1B1+A4B1+A4B4+P7=A1B2A3B1+A1B1+A4B4+(A3B1+A3B2A1B1A1B2)=A3B2+A4B4 \begin{align*} C_{4} =& P_{1} - P_{3} + P_{5} + P_{7} \\ =& (A_{1}B_{2} {\color{red} - A_{1} B_{4} } ) - P_{3} + ( A_{1}B_{1} + {\color{red} A_{1}B_{4} } + A_{4}B_{1} + A_{4}B_{4}) + P_{7} \\ =& A_{1}B_{2} + (- A_{3}B_{1} - {\color{red}A_{4}B_{1}}) + A_{1}B_{1} + {\color{red}A_{4}B_{1}} + A_{4}B_{4} + P_{7} \\ =& {\color{red} A_{1}B_{2}} - \color{blue}{A_{3}B_{1}} + \color{green}{A_{1}B_{1}}+ A_{4}B_{4} + ( \color{blue}{A_{3}B_{1}} + A_{3}B_{2} - \color{green}{A_{1}B_{1}} {\color{red}- A_{1}B_{2}}) \\ =& A_{3}B_{2} + A_{4} B_{4} \end{align*}


パート 2. 時間複雑性

本質的には、元の計算法がΘ(n3)\Theta ( n^3 )と認識されたことを証明した方法と同じだ。1回の計算にかかる時間がT(n)T(n)で、繰り返しの外での実行時間がccであれば、T(n)=7T(n2)+c\displaystyle T(n) = 7 T \left( {{n} \over {2}} \right) + cであるため、

T(n)=7T(n2)+c=7[7T(n4)+c]+c=7[49T(n8)+7c+c]+c=73T(n8)+(1+7+72)c=73T(n8)+73171c7log2n(T(1)+c)=nlog27(T(1)+c)=n2.807(T(1)+c)=Θ(n2.807) \begin{align*} T(n) =& 7 T \left( {{n} \over {2}} \right) + c \\ =& 7 \left[ 7 T \left( {{n} \over {4}} \right) + c \right] + c \\ =& 7 \left[ 49 T \left( {{n} \over {8}} \right) + 7 c + c \right] + c \\ =& 7^3 T \left( {{n} \over {8}} \right) + (1+7+7^2)c \\ =& 7^3 T \left( {{n} \over {8}} \right) + {{7^3 - 1} \over {7 - 1}}c \\ & \vdots & \\ \approx& 7^{\log_{2} n} ( T(1) + c ) \\ =& n^{\log_{2} 7} ( T(1) + c ) \\ =& n^{2.807} ( T(1) + c ) \\ =& \Theta \left( n{^2.807} \right) \end{align*}