Karazuba-Algorithmus

Der Karazuba-Algorithmus ist ein Algorithmus zur Multiplikation zweier großer ganzer Zahlen. Er wurde 1960 von dem 23-jährigen Anatoli Alexejewitsch Karazuba (engl. Karatsuba, russisch Анатолий Алексеевич Карацуба) entwickelt und 1962 veröffentlicht.

Bezeichnet n {\displaystyle n} die Bit-Anzahl der beiden Zahlen und O {\displaystyle O} ein Landau-Symbol, so ist der Algorithmus mit einer Laufzeitkomplexität von O ( n log 2 3 ) ,   log 2 3 = 1,584 9 , {\displaystyle O(n^{\log _{2}3}),\ \log _{2}3=1{,}5849\ldots ,} deutlich schneller als die Schulmethode. Diese (und auch deren implizite Übertragung auf das Binärsystem in Form der russischen Bauernmultiplikation) besitzt eine Laufzeitkomplexität von O ( n 2 ) {\displaystyle O(n^{2})} . Die Methode von Karazuba wurde zum Vorbild für das Teile-und-herrsche-Prinzip in der Informatik. Für hinreichend große Zahlen ist der Karazuba-Algorithmus langsamer als seine Verallgemeinerungen, wie der Toom-Cook-Algorithmus (1965) und der Schönhage-Strassen-Algorithmus (1971), dessen Laufzeitkomplexität O ( n ( log n ) log ( log n ) ) {\displaystyle O{\big (}n(\log n)\log(\log n){\big )}} beträgt und der aus Sicht der Komplexitätstheorie als schnellster Algorithmus zur Multiplikation großer ganzer Zahlen galt, bis 2007 Martin Fürer eine Weiterentwicklung mit einer (bisher nur theoretisch) geringeren Laufzeitkomplexität vorstellte.[1]

Idee des Algorithmus

Multiplizieren verursacht in der Schulmethode einen Aufwand, der mit dem Quadrat der Stellenanzahl wächst, während Additionen und Verschiebeoperationen, bei denen mit einer Potenz der Basis des verwendeten Stellenwertsystems multipliziert wird, nur linearen Aufwand benötigen. Die Idee ist, nach dem Teile-und-herrsche-Prinzip die beiden zu multiplizierenden Zahlen in zwei Teile aufzuspalten, und die Multiplikationen soweit möglich durch Additionen und Verschiebeoperationen zu ersetzen. Das Ausmultiplizieren der aufgeteilten 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 lässt sich als Differenz mit einem neuen Produkt und der Summe der anderen beiden Teilterme schreiben. Insgesamt spart man so also eine Teilmultiplikation ein. Führt man dieses Verfahren rekursiv durch, so erhält man eine wesentlich günstigere Laufzeit als nach der Schulmethode.

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 X {\displaystyle X} und Y {\displaystyle Y} seien im Stellenwertsystem zur Basis b {\displaystyle b} als Tupel dargestellt. Der Wert von b {\displaystyle b} ist unerheblich: Etwa in einem Computer mit einem Multiplizierer für 32 Bit breite Zahlen würde b = 2 31 {\displaystyle b=2^{31}} gewählt werden. Die Beispiele weiter unten verwenden Dezimalzahlen. Um die Rekursion bis n = 1 {\displaystyle n=1} durchführen zu können, seien die Längen beider Zifferntupel eine Zweierpotenz 2 m {\displaystyle 2^{m}} mit m > 1 {\displaystyle m>1} , und es sei n : = 2 m 1 {\displaystyle n:\,=2^{m-1}} . Das ist immer erreichbar durch geeignet vorangestellte Nullen; an der unten durchgeführten Laufzeitabschätzung ändert sich dadurch nichts Wesentliches.

Die Zifferntupel seien also

X = ( x 2 n 1 x 0 ) b   {\displaystyle X=(x_{2n-1}\ldots x_{0})_{b}\ } und   Y = ( y 2 n 1 y 0 ) b . {\displaystyle \ Y=(y_{2n-1}\ldots y_{0})_{b}.}

