• Aucun résultat trouvé

Chapitre 2 Autour de l’algorithme d’Euclide ; r´ecursivit´e et invariant de boucle

N/A
N/A
Protected

Academic year: 2022

Partager "Chapitre 2 Autour de l’algorithme d’Euclide ; r´ecursivit´e et invariant de boucle"

Copied!
5
0
0

Texte intégral

(1)

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

(2)

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

i

le i

ieme

op´ erande de la liste A ; B ← (0, 1, b) ; //On notera B

i

le i

ieme

op´ erande de la liste B ; reste ← b;

tantque reste6=0 faire

q ← le quotient de A

3

par 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 )

(3)

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

i

est non nul : r

i+1

= r

i−1

− q

i

.r

i

o` u q

i

est le quotient de la division Euclidienne de r

i−1

par 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

i

et v

i+1

= v

i−1

− q

i

.v

i

tant que r

i

est non nul, v´ erifient la relation suivante :

u

i

.a + v

i

.b = r

i

pour 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≥1

et (v

i

)

N≥i≥1

sont de signe altern´ e et (|u

i

|)

N≥i≥1

et (|v

i

|)

N≥i≥1

sont 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

(4)

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

n

b ≤ 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

1

cr´ 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

k

x

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

n

en fonction du cas c = 1.

1. r´ef : D. Knuth : The art of computer programming : chapter 3 (tout d´ebut du vol 2)

(5)

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

e

s’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

n

par 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−1

les m caract` eres

2

de la chaˆıne point´ ee par a, et b

0

. . . b

n−1

ceux 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−1

par 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−1

modulo q (respectivement de ((. . . (((b

0

.d + b

1

).d + b

2

).d + b

3

) . . .).d + b

m−2

).d + b

m−1

modulo 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−1

et b

0

. . . b

m−1

sont diff´ erentes.

- Pour s variant de 0 ` a n − m :

* Si t = p alors on compare les chaines a

0

. . . a

m−1

et b

s

. . . b

m+s−1

, et si elles co¨ıncidents, on affiche que la chaine a

0

. . . a

m−1

apparait ` 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+m

par q.

2. que l’on identifiera dans les calculs a des entiers entre 0 et 255

Références

Documents relatifs

On admettra comme op´eration ´el´ementaire une op´eration arithm´etique, une affectation, une comparaison (´evaluation d’une expression bool´eenne), l’affichage d’un

admettra comme op´eration ´el´ementaire une op´eration arithm´etique, une affectation, une comparaison (´evaluation d’une expression bool´eenne), l’affichage d’un

En d´eduire une fonction qui teste si deux tableaux d’entiers contiennent les mˆemes ´el´elments, sans tenir compte de l’ordre dans lequel les ´el´ements

En d´eduire une fonction qui teste si deux tableaux d’entiers contiennent les mˆemes ´el´elments, sans tenir compte de l’ordre dans lequel les ´el´ements

Sachant que le syst` eme a fonctionn´ e d´ ej` a pendant 1000 h, quelle est la probabilit´ e qu’il fonctionne encore pendant au moins 2000 h suppl´ ementaires5. Pour n = 2, calculer

On modelise les dur´ ees de vie de ces composants (exprim´ ees en heures) par des variables al´ eatoires T 1 et T 2 ind´ ependantes et de mˆ eme loi exponentielle de param` etre λ,

[r]

[r]