Nicolas Gourmelon TP n˚7
14 avril 2014 Calcul Scientifique et Symbolique avancés
Tests de primalité et algorithmes de factorisation
I. Tests de primalité et nombres de Carmichael
Les tailles des listes ne sont qu’indicatives et seront adaptées à la puissance de calcul disponible
Exercice 1 : Test de primalité de Fermat.
On veut tester la primalité d’un nombre entier n. On rappelle informellement le test de Fermat :
(a) Choisir une liste Lde tnombres à interroger on peut les choisir aléatoirement ou choisir les quelques
premiers nombres premiers (par exemple de 2à17).
(b) Soit ale premier témoin non encore interrogé de la liste L. Vérifier que aest premier avec n, sinon
retourner "ncomposé".
(c) Calculer b=anmod nà l’aide de l’exponentiation modulaire rapide. Si b6=a, alors retourner "n
composé", sinon retourner à l’étape (b).
(d) Si parvient à épuisement de la liste L, sans rencontrer la condition d’arrêt, déclarer "npremier
probable".
1. Ecrire un algorithme Fermat(n,t) testant la primalité d’un nombre npar le test de Fermat avec une
liste Lde ttémoins. On utilisera un algorithme d’exponentiation modulaire rapide et on pourra utiliser
la fonction de Python
sage: randint(0,100)
2. Donner une majoration du coût de cet algorithme.
3. Dresser la liste des 1000 premiers nombres premiers probables ainsi obtenus pour t=10.
4. Comparer les listes des 10000 premiers nombres premiers probables avec L=[2], puis L=[2,3].
5. Extraire de cette dernière liste celle des nombres non premiers, en utilisant par exemple la fonction
is_prime.
Exercice 2 : Test de primalité de Rabin-Miller.
On veut tester la primalité d’un nombre entier n. On rappelle l’algorithme de Rabin-Miller :
(a) Déterminer les entiers k, m Ntels que n1 = 2kmet mimpair.
(b) Choisir une liste Lde tnombres (témoins) à interroger on peut les choisir aléatoirement ou choisir
les quelques premiers nombres premiers (par exemple de 2à17).
(c) Soit ale premier témoin non encore interrogé de la liste L. Vérifier que aest premier avec n, sinon
retourner "ncomposé".
(d) Calculer b=ammod nà l’aide de l’exponentiation modulaire rapide. Si b= 1 ou b=1mod n
alors retourner à l’étape (c). Puis calculer les puissances successives b`=a2`mmod npour 16
`6k1jusqu’à ce que l’une d’entre elle soit égale à 1mod n, et dans ce cas retourner à l’étape
(c). Si b`6=1mod npour tout `, alors retourner "ncomposé".
En pratique, on définit b0=ammod n, puis récursivement b`+1 =b2
`.
(e) Si on parvient à épuisement de la liste Lsans rencontrer la condition d’arrêt, déclarer "npremier
probable".
1. Ecrire un algorithme Rabin_Miller(n,t) testant la primalité d’un nombre npar le test de Rabin-
Miller, à l’aide d’une liste de tnombres engendrés aléatoirement.
2. Donner une majoration du coût de cet algorithme
3. Dresser la liste des 1000 premiers nombres premiers probables ainsi obtenus pour t= 5.
1
4. Dresser la liste des 10000 premiers nombres premiers probables ainsi obtenus avec L=[2],L=[2,3],
puis L=[2,3,5].
5. En utilisant l’algorithme is_prime comme référence, déterminer la liste des "faux nombres premiers"
61500000 ainsi obtenus avec L=[2,3,5].
6. Comparer le coût de l’algorithme Rabin_Miller et celui de is_prime. Pour cela on considèrera les
fonctions RM (s)et IP (s)qui à sassocient les coût moyens d’execution des algorithmes de Rabin_Miller
et is_prime, repectivement, pour des entiers naléatoires à schiffres.
On pourra déterminer expérimentalement RM(s)en choisissant aléatoirement 20 entiers entre 10set
10s+1 et en faisant la moyenne des temps d’exécution de Rabin_Miller, en utilisant timeit.
7. Comparer les coûts des tests de Rabin_Miller et Lucas_Lehmer pour les nombres de Mersenne.
Remarque : En prenant pour Lla liste des nombres premiers 617, Pomerance, Selfridge, Wagstaff et
Jaeschke ont montré que le test de Rabin-Miller est déterministe pour tous les nombres inférieurs ou
égaux à 341 550 071 728 321.
Exercice 3 : Nombres de Carmichael.
Etant donné un nombre de Carmichael n, alors que tout nombre apremier à nest un menteur de Fermat,
les menteurs de Rabin-Miller ne représentent pas plus d’un quart des nombres 1< a < n. La probabilité
qu’un nombre de Carmichael soit déclaré premier par le test de Rabin-Miller en interrogeant tnombres
est donc 64t.
1. En appliquant le théorème de Korselt, et à l’aide de la fonction factor de Sage, écrire un test
carmichael déterministe qui à un entier nrenvoie true si et seulement si ce nombre est de Carmichael.
La fonction factor renvoie une chaine de caractères, mais on peut facilement le convertir en liste par coercicion.
Essayer :
sage: list(factor(3473729))
2. En utilisant les tests de Rabin-Miller et en adaptant le test de Fermat, écrire un test probabiliste
carm_proba testant si un entier nest de Carmichael. (Attention ! Le test de Fermat peut exclure des
nombres de Carmichael nsi le témoin an’est pas premier à n)
Remarque : La factorisation est très coûteuse, la méthode probabiliste devrait donc être beaucoup plus
rapide que la déterministe.
II. Factorisation dans Z
Exercice 4 : Méthode ρde Pollard
1. Ecrire un algorithme facteur qui à un entier nassocie un facteur non trivial de n, en utilisant
la méthode ρde Pollard. (On pourra utiliser l’algorithme de Rabin-Miller pour exclure rapidement les
nombres probablement premiers).
2. En déduire un algorithme factorisation qui à un entier nassocie sa décomposition en facteurs
premiers sous la forme d’une chaine de caractères :
’n=p^a*q^b*r^c...’
3. Comparer l’efficacité moyenne de cet algorithme à factor sur des produits de grands nombres premiers.
4. En considérant les produits n=pq de deux nombres premiers, avec p<q, comparer le temps de calcul
moyen de l’algorithme à pen itérant par différentes fonctions f(x) = x2+c, où c6= 0,2.
Exercice 5 : Méthode p1de Pollard
2
La méthode p1de Pollard permet de trouver un diviseur non-trivial d’un entier nrapidement sous
l’hypothèse qu’il existe un facteur premier pde ntel que p1ait des petits facteurs premiers.
Définiton : Soit Bun entier. Un nombre sest dit B-ultrafriable (ou B-powersmooth en anglais) si et
seulement si pour tout pifacteur de savec ppremier, pi6B.
Soient Bet ndeux entiers. Supposons que nadmet un facteur premier ptel que p1soit B-ultrafriable.
Alors en particulier p1divise
k0=ppcm(1, ..., B)
=Y
pipremier, αiplus grand entier
tel que pαi
i6B
pαi
i
D’après le petit théorème de Fermat, ap1= 1 mod pdonc ak0= 1 mod pet donc ak01multiple de p.
En particulier,
g= (ak01) n>p.
Si p1est B-ultrafriable pour tout facteur pde nalors ak01est multiple de net g=nne donne
aucune information sur les facteurs de n. A l’inverse, si g= 1 alors p1n’est B-ultrafriable pour aucun
facteur premier pde n.
Si choisit Btel que p1est B-ultrafriable pour certains facteurs pde n, mais pas tous, alors gdonne
probablement un facteur non trivial de n(il se peut qu’il faille changer de a).
L’algorithme peut se résumer ainsi :
(a) fixer Bet définir k0. Choisir 1< a < n au hasard.
(b) Si h=an6= 1 alors retourner le facteur non trivial hde n.
(c) Calculer m=ak
01mod n, à l’aide d’une exponentation modulaire rapide, puis calculer
g=mn.
Si 1< g < n alors on a gagné et on retourne le facteur non trivial gde n.
Si g= 1, retourner à l’étape (a) en agrandissant B.
Si g=n, retourner à l’étape (a) en abaissant Bou en choisissant un autre a.
1. On suppose qu’un facteur premier pde nest tel que p1est B-ultrafriable. Exprimer en fonction de
Ble coût de l’algorithme, en supposant que g6=n.
2. Déterminer la liste des nombres premiers p6100000 tels que p1soit 1000-ultrafriable.
3. Implémenter l’algorithme p1de Pollard. Comparer son efficacité à celle du ρde Pollard.
3
1 / 3 100%