Schnelles Potenzieren
aus Wikipedia, der freien Enzyklopädie
Unter dem Schnellen Potenzieren versteht man ein mathematisch optimiertes Verfahren, dessen bekanntester Vertreter das „Square & Multiply“ ist. Es stellt eine Möglichkeit dar, um die Berechnung von natürlichen Zahlen mit großen Exponenten zu beschleunigen, in dem es versucht, Rechenoperationen zu ersparen.
Inhaltsverzeichnis |
[Bearbeiten] Square & Multiply
Das „Square-&-Multiply“-Verfahren beschreibt eine Methode, um schnell Potenzen zu berechnen.
[Bearbeiten] Einsatzgebiete
Das Verfahren ist für folgende zwei Fragestellungen geeignet:
- ac
Das Verfahren ist nicht nur auf die Multiplikation beschränkt, sondern kann für verschiedenste Operationen (z. B. Elliptische Kurven-Addition) adaptiert werden.
[Bearbeiten] Verfahren
„Square & Multiply“ nutzt die Tatsache, dass ac eindeutig als geschrieben werden kann, wobei
und
.
Dies kann man wiederum umformen und erhält folgende Form:
[Bearbeiten] Algorithmus
Gegeben:
- a ... Zahl, die potenziert werden soll
- c ... Potenz
- b ... Binärdarstellung von c, wobei das höchstwertigste Bit an der Stelle 0 steht und das niederwertigste Bit an der Stelle n; (b hat n+1 Ziffern)
- m ... Modulus
Gesucht:
Ablauf:
Square & Multiply |
---|
res=1 for i=0..n res = res^2 mod m if b_i = 1 res = (res * a) mod m end-if end-for |
Wenn keine modulare Reduzierung von Nöten ist, wird diese einfach weggelassen.
Möchte man die Punktmultiplikation für elliptische Kurven implementieren, muss man die Quadrierung und die Multiplikation durch das jeweilige Äquivalent ersetzen. Der adaptierte Algorithmus hätte folgende Form.
Gegeben:
- P ... Punkt, der multipliziert werden soll (Punktmultiplikation)
- c ... Multiplikator
- b ... Binärdarstellung von c, wobei das höchstwertigste Bit an der Stelle 0 steht und das niederwertigste Bit an der Stelle n
- INF ... Unendlichkeits- oder Nullpunkt (neutrales Element)
Gesucht:
Square & Multiply für elliptische Kurven |
---|
Q=INF for i=0..n Q = 2*Q if b_i = 1 Q = Q + P end-if end-for |
„Square & Multiply“ ist streng genommen der falsche Begriff. Es müsste eigentlich „Double & Add“ heißen.
[Bearbeiten] Beispiel
Gegeben:
- a = 2
- c = 11
- b = 1011
- res = 1
- Schleifendurchlauf 1: b0 = 1
- res = res2 = 1
- res = res * a = 2
- Schleifendurchlauf 2: b1 = 0
- res = res2 = 4
- Schleifendurchlauf 3: b2 = 1
- res = res2 = 16
- res = res * a = 32
- Schleifendurchlauf 4: b3 = 1
- res = res2 = 1024
- res = res * a = 2048
[Bearbeiten] Laufzeitanalyse
Bei der einfachen und langsamen Potenzierung von ac multipliziert man a (c − 1)-mal mit sich selbst. Beim „Square & Multiply“ werden lediglich log2(c) Schleifendurchläufe benötigt. In jedem Schleifendurchlauf kommt es zu einer Quadrierung (wobei die erste Quadrierung vernachlässigt werden kann) und eventuell einer Multiplikation. Asymptotisch kommt man auf O(log2(c)) Operationen, wogegen man O(c) Operationen bei der einfachen Potenzierung benötigt. O bezeichnet eine asymptotische obere Schranke für das Laufzeitverhalten des Algorithmus. Wie man leicht einsieht, ist das „Square-&-Multiply“-Verfahren sehr viel effizienter als das einfache Verfahren. Dieser verringerte Anspruch an die Rechenleistung ist bei großen Basen und Exponenten enorm.