Adloun

L'algorithme d'Euclide et son pire cas

Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 5 — Récursivité

Énoncé


(* pgcd a b renvoie le PGCD de a et b. Precondition : a >= 0, b >= 0. *)
let rec pgcd a b = if b = 0 then a else pgcd b (a mod b)

Prouver la terminaison et la correction. Quelles entrées maximisent le nombre d'appels ?

Corrigé

Terminaison. Variant : . Il est entier positif, et lors de l'appel pgcd b (a mod b) le nouveau second argument est , strictement inférieur à puisque . Le variant décroît strictement et reste positif.

Correction, par récurrence forte sur . Si , le résultat est , et . Sinon, tout diviseur commun de et divise , et réciproquement tout diviseur commun de et divise : les deux paires ont les mêmes diviseurs communs, donc le même plus grand. Par hypothèse de récurrence appliquée à , dont le variant est , la valeur rendue est bien .

Le pire cas est celui des Fibonacci consécutifs, et c'est une raison de les citer que le cours accepte : on les analyse, on ne les recommande pas. Comme , la suite des appels parcourt toute la suite de Fibonacci en descendant, sans jamais sauter d'étape. Mesuré :


pgcd(F5, F4)  = pgcd(5, 3)     : 4 appels
pgcd(F8, F7)  = pgcd(21, 13)   : 7 appels
pgcd(F12, F11)= pgcd(144, 89)  : 11 appels
pgcd(1071, 462)                : 4 appels

On lit appels pour la paire .

La complexité s'en déduit. Si demande appels avec , alors ; comme , il vient . Le nombre d'appels est donc logarithmique en la taille des entrées — et le pire cas est atteint, ce qui rend la borne exacte. C'est le théorème de Lamé, dont on vient de faire le seul calcul exigible : un encadrement élémentaire, sans théorème général, comme le demande le programme.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.