Multiplikation langer Zahlen

Werbung
16. Algorithmus der Woche – Informatikjahr 2006
http://www.informatikjahr.de/algorithmus/
16. Algorithmus der Woche
Multiplikation langer Zahlen
. . . schneller als in der Schule
Autor
Arno Eigenwillig, Max-Planck-Institut für Informatik, Saarbrücken
Kurt Mehlhorn, Max-Planck-Institut für Informatik, Saarbrücken
Multiplizieren haben wir alle schon in der Grundschule gelernt. Um zwei ganze Zahlen a und b miteinander
zu multiplizieren, multipliziert man a mit jeder Ziffer von b und arrangiert diese Teilprodukte in einem
Stufenschema. Dann addiert man die Teilprodukte spaltenweise.
5678 · 4321
22712
17034
11356
5678
24534638
Wir nennen diese Methode die Schulmethode der Multiplikation. Wenn die Zahlen a und b lang sind, also
aus vielen Ziffern bestehen, dann ist diese Methode zu aufwändig. Wir wollen nachfolgend untersuchen:
1. Was genau heißt hier aufwändig“?
”
2. Wie können wir mit weniger Aufwand multiplizieren?
Das ist aus zweierlei Gründen interessant:
1. Praxis: Schnelles Rechnen mit langen Zahlen braucht man in vielen Anwendungsgebieten der Informatik, zum Beispiel beim Verschlüsseln von Nachrichten und bei der zuverlässigen Lösung geometrischer und rechnerischer Probleme.
2. Theorie: Die Schulmethode der Multiplikation erscheint uns so vertraut und natürlich, dass jede
wesentliche Verbesserung — und wir werden eine solche kennen lernen — eine bemerkenswerte
Überraschung ist.
Aber was heißt nun, die Schulmethode ist aufwändig“? Informatiker messen Rechenaufwand nicht in
”
Sekunden (denn nächstes Jahr wird es schon wieder schnellere Computer zu kaufen geben), sondern in
der Anzahl der Grundoperationen, die eine Methode ausführt. Eine Grundoperation ist etwas, was ein
Computer oder ein Mensch in einem einzelnen gedanklichen Schritt tun kann. Die Grundoperationen, die
wir hier brauchen, sind Rechnungen mit den Ziffern 0,1,2,...,8,9, aus denen die Zahlen zusammengesetzt
sind:
1. Multiplikation von zwei Ziffern: Wir kennen das kleine Einmaleins, also können wir zu zwei Ziffern x und y, die man uns gibt, in einem Schritt die zwei Ziffern u und v ihres Produktes bestimmen:
x · y = 10 · u + v.
Beispiel: Für die Ziffern x = 3 und y = 7 wissen wir x · y = 3 · 7 = 21 = 10 · 2 + 1, also haben wir die
Ergebnisziffern u = 2 und v = 1. Für x = 3 und y = 2 haben wir u = 0 und v = 6.
2. Addition von drei Ziffern: Wir können zu drei Ziffern x, y, z in einem Schritt die zwei Ziffern ihrer
Summe ausgeben: x + y + z = 10 · u + v.
(Wir sehen gleich, warum wir hier drei statt zwei Ziffern haben wollen.)
Beispiel: Für x = 3, y = 5 und z = 4 haben wir u = 1 und v = 2, weil 3 + 5 + 4 = 12 = 10 · 1 + 2.
Wieviele Grundoperationen braucht nun die Schulmethode der Multiplikation? Bevor wir das beantworten
können, müssen wir erst einmal über die Addition von zwei Zahlen reden, denn die brauchen wir ja auch
fürs Multiplizieren.
Multiplikation langer Zahlen
Seite 1 von 7
Arno Eigenwillig, Kurt Mehlhorn
16. Algorithmus der Woche – Informatikjahr 2006
http://www.informatikjahr.de/algorithmus/
Die Addition langer Zahlen
Wie aufwändig ist es, zwei Zahlen a und b zu addieren? Das hängt natürlich von ihrer Länge ab. Sagen wir,
a und b bestehen beide aus n Ziffern. (Wenn eine von beiden kürzer ist, fügen wir einfach vorne Nullen
an, dann stimmt’s wieder.) Um sie zu addieren, schreiben wir sie untereinander und addieren von rechts
nach links die Ziffern in jeder Spalte mit der oben eingeführten Ziffern-Addition. Vom Ergebnis 10 · u + v
schreiben wir die Ziffer v als Ergebnisziffer hin; die Ziffer u schreiben wir als dritte Ziffer (Übertrag) bei
der nächsten Spalte dazu. Hier ist ein Beispiel mit vier Ziffern, also für n = 4:
6917
4269
1101
11186
So gehen wir von rechts nach links alle n Spalten durch. Den letzten Übertrag schreiben wir ohne weitere
Rechnung als linkeste Ziffer des Ergebnisses hin. Insgesamt haben wir dann n Grundoperationen durchgeführt, nämlich eine Ziffern-Addition für jede Spalte.
Die Multiplikation einer Zahl mit einer Ziffer
Erinnern wir uns wieder an die Schulmethode der Multiplikation. Die einzelnen Teilprodukte (Zeilen), die
bei ihr auftreten, entstehen durch Multiplikation einer langen Zahl a (nämlich dem linken Faktor) mit einer
einzelnen Ziffer y (die kommt aus dem rechten Faktor). Diese Multiplikation Zahl mal Ziffer“ schauen
”
wir uns jetzt genauer an. Dazu schreiben wir ihre Zwischenergebnisse etwas ausführlicher hin als sonst:
Wir gehen von rechts nach links die Ziffern von a durch. Jede Ziffer x von a multiplizieren wir mit y. Das
Ergebnis 10 · u + v schreiben wir in eine neue Zeile, und zwar so, dass v in derselben Spalte wie x steht und
u links daneben. Anschließend addieren wir alle diese zweistelligen Zwischenergebnisse. Das liefert uns
das Teilprodukt, was wir gewöhnlich direkt in eine einzelne Zeile schreiben. Für das erste Teilprodukt aus
unserem Anfangsbeispiel sieht das so aus:
5678·4
32
28
24
20
0 0 1 0
22712
Wieviele Grundoperationen haben wir durchgeführt? Für jede der n Ziffern von a haben wir eine ZiffernMultiplikation durchgeführt. (Im obigen Beispiel: vier Ziffern-Multiplikationen für die vier Ziffern der
Zahl 5678.) Anschließend mussten wir in n + 1 Spalten die Zwischenergebnisse addieren. In der rechtesten
Spalte steht nur eine einzelne Ziffer, da müssen wir nichts rechnen. Aber in den anderen n Spalten stehen
zwei Ziffern und eventuell ein Übertrag aus der vorigen Spalte, so dass wir pro Spalte eine einzelne ZiffernAddition brauchen. Das macht n Ziffern-Additionen. Zusammen mit den Ziffern-Multiplikation sind das
2 · n Grundoperationen für die Multiplikation Zahl mal Ziffer“.
”
Die Schulmethode der Multiplikation: Analyse
Jetzt untersuchen wir die Anzahl der Grundoperationen, die die Schulmethode der Multiplikation für zwei
lange Zahlen a und b benötigt, die beide aus n Ziffern bestehen. (Wenn eine kürzer ist, schreiben wir einfach
so lange Nullen davor, bis sie genau so lang wie die andere ist.)
Multiplikation langer Zahlen
Seite 2 von 7
Arno Eigenwillig, Kurt Mehlhorn
16. Algorithmus der Woche – Informatikjahr 2006
http://www.informatikjahr.de/algorithmus/
Für jede Ziffer y von b müssen wir ein Teilprodukt a · y ausrechnen. Das ist eine Multiplikation Zahl mal
”
Ziffer“, benötigt also 2 · n Grundoperationen, wie wir uns oben überlegt haben. Weil b insgesamt n Ziffern
2
hat, müssen wir n · (2 · n) = 2 · n Grundoperationen durchführen, um alle Teilprodukte zu errechnen.
5678 · 4321
22712000
01703400
00113560
00005678
24534638
Als nächstes müssen wir die Teilprodukte so zusammenzählen, wie sie schräg untereinanderstehen. Um uns
die Rechnung zu vereinfachen, denken wir uns an den leeren Stellen Nullen hingeschrieben; dann haben
wir einfach n Zahlen, die gerade untereinander stehen, und die wir alle addieren müssen. Dazu verwenden
wir mehrmals die oben beschriebene Methode zur Addition langer Zahlen: Erst addieren wir die erste Zeile
zur zweiten Zeile, zu dieser Zwischensumme addieren wir die dritte Zeile, und so weiter, bis wir schließlich
alle n Teilprodukte (Zeilen) addiert haben. Dazu brauchen wir n − 1 Additionen langer Zahlen. (Im Beispiel
ist n = 4, und wir brauchen drei Additionen zum Zusammenzählen der vier Teilprodukte, nämlich die
folgenden: 22712000 + 1703400 = 24415400, 24415400 + 113560 = 24528960 und 24528960 + 5678 =
24534638.)
Aber wieviele Grundoperationen sind das? Um das sagen zu können, müssen wir die Länge aller Zwischensummen kennen, die während dieser Kette von Additionen auftreten. Dafür denken wir ein bisschen
um die Ecke: Das Endergebnis a · b unserer Rechnung kann höchstens 2 · n Ziffern haben. (Man überlege
sich, warum!) Während wir Zeile um Zeile addieren, werden die Zahlen immer nur größer, nie wieder
kleiner. Deswegen können auch alle Zwischenergebnisse nur eine Länge von höchstens 2 · n Ziffern haben. Nach der obigen Untersuchung über die Addition heißt das: Jede einzelne Addition von Teilprodukten
braucht höchstens 2 · n Grundoperationen. Für unsere n − 1 Additionen dieser Zahlen brauchen wir also
höchstens (n − 1) · (2 · n) = 2 · n2 − 2 · n Grundoperationen. Zusammen mit den 2 · n2 Grundoperationen
für das Ausrechnen der Teilprodukte sind das also insgesamt höchstens 4 · n2 − 2 · n Grundoperationen, um
mit der Schulmethode zwei Zahlen aus jeweils n Ziffern miteinander zu multiplizieren; darunter sind n2
Ziffern-Multiplikationen.
Was bedeutet das konkret? Wenn wir mit wirklich langen Zahlen rechnen wollen, sagen wir: mit 100.000
Ziffern, dann brauchen wir fast 40 Milliarden Grundoperationen für eine einzige Multiplikation, darunter
10 Milliarden Ziffern-Multiplikationen. Für jede einzelne Ausgabeziffer eines solchen Produkts brauchen
wir im Mittel ca. 200.000 Rechenoperationen. Das ist ein offensichtlich sehr ungünstiges Verhältnis, und es
wird noch schlechter, wenn die Zahlen länger werden: Bei 1 Million Ziffern brauchen wir fast 4 Billionen
Grundoperationen (davon eine Billion Ziffern-Multiplikationen), das sind sind im Mittel ca. 2 Millionen
Grundoperationen für eine einzelne Ergebnisziffer.
Die Methode von Karazuba
Jetzt besprechen wir eine Methode, die mit wesentlich weniger Grundoperationen zwei Zahlen aus n Ziffern
multiplizieren kann. Sie ist nach dem russischen Mathematiker Anatolij Alexejewitsch Karazuba (engl.:
Karatsuba) benannt, von dem ihre zentrale Idee stammt (veröffentlicht 1962 mit Yu. Ofman). Wir beschreiben diese Methode zunächst für Zahlen mit ein, zwei oder vier Ziffern, dann für Zahlen jeder Länge.
Der einfachste Fall ist die Multiplikation zweier einstelliger Zahlen (n = 1); beispielsweise 8 · 4 = 32.
Dazu braucht man nur eine Grundoperation, nämlich eine einzelne Ziffern-Multiplikation, die direkt das
Ergebnis liefert.
Der nächste Fall, den wir uns ansehen wollen, ist der Fall n = 2, also die Multiplikation von zweistelligen
Zahlen a und b. Wir schreiben sie zerlegt in ihre Ziffern hin:
Multiplikation langer Zahlen
Seite 3 von 7
Arno Eigenwillig, Kurt Mehlhorn
16. Algorithmus der Woche – Informatikjahr 2006
http://www.informatikjahr.de/algorithmus/
a = p · 10 + q und b = r · 10 + s.
Ist beispielsweise a = 78 und b = 21, so lautet die Zerlegung in Ziffern
p = 7 und q = 8 sowie r = 2 und s = 1.
Jetzt überlegen wir uns, wie das Produkt a · b in Ziffern ausgedrückt aussieht:
=
=
a·b
(p · 10 + q) · (r · 10 + s)
(p · r) · 100 + (p · s + q · r) · 10 + q · s.
Für das obige Beispiel (a = 78 und b = 21) ist das
78 · 21 = (7 · 2) · 100 + (7 · 1 + 8 · 2) · 10 + 8 · 1 = 1638.
So wie es dasteht, sieht man direkt, dass man das Produkt der zweistelligen Zahlen a und b ausrechnen
kann, indem man vier Multiplikationen einstelliger Zahlen durchführt und die Ergebnisse (gegeneinander
verschoben) addiert. Das ist genau das, was die Schulmethode der Multiplikation auch macht. Karazuba
verdanken wir die Entdeckung, dass aber auch schon drei Multiplikationen einstelliger Zahlen ausreichen,
mit denen man die folgenden Werte berechnet:
u
v
=
=
p · r,
(q − p) · (s − r),
w
=
q · s.
Beim Berechnen von v muss man etwas genauer hinschauen, weil dabei Subtraktionen von zwei Ziffern
auftreten. Wir brauchen also Ziffern-Subtraktion als eine weitere Grundoperation, die wir hier zweimal
anwenden müssen. Ihre Ergebnisse (q − p) und (s − r) haben zwar nur eine Ziffer, aber möglicherweise
ein negatives Vorzeichen. Wenn man sie multipliziert, um v zu erhalten, muss man zunächst für die beiden
Ziffern eine Ziffern-Multiplikation durchführen und dann nach den üblichen Regeln ( minus mal minus ist
”
plus“ usw.) das Vorzeichen bestimmen.
Aber warum hilft das alles nun beim Multiplizieren? Weil folgende Gleichung gilt:
u + w − v = p · r + q · s − (q − p) · (s − r) = p · s + q · r
Der Karazuba-Trick besteht nun darin, mit Hilfe dieser Gleichung das Produkt a · b folgendermaßen auszudrücken:
a · b = u · 102 + (u + w − v) · 10 + w.
Rechnen wir das einmal für unser Beispiel a = 78 und b = 21 durch. Es ist
u
v
=
=
7·2
=
(8 − 7) · (1 − 2) =
14,
−1,
w
=
8·1
=
8.
Damit finden wir
78 · 21
=
=
14 · 100 + (14 + 8 − (−1)) · 10 + 8
1400 + 230 + 8
=
1638.
Jetzt haben wir nur noch drei statt vier Ziffern-Multiplikationen benutzt; hinzu kommen mehrere Additionen und Subtraktionen für das Zusammensetzen der Teilergebnisse.
Multiplikation langer Zahlen
Seite 4 von 7
Arno Eigenwillig, Kurt Mehlhorn
16. Algorithmus der Woche – Informatikjahr 2006
http://www.informatikjahr.de/algorithmus/
Die Methode von Karazuba für vierstellige Zahlen
Nach dem Fall n = 2 wenden wir uns jetzt dem Fall n = 4 zu, also der Multiplikation von zwei vierstelligen
Zahlen a und b. Genau wie oben können wir sie in je zwei Hälften p und q bzw. r und s teilen; diese Hälften
vierstelliger Zahlen sind jetzt aber keine Ziffern mehr, sondern zweistellige Zahlen:
a = p · 102 + q und b = r · 102 + s.
Aus diesen vier Hälften berechnen wir mit der Karazuba-Multiplikation zweistelliger Zahlen wieder die
drei Hilfsprodukte
u
=
p · r,
v
w
=
=
(q − p) · (s − r),
q·s
und ganz genau wie vorher erhalten wir das Produkt von a und b als
a · b = u · 104 + (u + w − v) · 102 + w.
Beispiel: Nehmen wir uns noch einmal die Aufgabe a · b für a = 5678 und b = 4321 vor. Zuerst spalten
wir a und b in die Hälften p = 56 und q = 78 sowie r = 43 und s = 21. Dann berechnen wir mit Hilfe der
Karazuba-Methode für zweistellige Zahlen die Hilfsprodukte
u
=
56 · 43
=
v
w
=
=
(78 − 56) · (21 − 43) = −484,
78 · 21
= 1638.
=
2408 · 10000 + (2408 + 1638 − (−484)) · 100 + 1638
=
=
24080000 + 453000 + 1638
24534638.
2408,
Damit ergibt sich
5678 · 4321
Für diese Rechnung haben wir drei Hilfsprodukte zweistelliger Zahlen bilden müssen, und wir haben uns
ja gerade im vorigen Abschnitt überlegt, wie das mit der Karazuba-Methode geht. Für jedes Hilfsprodukt
braucht man drei Ziffern-Multiplikationen. Insgesamt brauchen wir also 3 · 3 = 9 Ziffern-Multiplikationen
und mehrere Additionen und Subtraktionen, um zwei vierstellige Zahlen nach der Karazuba-Methode
zu multiplizieren. Mit der Schulmethode hätten wir 16 Ziffern-Multiplikationen und mehrere Additionen
benötigt.
Die Methode von Karazuba für beliebig lange Zahlen
Nach dem gleichen Prinzip fortfahrend können wir die Multiplikation 8-stelliger Zahlen auf drei Multiplikationen 4-stelliger Zahlen zurückführen, die Multiplikation 16-stelliger Zahlen auf drei Multiplikationen
8-stelliger Zahlen und so weiter. Mit anderen Worten, für die Karazuba-Methode kann die Länge n der
beiden Zahlen a und b irgend eine Potenz von 2 sein, wie nämlich 2 = 21 , 4 = 2 · 2 = 22 , 8 = 2 · 2 · 2 = 23 ,
16 = 2 · 2 · 2 · 2 = 24 usw.
In allgemeiner Form können wir die Karazuba-Methode so beschreiben: Zwei Zahlen a und b der Länge
= 2 · 2 · 2 · · ·2 = 2k teilen wir auf als
n
n
a = p · 10 2 + q und b = r · 10 2 + s
Multiplikation langer Zahlen
Seite 5 von 7
Arno Eigenwillig, Kurt Mehlhorn
16. Algorithmus der Woche – Informatikjahr 2006
http://www.informatikjahr.de/algorithmus/
und berechnen dann ihr Produkt mit drei Multiplikationen von Zahlen der Länge
n
2
= 2k−1 in der Art
n
a · b = p · r · 10n + (p · r + q · s − (q − p) · (s − r)) · 10 2 + q · s
Auf diese Weise brauchen wir für die Multiplikation von Zahlen der Länge 2k nur dreimal (statt viermal) so
viele Ziffern-Multiplikationen wie für Zahlen der Länge 2k−1 . Damit ergibt sich die folgende Tabelle für die
Anzahl der Ziffern-Multiplikationen, die die Karazuba-Methode und die Schulmethode jeweils benötigen,
um Zahlen einer bestimmten Länge n zu multiplizieren:
Länge
1 = 20
2 = 21
4 = 22
8 = 23
16 = 24
32 = 25
64 = 26
128 = 27
256 = 28
512 = 29
1.024 = 210
1.048.576 = 220
...
n = 2k
Karazuba
1
3
9
27
81
243
729
2.187
6.561
19.638
59.049
3.486.784.401
...
3k
Schulmethode
1
4
16
64
256
1.024
4.096
16.384
65.536
262.144
1.048.576
1.099.511.627.776
...
4k
Wer das Rechnen mit Logarithmen beherrscht, kann die Tabelleneinträge auch leicht als Funktion von n
ausdrücken:
In der Spalte für die Schulmethode steht für n = 2k der Wert 4k . Wir schreiben log für den Logarithmus zur
Basis 2. Damit gilt k = log(n) und
4k = 4log(n) = (2log(4) )log(n) = nlog(4) = n2 .
Bei der Karazuba-Methode hingegen steht
3k = 3log(n) = (2log(3) )log(n) = nlog(3) = n1,58....
Vergleichen wir nun einmal die Tabelle mit unserer Analyse der Schulmethode für die Multiplikation von
Zahlen mit einer Million Ziffern. Die Schulmethode benötigte fast 4 Billionen Grundoperationen, davon eine Billion Ziffern-Multiplikationen. Um statt dessen die Karazuba-Methode anwenden zu können, müssen
wir zunächst vor die eine Million Ziffern noch eine Kette von Nullen schreiben, um auf die nächsthöhere Zweierpotenz zu kommen, nämlich 220 = 1.048.576. (Andernfalls könnten wir die Länge nicht immer
weiter durch 2 teilen, bis wir bei 1 angekommen sind.) Dann können wir mit der Karazuba-Methode multiplizieren und brauchen dafür nur“ etwa dreieinhalb Milliarden Ziffern-Multiplikationen (siehe Tabelle).
”
Das ist gerade noch ein 287stel des Aufwandes der Schulmethode. (Zum Vergleich: Das Verhältnis von
einer Sekunde zu den sprichwörtlichen fünf Minuten“ ist ein 300stel.) Wir sehen also: Die Karazuba”
Methode ist im Rechenaufwand erheblich sparsamer; zumindest dann, wenn man — so wie wir — nur
die Ziffern-Multiplikationen zählt. Für eine präzise Untersuchung muss man auch noch beachten, welchen
Aufwand das Addieren und Subtrahieren der Zwischenergebnisse verursacht. Unsere Beispiele mit zwei
und vier Ziffern möchte man dann vielleicht lieber nach der Schulmethode ausrechnen. Wenn die Zahlen
ziemlich lang werden, gewinnt die Karazuba-Methode aber, weil sie viel weniger Zwischenergebnisse als
die Schulmethode produziert. Ab welcher Länge genau sie schneller ist, hängt von den Eigenheiten des
benutzten Computers ab.
Multiplikation langer Zahlen
Seite 6 von 7
Arno Eigenwillig, Kurt Mehlhorn
16. Algorithmus der Woche – Informatikjahr 2006
http://www.informatikjahr.de/algorithmus/
Fassen wir zum Abschluss noch einmal zusammen: Was ist das Erfolgsrezept hinter der Karazuba-Methode?
Es besteht aus zwei entscheidenden Ideen.
Die erste Idee ist eine ganz allgemeine: Die vorgelegte Aufgabe multipliziere zwei Zahlen der Länge
”
n“ wird zurückgeführt auf mehrere Aufgaben von der gleichen Art, aber von kleinerer Größe, nämlich:
multipliziere zwei Zahlen der Länge n2 “. Damit verkleinern wir das Problem so lange, bis es ganz ein”
fach geworden ist ( multipliziere zwei Ziffern“). Dieses Prinzip nennt sich divide and conquer (dt.: teile
”
und herrsche), und wir haben es schon in früheren Algorithmen der Woche in Aktion gesehen (etwa beim
schnellen Sortieren). Für die verschiedenen Größen des Problems programmiert man natürlich nicht jeweils
eine neue Prozedur, sondern man schreibt eine Prozedur für allgemeine Länge n, die sich für die verringerte Problemgröße n2 mehrfach selbst aufruft. Dies nennt man Rekursion, und das ist eine der wichtigsten
Techniken überhaupt in der Informatik.
Die zweite Idee, speziell für die Multiplikation, ist der Karazuba-Trick, mit dem es gelingt, bei jeder rekursiven Aufteilung des Problems nur drei statt vier Unterprobleme lösen zu müssen. Dieser scheinbar
winzige Unterschied ergibt über die ganze Rekursion hinweg eine enorme Ersparnis und macht den Vorteil
der Karazuba-Methode gegenüber der Schulmethode aus.
Autoren:
• Dipl.-Inform. Arno Eigenwillig
http://www.mpi-inf.mpg.de/~arno
• Prof. Dr. Dr. h.c. mult. Kurt Mehlhorn
http://www.mpi-inf.mpg.de/~mehlhorn
Externe Links:
• Wikipedia (DE): Karatsuba-Algorithmus
http://de.wikipedia.org/wiki/Karatsuba-Algorithmus
• Wikipedia (EN): Strassen-Algorithmus
(eine ähnliche Idee für schnelle rekursive Matrix-Multiplikation)
http://en.wikipedia.org/wiki/Strassen_algorithm
Die Autoren danken H. Alt, M. Dietzfelbinger und C. Klost für hilfreiche Anmerkungen.
Multiplikation langer Zahlen
Seite 7 von 7
Arno Eigenwillig, Kurt Mehlhorn
Herunterladen