Jedes Zifferntupel wird nun in zwei Tupel der Länge n {\displaystyle n} aufgespalten. Das liefert die vier Zahlen

X h = ( x 2 n 1 x n ) b   {\displaystyle X_{h}=(x_{2n-1}\ldots x_{n})_{b}\ } und   X l = ( x n 1 x 0 ) b   {\displaystyle \ X_{l}=(x_{n-1}\ldots x_{0})_{b}\ } sowie
Y h = ( y 2 n 1 y n ) b   {\displaystyle Y_{h}=(y_{2n-1}\ldots y_{n})_{b}\ } und   Y l = ( y n 1 y 0 ) b . {\displaystyle \ Y_{l}=(y_{n-1}\ldots y_{0})_{b}.}

Damit ist

X = X h b n + X l   {\displaystyle X=X_{h}b^{n}+X_{l}\ } und   Y = Y h b n + Y l . {\displaystyle \ Y=Y_{h}b^{n}+Y_{l}.}

Ausmultipliziert ergibt sich

X Y = ( X h b n + X l ) ( Y h b n + Y l ) = X h Y h b 2 n + ( X h Y l + X l Y h ) b n + X l Y l . {\displaystyle X\,Y=(X_{h}b^{n}+X_{l})(Y_{h}b^{n}+Y_{l})=X_{h}Y_{h}b^{2n}+(X_{h}Y_{l}+X_{l}Y_{h})\,b^{n}+X_{l}Y_{l}.}

Den Term X h Y l + X l Y h {\displaystyle X_{h}Y_{l}+X_{l}Y_{h}} kann man nun in eine andere, hier schneller berechenbare Form bringen:

X h Y l + X l Y h = ( X h Y h + X h Y l + X l Y h + X l Y l ) ( X h Y h + X l Y l ) = ( X h + X l ) ( Y h + Y l ) ( X h Y h + X l Y l ) . {\displaystyle X_{h}Y_{l}+X_{l}Y_{h}=(X_{h}Y_{h}+X_{h}Y_{l}+X_{l}Y_{h}+X_{l}Y_{l})-(X_{h}Y_{h}+X_{l}Y_{l})=(X_{h}+X_{l})(Y_{h}+Y_{l})-(X_{h}Y_{h}+X_{l}Y_{l}).}

Damit ergibt sich für das Produkt die Darstellung

X Y = X h Y h b 2 n + ( ( X h + X l ) ( Y h + Y l ) ( X h Y h + X l Y l ) ) b n + X l Y l , {\displaystyle X\,Y=X_{h}Y_{h}b^{2n}+{\big (}(X_{h}+X_{l})(Y_{h}+Y_{l})-(X_{h}Y_{h}+X_{l}Y_{l}){\big )}\,b^{n}+X_{l}Y_{l},}

in der nur noch die drei „kurzen“ Produkte

P 1 = X h Y h ,   P 2 = X l Y l ,   P 3 = ( X h + X l ) ( Y h + Y l ) {\displaystyle P_{1}=X_{h}Y_{h},\ P_{2}=X_{l}Y_{l},\ P_{3}=(X_{h}+X_{l})(Y_{h}+Y_{l})}

erscheinen. Rekursiv berechnet und mit einfachen Verschiebe- und Additionsoperationen verknüpft ergeben sie

X Y = P 1 b 2 n + ( P 3 ( P 1 + P 2 ) ) b n + P 2 . {\displaystyle X\,Y=P_{1}b^{2n}+{\big (}P_{3}-(P_{1}+P_{2}){\big )}\,b^{n}+P_{2}.}

Von den vier möglichen Produkten (von X mit Y) Xh Yh, Xh Yl, Xl Yh, Xl Yl wird das erste P1 und das letzte P2 direkt im Ergebnis verwendet. Der Term aus der Summe der beiden mittleren Produkten kann als Summe von allen Produkten minus des ersten und letzten Produkt gebildet werden. Die Summe aus allen vier Produkten kann über das neu eingeführte Produkt P3 mit nur einer Multiplikation erzeugt werden.

Laufzeitanalyse

