Python, Algorithmen Schnelle modulare Potenzierung Skript, Wojciech Jamrozy Blog

Wenn wir die letzten zehn Ziffern der Zahl wissen wollen ein - müssen wir bewerten Ausdruck ein mod 10 10. Mit Brute-Force-Ansatz müssen wir O (n) tun (Wenn Sie nicht große „O“ Notation verstehen, Besuch : Big O-Notation - es ist sehr wichtig) Multiplikationen und Divisionen Modulo. Wenn n größer als 10 9 ist, wird es viel Zeit in Anspruch nehmen. Zum Glück können wir mehr „mathematischen“ -Ansatz verwenden, die O (log n) Komplexität hat.
Erstens müssen wir feststellen, dass:
(1) ein 2c mod r = (a c) 2 mod r
(2) ein 2c + 1 mod r = a * (a c) 2 mod r

#! / Usr / bin / env Python # Autor: Wojtek Jamrozy (www.wojtekrj.net) def modexp (a, n, m): Bits = [], während n: bits.append (n% 2) n / 2 = Lösung = 1 bits.reverse () für x in Bits: Lösung = (Lösung * Lösung) m%, wenn x: Lösung = (* Lösung a)% m return Lösung Druck modexp (2,34, pow (10,10)) print modexp (2, pow (10,20), pow (10,10))

Funktion pow (a, b) ist eine Funktion der Python, die eine B berechnet
Modexp Funktion (a, n, m) berechnet ein n mod m. Hier ist beispielsweise die die Funktion zeigt läuft = 2, n = 34, m = 10 10
Zum einen wollen wir Bits binärer Schreibweise von n in der Liste Bits haben.
Bevor Reversion hat Bits folgenden Inhalt: [0, 1, 0, 0, 0, 1] (2 + 1 2 5 = 33)
Nach Umkehrung der Liste: Bits = [1, 0, 0, 0, 1, 0]
Bits binärer Schreibweise von n sind in der Reihenfolge von „größeren“ Kräften „niedriger“ ist.
Ich verwende (b) für die Binärdarstellung von Nummer: 33 = 100001 (B)
Am beggining, Lösung 2 = 0 mod 10 10 = 1. Dann, während der Ausführung der for-Schleife, Lösung hat folgende Werte: 2 1 (b) mod 10 10. 2 10 (b) mod 10 10 2 100 (b) mod 10 10 2 1000 (b) mod 10 10. 2 10001 (b) mod 10 10 und schließlich 2 100010 (b) mod 10 10.
Mit Hilfe von (1) und (2) können wir jede Lösung Wert calcualte wenn wir vorherige wissen.
Schleife für wird für jedes Element von Bits ausgeführt wird. Bits Größe log2 n. so die Komplexität der gesamten alghorithm O (log n)

Sie können Code hier herunterladen: