Chapitre 2
Autour de l’algorithme d’Euclide ; r´ ecursivit´ e et invariant de boucle
Dans ce chapitre on va mettre l’accent sur l’´ ecriture des algorithmes et leur justification (l’al- gorithme se termine et produit le bon r´ esultat).
2.1 Deux versions de l’algorithme d’Euclide
Proposition 2.1.1 Soient : a ∈ Z
/, b ∈ Z
/. On a pour tout m ∈ Z
/: P GCD(a, b) = P GCD(b, a − mb) .
On peut en particulier appliquer la proposition pr´ ec´ edente au cas o` u m = q est le quotient dans la division euclidienne de a par b.
Entr´ ee: Deux entiers : a, b;
Sortie: Un entier pgcd de a et b;
Fonction PGCD(a, b) ; a ← |a| ; b ← |b| ; si b > a alors
a ↔ b;
fsi
r ← a mod b (reste de la division euclidienne) ; si r est nul alors
retourner b;
sinon
retourner PGCD(b, r);
fsi
Algorithm 1: Algorithme d’Euclide, forme r´ ecursive Entr´ ee: Deux entiers : a, b;
Sortie: Un entier pgcd de a et b;
Fonction PGCD(a, b) ; a ← |a| ; b ← |b| ; si b > a alors
a ↔ b;
fsi
tantque b est non nul faire
r ← a mod b (reste de la division euclidienne) ; a ← b ;b ← r;
ftantque retourner a;
Algorithm 2: Algorithme d’Euclide, forme imp´ erative
On dispose aussi d’une variante binaire de cet algorithme, qui permet d’´ eviter les divisions en les rempla¸cant par des op´ erations de d´ ecalage.
Entr´ ee: Deux entiers : a, b avec b ≥ 3 impair et a > 0;
Sortie: Un entier pgcd de a et b;
Fonction PGCD(a, b) ; tantque a 6= b faire
si a pair alors
a ← a/2 ; (On pourra utiliser le d´ ecalage binaire);
sinon
si a > b alors a ← a − b
2 ; sinon
r ← b − a 2 b ← a ; a ← r;
fsi fsi ftantque retourner a;
Algorithm 3: Algorithme d’Euclide, version binaire imp´ erative Exercice 2.1.2 Am´ eliorer l’algorithme binaire au cas b > 0 de parit´ e quelconque.
2.2 Algorithme d’Euclide ´ etendu aux coefficients de Be- zout
Proposition 2.2.1 Soient : a ∈ Z
/, b ∈ Z
/, d = P GCD(a, b). Il existe deux entiers u et v tels que d = ua + vb.
Entr´ ee: 2 entiers a et b
Sortie: Une liste de 3 entiers : (u, v, d) tels que a.u + v.b = d Fonction Bezout(a, b);
A ← (1, 0, a) ; //On notera A
ile i
iemeop´ erande de la liste A ; B ← (0, 1, b) ; //On notera B
ile i
iemeop´ erande de la liste B ; reste ← b;
tantque reste6=0 faire
q ← le quotient de A
3par reste;
temp ← A − q × B;
A ← B;
B ← temp;
reste ← B
3; ftantque retourner A
Algorithm 4: algorithme d’Euclide ´ etendu : version imp´ erative
Exercice 2.2.2 Programmez cet algorithme en Python et sous Xcas, en utilisant des listes. Affichez le nombre de tours effectu´ es.
La version r´ ecursive sous xcas avec la syntaxe de type algorithmique : (giac/xcas)
fonction b e z o u t r ( a , b )
// r e n v o i e l a l i s t e [ u , v , d ] t e l l e que a∗u+b∗v=d=p g c d ( a , b ) ( f c t r e c u r s i v e )
l o c a l l b , q , r ; s i ( b ! = 0 ) a l o r s
q:= i q u o ( a , b ) ; r := i r e m ( a , b ) ; l b := b e z o u t r ( b , r ) ;
retourne( [ l b [ 1 ] , l b [0]+(−q )∗l b [ 1 ] , l b [ 2 ] ] ) ; sinon
retourne( [ 1 , 0 , a ] ) ; f s i;
f f o n c t i o n;
ou avec la syntaxe traditionnelle (cf le menu exemples d’xcas) : (giac/xcas)
b e z o u t r ( a , b ) : ={
// r e n v o i e l a l i s t e [ u , v , d ] t e l l e que a∗u+b∗v=d=p g c d ( a , b ) ( f c t r e c u r s i v e ) l o c a l l b , q , r ;
i f ( b ! = 0 ) { q:= i q u o ( a , b ) ; r := i r e m ( a , b ) ; l b := b e z o u t r ( b , r ) ;
return( [ l b [ 1 ] , l b [0]+(−q )∗l b [ 1 ] , l b [ 2 ] ] ) ; }
e l s e
return( [ 1 , 0 , a ] ) ;// l o r s q u ’ i l n ’ y a qu ’ une l i g n e , p a s b e s o i n d e s {}
}: ;// l e : ; permet de ne p a s a f f i c h e r l e programme a p r e s l ’ a v o i r v a l i d\’ e
Proposition 2.2.3 On consid` ere deux entiers a, b et l’on pose : r
0= a et r
1= b. On d´ efinit par r´ ecurrence tant que r
iest non nul : r
i+1= r
i−1− q
i.r
io` u q
iest le quotient de la division Euclidienne de r
i−1par r
i. 0n pose u
0= 1, u
1= 0 et v
0= 0, v
1= 1. Alors les suites (u
i, v
i) d´ efinies par
u
i+1= u
i−1− q
i.u
iet v
i+1= v
i−1− q
i.v
itant que r
iest non nul, v´ erifient la relation suivante :
u
i.a + v
i.b = r
ipour toute les valeurs de i o` u elles sont d´ efinies.
Exercice 2.2.4 Notons N le nombre d’it´ erations de l’algorithme d’Euclide. Alors les suites (u
i)
N≥i≥1et (v
i)
N≥i≥1sont de signe altern´ e et (|u
i|)
N≥i≥1et (|v
i|)
N≥i≥1sont croissantes
2.3 M´ ethodes algorithmiques : L’exemple de la division eu- clidienne
Division euclidienne pour les entiers positifs
Th´ eor` eme 2.3.1 Pour a ∈ IN, b ∈ IN
∗, il existe un unique couple d’entiers (q, r) avec a = bq + r et 0 ≤ r < b.
2.3.1 M´ ethode na¨ıve :
Entr´ ee: a ≥ 0 et b > 0 ; q ← 0 ; r ← a;
tantque r > b faire r ← r − b;
q ← q + 1;
ftantque
retourner q et r;
Algorithm 5: Division euclidienne, m´ ethode na¨ıve
Le nombre de boucle de cet algorithme est q ; ` a chaque ´ etape il y a une soustraction et une comparaison ; pour b fix´ e la complexit´ e croˆıt lin´ eairement avec a.
Remarque 2.3.2 Si on mesure la taille de l’entier a par le nombre de chiffres de son d´ eveloppement en binaire : t = log
2(a), alors la complexit´ e croˆıt exponentiellement avec la taille de a.
2.3.2 Recherche dichotomique
Entr´ ee: a ≥ 0 et b > 0 ;
Sortie: Le quotient et le reste de la division de a par b n ← 0 ;
tantque 2
nb ≤ a faire n ← n + 1;
ftantque
α ← 2
n−1;β ← 2
n;
pour k de 1 jusque n − 1 faire γ = α + β
2 ; si γb ≤ a alors
α ← γ ; sinon
β ← γ ; fsi
fpour
retourner q = α et r = a − bq ;
Algorithm 6: Division euclidienne, recherche dichotomique Exercice 2.3.3 Ecrire un algorithme qui ´ evite la multiplication.
Exercice 2.3.4 Comparez avec la m´ ethode que vous utilisez ` a la main.
Division euclidienne pour les entiers relatifs
Th´ eor` eme 2.3.5 Pour a ∈ Z
/, b ∈ Z
/ ∗, il existe un unique couple d’entiers (q, r) avec a = bq + r et 0 ≤ r < |b|.
Exercice 2.3.6 Modifier si besoin les algorithmes pr´ ec´ edents pour effectuer la division euclidienne des entiers relatifs.
2.3.3 Applications : Fonctions pseudo al´ eatoires
Nous voulons
1cr´ eer une fonction pseudo al´ eatoire grˆ ace ` a une suite r´ ecurrente. Probl´ ematique : comportement statistique semblable ` a celui d’une loi uniforme, rapidit´ e, et contrˆ ole des mauvais cas.
C’est souvent dangereux de prendre une fonction compliqu´ ee qui ne permette pas d’analyser le comportement de la suite. Nous allons donc essayer prendre des congruences lin´ eaires : x
n+1= a.x
n+ c [m].
On supposera a > 1. On pose alors b = a − 1. On remarquera que x
n+k= a
kx
n+ (a
k− 1)c/b [m]
et que x
n= Ay
n+ 1[m] o` u y
0= 0, y
n+1= ay
n+ 1 [m] et A = ax
0+ c [m], ce qui permet de calculer simplement x
nen fonction du cas c = 1.
1. r´ef : D. Knuth : The art of computer programming : chapter 3 (tout d´ebut du vol 2)
Th´ eor` eme 2.3.7 Soit x
0= 0, x
n+1= a.x
n+ c [m], alors (x
n) est de p´ eriode maximale (m) si et seulement si c est premier avec m, et a = 1[d] pour tout diviseur d de m tel que d soit premier impair ou 4. Dans ce cas, a est un ´ el´ ement du groupe multiplicatif de Z
//(a − 1)mZ
/et la p´ eriode est l’ordre de a dans ce groupe.
Nous cherchons maintenant un m ` a la fois bon pour le comportement al´ eatoire et pour le temps de calcul. On prend donc m proche de la taille w d’un mot de l’ordinateur. Ex m proche de 2
es’il travaille sur e-bits.
Exercice 2.3.8 Pour simplifier ici on travaillera en base 10. Montrons maintenant que le choix de m = w est mauvais. Etudier la r´ epartition des 2 derniers chiffres de x
npar rapport aux 2 premiers lorsque l’on prend m = 10
4. Etudier aussi le dernier chiffre.
(giac/xcas)
x : = 1 ; a : = 2 3 7 ; c : = 5 4 3 2 1 ;m: = 1 0 ˆ 4 ; l : = [ ] ;
for( j : = 0 ; j<500; j ++){x := i r e m ( a∗x+c ,m) ; l : = [ op ( l ) , x ]}; //NB: op ( l ) e n l e v e l e s [ ] a l . // Sinon , on p e u t a u s s i u t i l i s e r l ’ i n s t r u c t i o n l := augment ( l , x )
l 1 : = [ s e q ( i r e m ( j , 1 0 ˆ 2 ) , j= l ) ] ; // l a l i s t e d e s 2 d e r n i e r s c h i f f r e s l 2 : = [ s e q ( t r u n c ( j / 1 0 ˆ 2 ) , j= l ) ] ; // l a l i s t e d e s 2 p r e m i e r s c h i f f r e s
// Pour une e t u d e s t a t i s t i q u e , i l f a u t r e g r o u p e r l e s d o n n e e s en c l a s s e s .
h i s t o g r a m ( c l a s s e s ( l 1 , 0 , 5 ) ) ; // Par e x e m p l e on p r e n d i c i l e s c l a s s e s de l a r g e u r 5 h i s t o g r a m ( c l a s s e s ( l 2 , 0 , 5 ) ) ; // h i s t o g r a m donne l e s a i r e s
d i a g r a m m e b a t o n s ( c l a s s e s ( l 1 , 0 , 5 ) ) ; // Le diagramme en b a t o n s donne l e s e f f e c t i f s d i a g r a m m e b a t o n s ( c l a s s e s ( l 2 , 0 , 5 ) ) ;
l 1 : = [ s e q ( i r e m ( j , 1 0 ) , j= l ) ] ;
h i s t o g r a m ( c l a s s e s ( l 1 , 0 , 1 ) ) ; // l a l i s t e du d e r n i e r c h i f f r e d i a g r a m m e b a t o n s ( c l a s s e s ( l 1 , 0 , 1 ) ) ;
2.3.4 Applications : Recherche d’une sous chaˆıne
Nous allons maintenant cr´ eer une fonction qui affiche toutes les positions o` u les m premiers caract` eres de la chaine a apparaissent cons´ ecutivement dans les n premiers caract` eres de la chaine b. Ces chaines ´ etant de longueurs respectives au moins m et n. L’algorithme est donn´ e dans les questions suivantes :
On note a
0. . . a
m−1les m caract` eres
2de la chaˆıne point´ ee par a, et b
0. . . b
n−1ceux de b.
- On d´ efinit les variables d et q de type entier, affect´ ees des valeurs 256 et 4194319.
- On d´ efinit des variables p, t, h de type entier affect´ ees des valeurs 0, 0 et du reste de la division de d
m−1par q.
- On calcule it´ erativement en utilisant la variable p (respectivement t) la valeur de ((. . . (((a
0.d + a
1).d + a
2).d + a
3) . . .).d + a
m−2).d + a
m−1modulo q (respectivement de ((. . . (((b
0.d + b
1).d + b
2).d + b
3) . . .).d + b
m−2).d + b
m−1modulo q)
Les 2 valeurs pr´ ec´ edentes ´ etant maintenant stock´ ees dans p et t. On remarque que la condition p 6= t implique que les chaines a
0. . . a
m−1et b
0. . . b
m−1sont diff´ erentes.
- Pour s variant de 0 ` a n − m :
* Si t = p alors on compare les chaines a
0. . . a
m−1et b
s. . . b
m+s−1, et si elles co¨ıncidents, on affiche que la chaine a
0. . . a
m−1apparait ` a la position s dans b.
* On d´ ecale t ce qui revient ` a faire : t re¸coit le reste de la division euclidienne de d ∗ (t − b
s.h) + b
s+mpar q.
2. que l’on identifiera dans les calculs a des entiers entre 0 et 255