Springe zum Inhalt oder Footer
SerloDie freie Lernplattform

Programmiere eine rekursive Funktion karatsuba_mul(a, b), um zwei nichtnegative ganze Zahlen aa und bb 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 aa und bb.:

 m=max(a.bit_length(), b.bit_length())
  • Wenn diese Zahl mm kleiner oder gleich 1 ist, berechnest du das Produkt aba \cdot b konventionell und gibst diesen Wert zurück.

  • Ansonsten setzt du k=m//2k = m//2 (ganzzahlige Division durch 2) und beginnst mit der rekursiven Berechnung.

Operanden aufteilen

Die Teilstücke a1a_1 und a0a_0 erzeugst du am effizientesten durch Bit-Schieben und Bit-Maskieren.

  • Das vordere Teilstück a1a_1 erhältst du, indem du aa um kk Positionen nach rechts schiebst:

a1=a>>k
  • Das hintere Teilstück a0a_0 erhältst du, indem du eine "Bit-Maske" von kk Einsen über aa legst und nur diejenigen Bits von aa berücksichtigst, die unter diesen Einsen liegen.

Technisch gesehen realisiert du diese Maskierung durch eine Und-Verknüpfung (Operator &). Die Bit-Maske von kk Einsen entspricht der Zahl 2k12^k -1. Die Zahl 2k2^k erzeugst du, indem du 20=12^0 = 1 um kk Positionen nach links schiebst.

a0=a & (1<<k)-1 

Ganz entsprechend erzeugst du die Teilstücke b1b_1 und b0b_0.

Rekursion

Nun berechnest du durch rekursive Aufrufe der Funktion karatsuba_mul die drei Produkte

  • p0=a0b0p_0 = a_0\cdot b_0

  • p1=(a1+a0)(b1+b0)p_1 = (a_1+a_0)\cdot(b_1+b_0) und

  • p2=a1b1p_2 = a_1\cdot b_1

Zum Schluss berechnest du nach der Formel des Karatsuba-Algorithmus die drei Teilstücke c0c_0, c1c_1 und c2c_2 und schiebst diese jeweils um 0 Bit, kk Bit und 2k2k Bit nach links, bevor du sie addierst und als Ergebnis zurückgibst.