TD: Algorithme d`Euclide.

publicité
TD: Algorithme d’Euclide.
1 Position du problème
Soient deux nombres a, b ∈ Z, tels que b 6= 0, on appelle division euclidienne de a par b, l’opération qui
consiste à déterminer les entiers uniques q et r tels que:
a = b × q + r avec 0 ≤ r < |b|.
L’entier q est appelé le quotient de la division euclidienne de a par b et l’entier r le reste de la division
euclidienne de a par b. “Reste” se dit remainder en anglais et modulo en latin (aussi utilisé couramment en
français mathématique).
Si deux nombres n et m admettent le même reste pour la division euclidienne par p, alors on dit que n est
congru à m modulo p.
La notion de division euclidienne dépasse le cadre des entiers, on peut définir une telle notion dans tout
anneau dit euclidien, en particulier sur les polynômes. Le reste et le quotient s’obtiennent par les fonctions Mod
et Quotient avec MAthematica et par les fonctions irem et iquo (i pour integer entier en anglais) avec
Maple.
Si un nombre b divise un nombre a, alors a = b × q et le reste de la division euclidienne de a par b est
nul. Par conséquent, si on veut tester si un nombre b divise 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 a et b est le “plus grand commun diviseur” de a et b.
Il existe un algorithme fondamental pour calculer le pgcd de deux entiers positifs (et même de deux
polynômes) qui s’appelle l’algorithme d’Euclide. L’idée principale de cet algorithme est que si la division
euclidienne de a par b, où a est le plus grand des deux entiers en valeur absolue, s’écrit a = b × q + r, alors le
pgcd de a et b divise aussi r et on itère le processus avec les entiers b et r qui sont plus petits que a et b (|b| ≤ |a|
et |r| < |b|). En notant r0 = a, r1 = b, on écrit la suite d’égalité:
r0 = r1 × q0 + r2
r1 = r2 × q1 + r3
... = ...
ri = ri+1 × qi + ri+2
... = ...
rn−1 = rn × qn−1 + 0.
Du fait que l’on construit une suite d’entiers positifs strictement décroissante (ri )i∈N , il existe n tel que rn+1 = 0
et alors rn est un diviseur commun à rn−1 et rn ,. . . , à ri+1 et ri+2 , à ri et ri+1 ,. . . , à r0 et r1 , donc rn est un
diviseur commun à a et b.
Par ailleurs tout diviseur commun à a et b est un diviseur commun à r0 et r1 ,. . . , d’où à rn−1 et rn , donc
en particulier est un diviseur de rn et rn est bien le plus grand diviseur commun à a et b.
1. Écrire une procédure qui calcule le pgcd de deux entiers par l’algorithme d’Euclide.
2. De la même façon, écrire une procédure qui calcule les coefficients de Bézout de deux entiers, c’est-à-dire
des entiers u et v tels que u × a + v × b = pgcd(a, b).
On rappelle que si la ième étape de l’algorithme d’Euclide s’écrit ri = qi × ri+1 + ri+2 avec r1 = a,
r2 = b et pgcd(a, b) = rn , alors les coefficients de Bézout de a et b s’obtiennent comme u1 et v1 , où ui et vi
sont définis par la récurrence: un−2 = 1, vn−2 = −qn−2 , 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
Téléchargement