Aufgaben zu Algorithmen
- 1
Programmiere eine rekursive Funktion karatsuba_mul(a, b), um zwei nichtnegative ganze Zahlen und mit dem Karatsuba-Multiplikationsverfahren miteinander zu multiplizieren.
In den folgenden Hinweisen wird beispielhaft Python als Programmiersprache benutzt.
Hinweise:
Du bestimmst zunächst das Maximum der Bit-Längen der beiden Operanden und .:
m=max(a.bit_length(), b.bit_length())
Wenn diese Zahl kleiner oder gleich 1 ist, berechnest du das Produkt konventionell und gibst diesen Wert zurück.
Ansonsten setzt du (ganzzahlige Division durch 2) und beginnst mit der rekursiven Berechnung.
Operanden aufteilen
Die Teilstücke und erzeugst du am effizientesten durch Bit-Schieben und Bit-Maskieren.
Das vordere Teilstück erhältst du, indem du um Positionen nach rechts schiebst:
a1=a>>k
Das hintere Teilstück erhältst du, indem du eine "Bit-Maske" von Einsen über legst und nur diejenigen Bits von berücksichtigst, die unter diesen Einsen liegen.
Technisch gesehen realisiert du diese Maskierung durch eine Und-Verknüpfung (Operator &). Die Bit-Maske von Einsen entspricht der Zahl . Die Zahl erzeugst du, indem du um Positionen nach links schiebst.
a0=a & (1<<k)-1
Ganz entsprechend erzeugst du die Teilstücke und .
Rekursion
Nun berechnest du durch rekursive Aufrufe der Funktion karatsuba_mul die drei Produkte
und
Zum Schluss berechnest du nach der Formel des Karatsuba-Algorithmus die drei Teilstücke , und und schiebst diese jeweils um 0 Bit, Bit und Bit nach links, bevor du sie addierst und als Ergebnis zurückgibst.
Dieses Werk steht unter der freien Lizenz
CC BY-SA 4.0 → Was bedeutet das?