Strassen-algoritmus

A Strassen-algoritmus négyzetes mátrixok szorzását a klasszikus mátrixszorzásnál kevesebb szorzással oldja meg. 1969-ben írta le Volker Strassen német matematikus.

Az algoritmus alapötlete és leírása

Mátrixszorzás illusztrálása. Például: az A {\displaystyle A} mátrix első sora szorozva a B {\displaystyle B} mátrix második oszlopával, megadja a C {\displaystyle C} mátrix c 12 {\displaystyle c_{12}} elemét.

2×2-es mátrixok klasszikus szorzása a következőképpen valósítható meg. Legyen

A = ( a 11 a 12 a 21 a 22 )  és  B = ( b 11 b 12 b 21 b 22 ) {\displaystyle A={\begin{pmatrix}a_{11}&a_{12}\\a_{21}&a_{22}\end{pmatrix}}{\mbox{ és }}B={\begin{pmatrix}b_{11}&b_{12}\\b_{21}&b_{22}\end{pmatrix}}}

a két összeszorzandó mátrix. A szorzás eredménye a

C = A B = ( c 11 c 12 c 21 c 22 ) {\displaystyle C=AB={\begin{pmatrix}c_{11}&c_{12}\\c_{21}&c_{22}\end{pmatrix}}}

mátrix, ahol
c 11 = a 11 b 11 + a 12 b 21 c 12 = a 11 b 12 + a 12 b 22 c 21 = a 21 b 11 + a 22 b 21 c 22 = a 21 b 12 + a 22 b 22 {\displaystyle {\begin{matrix}c_{11}=a_{11}b_{11}+a_{12}b_{21}\\c_{12}=a_{11}b_{12}+a_{12}b_{22}\\c_{21}=a_{21}b_{11}+a_{22}b_{21}\\c_{22}=a_{21}b_{12}+a_{22}b_{22}\end{matrix}}}

Strassen ötlete a C {\displaystyle C} mátrix kiszámítására az, hogy a fenti 8 szorzás helyett 7-et használjon. Ha

x 1 = ( a 11 + a 22 ) ( b 11 + b 22 ) x 5 = ( a 11 + a 12 ) b 22 x 2 = ( a 21 + a 22 ) b 11 x 6 = ( a 21 a 11 ) ( b 11 + b 12 ) x 3 = a 11 ( b 12 b 22 ) x 7 = ( a 12 a 22 ) ( b 21 + b 22 ) x 4 = a 22 ( b 21 b 11 ) {\displaystyle {\begin{array}{ll}x_{1}=(a_{11}+a_{22})(b_{11}+b_{22})\quad &x_{5}=(a_{11}+a_{12})b_{22}\\x_{2}=(a_{21}+a_{22})b_{11}&x_{6}=(a_{21}-a_{11})(b_{11}+b_{12})\\x_{3}=a_{11}(b_{12}-b_{22})&x_{7}=(a_{12}-a_{22})(b_{21}+b_{22})\\x_{4}=a_{22}(b_{21}-b_{11})&\end{array}}}

akkor egyszerű számítással bizonyítható, hogy

c 11 = x 1 + x 4 x 5 + x 7 c 12 = x 3 + x 5 c 21 = x 2 + x 4 c 22 = x 1 + x 3 x 2 + x 6 {\displaystyle {\begin{array}{ll}c_{11}=x_{1}+x_{4}-x_{5}+x_{7}\qquad &c_{12}=x_{3}+x_{5}\\c_{21}=x_{2}+x_{4}&c_{22}=x_{1}+x_{3}-x_{2}+x_{6}\end{array}}}

Ebben az esetben az összeadások száma viszont 18-ra nő.

Legyen n = 2 k {\displaystyle n=2^{k}} . Felosztjuk a mátrixokat n 2 × n 2 {\displaystyle {\frac {n}{2}}\times {\frac {n}{2}}} típusú mátrixokra, és alkalmazzuk Strassen módszerét ezen mátrixok szorzására is.

