Rechenleistung (z. B. 2 ^ 11) schnell [duplizieren]

7

Wie kann ich Potenzen mit besserer Laufzeit berechnen?

z. 2 ^ 13.

Ich erinnere mich, irgendwo gesehen zu haben, dass es etwas mit der folgenden Berechnung zu tun hat:

2 ^ 13 = 2 ^ 8 * 2 ^ 4 * 2 ^ 1

Aber ich kann nicht sehen, wie es mir helfen würde, jede Komponente der rechten Seite der Gleichung zu berechnen und sie dann zu multiplizieren.

Irgendwelche Ideen?

Edit: Ich meinte mit jeder Basis. Wie verbessern die unten erwähnten Algorithmen, insbesondere die "Exponentierung durch Quadrieren", die Laufzeit / Komplexität?

    
Meir 04.02.2010, 08:07
quelle

6 Antworten

14

Es gibt einen verallgemeinerten Algorithmus dafür, aber in Sprachen, die Bit-Shifting haben, gibt es eine viel schnellere Möglichkeit, Potenzen von 2 zu berechnen. Sie geben einfach 1 << exp ein (vorausgesetzt, Ihr Bit-Shift-Operator ist << wie er ist) ist in den meisten Sprachen, die die Operation unterstützen).

Ich nehme an, Sie suchen nach dem verallgemeinerten Algorithmus und wählen einfach eine unglückliche Basis als Beispiel. Ich werde diesen Algorithmus in Python geben.

%Vor%

Dies bewirkt, dass Exponenten in log2 exp time berechnet werden können. Es ist ein Divide and Conquer-Algorithmus. :-) Wie jemand anderes Potenzierung durch Quadrierung sagte.

Wenn Sie Ihr Beispiel damit verbinden, können Sie sehen, wie es funktioniert und mit der von Ihnen gegebenen Gleichung in Beziehung steht:

%Vor%     
Omnifarious 04.02.2010, 08:08
quelle
8

Verwenden Sie bitweises Verschieben. Ex. 1 & lt; & lt; 11 gibt 2 ^ 11 zurück.

    
jhchen 04.02.2010 08:11
quelle
3

Sie können die Potenzierung durch Quadrieren verwenden. Dies wird auch als "Quadrat-und-Multiplizieren" bezeichnet und funktioniert auch für Basen! = 2.

    
SebastianK 04.02.2010 08:10
quelle
2

Zweierpotenzen sind die einfachen. In binär 2 ^ 13 ist eine Eins gefolgt von 13 Nullen.

Sie würden Bit Shifting verwenden, das ein eingebauter Operator in vielen Sprachen ist.

    
Karl 04.02.2010 08:09
quelle
1

Wenn Sie sich nicht auf Zweierpotenzen beschränken, dann:

k ^ 2n = (k ^ n) ^ 2

    
Thom Smith 04.02.2010 08:11
quelle
1

Der schnellste freie Algorithmus, den ich kenne, stammt von Phillip S. Pang, Ph.D und kann den Quellcode enthalten hier gefunden. Es verwendet eine tabellengesteuerte Zerlegung, mit der es möglich ist, die Funktion exp (), die 2-10 mal schneller ist, als native exp () des Pentium (R) -Prozessors zu machen.

    
Suraj Chandran 04.02.2010 08:13
quelle

Tags und Links