Bonjour à tous,
Les spécialistes de l'optimisation vont avoir de quoi faire tourner leurs neurones.
A partir de la page suivante, méthode de rho Pollard, variante Richard Brent :
http://www-lipn.univ-paris13.fr/~ban...cto/facto.html
J'ai créé ce premier code :
Temps : 0.733999967575 s
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
29
30
31
32
33 # usr/bin/env python # -*- coding: utf-8 -*- from math import sqrt,log from time import time def pgcd(a,b): while b>0: a,b=b,a%b return a tp_d=time() n=10023859281455311421 racine= sqrt(n) x,c,a,xk=1,1,1,1 k1=1 liste_x=[1] i=0 while a==1 and i < racine: i+=1 k = 2**int(log(i)/log(2))-1 x=(x**2+c)%n liste_x.append(x) if k-k1!=0: xk=liste_x[k] k1=k a=pgcd(n,abs(x-xk)) print "Le nombre",n,"se factorise ainsi :" print a,"*",n/a print print "Temps de travail :", time()-tp_d
En fait j'ai déjà écrit un premier code sur cette base http://en.wikipedia.org/wiki/Pollard%27s_rho_algorithm qui était deux fois plus rapide...
Je me suis donc dit : c'est normal, tu stockes tous les nombres dans une liste, et tu accèdes de très nombreuses fois à ladite liste, il faut trouver un moyen de se passer de la liste !
Donc, j'ai cogité et pondu ça :
Et bien : 1.54699993134 s... Encore deux fois plus lent !
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
29 # usr/bin/env python # -*- coding: utf-8 -*- from math import sqrt,log from time import time def pgcd(a,b): while b>0: a,b=b,a%b return a tp_d=time() x,a,xk,c=2,1,1,3 n=10023859281455311421 racine=sqrt(n) i=1 while a==1 and i<racine: i+=1 k=2**int(log(i)/log(2)) x=(x**2+c)%n a=pgcd(abs(x-xk),n) if k==i: xk=x print "Le nombre",n,"se factorise ainsi :" print a,"*",n/a print print "Temps de travail :", time()-tp_d
Là, je perds mon latin...
Il y a les mêmes calculs, pas de liste dans le 2nd code, un test pratiquement identique. D'où vient cette perte de temps ?
Merci d'avance,
@+
Partager