Strassen-algoritmus

Innen: testwiki
A lap korábbi változatát látod, amilyen imported>TurkászBot 2016. augusztus 25., 09:41-kor történt szerkesztése után volt. (Az algoritmus alapötlete és leírása: File: → Fájl:)
(eltér) ← Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)
Ugrás a navigációhoz Ugrás a kereséshez

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 mátrix első sora szorozva a B mátrix második oszlopával, megadja a C mátrix c12 elemét.

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

A=(a11a12a21a22) és B=(b11b12b21b22)

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

C=AB=(c11c12c21c22)

mátrix, ahol
c11=a11b11+a12b21c12=a11b12+a12b22c21=a21b11+a22b21c22=a21b12+a22b22

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

x1=(a11+a22)(b11+b22)x5=(a11+a12)b22x2=(a21+a22)b11x6=(a21a11)(b11+b12)x3=a11(b12b22)x7=(a12a22)(b21+b22)x4=a22(b21b11)

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

c11=x1+x4x5+x7c12=x3+x5c21=x2+x4c22=x1+x3x2+x6

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

Legyen n=2k. Felosztjuk a mátrixokat n2×n2 típusú mátrixokra, és alkalmazzuk Strassen módszerét ezen mátrixok szorzására is.

(A11A12A21A22)(B11B12B21B22)=(C11C12C21C22)

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=2k, akkor legyen M(k) a szorzások száma, A(k) pedig az összeadások száma.

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

M(0)=1M(k)=7M(k1), ha k>0.

Ennek megoldása

M(k)=7k=7logn=nlog7 ≈ n2,81         (A log itt a kettes alapú logaritmust jelöli.)

A klasszikus mátrixszorzás esetében a szorzások száma n3, a Strassen-algoritmus esetében, ha n=2k, akkor a szorzások száma lecsökkenthető n2,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)=0A(k)=18(2k1)2+7A(k1), ha k>0

Innen

A(k)=67k64k ≈ 6n2,816n2

A klasszikus mátrixszorzás esetében az összeadások száma n3n2.

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

Jegyzetek

Sablon:Jegyzetek

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.

Sablon:Portál


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