Karatsuba-Algorithmus
Der Karatsuba-Algorithmus ist ein Algorithmus zur Multiplikation zweier ganzer Zahlen, der nach dem rekursiven Teilen-und-Herrschen-Prinzip arbeitet. Er wurde 1960 von Anatoli Alexejewitsch Karazuba (engl. Karatsuba, russisch Анато́лий Алексе́евич Карацу́ба) entwickelt und 1962 veröffentlicht. Mit einer Laufzeitkomplexität von
ist er deutlich schneller als der naive Algorithmus nach der Schulmethode. Dieser (und auch dessen implizite Übertragung auf das Binärsystem in Form der russischen Bauernmultiplikation) besitzt eine Laufzeitkomplexität von
. Für hinreichend große Zahlen ist der Karatsuba-Algorithmus aber auch langsamer als seine Verallgemeinerungen, wie der Toom-Cook-Algorithmus oder der Schönhage-Strassen-Algorithmus (1971), dessen Laufzeitkomplexität
beträgt und der aus Sicht der Komplexitätstheorie bis 2007 als schnellster Algorithmus zur Multiplikation ganzer Zahlen galt.
Inhaltsverzeichnis |
[Bearbeiten] Idee des Algorithmus
Multiplizieren verursacht in der Schulmethode quadratischen Aufwand, während Additionen und Verschiebeoperation nur linearen Aufwand haben. Die Idee ist, nach dem „Teile und herrsche“-Prinzip die beiden zu multiplizierenden Zahlen in zwei Teile aufzuspalten, und die teuren Multiplikationen (so gut es geht) durch Additionen und Verschiebeoperationen zu ersetzen. Das Ausmultiplizieren der geteilten Zahlen ergibt drei Teilterme, die durch vier Multiplikationen gebildet werden. Diese können durch Verschiebe- und Additionsoperationen zum Gesamtergebnis zusammengesetzt werden. Einer dieser Terme ist dabei eine Summe zweier Produkte. Dieser Term kann aber auch als Summe geschrieben werden, die aus einem (neuen) Produkt und den anderen beiden Teiltermen besteht. Insgesamt spart man so also eine teure Teil-Multiplikation ein. Führt man dieses Verfahren rekursiv durch, so erhält man eine wesentlich günstigere Laufzeit als nach der naiven Schulmethode.
[Bearbeiten] Der Algorithmus im Detail
Der hier angegebene Algorithmus gilt für natürliche Zahlen, er lässt sich aber leicht auch auf ganze Zahlen verallgemeinern, indem ihre Vorzeichen gesondert berücksichtigt werden. Die Faktoren
und
seien dargestellt im Stellenwertsystem zur Basis
; der Wert von
ist unerheblich - die Beispiele weiter unten verwenden Dezimalzahlen. Die Längen beider Ziffernfolgen seien gerade und gleich
. Das ist immer erreichbar durch geeignet vorangestellte Nullen; an der Laufzeitabschätzung unten ändert es nichts.
Die Ziffernfolgen seien also
-
und
Jede Ziffernfolge wird nun in zwei Folgen der Länge n aufgespalten. Das liefert die vier Zahlen
-
und
sowie
und 
Damit ist
-
und
Ausmultipliziert ergibt sich
Den Term
kann man nun in eine andere, hier schneller berechenbare Form bringen:
Damit ergibt sich für das Produkt die Darstellung
in der nur noch die drei "kurzen" Produkte
erscheinen. Rekursiv berechnet und mit einfachen Verschiebe- und Additionsoperationen verknüpft ergeben sie
[Bearbeiten] Laufzeitanalyse
Eine Multiplikation zweier
-stelliger Zahlen wird zurückgeführt auf drei Multiplikationen von je zwei
bzw.
-stelligen Zahlen sowie vier Additionen bzw. Subtraktionen
-stelliger Zahlen. Die für letzteres benötigte Zeit ist O(n). Wenn
die Laufzeit bezeichnet, die zur Multiplikation zweier
-stelliger Zahlen nötig ist, so gilt:

Mit den Bezeichnungen des hier anwendbaren Master-Theorems ist
,
und c=1, also
. Der lineare Faktor für die Additionen bzw. Subtraktionen wird also von dem rekursiven Aufwand für die Multiplikationen dominiert (mathematisch ausgedrückt
). Damit gilt:

[Bearbeiten] Beispiel
Gegeben seien die Zahlen
-
und
Mit vorangestellten Nullen auf gerade und gleiche Länge aufgefüllt ergeben sich die Ziffernfolgen
-
und
der Länge
, die zerlegt werden in vier Folgen der Länge 
-
und
sowie
und 
Es gilt
-
und
Die benötigten Produkte sind
-

und
Der Algorithmus würde die Produkte
,
und
rekursiv bestimmen. Es bleibt das Ergebnis gemäß obiger Formel zusammenzusetzen:
[Bearbeiten] Implementierung in Java
Eine Implementierung in Java kann wie folgt aussehen:
public static BigInteger karatsuba (BigInteger x, BigInteger y) { // Verwende Standard Multiplikation bei kleinen Eingaben int n = Math.max (x.bitLength(), y.bitLength()); if (n <= 1500) return x.multiply (y); // teile; x = xH * b^n + xL , y = yH * b^n + yL n = n / 2; BigInteger xH = x.shiftRight (n); BigInteger xL = x.subtract (xH.shiftLeft(n)); BigInteger yH = y.shiftRight (n); BigInteger yL = y.subtract (yH.shiftLeft(n)); // berechne die Teilresultate BigInteger p1 = karatsuba (xH, yH); BigInteger p2 = karatsuba (xL, yL); BigInteger p3 = karatsuba (xL.add (xH), yL.add (yH)); // Setze die Teile zum Gesamtergebnis zusammen return p1.shiftLeft (2*n).add (p3.subtract (p1).subtract (p2).shiftLeft (n)).add (p2); }
[Bearbeiten] Verallgemeinerung
Statt in zwei Teile, können die zu multiplizierenden Zahlen auch in mehr Teile zerlegt werden. Durch geschickte Linearkombination von Teilergebnissen genügen dann bei Zerlegung in
Teile
Multiplikationen auf den kleineren Zahlen. Rekursiv angewandt führt dieses Verfahren dann zum Toom-Cook-Algorithmus.
[Bearbeiten] Literatur
- A. Karatsuba and Yu Ofman: Multiplication of Many-Digital Numbers by Automatic Computers. Doklady Akad. Nauk SSSR, Vol. 145 (1962), pp. 293–294. Translation in Physics-Doklady, 7 (1963), pp. 595–596.
- Karacuba A.A. Berechnungen und die Kompliziertheit von Beziehungen. Elektron. Informationsverarb. Kybernetik, 11, 603–606 (1975).
- Karatsuba A.A. The complexity of computations. Proc. Steklov Inst. Math., 211, 169–183 (1995); translation from Trudy Mat. Inst. Steklova, 211, 186–202 (1995).
- Knuth D. E. The art of computer programming. v.2. Addison-Wesley Publ.Co., 724 pp., Reading (1969).
[Bearbeiten] Weblinks
- Schnelle Multiplikation beim Algorithmus der Woche
- Karatsuba Multiplication on MathWorld
- Bernstein, D. J.: Multidigit multiplication for mathematicians (PDF; 276 kB). Mathematische Darstellung diverser Multiplikations Algorithmen. Behandelt auch den Karatsuba Algorithmus.
und
und
sowie
und 
und







und
und
und
sowie
und 
und

und
