Autor: Mark Probst
[ < ] [ globale Übersicht ] [ Kapitelübersicht ] [ Stichwortsuche ] [ > ]

Der Strassen-Algorithmus

Der Strassen-Algorithmus ist ein rekursiver Algorithmus, der auf dem divide-and-conquer-Prinzip beruht. Dabei wird in zwei Schritten vorgegangen:
  1. Das Problem wird in möglichst gleichgroße Teilprobleme derselben Art wie das Originalproblem aufgeteilt. Diese Teilprobleme können mit demselben Algorithmus unabhängig voneinander gelöst werden.
  2. Die Lösungen der Teilprobleme werden zu einer Lösung der Originalproblems kombiniert.
Diese Aufteilung wird so lange rekursiv wiederholt, bis die Teilprobleme trivial sind und sofort gelöst werden können. Der einfachste Fall der Matrizenmultiplikation ist die Multiplikation zweier 2x2 Matrizen A,B
$$
A=
\left(
\begin{array}{cc}
a_{11} & a_{12} \\
a_{21} & a_{22}
\end{array}
\right),\qquad
B=
\left(
\begin{array}{cc}
b_{11} & b_{12} \\
b_{21} & b_{22}
\end{array}
\right).
$$
Definiert man die Hilfsgrößen
p1 := (a11 + a22) * (b11 + b22)
p2 := (a21 + a22) * b11
p3 := a11 * (b12 - b22)
p4 := a22 * (b21 - b11)
p5 := (a11 + a12) * b22
p6 := (a21 - a11) * (b11 + b12)
p7 := (a12 - a22) * (b21 + b22)
dann gilt für das Produkt
$$
A \cdot B =: C =
\left(
\begin{array}{cc}
c_{11} & c_{12} \\
c_{21} & c_{22}
\end{array}
\right),
$$
wie man durch einfaches Nachrechnen leicht bestätigen kann:
c11 = p1 + p4 - p5 + p7
c12 = p3 + p5
c21 = p2 + p4
c22 = p1 + p3 - p2 + p6
Dieser Algorithmus zur Matrizenmultiplikation, der Strassen-Algorithmus, benötigt in diesem Fall sieben Multiplikationen und 18 Additionen bzw. Subtraktionen, während der Standardalgorithmus nur 8 Multiplikationen und 4 Additionen benötigt. Im Fall von von 2x2 Matrizen ist der Strassen-Algorithmus also deutlich unterlegen, jedoch erkannte Strassen, dass die Formeln (5.3) und (5.4) gültig bleiben, wenn die aij und bij selbst Matrizen sind. Für diesen allgemeinen Fall werden im folgenden die Algorithmen Am,k, die zwei Matrizen der Ordnung m2k multiplizieren, durch Induktion über k definiert. Falls n keine gerade Zahl ist, dann berechnet man die letzte Spalte von C nach den üblichen Methoden und wendet das Verfahren auf die verbleibenden Matrizen der Dimension n-1 an.

Definition 5.5.2: Am,0 sei der Standardalgorithmus zur Matrizenmultiplikation (dieser benötigt m3 Multiplikationen und m2(m-1) Additionen). Ist Am,k bereits bekannt, dann sei Am,k+1 wie folgt definiert:

Sollen die Matrizen A und B der Ordnung m2k+1 multipliziert werden, dann unterteilt man A, B und A.B in Blöcke

$$
A=
\left(
\begin{array}{cc}
A_{11} & A_{12} \\
A_{21} & A_{22}
\end{array}
\right),\qquad
B=
\left(
\begin{array}{cc}
B_{11} & B_{12} \\
B_{21} & B_{22}
\end{array}
\right),\qquad
A \cdot B
=
\left(
\begin{array}{cc}
C_{11} & C_{12} \\
C_{21} & C_{22}
\end{array}
\right),
$$
wobei Ai,j, Bi,j, Ci,j Matrizen der Ordnung m2k sind, und berechnet die Hilfsmatrizen der Ordnung m2k
P1 := (A11 + A22) * (B11 + B22)
P2 := (A21 + A22) * B11
P3 := A11 * (B12 - B22)
P4 := A22 * (B21 + B11)
P5 := (A11 + A12) * B22
P6 := (A21 - A11) * (B11 + B12)
P7 := (A12 - A22) * (B21 + B22)

C11 = P1 + P4 - P5 + P7
C12 = P3 + P5
C21 = P2 + P4
C22 = P1 + P3 - P2 + P6

indem man für die Multiplikation den Algorithmus Am,k und für die Addition und Subtraktion den gewöhnlichen (elementweisen) Algorithmus verwendet.

Die Matrizen P1, P2, ..., P7 können alle gleichzeitig berechnet werden. Dies gilt auch für die Matrizen C11, ..., C22, obwohl deren Berechnungsaufwand verglichen mit jenem für die Hilfsmatrizenn P1, P2, ..., P7 verhältnismäßig klein ist, sodaß sich die parallele Berechnung oft nicht lohnt. Der Strassen-Algorithmus ist auf jeden Fall für eine Verwendung auf Parallelrechnern gut geeignet.

Hier ist eine Implementierung des Strassen-Algorithmus in C. Sie ist weder effizient, noch hübsch, noch gibt es eine Garantie, daß sie fehlerfrei ist. Ausserdem gibt sie allokierten Speicher nicht wieder frei. Dennoch sollte sie demonstrieren, wie und daß der Algorithmus funktioniert.

Komplexität des Strassen-Algorithmus

Der Strassen-Algorithmus ermöglicht die Berechnung des Produktes zweier Matrizen der Ordnung n=2k mit 7k Multiplikationen und weniger als 6.7k Additionen und Subtraktionen, genauer:
Kmult(n) = nlog27 Multiplikationen und
Kadd(n) = 6(nlog27 - nlog24) Additionen/Subtraktionen
Dieser Algorithmus hat also sowohl bezüglich der Additionen als auch bezüglich der Multiplikationen eine asymptotische Komplexität O(nlog27), die deutlich niefriger ist als jene des Standardalgorithmus. Für Matrizen mit allgemeiner Ordnung (nicht notwendigerweise n=2k) gilt:

Satz 5.5.1: Das Produkt zweier quadratischer Matrizen der Ordnung n kann mit dem Strassen-Algorithmus mit weniger als 28.nlog27 arithmetischen Operationen berechnet werden.

Software für den Strassen-Algorithmus

Aus dem Grundkonzept des Strassen-Algorithmus effiziente Programme zu entwickeln, ist keine einfache Aufgabe. Der Strassen-Algorithmus galt daher auch lange nur als threoretisch interessantes Beispiel zur Komplexitätsreduktion bei der Matrizenmultiplikation. Von C. C. Douglas, M. Heroux, G. Slishman und R. M. Smith gibt es jedoch seit kurzem sehr effiziente Implementierungen für Einprozessor-Computer und Parallelrechner. Auch in die Softwarebibliotheken der Computerhersteller wurden bereits Implementierungen des Strassen-Algorithmus aufgenommen (z.B. sgemms und dgemms in der ESSL-Bibliothek).

Die "Grenzdimension" nmin, ab der eine Strassen-Implementierung weniger Rechenzeit erfordert als das entsprechende BLAS-3-Programm sgemm bzw. dgemm, liegt bei den meisten Computern zwischen 32 und 256. Bei größeren Matrizen tritt eine signifikante Verringerung der erforderlichen Gleitpunktoperationen und eine entsprechende Verkürzung der Rechenzeit ein.