TD: Algorithme d’Euclide.
1 Position du probl`eme
Soient deux nombres a, b Z, tels que b6= 0, on appelle division euclidienne de apar b, l’op´eration qui
consiste `a d´eterminer les entiers uniques qet rtels que:
a=b×q+ravec 0 r < |b|.
L’entier qest appel´e le quotient de la division euclidienne de apar bet l’entier rle reste de la division
euclidienne de apar b. “Reste” se dit remainder en anglais et modulo en latin (aussi utilis´e couramment en
fran¸cais math´ematique).
Si deux nombres net madmettent le mˆeme reste pour la division euclidienne par p, alors on dit que nest
congru `a mmodulo p.
La notion de division euclidienne d´epasse le cadre des entiers, on peut d´efinir une telle notion dans tout
anneau dit euclidien, en particulier sur les polynˆomes. Le reste et le quotient s’obtiennent par les fonctions Mod
et Quotient avec MAthematica et par les fonctions irem et iquo (ipour integer entier en anglais) avec
Maple.
Si un nombre bdivise un nombre a, alors a=b×qet le reste de la division euclidienne de apar best
nul. Par cons´equent, si on veut tester si un nombre bdivise un nombre a, on regarde si Mod[a,b]==0 (en
Mathematica) ou si irem(a,b)=0 (en Maple).
Le pgcd de deux nombres aet best le “plus grand commun diviseur” de aet b.
Il existe un algorithme fondamental pour calculer le pgcd de deux entiers positifs (et mˆeme de deux
polynˆomes) qui s’appelle l’algorithme d’Euclide. L’id´ee principale de cet algorithme est que si la division
euclidienne de apar b, o`u aest le plus grand des deux entiers en valeur absolue, s’´ecrit a=b×q+r, alors le
pgcd de aet bdivise aussi ret on it`ere le processus avec les entiers bet rqui sont plus petits que aet b(|b| ≤ |a|
et |r|<|b|). En notant r0=a,r1=b, on ´ecrit la suite d’´egalit´e:
r0=r1×q0+r2
r1=r2×q1+r3
. . . =. . .
ri=ri+1 ×qi+ri+2
. . . =. . .
rn1=rn×qn1+ 0.
Du fait que l’on construit une suite d’entiers positifs strictement d´ecroissante (ri)iN, il existe ntel que rn+1 = 0
et alors rnest un diviseur commun `a rn1et rn,. . . , `a ri+1 et ri+2, `a riet ri+1,. . . , `a r0et r1, donc rnest un
diviseur commun `a aet b.
Par ailleurs tout diviseur commun `a aet best un diviseur commun `a r0et r1,. . . , d’o`u `a rn1et rn, donc
en particulier est un diviseur de rnet rnest bien le plus grand diviseur commun `a aet b.
1. ´
Ecrire une proc´edure qui calcule le pgcd de deux entiers par l’algorithme d’Euclide.
2. De la mˆeme fa¸con, ´ecrire une proc´edure qui calcule les coefficients de B´ezout de deux entiers, c’est-`a-dire
des entiers uet vtels que u×a+v×b=pgcd(a, b).
On rappelle que si la i`eme ´etape de l’algorithme d’Euclide s’´ecrit ri=qi×ri+1 +ri+2 avec r1=a,
r2=bet pgcd(a, b) = rn, alors les coefficients de B´ezout de aet bs’obtiennent comme u1et v1, o`u uiet vi
sont d´efinis par la r´ecurrence: un2= 1, vn2=qn2,ui=vi+1,vi=ui+1 vi+1 ×qi.
2 Code avec Mathematica
Euclide
In[1]:= pgcd[a ,b ]:=( If[Abs[a]>Abs[b],r1=a;r2=b,r1=b;r2=a;];
While[Mod[r1,r2]!=0,r=Mod[r1,r2];r1=r2;r2=r;]; Return[r2];);
1
ISEN-Brest. Kany. TD: Algorithme d’Euclide.
In[2]:= Print[pgcd[48,56]];
8
In[3]:= Bezout[a ,b ]:=(q=Table[,{0}];
If[Abs[a]>Abs[b],r=Table[a,{1}];r=Append[r,b],r=Table[b,{1}];r=Append[r,a]]; i=1;
While[Mod[r[[i]],r[[i+1]]]!=0,
r=Append[r,Mod[r[[i]],r[[i+1]]]]; q=Append[q,Quotient[r[[i]],r[[i+1]]]]; i=i+1;];
n=i+1; u=1;TableU=Table[u,{1}]; v=-q[[n-2]];TableV=Table[v,{1}];
For[i=n-3,i>=1,i-=1,
u=TableV[[1]];v=TableU[[1]]-TableV[[1]]*q[[i]];
TableU=Prepend[TableU,u]; TableV=Prepend[TableV,v]];
Print["PGCD: ",r[[n]]];
Print["(u=",TableU[[1]],")*",r[[1]],"+(v=",TableV[[1]],")*",r[[2]],"=",
TableU[[1]]*r[[1]]+TableV[[1]]*r[[2]]];);
In[4]:= Bezout[40,72];
PGCD: 8 (u=-1)*72+(v=2)*40=8
In[5]:= Bezout[4568,41258];
PGCD: 2 (u=-219)*41258+(v=1978)*4568=2
In[6]:= Bezout[2365897,12547668];
PGCD: 1 (u=658573)*12547668+(v=-3492779)*2365897=1
In[7]:= Bezout[54648,213346694];
PGCD: 22 (u=-727)*213346694+(v=2838220)*54648=22
3 Code avec Python
# -*- coding: utf-8 -*-
Bezout(2365897, 12547668) #PGCD: 1 (u= 658573 )* 12547668 +(v= -3492779 )* 2365897 = 1
Bezout(54648, 213346694) #PGCD: 22 (u= -727 )* 213346694 +(v= 2838220 )* 54648 = 22
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 !