TD: Algorithme d`Euclide.
Transcription
TD: Algorithme d`Euclide.
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