Springe zum Inhalt oder Footer
SerloDie freie Lernplattform

Schnelle Multiplikation - Divide and Conquer

Wenn du zwei n-Bit-Zahlen nach der Schulmethode miteinander multiplizierst, dann benötigst du hierfür n2 Schritte. Aber es geht schneller: in nur n1,585 Schritten, mit dem Karatsuba-Algorithmus. Die Idee ist bestechend einfach, die rekursive Implementierung ist unkompliziert.

Der Computer ist schnell – eine Multiplikation von zwei ganzen Zahlen schafft er in Nullkommanix.

Dies gilt für die Zahlen, mit denen der Computer normalerweise rechnet, nämlich für relativ "kleine" Zahlen, die nicht größer als ca. 2 Milliarden sind. Dies sind Zahlen, die im Binärformat mit 32 Bit dargestellt werden. Das Rechenwerk des Computers kann 32-Bit-Zahlen in einem Schritt miteinander multiplizieren.

Was ist aber, wenn die Zahlen nicht 32 Bit lang sind, sondern zum Beispiel 1024 Bit oder gar 2048 Bit? Und wenn nicht nur eine Multiplikation ausgeführt wird, sondern tausende?

Multiplikation mit der Schulmethode

Wenn du zwei n-Bit-Zahlen nach der Schulmethode multiplizierst, dann füllst ein parallelogrammförmiges Schema mit n2 Einträgen aus, dafür benötigst du mindestens n2 Schritte. In der Abbildung ist dieses Schema für zwei 4-Bit-Zahlen dargestellt.

Multiplikation mit der Schulmethode

Multiplikation mit der Schulmethode

Karatsuba-Algorithmus

Tatsächlich geht es schneller: Mit dem Karatsuba-Algorithmus benötigst du statt n2 Schritten nur n1,585 Schritte.

Vielleicht ist dein erster Gedanke, dass 1,585 nicht so furchtbar viel weniger als 2 ist – das stimmt, aber im Exponenten wirkt sich der geringe Unterschied gehörig aus. Anhand folgender Tabelle bekommst du einen Eindruck davon:

n

n1,585

n2

1024

< 60.000

> 1.000.000

Für die Multiplikation von zwei 1024 Bit langen Zahlen benötigst du mit dem Karatsuba-Algorithmus weniger als 60.000 Schritte, mit der Schulmethode dagegen mehr als eine Million Schritte.

Kommen denn so lange Zahlen in der Praxis überhaupt vor? Ja, in der Kryptografie sind zum Beispiel bei der RSA-Verschlüsselung die verwendeten Zahlen mindestens 1024 Bit lang, meist sogar 2048 Bit lang. Und du benötigst dabei eine Vielzahl von Multiplikationen dieser Zahlen, um einen Text zu verschlüsseln.

Divide-and-Conquer-Strategie

Dein Ziel ist es, zwei n-Bit-Zahlen in weniger als n2 Schritten zu multiplizieren. Du gehst nach der Divide-and-Conquer-Strategie vor.

Divide

Du unterteilst die beiden n-Bit-Zahlen a und b jeweils in zwei Hälften a1, a0 sowie b1, b0. Diese Teilstücke sind jetzt nur noch k=n/2 Bit lang - wenn du zwei dieser Teilstücke miteinander multiplizierst, benötigst du nur k2=n2/4 Schritte.

Bild

Conquer

Es gilt a=a12k+a0 sowie b=b12k+b0, hierbei ist k=n/2. Durch Ausmultiplizieren erhältst du

ab = a1b122k+a1b02k+a0b12k+a0b0

Leider ist es so, dass die 4 Multiplikationen zu je n2/4 Schritten zusammen auch wieder n2 Schritte ergeben – also ist nichts gewonnen…

Die Idee von Karatsuba

Tatsächlich schaffst du es auch mit 3 Multiplikationen. Du brauchst ein paar Additionen und Subtraktionen zusätzlich, diese verursachen aber höchstens linearen Aufwand und fallen damit nicht ins Gewicht. Wenn du lange genug herumprobierst, kommst du auf folgende Lösung:

Du berechnest die 3 Produkte

  • a1b1

  • (a1+a0)(b1+b0)

  • a0b0

und setzt ab daraus folgendermaßen zusammen

ab  =  a1b122k+((a1+a0)(b1+b0)  a1b1  a0b0)2k+a0b0

Die Produkte a1b1 und a0b0 berechnest du dabei nur einmal und verwendest sie mehrfach.

Eigentlich nicht schwer, oder? Bereits im Jahre 1960 fand der damals 23-jährige russische Mathematiker A. Karatsuba diese Lösung.

Rekursive Implementierung

Die 3 Produkte a1b1, (a1+a0)(b1+b0) und a0b0 berechnest du wieder nach derselben Methode: Du unterteilst die Operanden jeweils in zwei Hälften, usw.

Irgendwann kannst du die Operanden nicht mehr unterteilen, nämlich wenn sie nur noch 1 Bit lang sind. Dann multiplizierst du die Bits direkt.

In der Praxis brichst du bei der Langzahlen-Multiplikation die Rekursion ab, wenn du die Operanden mit dem Standard-Multiplikationsbefehl des Computers multiplizieren kannst, also bei einer Länge von 32 oder 64 Bit.

Zeitkomplexität

Für die Zeitkomplexität ausschlaggebend sind die Multiplikationen. Du zählst somit die Schritte, die du für die Multiplikationen benötigst.

  • Für die Multiplikation von 1-Bit-Zahlen benötigst du 1 Schritt.

  • Für die Multiplikation von 2-Bit-Zahlen benötigst du 3 Multiplikationen von 1-Bit-Zahlen, also 3 Schritte.

  • Für die Multiplikation von 4-Bit-Zahlen benötigst du 3 Multiplikationen von 2-Bit-Zahlen, also 33 Schritte.

  • Für die Multiplikation von 8-Bit-Zahlen benötigst du 3 Multiplikationen von 4-Bit-Zahlen, also 333 Schritte.

Jetzt erkennst du das System:

Für die Multiplikation von n-Bit-Zahlen benötigst du T(n)=3log2n Schritte.

Verrückterweise gilt

3log2n=nlog23

Somit erhältst du

T(n) = nlog23 = n1,585

Fazit

Der Karatsuba-Algorithmus ist ein besonders schönes Beispiel für die Anwendung der Divide-and-Conquer-Strategie.

Du erinnerst dich: Die Divide-and-Conquer-Strategie besteht aus den drei Phasen

  1. Divide - zerteile das Problem in kleinere Teilprobleme

  2. Conquer - löse die Teilprobleme

  3. Combine - füge die Lösungen der Teilprobleme zur Lösung des ursprünglichen Problems zusammen

Beim Karatsuba-Algorithmus ist es entscheidend, dass die vier Teilprobleme in der Conquer-Phase mit nur drei Multiplikationen gelöst werden.


Dieses Werk steht unter der freien Lizenz
CC BY-SA 4.0Was bedeutet das?