Python, algorithmes de script Fast exponentiation modulaire, Wojciech Blog Jamrozy
Si nous voulons connaître les dix derniers chiffres du numéro un - nous devons évaluer l'expression d'un mod 10 10. En utilisant l'approche de la force brutale, nous devons faire O (n) (Si vous ne comprenez pas grande notation « O », visite : notation Big O - il est très important) multiplications et divisions modulo. Lorsque n est supérieur à 10 9. il faudra beaucoup de temps. Heureusement, nous pouvons utiliser approche plus « mathématique », qui a O (log n) complexité.
Tout d'abord, nous devons remarquer que:
(1) un mod 2c r = (a c) mod 2 r
(2) un 2c + 1 mod r = a * (a c) mod 2 r
#! / Usr / bin / env python # Auteur: Wojtek Jamrozy (www.wojtekrj.net) def modexp (a, n, m): bits = [] lorsque n: bits.append (n% 2) n / 2 = solution = 1 bits.reverse () pour x en bits: solution = (solution * solution)% m si x: = solution (solution * a) l'impression de la solution de retour% m modexp (2,34, pow (10,10)) print modexp (2, pow (10,20), pow (10,10))
Fonction pow (a, b) est la fonction de python, qui calcule un b
Fonction modexp (a, n, m) calcule un mod n m. Voici exemple, qui montre l'exécution de la fonction a = 2, n = 34, m = 10 10
Tout d'abord, nous voulons avoir des morceaux de notation binaire de n bits dans la liste.
Avant de réversion, les bits ont le contenu suivant: [0, 1, 0, 0, 0, 1] (2 + 1 2 5 = 33)
Après retour de la liste: bits = [1, 0, 0, 0, 1, 0]
Les bits de notation binaire de n sont dans l'ordre des puissances « plus gros » à ceux « inférieurs ».
Je vais utiliser (b) pour la notation binaire du nombre: 33 = 100.001 (b)
Au commence, la solution = 0 mod 2 = 10 10 1. Ensuite, lors de l'exécution de la boucle for, la solution a les valeurs suivantes: 2 1 (b) mod 10 10. 2 10 (b) mod 2 10 10. 100 (b) mod 10 10. 2 1000 (b) mod 10 10. 2 10001 (b) mod 10 10 et enfin 2 100.010 (b) mod 10 10.
L'utilisation (1) et (2) nous pouvons calcualte la valeur de chaque solution si nous savons précédent.
Boucle pour l'exécution de chaque élément de bits. taille Bits est log2 n. de sorte que la complexité de l'ensemble alghorithm est O (log n)
Vous pouvez télécharger le code ici: