www.wikidata.de-de.nina.az
Die binare Exponentiation auch Square and Multiply genannt ist eine effiziente Methode zur Berechnung von naturlichen Potenzen also Ausdrucken der Form x k displaystyle x k mit einer naturlichen Zahl k displaystyle k Dieser Algorithmus wurde bereits um ca 200 v Chr in Indien entdeckt und ist in einem Werk namens Chandah sutra niedergeschrieben Inhaltsverzeichnis 1 Motivation 2 Algorithmus 2 1 Beispiel Algorithmus 2 2 Pseudocode Algorithmus 3 Alternativer Algorithmus 3 1 Beispiel alternativer Algorithmus 3 2 Pseudocode alternativer Algorithmus 4 Rekursiver Algorithmus mit Herleitung 5 Binare Modulo Exponentiation 5 1 Beispiel 6 Laufzeitanalyse 7 Ahnliche Algorithmen 8 Implementierung in C 9 LiteraturMotivation BearbeitenUm z x 4 displaystyle z x 4 nbsp zu berechnen kann man entweder z x x x x displaystyle z x cdot x cdot x cdot x nbsp ausrechnen drei Multiplikationen oder y x x displaystyle y x cdot x nbsp z y y displaystyle z y cdot y nbsp zwei Multiplikationen also z x 2 2 displaystyle z x 2 2 nbsp Ebenso konnen auch andere ganzzahlige Potenzen durch fortgesetztes Quadrieren und gelegentliches Multiplizieren effizient berechnet werden Dieses Einsparen von Multiplikationen funktioniert sowohl fur reelle Zahlen als auch fur reellwertige Matrizen elliptische Kurven und beliebige andere Halbgruppen Algorithmus BearbeitenUmwandlung des Exponenten k displaystyle k nbsp in die zugehorige Binardarstellung Ersetzen jeder 0 durch Q und jeder 1 durch QM Nun wird Q als Anweisung zum Quadrieren und M als Anweisung zum Multiplizieren aufgefasst Somit bildet die resultierende Zeichenkette von links nach rechts gelesen eine Vorschrift zur Berechnung von x k displaystyle x k nbsp Man beginne mit 1 quadriere fur jedes gelesene Q das bisherige Zwischenergebnis und multipliziere es fur jedes gelesene M mit x displaystyle x nbsp Da die Binardarstellung von k gt 0 displaystyle k gt 0 nbsp immer mit der Ziffer 1 beginnt und so ebenfalls die Anweisung mit QM beginnt ergibt sich fur die erste Anweisung QM in jedem Fall das Zwischenergebnis 1 2 x x displaystyle 1 2 cdot x x nbsp Aus diesem Grund ergibt sich eine leicht vereinfachte Variante bei der die erste Anweisung QM durch x displaystyle x nbsp ersetzt wird Beispiel Algorithmus Bearbeiten Sei k 23 Die Binardarstellung von 23 lautet 10111 Daraus ergibt sich nach den Ersetzungen QM Q QM QM QM Nach dem Streichen des fuhrenden QM Paares hat man Q QM QM QM Daraus konnen wir nun ablesen dass der Rechenvorgang folgendermassen auszusehen hat quadriere quadriere multipliziere mit x displaystyle x nbsp quadriere multipliziere mit x displaystyle x nbsp quadriere multipliziere mit x displaystyle x nbsp Formal sieht das Ganze so aus x 2 2 x 2 x 2 x displaystyle left left x 2 2 cdot x right 2 cdot x right 2 cdot x nbsp bzw sukzessive geschrieben x Q x 2 Q x 4 x x 5 Q x 10 x x 11 Q x 22 x x 23 displaystyle x stackrel mathrm Q longrightarrow x 2 stackrel mathrm Q longrightarrow x 4 stackrel cdot x longrightarrow x 5 stackrel mathrm Q longrightarrow x 10 stackrel cdot x longrightarrow x 11 stackrel mathrm Q longrightarrow x 22 stackrel cdot x longrightarrow x 23 nbsp Man sieht am Beispiel dass man sich mit Hilfe der binaren Exponentiation einige Rechenschritte sparen kann Anstatt von 22 Multiplikationen werden nur noch 7 benotigt indem man viermal quadriert und dreimal mit x displaystyle x nbsp multipliziert Pseudocode Algorithmus Bearbeiten Der Algorithmus ist in zwei Varianten dargestellt Variante 1 verwendet eine if Bedingung um an den entsprechenden Stellen zu multiplizieren Variante 2 baut die if Bedingung implizit in den arithmetischen Ausdruck ein Variante 1 Variante 2 Berechnet x k b binare Darstellung von k res Resultat der Berechnung function bin exp x b res 1 for i n 0 res res 2 if b i 1 res res x end if end for return res end function Berechnet x k b binare Darstellung von k res Resultat der Berechnung function bin exp x b res 1 for i n 0 res res 2 x b i end for return res end functionAlternativer Algorithmus BearbeitenMan kann das Verfahren fur eine Berechnung von Hand auch so gestalten dass man zunachst die Basis oft genug quadriert und anschliessend die richtigen Zahlen miteinander multipliziert Dann ahnelt es der Russischen Bauernmultiplikation welche die Multiplikation zweier Zahlen auf das Halbieren Verdoppeln und Addieren von Zahlen zuruckfuhrt Dazu schreibt man den Exponenten links und die Basis rechts Der Exponent wird schrittweise halbiert das Ergebnis wird abgerundet und die Basis schrittweise quadriert Man streicht die Zeilen mit geradem Exponenten Das Produkt der nichtgestrichenen rechten Zahlen ist die gesuchte Potenz Beispiel alternativer Algorithmus Bearbeiten 21818 29 44 162 2561 65 536Ergebnis 262 144 4 65 536 Pseudocode alternativer Algorithmus Bearbeiten Anders als bei dem vorherigen Ansatz werden hier die benotigten Potenzen von x displaystyle x nbsp direkt aufmultipliziert Diese Variante bietet sich an wenn der Exponent k displaystyle k nbsp nicht explizit in Binardarstellung vorliegt Zur Veranschaulichung kann die Gleichheit x 23 x 16 x 4 x 2 x displaystyle x 23 x 16 cdot x 4 cdot x 2 cdot x nbsp betrachtet werden Bestimmt werden soll x k displaystyle x k nbsp ohne k displaystyle k nbsp in Binardarstellung vorliegen zu haben Binare Exponentiation Berechnet x k res Resultat der Berechnung function res bin exp x k res 1 while k gt 0 if k mod 2 1 res res x end if x x 2 k k DIV 2 Ganzzahlige Division das Ergebnis wird abgerundet end while return res end functionRekursiver Algorithmus mit Herleitung BearbeitenJede naturliche Zahl n displaystyle n nbsp lasst sich eindeutig in n 2 m b displaystyle n 2m b nbsp zerlegen wobei b 0 1 displaystyle b in 0 1 nbsp Aufgrund der Potenzgesetze ergibt sich a n a 2 m b a m 2 a b displaystyle begin aligned a n amp a 2m b amp a m 2 a b end aligned nbsp Der letzte Ausdruck beinhaltet lediglich eine Potenzierung mit einem Exponenten m displaystyle m nbsp der nur noch etwa halb so gross wie n displaystyle n nbsp ist welche rekursiv mit demselben Algorithmus berechnet werden kann eine Quadrierung eine Multiplikation eine Potenzierung mit 0 oder 1 als Exponent Eine direkte Implementation in Haskell sahe wie folgt aus a 0 1 a 1 a a 2 a a a n a m 2 a b where m b n divMod 2 Die Funktion die hier definiert wird stutzt sich also auf ein vorhandenes fur die Multiplikation divMod fur die Abspaltung der untersten Binarstelle des Exponenten und rekursiv sich selbst Geringfugige Optimierungen wie etwa die Umwandlung in eine endrekursive Variante fuhren im Wesentlichen zu oben genannten iterativen Algorithmen Binare Modulo Exponentiation BearbeitenBeim Rechnen modulo einer naturlichen Zahl ist eine leichte Modifikation anwendbar die verhindert dass die berechneten Zahlen zu gross werden Man bildet nach jedem Quadrieren und Multiplizieren den Rest Die zuvor vorgestellten Algorithmen konnen leicht durch diese Moduloperationen erweitert werden Dieses Verfahren wird beispielsweise bei RSA Verschlusselung angewendet Beispiel Bearbeiten 218 mod 3918 29 44 162 22 256 mod 39 1 16 484 mod 39 Ergebnis 25 4 16 mod 39 218 mod 39 Laufzeitanalyse BearbeitenBei der einfachen und langsamen Potenzierung von x k displaystyle x k nbsp werden k 1 displaystyle k 1 nbsp Multiplikationen benotigt Bei der binaren Exponentiation wird die Schleife lediglich log 2 k displaystyle log 2 k nbsp mal durchlaufen log 2 k displaystyle log 2 k nbsp entspricht hierbei ungefahr der Lange der Zahl k displaystyle k nbsp in der Binardarstellung In jedem Schleifendurchlauf kommt es zu einer Quadrierung wobei die erste Quadrierung vernachlassigt werden kann und eventuell einer Multiplikation Asymptotisch werden O log k displaystyle O log k nbsp Operationen eventuell Langzahloperationen benotigt wogegen O k displaystyle O k nbsp Operationen bei der einfachen Potenzierung zu Buche schlagen O displaystyle O nbsp bezeichnet eine asymptotische obere Schranke fur das Laufzeitverhalten des Algorithmus Wie man leicht einsieht ist die binare Exponentiation sehr viel effizienter als das einfache Verfahren Dieser verringerte Anspruch an die Rechenleistung ist bei grossen Basen und Exponenten enorm Ahnliche Algorithmen BearbeitenDie binare Exponentiation muss nicht notwendig die multiplikationssparendste Berechnungsart einer Potenz sein Um beispielsweise z x 15 displaystyle z x 15 nbsp zu berechnen kann man entweder gemass binarer Exponentiation z x 2 x 2 x 2 x displaystyle z left left x 2 cdot x 2 cdot x right 2 cdot x right nbsp berechnen 6 Multiplikationen oder aber z y 3 y y 2 displaystyle z y 3 y cdot y 2 nbsp mit y x 5 x x 2 2 displaystyle y x 5 x cdot x 2 2 nbsp insgesamt 5 Multiplikationen Ubersichtlicher schreibt man das indem man nur die Folge der Exponenten der berechneten Potenzen aufschreibt hier 1 2 4 5 10 15 wobei jede der Zahlen Summe zweier vorangehender Zahlen der Folge ist solche Folgen heissen Additionsketten Ein Beispiel mit grosserer Ersparnis ist der Exponent 367 fur den man nacheinander die Potenzen mit den Exponenten 1 2 3 5 10 20 23 43 86 172 344 367 berechnet wobei die relativ aufwendig berechnete 23 Potenz zweimal verwendet wird unmittelbar danach und ganz am Schluss Dadurch werden gegenuber der binaren Exponentiation drei Multiplikationen eingespart 11 statt 14 Trotzdem ist in vielen Fallen die binare Exponentiation das optimale Verfahren weil die Berechnung der gunstigsten Reihenfolge also der kurzesten Additionskette meist sehr viel aufwendiger ist als die Multiplikationen selbst von denen man einige einspart Anders ist es nur wenn die Multiplikationen selbst sehr aufwendig sind z B sehr grosse Matrizen oder wenn viele Basen mit demselben Exponenten potenziert werden sollen Implementierung in C BearbeitenEs wird 0 0 1 displaystyle 0 0 1 nbsp verwendet wie in der Funktion pow aus der STL Statt unsigned kann jeder vorzeichenlose ganzzahlige Datentyp verwendet werden falls notig Zur Vereinfachung der Darstellung fehlt eine Uberprufung auf Overflow b basis e Exponent Annahmen Typ T besitzt T operator T und eine 1 template lt typename T gt T bin exp T b unsigned e if e 0 return T 1 while e 2 0 e gerade b b e 2 hier ist e ungerade T result b while true e 2 if e 0 break b b if e 2 e ungerade result b return result Literatur BearbeitenDonald E Knuth The Art of Computer Programming Vol 2 Addison Wesley 1998 Section 4 6 3 S 461 Jorg Arndt Christoph Haenel Pi Algorithmen Computer Arithmetik 2 Auflage Springer Berlin 2000 ISBN 3 540 66258 8 S 120 121 Abgerufen von https de wikipedia org w index php title Binare Exponentiation amp oldid 238252005