Eine Multiplikation zweier 2 n {\displaystyle 2n} -stelliger Zahlen wird zurückgeführt auf drei Multiplikationen von je zwei n {\displaystyle n} -stelligen Zahlen und vier Additionen bzw. Subtraktionen n {\displaystyle n} -stelliger Zahlen eventuell mit Überträgen sowie mit zwei Verschiebungen. Die benötigte Zeit für die Operationen, die keine Multiplikationen sind, ist kleiner als c n {\displaystyle cn} mit einer von n {\displaystyle n} unabhängigen Konstanten c {\displaystyle c} . Bezeichnet T ( s ) {\displaystyle T(s)} die Gesamtzahl der Operationen bei der Multiplikation zweier s {\displaystyle s} -stelliger Zahlen, so gilt

T ( 2 n ) 3 T ( n ) + c n ,   T ( 1 ) = 1. {\displaystyle T(2n)\leq 3T(n)+cn,\ T(1)=1.}

Der hier anwendbare erste Fall des Master-Theorems mit a = 3 ,   b = 2 {\displaystyle a=3,\ b=2} und f ( n ) c n {\displaystyle f(n)\leq cn} liefert O ( n log 2 3 ) {\displaystyle O(n^{\log _{2}3})} als Laufzeitkomplexität von T ( n ) . {\displaystyle T(n).} Die direkte Herleitung mit vollständiger Induktion ermöglicht einen genaueren Einblick:

T ( 2 m ) 3 m T ( 1 ) + c 2 2 m k = 0 m 1 ( 3 2 ) k = 3 m + c ( 3 m 2 m ) < ( c + 1 ) 3 m . {\displaystyle T(2^{m})\leq 3^{m}T(1)+{\frac {c}{2}}2^{m}\sum \limits _{k=0}^{m-1}\left({\frac {3}{2}}\right)^{k}=3^{m}+c(3^{m}-2^{m})<(c+1)\,3^{m}.}

Ersetzen von 2 m {\displaystyle 2^{m}} durch n {\displaystyle n} ergibt dann

T ( n ) < ( c + 1 ) ( 2 log 2 3 ) m = ( c + 1 ) ( 2 m ) log 2 3 = ( c + 1 ) n log 2 3 . {\displaystyle T(n)<(c+1)\,(2^{\log _{2}3})^{m}=(c+1)\,(2^{m})^{\log _{2}3}=(c+1)\,n^{\log _{2}3}.}

Beispiel zur Produktumformung

Die zu multiplizierenden Zahlen seien

X = 84 232 332 233   {\displaystyle X=84\,232\,332\,233\ } und   Y = 1 532 664 392 {\displaystyle \ Y=1\,532\,664\,392} .

Da es hier nur um die Veranschaulichung der Produktumformung geht, wird mit vorangestellten Nullen auf die nächste gerade und gleiche Länge und nicht auf eine Zweipotenzlänge aufgefüllt. Damit ergeben sich die Zifferntupel

X = 084 232 332 233 {\displaystyle X={\color {Blue}084\,232}\,{\color {OliveGreen}332\,233}} und Y = 001 532 664 392 {\displaystyle Y={\color {Red}001\,532}\,{\color {Brown}664\,392}}

der Länge 2 n = 12 {\displaystyle 2n=12} , die in vier Tupel der Länge n = 6 {\displaystyle n=6} zerlegt werden:

X h = 084 232 {\displaystyle X_{h}={\color {Blue}084\,232}} und X l = 332 233 {\displaystyle X_{l}={\color {OliveGreen}332\,233}} sowie
Y h = 001 532 {\displaystyle Y_{h}={\color {Red}001\,532}} und Y l = 664 392 . {\displaystyle Y_{l}={\color {Brown}664\,392}.}

Es gilt

X = X h 10 6 + X l = 084 232 10 6 + 332 233 {\displaystyle X=X_{h}\cdot 10^{6}+X_{l}={\color {Blue}084\,232}\cdot 10^{6}+{\color {OliveGreen}332\,233}} und
Y = Y h 10 6 + Y l = 001 532 10 6 + 664 392 . {\displaystyle Y=Y_{h}\cdot 10^{6}+Y_{l}={\color {Red}001\,532}\cdot 10^{6}+{\color {Brown}664\,392}.}

