Springe zum Inhalt oder Footer
SerloDie freie Lernplattform

Aufgaben zu Algorithmen

  1. 1

    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.


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