( A 11 A 12 A 21 A 22 ) ( B 11 B 12 B 21 B 22 ) = ( C 11 C 12 C 21 C 22 ) {\displaystyle {\begin{pmatrix}{\begin{array}{c|c}A_{11}&A_{12}\\\hline A_{21}&A_{22}\end{array}}\end{pmatrix}}\cdot {\begin{pmatrix}{\begin{array}{c|c}B_{11}&B_{12}\\\hline B_{21}&B_{22}\end{array}}\end{pmatrix}}={\begin{pmatrix}{\begin{array}{c|c}C_{11}&C_{12}\\\hline C_{21}&C_{22}\end{array}}\end{pmatrix}}}

Ezt a felbontást addig végezzük, ameddig csak lehet, és minden esetben alkalmazzuk a Strassen elképzelését mátrixok szorzására, függetlenül attól, hogy elemei mátrixok vagy számok.

Az algoritmus elemzése

Ha n = 2 k {\displaystyle n=2^{k}} , akkor legyen M ( k ) {\displaystyle M(k)} a szorzások száma, A ( k ) {\displaystyle A(k)} pedig az összeadások száma.

Felírhatjuk a következő rekurzív összefüggéseket

M ( 0 ) = 1 M ( k ) = 7 M ( k 1 ) ,  ha  k > 0. {\displaystyle {\begin{array}{l}M(0)=1\\M(k)=7M(k\!-\!1),{\mbox{ ha }}k>0.\end{array}}}

Ennek megoldása

M ( k ) = 7 k = 7 log n = n log 7  ≈  n 2 , 81 {\displaystyle M(k)=7^{k}=7^{\log n}=n^{\log 7}{\mbox{ ≈ }}n^{2,81}}         (A log {\displaystyle \log } itt a kettes alapú logaritmust jelöli.)

A klasszikus mátrixszorzás esetében a szorzások száma n 3 {\displaystyle n^{3}} , a Strassen-algoritmus esetében, ha n = 2 k {\displaystyle n=2^{k}} , akkor a szorzások száma lecsökkenthető n 2 , 81 {\displaystyle n^{2,81}} -re. Ez az eredmény elméleti szempontból fontos, mivel a kitevő értékét 3 alá csökkentette.

Hasonló módon számítható ki az összeadások száma

A ( 0 ) = 0 A ( k ) = 18 ( 2 k 1 ) 2 + 7 A ( k 1 ) ,  ha  k > 0 {\displaystyle {\begin{array}{l}A(0)=0\\A(k)=18(2^{k-1})^{2}+7A(k-1),{\mbox{ ha }}k>0\end{array}}}

Innen

A ( k ) = 6 7 k 6 4 k  ≈  6 n 2 , 81 6 n 2 {\displaystyle A(k)=6\cdot 7^{k}-6\cdot 4^{k}{\mbox{ ≈ }}6n^{2,81}-6n^{2}}

A klasszikus mátrixszorzás esetében az összeadások száma n 3 n 2 {\displaystyle n^{3}-n^{2}} .

Ma már létezik ennél is gyorsabb algoritmus, az ún. Coppersmith–Winograd-algoritmus, amely kb. n 2 , 37 {\displaystyle n^{2,37}} szorzást igényel.[1]

Jegyzetek

  1. Coppersmith, Don; Winograd, Shmuel: "Matrix multiplication via arithmetic progressions, Journal of Symbolic Computation 9 (3): 1990, p.251. Online hozzáférés

Források

  • Sara Baase: Computer Algorithms. Introduction to Design and Analysis, Addison-Wesley Publishing Company, 1983.
  • T. H. Cormen, C. E. Leiserson, R. R. Rivest, C. Stein, Új algoritmusok, Scolar Kiadó, Budapest, 2003.
  • Matematika Matematikaportál
  • Informatika Informatikaportál