Die benötigten Produkte sind

P 1 = X h Y h = 084 232 001 532 = 000 129 043 424 {\displaystyle P_{1}=X_{h}\cdot Y_{h}={\color {Blue}084\,232}\cdot {\color {Red}001\,532}=000\,129\,043\,424} ,
P 2 = X l Y l = 332 233 664 392 = 220 732 947 336 {\displaystyle P_{2}=X_{l}\cdot Y_{l}={\color {OliveGreen}332\,233}\cdot {\color {Brown}664\,392}=220\,732\,947\,336} und
P 3 = {\displaystyle P_{3}=} ( X h + X l ) ( Y h + Y l ) = ( 084 232 + 332 233 ) ( 001 532 + 664 392 ) = 416 465     665 924 = 277 334 038 660. {\displaystyle \!(X_{h}+X_{l})\cdot (Y_{h}+Y_{l})=({\color {Blue}084\,232}+{\color {OliveGreen}332\,233})\cdot ({\color {Red}001\,532}+{\color {Brown}664\,392})=416\,465\ \cdot \ 665\,924=277\,334\,038\,660.}

Der Algorithmus würde die Produkte P 1 {\displaystyle P_{1}} , P 2 {\displaystyle P_{2}} und P 3 {\displaystyle P_{3}} rekursiv bestimmen. Es bleibt das Ergebnis gemäß obiger Formel zusammenzusetzen:

X Y = P 1 10 12 + ( P 3 ( P 1 + P 2 ) ) 10 6 + P 2 = 000 129 043 424 10 12 + ( 277 334 038 660 ( 000 129 043 424 + 220 732 947 336 ) ) 10 6 + 220 732 947 336. {\displaystyle {\begin{array}{rll}X\cdot Y&=&P_{1}\cdot 10^{12}+{\big (}P_{3}-(P_{1}+P_{2}){\big )}\cdot 10^{6}+P_{2}\\&=&000\,129\,043\,424\cdot 10^{12}\\&&+{\big (}277\,334\,038\,660-(000\,129\,043\,424+220\,732\,947\,336){\big )}\cdot 10^{6}\\&&+220\,732\,947\,336.\end{array}}}

Während die Schulmethode 110 Ziffernmultiplikationen und 90 Additionen (ohne Überträge) benötigt, sind es hier 92 Multiplikationen und 83 Additionen.

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 d + 1 {\displaystyle d+1} Teile 2 d + 1 {\displaystyle 2d+1} Multiplikationen auf den kleineren Zahlen. Rekursiv angewandt führt dieses Verfahren dann zum Toom-Cook-Algorithmus.

Literatur

  • A. Karatsuba, Y. Ofman: Multiplication of Many-Digital Numbers by Automatic Computers. In: Soviet Physics-Doklady. 7, 1963, S. 595–596 (engl. Übersetzung des russ. Originals. In: Doklady Akad. Nauk SSSR. Band 145, 1962, S. 293–294).
  • A. A. Karacuba: Berechnungen und die Kompliziertheit von Beziehungen. In: Elektron. Informationsverarb. Kybernetik. 11, 1975, S. 603–606.
  • A. A. Karatsuba: The Complexity of Computations. In: Proc. Steklov Inst. Math. 211, 1995, S. 169–183 (cs.ru PDF; engl. Übersetzung des russ. Originals. In: Trudy Mat. Inst. Steklova. 211, 1995, S. 186–202).
  • D. E. Knuth: The Art of Computer Programming. Band 2: Seminumerical Algorithms. Addison-Wesley Publ.Co., Reading, Mass., 1969, ISBN 0-201-89684-2.

Weblinks

  • Karatsuba Multiplication. auf MathWorld
  • D. J. Bernstein: Multidigit multiplication for mathematicians. (PDF; 276 kB). Mathematische Darstellung diverser Multiplikationsalgorithmen. Behandelt auch den Karazuba-Algorithmus.
  • Karatsuba Multiplication on Fast Algorithms and the FEE.

Einzelnachweise und Anmerkungen

  1. Das englische Lemma Fürer's algorithm enthält dazu einige Hinweise.