TP n˚7

publicité
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 L de t nombres à interroger on peut les choisir aléatoirement ou choisir les quelques
premiers nombres premiers (par exemple de 2 à 17).
(b) Soit a le premier témoin non encore interrogé de la liste L. Vérifier que a est premier avec n, sinon
retourner "n composé".
(c) Calculer b = an mod n à l’aide de l’exponentiation modulaire rapide. Si b 6= 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 "n premier
probable".
Ecrire un algorithme Fermat(n,t) testant la primalité d’un nombre n par le test de Fermat avec une
liste L de t témoins. On utilisera un algorithme d’exponentiation modulaire rapide et on pourra utiliser
la fonction de Python
1.
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].
Extraire de cette dernière liste celle des nombres non premiers, en utilisant par exemple la fonction
is_prime.
5.
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 ∈ N tels que n − 1 = 2k m et m impair.
(b) Choisir une liste L de t nombres (témoins) à interroger on peut les choisir aléatoirement ou choisir
les quelques premiers nombres premiers (par exemple de 2 à 17).
(c) Soit a le premier témoin non encore interrogé de la liste L. Vérifier que a est premier avec n, sinon
retourner "n composé".
(d) Calculer b = am mod n à l’aide de l’exponentiation modulaire rapide. Si b = 1 ou b = −1 mod n
`
alors retourner à l’étape (c). Puis calculer les puissances successives b` = a2 m mod n pour 1 6
` 6 k − 1 jusqu’à ce que l’une d’entre elle soit égale à −1 mod n, et dans ce cas retourner à l’étape
(c). Si b` 6= −1 mod n pour tout `, alors retourner "n composé".
En pratique, on définit b0 = am mod n, puis récursivement b`+1 = b2` .
(e) Si on parvient à épuisement de la liste L sans rencontrer la condition d’arrêt, déclarer "n premier
probable".
Ecrire un algorithme Rabin_Miller(n,t) testant la primalité d’un nombre n par le test de RabinMiller, à l’aide d’une liste de t nombres engendrés aléatoirement.
1.
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
Dresser la liste des 10000 premiers nombres premiers probables ainsi obtenus avec L=[2], L=[2,3],
puis L=[2,3,5].
4.
En utilisant l’algorithme is_prime comme référence, déterminer la liste des "faux nombres premiers"
6 1500000 ainsi obtenus avec L=[2,3,5].
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 à s associent les coût moyens d’execution des algorithmes de Rabin_Miller
et is_prime, repectivement, pour des entiers n aléatoires à s chiffres.
On pourra déterminer expérimentalement RM (s) en choisissant aléatoirement 20 entiers entre 10s et
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 L la liste des nombres premiers 6 17, 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 a premier à n est 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 t nombres
est donc 6 4−t .
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 n renvoie 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))
En utilisant les tests de Rabin-Miller et en adaptant le test de Fermat, écrire un test probabiliste
carm_proba testant si un entier n est de Carmichael. (Attention ! Le test de Fermat peut exclure des
nombres de Carmichael n si le témoin a n’est pas premier à n)
2.
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 n associe 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).
En déduire un algorithme factorisation qui à un entier n associe sa décomposition en facteurs
premiers sous la forme d’une chaine de caractères :
2.
’n=p^a*q^b*r^c...’
3.
Comparer l’efficacité moyenne de cet algorithme à factor sur des produits de grands nombres premiers.
En considérant les produits n = pq de deux nombres premiers, avec p < q, comparer le temps de calcul
√
moyen de l’algorithme à p en itérant par différentes fonctions f (x) = x2 + c, où c 6= 0, −2.
4.
Exercice 5 : Méthode p − 1 de Pollard
2
La méthode p − 1 de Pollard permet de trouver un diviseur non-trivial d’un entier n rapidement sous
l’hypothèse qu’il existe un facteur premier p de n tel que p − 1 ait des petits facteurs premiers.
Définiton : Soit B un entier. Un nombre s est dit B-ultrafriable (ou B-powersmooth en anglais) si et
seulement si pour tout pi facteur de s avec p premier, pi 6 B.
Soient B et n deux entiers. Supposons que n admet un facteur premier p tel que p − 1 soit B-ultrafriable.
Alors en particulier p − 1 divise
k0 = ppcm(1, ..., B)
Y
=
pi
i
pα
i
premier, αi plus grand entier
i 6B
tel que pα
i
D’après le petit théorème de Fermat, ap−1 = 1 mod p donc ak0 = 1 mod p et donc ak0 − 1 multiple de p.
En particulier,
g = (ak0 − 1) ∧ n > p.
Si p − 1 est B-ultrafriable pour tout facteur p de n alors ak0 − 1 est multiple de n et g = n ne donne
aucune information sur les facteurs de n. A l’inverse, si g = 1 alors p − 1 n’est B-ultrafriable pour aucun
facteur premier p de n.
Si choisit B tel que p − 1 est B-ultrafriable pour certains facteurs p de n, mais pas tous, alors g donne
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 B et définir k0 . Choisir 1 < a < n au hasard.
(b) Si h = a ∧ n 6= 1 alors retourner le facteur non trivial h de n.
(c) Calculer m = ak0 − 1 mod n, à l’aide d’une exponentation modulaire rapide, puis calculer
g = m ∧ n.
— Si 1 < g < n alors on a gagné et on retourne le facteur non trivial g de n.
— Si g = 1, retourner à l’étape (a) en agrandissant B.
— Si g = n, retourner à l’étape (a) en abaissant B ou en choisissant un autre a.
On suppose qu’un facteur premier p de n est tel que p − 1 est B-ultrafriable. Exprimer en fonction de
B le coût de l’algorithme, en supposant que g 6= n.
1.
2.
Déterminer la liste des nombres premiers p 6 100000 tels que p − 1 soit 1000-ultrafriable.
3.
Implémenter l’algorithme p − 1 de Pollard. Comparer son efficacité à celle du ρ de Pollard.
3
Téléchargement