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.