Seien x, m ∈ ℕ. Um r = x mod m zu berechnen, wird x durch m geteilt und der Rest r ermittelt. Die Schulmethode der Division liefert den Rest zum Schluss, wenn der Divisor nicht mehr subtrahiert werden kann.
Für die Berechnung von 72 mod 13 beispielsweise wird 72 durch 13 geteilt; es verbleibt der Rest r = 7. Bild 1 zeigt das entsprechende Schema der Schulmethode für die Division.
Bild 1: Schulmethode der Division
Die Schwierigkeit bei der Division besteht darin, dass jedes Mal ein Vergleich notwendig ist, um zu entscheiden, ob der Divisor subtrahiert werden kann oder ob 0 subtrahiert werden muss.
Ein Vergleich kann durch eine Subtraktion realisiert werden. D.h. der Divisor wird in jedem Fall subtrahiert. Es wird dann mit dem Wert vor der Subtraktion oder mit dem Wert nach der Subtraktion fortgefahren, je nach dem, ob das Ergebnis der Subtraktion negativ oder nichtnegativ ist.
Ob das Ergebnis negativ ist, lässt sich anhand des entstehenden Übertragsbits erkennen. Ist dieses 1, so ist das Ergebnis negativ.
Das Divisionsverfahren benötigt n – d Subtraktionen, wobei n die Länge des Dividenden und d die Länge des Divisors ist. Es bietet sich an, diese Subtraktionen mit einem Carry-Save-Addierer jeweils in konstanter Zeit durchzuführen. Die bei der Carry-Save-Addition verwendete redundante Zahlendarstellung ermöglicht jedoch leider nicht, in konstanter Zeit zu erkennen, ob eine Zahl negativ ist, ebenso wenig ermöglicht sie einen Vergleich zwischen zwei Zahlen in konstanter Zeit.
Das folgende Verfahren für Berechnungen modulo m ist auch für die Carry-Save-Addition geeignet.
Die Idee ist, den Divisor nur dann zu subtrahieren, wenn er sich sicher subtrahieren lässt. Dies ist dann der Fall, wenn die Zahl, von der er subtrahiert wird, um ein Bit länger ist. Die Tatsache, ob eine Zahl länger ist als eine andere, lässt sich auch bei redundanter Zahlendarstellung feststellen.
Statt den Divisor m direkt zu subtrahieren, werden zwei Schritte ausgeführt:
Beispiel: Die Zahl 1 0 0 1 0 ist um ein Bit länger als 1 1 0 1. Daher kann 1 1 0 1 sicher subtrahiert werden:
Die Subtraktion wird realisiert, indem das vorne überstehende Bit weggelassen wird – dies entspricht hier einer Subtraktion von 16. Da aber nicht 16, sondern 13 subtrahiert werden sollte, wird der Korrekturwert 16 mod 13 = 3 addiert:
Folgendes Bild zeigt das Divisionsverfahren nach dieser Methode. Der Divisor wird nur dann subtrahiert, wenn er sich sicher subtrahieren lässt. Die jeweils weggelassenen Bits sind grün dargestellt.
Bild 2: Berechnung 72 mod 13 = 7
Es kann vorkommen, dass im Verlauf dieses Verfahrens zwei Bits vorne überstehen, wie in folgendem Bild zu sehen ist. Dann muss beim Weglassen dieser Bits ein entsprechender anderer Korrekturwert addiert werden. Hier entsprechen die weggelassenen Bits 1 0 dem Wert 32, der Korrekturwert ist somit 32 mod 13 = 6.
Bild 3: Berechnung 124 mod 13 = 7
Mehr als zwei Bits können vorne nicht überstehen. Denn nach der Addition des Korrekturwertes kann höchstens ein Bit überstehen. Nach dem Schieben können daher höchstens zwei Bits überstehen.
In einem Vorlauf des Verfahrens werden also drei Korrekturwerte bestimmt: 2k mod m, 2·2k mod m und 3·2k mod m. Der Aufwand hierfür ist natürlich nur dann gerechtfertigt, wenn der Modul m feststeht und viele Berechnungen modulo m durchgeführt werden sollen.
Der Vorteil dieses Verfahrens besteht darin, dass es sich für die Carry-Save-Addition eignet.
Bild 4 zeigt das Schema der Schulmethode für die Multiplikation zweier Binärzahlen. In diesem Beispiel werden die Zahlen 8 und 9 multipliziert, das Ergebnis ist 72.
Bild 4: Schulmethode der Multiplikation 8·9 = 72
Für die Multiplikation modulo m bietet es sich an, das Schema für die Multiplikation und das Schema für die Division ineinander zu verschränken, d.h. jeweils nach einer Addition des Multiplikationsschemas eine Subtraktion des Divisionsschemas auszuführen (Bild 5). Der Rechenaufwand verringert sich dadurch nicht, allerdings wird nicht erst ein Ergebnis der Länge 2n erzeugt.
Bild 5: Verschränkte Multiplikation und Division 8 · 9 : 13 = 5 Rest 7
Das folgende Verfahren realisiert die Multiplikation modulo m durch verschränkte Multiplikation und Division unter Benutzung der Carry-Save-Addition [BS 03].
Die durch Kommentare dargestellten Zusicherungen betreffen die Länge der auftretenden Zahlen. Es zeigt sich, dass nicht mehr als zwei überstehende Bits auftreten können.
Der Subtraktionsschritt bei der verschränkten Multiplikation und Division wird jeweils durch Weglassen der überstehenden Bits und Addition eines entsprechenden Korrekturwertes durchgeführt.
Algorithmus ModulareMultiplikation
Eingabe:
Zahlen x = xn-1, ..., x0 und y = yn-1, ..., y0
Ausgabe:
Zahl z = x·y mod m
Methode:
Die Schleife wird n-mal durchlaufen. Alle Operationen in der Schleife lassen sich bit-parallel in konstanter Zeit ausführen. Die Operation ·2 entspricht einem Linksschieben um 1; die Operation mod 2n entspricht einem Weglassen der Bits n und n+1.
Der Korrekturwert a wird aus einer Tabelle in Abhängigkeit von den beiden, jeweils bei s und c überstehenden Bits abgelesen. Die Summe dieser Bits kann einem Wert zwischen 0 und 5 entsprechen (der Wert 6 ist nicht möglich). Dementsprechend müssen in einem Vorlauf die fünf Korrekturwerte
1·2n mod m, ..., 5·2n mod m
berechnet und in die Tabelle eingetragen werden. Dies kann in Zeit O(n) geschehen.
Die Addition am Schluss des Algorithmus kann mit einem Ripple-Carry-Addierer in O(n) Schritten durchgeführt werden. Ebenso kann die abschließende mod-m-Berechnung mit der Schulmethode der Division ausgeführt werden; es sind hierbei höchstens 3 Subtraktionen zu je O(n) Schritten erforderlich. Damit bleibt das gesamte Verfahren in Zeit O(n).
[BS 03] V. Bunimov, M. Schimmler: Area and Time Efficient Modular Multiplication of Large Integers. Proceedings of the IEEE Int. Conf. on Application-Specific Systems, Architectures, and Processors (ASAP'03), 400-411 (2003)
[Lan 12] H.W. Lang: Algorithmen in Java. 3. Auflage, Oldenbourg (2012)
Den Algorithmus zur modularen Multiplikation finden Sie auch in meinem Buch über Algorithmen.
Weitere Themen des Buches: Sortieren, Textsuche, Graphenalgorithmen, Arithmetik, Codierung, Kryptografie, parallele Sortieralgorithmen.
Weiter mit: [up]