TP 7 : algorithmes pour l`arithmétique 1 Autour de l

publicité
T.P. 7 : algorithmes pour l’arithmétique
1
Autour de l’algorithme d’Euclide
1.1
L’algorithme d’Euclide usuel
Ecrire une fonction Euclide qui reçoit deux arguments a et b supposés de type integer et renvoie
le pgcd de a et b calculé par l’algorithme d’Euclide.
1.2
L’algorithme d’Euclide étendu
On considère deux entiers positifs a et b avec a > b > 0 et la suite (rk ) définie par r0 = a,
r1 = b et tant que rk ≠ 0, rk+1 est le reste de la division euclidienne de rk−1 par rk . On notera
rk−1 = qk rk + rk+1 cette égalité de division euclidienne.
On note N l’indice du dernier reste non nul, rN =pgcd(a, b).
a) Montrer par récurrence (finie) que pour tout k ∈ ⟦0, N ⟧, il existe (uk , vk ) ∈ Z2 tels que
rk = uk a + vk b. On donnera la relation de récurrence vérifiée par les suites (uk ) et (vk ).
Indication : une illustration concrète.
97 = 5 × 18 + 7,
7
= 1 × 97 − 5 × 18,
18 = 2 × 7 + 4,
4
= −2 × 97 + 11 × 18,
7 = 1 × 4 + 3,
3
= 3 × 97 − 16 × 18,
4 = 1 × 3 + 1,
1
= −5 × 97 + 27 × 18.
3 = 3 × 1 + 0.
b) Ecrire une fonction Python qui prend deux arguments a,b (supposés entiers non nuls avec
a>b) et qui renvoie le pgcd d de a et b et des coefficients u,v tels que au +bv=d.
2
2.1
Diviseurs et test simple de primalité
Diviseurs
Ecrire une fonction Python diviseurs qui prend en argument un entier positif n et renvoie
la liste de ses diviseurs dans N.
2.2
Premiers
Ecrire une fonction testpremier qui prend en argument un entier positif n et renvoie True si
n est un nombre premier et False sinon.
2.3
Eratosthène
Ecrire une fonction Erato qui prend prend en paramètre un entier positif n et renvoie la liste
de tous les nombres premiers dans ⟦2, n⟧ calculée grâce au crible d’Eratosthene (certains, peu, ont
déjà dû le faire à un TP de début d’année sur les listes...)
A l’aide du module time comparer l’efficacité de testpremier et de eratosthene pour tester
si disons deux nombres à ... chiffres sont premiers ( à vous de voir le bon ordre de grandeur).
3
3.1
Le test de Fermat
Exponentiation modulaire
Pour expérimenter le test de Fermat, nous commençons par modifier l’algorithme d’exponentiation rapide pour le faire travailler dans les anneaux de congruences (Z/nZ, +, ×).
1
Ecrire une fonction exp_mod(x,N,m) qui applique l’algorithme d’exponentiaton rapide pour
calculer xN , en réduisant à chaque étape le résultat modulo m, autrement dit, en remplaçant le
résultat à chaque étape par son reste dans la division euclidienne par m.
Remarque : La fonction Python pow fait exactement cela si on lui rentre l’argument facultatif
m. (A condition de ne pas prendre celle du module math !)
3.2
Le test de Fermat et son efficacité
Le petit théorème de Fermat dit que si n est un nombre premier alors pour tout a ∈ N, an ≡ a [n].
Ce théorème fournit donc une C.N. pour qu’un nombre soit premier. Si on a un a tel que an ≡/ a [n],
on est sûr que n n’est pas premier. On dira que n ne passe pas le test de Fermat pour la valeur a
en question et donc n’est pas premier.
a) Ecrire une fonction test_Fermat qui prend en argument un nombre n et un argument
facultatif a, qui sinon admet a=2 comme valeur par défaut, et qui teste si n ≪ passe ≫ le test
de Fermat pour tous entiers entre 2 et a, en renvoyant un booléen.
b) Ecrire une fonction alea qui prend comme argument facultatif un nombre n, avec comme
valeur par défaut n=500 et qui renvoie un nombre entier impair aléatoire à n chiffres.
c) Fabriquer à l’aide de la fonction précédente une liste de 10 nombres aléatoires à 300 chiffres
chacun et tester la primalité de chacun avec le test naı̈f de la fonction testpremier. Pour le
premier nombre pour lequel ce test prend beaucoup de temps arrêter la recherche et comparer
au test de Fermat pour 2, 3...
3.3
Le test de Fermat et ses failles
a) Déterminer la liste des nombres non premiers entre 1 et 10000 qui passent le test de Fermat
pour a = 2 puis a = 3.
b) Un nombre de Carmichael est un entier n ≥ 2 non premier qui vérifie la propriété que pour
tout entier a ∈ Z : an ≡ a [n].
A l’aide de la fonction précédente, écrire un programme qui donne la liste de tous les nombres
de Carmichael inférieurs à 10000.
2
Téléchargement