Strassen-Algorithmus

Aus testwiki
Zur Navigation springen Zur Suche springen

Der Strassen-Algorithmus (erfunden vom deutschen Mathematiker Volker Strassen) ist ein Algorithmus aus der Linearen Algebra und wird zur Matrizenmultiplikation verwendet. Der Strassen-Algorithmus realisiert die Matrizenmultiplikation asymptotisch effizienter als das Standardverfahren und ist in der Praxis schneller für große Matrizen (solche mit einem Rang größer als 1000).

Der Algorithmus

Vereinfachend wird der Spezialfall quadratischer Matrizen mit 2k Zeilen bzw. Spalten betrachtet.

Seien also A,BR2k×2k Matrizen über einem Ring R und ferner ihr Produkt C=ABR2k×2k. Diese lassen sich auch als Blockmatrizen

A=(A1,1A1,2A2,1A2,2),B=(B1,1B1,2B2,1B2,2),C=(C1,1C1,2C2,1C2,2)

betrachten, wobei Ai,j,Bi,j,Ci,jR2k1×2k1 sind.

Für die Multiplikation von Blockmatrizen gilt:

C1,1=A1,1B1,1+A1,2B2,1
C1,2=A1,1B1,2+A1,2B2,2
C2,1=A2,1B1,1+A2,2B2,1
C2,2=A2,1B1,2+A2,2B2,2

Die direkte Berechnung der Ci,j benötigt also 8 (aufwändige) Matrizenmultiplikationen. Um diese Anzahl zu reduzieren, berechnet der Algorithmus von Strassen folgende Hilfsmatrizen:

M1:=(A1,1+A2,2)(B1,1+B2,2)
M2:=(A2,1+A2,2)B1,1
M3:=A1,1(B1,2B2,2)
M4:=A2,2(B2,1B1,1)
M5:=(A1,1+A1,2)B2,2
M6:=(A2,1A1,1)(B1,1+B1,2)
M7:=(A1,2A2,2)(B2,1+B2,2)

Zur Berechnung der Mi sind lediglich 7 Multiplikationen nötig, die Cij lassen sich nun durch Additionen (und Subtraktionen) ermitteln:

C1,1=M1+M4M5+M7
C1,2=M3+M5
C2,1=M2+M4
C2,2=M1M2+M3+M6

Für die Multiplikationen in der Berechnung der Mi wird obiges Verfahren rekursiv ausgeführt, bis das Problem auf die Multiplikation von Skalaren reduziert ist.

In der Praxis kann die gewöhnliche Multiplikation für kleine Matrizen durchaus schneller sein. Daher bietet sich ein Wechsel zur gewöhnlichen Multiplikation anstelle eines rekursiven Aufrufs an, sobald die Matrizendimensionen klein genug sind (Cut-Off).

Datei:Strassen algorithm.svg
Die linke Spalte repräsentiert eine 2×2-Matrizenmultiplikation. Jede andere Spalte repräsentiert eine der 7 Multiplikationen des Strassen-Algorithmus.

Aufwand

Der Standardalgorithmus zur Matrizenmultiplikation benötigt

nlog28=n3

Multiplikationen der Elemente des Ringes R. Die benötigten Additionen sind hierbei nicht in die Komplexitätsberechnung eingeflossen, Sie können, abhängig von R, in Computerimplementationen viel schneller sein als die Multiplikationen. (Insbesondere bei gewöhnlichen ganzen oder Fließkommazahlen ist das oft der Fall.) Mit dem Strassen-Algorithmus wird die Anzahl der Multiplikationen auf

nlog27n2,807

reduziert. Die Reduktion der Anzahl der Multiplikationen führt allerdings zu einer Verringerung der numerischen Stabilität.[1]

Eine saubere Analyse einschließlich der Additionen ist mit dem Master-Theorem möglich: Die gewöhnliche Matrizenmultiplikation benötigt 2n3n2𝒪(n3) Schritte (Multiplikationen und Additionen gleich gewichtet und zusammenaddiert). Dies gilt auch für den ganz oben erklärten naiven rekursiven Algorithmus, denn er erzeugt 8 Teilprobleme der Größe n2und zudem sind 4 quadratische Matrizen der Seitenlänge n2 zu addieren, was einen zusätzlichen Aufwand von 4(n2)2=n2 nach sich zieht, also gilt für seine Laufzeit die Rekursion

T(n)=8T(n2)+n2

was nach dem Master-Theorem T(n)Θ(nlog28)=Θ(n3) nach sich zieht.

Der Strassen-Algorithmus erzeugt hingegen jeweils nur sieben solche Teilprobleme, auch wenn dafür nun 18 Additionen oder Subtraktionen von Matrizen mit halber Seitenlänge, also 18(n2)2=92n2 Additionen/Subtraktionen einzelner Matrixeinträge in R, erforderlich sind:

T(n)=7T(n2)+92n2

Mit dem Master-Theorem folgt T(n)Θ(nlog27) (mit log272,807).

Literatur

Einzelnachweise