T.P. 7 : algorithmes pour l’arithm´etique
1 Autour de l’algorithme d’Euclide
1.1 L’algorithme d’Euclide usuel
Ecrire une fonction Euclide qui re¸coit deux arguments aet bsuppos´es de type integer et renvoie
le pgcd de aet bcalcul´e par l’algorithme d’Euclide.
1.2 L’algorithme d’Euclide ´etendu
On consid`ere deux entiers positifs aet bavec a>b>0 et la suite (rk)d´efinie par r0=a,
r1=bet tant que rk0, rk+1est le reste de la division euclidienne de rk1par rk. On notera
rk1=qkrk+rk+1cette ´egalit´e de division euclidienne.
On note Nl’indice du dernier reste non nul, rN=pgcd(a, b).
a) Montrer par r´ecurrence (finie) que pour tout k0, N , il existe (uk, vk)Z2tels que
rk=uka+vkb. On donnera la relation de r´ecurrence v´erifi´ee par les suites (uk)et (vk).
Indication : une illustration concr`ete.
97 =5×18 +7,
18 =2×7+4,
7=1×4+3,
4=1×3+1,
3=3×1+0.
7=1×97 5×18,
4=2×97 +11 ×18,
3=3×97 16 ×18,
1=5×97 +27 ×18.
b) Ecrire une fonction Python qui prend deux arguments a,b (suppos´es entiers non nuls avec
a>b) et qui renvoie le pgcd dde aet bet des coefficients u,v tels que au +bv=d.
2 Diviseurs et test simple de primalit´e
2.1 Diviseurs
Ecrire une fonction Python diviseurs qui prend en argument un entier positif net renvoie
la liste de ses diviseurs dans N.
2.2 Premiers
Ecrire une fonction testpremier qui prend en argument un entier positif net renvoie True si
nest un nombre premier et False sinon.
2.3 Eratosth`ene
Ecrire une fonction Erato qui prend prend en param`etre un entier positif net renvoie la liste
de tous les nombres premiers dans 2, ncalcul´ee grˆace au crible d’Eratosthene (certains, peu, ont
d´ej`a dˆu le faire `a un TP de d´ebut d’ann´ee sur les listes...)
A l’aide du module time comparer l’efficacit´e de testpremier et de eratosthene pour tester
si disons deux nombres `a ... chiffres sont premiers ( `a vous de voir le bon ordre de grandeur).
3 Le test de Fermat
3.1 Exponentiation modulaire
Pour exp´erimenter le test de Fermat, nous commen¸cons par modifier l’algorithme d’exponen-
tiation 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´eduisant `a chaque ´etape le r´esultat modulo m, autrement dit, en rempla¸cant le
r´esultat `a chaque ´etape 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´e
Le petit th´eor`eme de Fermat dit que si nest un nombre premier alors pour tout aN,ana[n].
Ce th´eor`eme fournit donc une C.N. pour qu’un nombre soit premier. Si on a un atel que an/a[n],
on est sˆur que nn’est pas premier. On dira que nne 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 net un argument
facultatif a, qui sinon admet a=2 comme valeur par d´efaut, et qui teste si npasse le test
de Fermat pour tous entiers entre 2 et a, en renvoyant un bool´een.
b) Ecrire une fonction alea qui prend comme argument facultatif un nombre n, avec comme
valeur par d´efaut n=500 et qui renvoie un nombre entier impair al´eatoire `a nchiffres.
c) Fabriquer `a l’aide de la fonction pr´ec´edente une liste de 10 nombres al´eatoires `a 300 chiffres
chacun et tester la primalit´e de chacun avec le test na¨ıf de la fonction testpremier. Pour le
premier nombre pour lequel ce test prend beaucoup de temps arrˆeter la recherche et comparer
au test de Fermat pour 2,3...
3.3 Le test de Fermat et ses failles
a) D´eterminer 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 n2non premier qui v´erifie la propri´et´e que pour
tout entier aZ:ana[n].
A l’aide de la fonction pr´ec´edente, ´ecrire un programme qui donne la liste de tous les nombres
de Carmichael inf´erieurs `a 10000.
2
1 / 2 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !