• Aucun résultat trouvé

II. II. Algorithme astucieux (plus rapide)Algorithme astucieux (plus rapide) I. I. Algorithme classiqueAlgorithme classique c≡a [ n ]

N/A
N/A
Protected

Academic year: 2022

Partager "II. II. Algorithme astucieux (plus rapide)Algorithme astucieux (plus rapide) I. I. Algorithme classiqueAlgorithme classique c≡a [ n ]"

Copied!
2
0
0

Texte intégral

(1)

EXPONENTIATION MODULAIRE RAPIDE : ALGORITHMES

Étant donnés une base a, un exposant e et un entier n, on souhaite calculer c tel que :

c ≡ a

e

[ n ]

.

L’exponentiation modulaire rapide permet de le faire.

I. I. Algorithme classique Algorithme classique

def expmodrap(a, e, n) : p=1

while e>0:

if e % 2 == 1:

p = (p*a)%n a=(a*a)%n

e=e//2 return p

II. Algorithme astucieux (plus rapide) II. Algorithme astucieux (plus rapide)

def lpowmod(x, y, n) : result = 1

while y>0:

if y&1>0:

result = (result*x)%n y >>= 1

x = (x*x)%n return result

Explications :

>>=1 est l'opérateur de décalage à droite

On pousse tous les bits d'un cran (ou de plusieurs si on remplace 1 par n) vers la droite (on perd donc des données de ce côté), on complète par des zéros sur la gauche.

On obtient le quotient par une puissance de 2 sans faire appel à une routine coûteuse de division.

Un & logique avec 1 donne le bit de poids faible qui est le reste de la division par 2.

Ces opérations (>> et &) correspondent à des instructions du processeur, donc de la logique câblée extrêmement rapide.

T°S spé maths - Exponentiation modulaire rapide : algorithmes (J. Mathieu) Page 1 sur 2

(2)

III.

III. Fonction Fonction pow pow de Python de Python

Python intègre une fonction qui permet de faire une exponentiation modulaire rapide : pow(a,e,n).

IV. Rapidité de chaque algorithme IV. Rapidité de chaque algorithme

Pour calculer 413 modulo 497, sur mon PC, j’obtiens les temps suivants1 : Avec expmodrap : 2,4550×10−6

Avec lpowmod : 2,2413×10−6 Avec pow : 1,0076×10−6

Pour calculer 6512712111 985 modulo 81629 , j’obtiens les temps suivants2 : Avec expmodrap : 1,5196×10−5

Avec lpowmod : 1,4385×10−5 Avec pow : 0,6733×10−5

Il semble donc que la fonction pow implémentée dans Python soit deux fois plus rapide que nos algorithmes !

Algorithmes utilisés pour le calcul de rapidité de chaque méthode : import time

sum_a, sum_b, sum_c = 0,0,0 nbfois = 500000

for i in range(0,nbfois):

a = time.clock() expmodrap(4,13,497) b = time.clock() sum_a = sum_a + b - a b = time.clock() lpowmod(4,13,497) c = time.clock()

sum_b = sum_b + c - b c = time.clock()

pow(4,13,497) d = time.clock() sum_c = sum_c + d - c

print("Avec expmodrap : ",sum_a/nbfois) print("Avec lpowmod : ",sum_b/nbfois) print("Avec pow : ",sum_c/nbfois)

1 Moyenne des temps sur 500 000 essais consécutifs. Temps exprimé en secondes.

2 Idem

T°S spé maths - Exponentiation modulaire rapide : algorithmes (J. Mathieu) Page 2 sur 2

Références

Documents relatifs

Le principe des jeux problèmes du championnat a spécialement été étudié pour leur plaire, même si les ressorts mathématiques sous-tendus sont aussi formateurs que ceux

Comme on en prend le minimum, ce minimum est donc supérieur aux éléments de liste[0 :i], ce qui fait que la liste liste[0 :i’] est bien triée, et comme c’est le minimum de

En déduire qu’un couplage de poids minimum sur les sommets de degré impair dans T est inférieur ou égal à la moitié du poids de C opt... Préambule : technique pour montrer

En utilisant et adaptant l’algorithme/programme ci-dessus, d´eterminer le nombre de moteurs per- mettant d’obtenir un b´en´efice

Face à cette difficulté, le chef de votre établissement décide de mettre sur pied un système d’information et sollicite les élèves de classe de T Le CD pour

Chaque réglette posée dans une colonne N se compare avec sa voisine de droite ; si elle est plus petite, elle reste dans sa colonne, sinon elles échangent leurs places.. On parcourt

Comme l’ensemble des diviseurs d’un entier est fini, le diviseur Q considéré est dans un ensemble fini de polynomes d’interpolation basés sur 0 et 1 et de valeurs tous les couples

Tri des éléments du jeu de données par les distances dans l’ordre croissant Sélection des k voisins les plus proches : ce sont les k premiers éléments triés à