Bonsoir,
Pour m'exercer, j'ai programmé une exponentiation modulaire qui est très efficace ( https://fr.wikipedia.org/wiki/Exponentiation_modulaire , dernière méthode exposée).
Pour résumer, il faut convertir l'exposant en binaire et en partant de la droite, faire certaines opérations si on rencontre un 0 ou 1.
Mon code semble fonctionnel (je compare le résultat avec la fonction powmod de gmpy2), cela fonctionne.
Mais cela déraille avec de plus grands nombres, mais parfois aussi avec de plus petits nombres.
Ma question est : ai-je fait une erreur quelque part ou alors c'est la conversion en binaire sur des grands nombres qui ne se fait pas correctement ?
Voici le code :
Si quelqu'un pouvait m'éclairer, merci par avance !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 import time import gmpy2 from gmpy2 import mpz a=215 b=54 c=10485 exposant=bin(b)[2:] exposant=list(exposant) base=a result=1 start=time.time() for i in range(int(len(exposant))-1,0,-1): if int(exposant[i])==0: base=pow(base,2) % c else: result = (base*result) % c base = pow(base, 2) % c end=time.time() print("Méhode 4 : ",end-start," ",result) start=time.time() nombreb=gmpy2.powmod(a,b,c) end=time.time() print("Méthode 3 : ",end-start," ",nombreb)
Partager