Adloun

Python (école d'ingénieur) · Chapitre 6 · Exercice

Preuve par invariant et complexité

Complexité algorithmique

Énoncé

On considère l'algorithme itératif suivant qui calcule la factorielle d'un entier :

def factorielle(n):
    i, f = 1, 1
    while i <= n:
        f = f * i
        i = i + 1
    return f
  • Énoncer un invariant de la boucle.
  • Prouver la correction partielle de l'algorithme à l'aide de cet invariant.
  • Démontrer sa terminaison et donner sa complexité temporelle et spatiale.

Corrigé

  • Invariant de boucle : Proposons la propriété suivante : à l'entrée de la boucle while, la variable stocke le produit des entiers de 1 à , c'est-à-dire :
  • Preuve de correction :
  • Initialisation : Avant la première itération, et . L'invariant donne , ce qui est vrai.
  • Conservation : Supposons l'invariant vrai à l'entrée de la boucle pour une valeur de . Durant l'itération, les variables sont mises à jour : À la fin de la boucle, nous avons bien : L'invariant est conservé.
  • Terminaison et Correction totale : La variable est initialisée à 1 et est incrémentée de 1 à chaque tour. Comme est constant, la condition de boucle finira par devenir fausse (quand ), ce qui assure la terminaison de la boucle. À la terminaison de la boucle, on a . D'après l'invariant : La fonction retourne , soit exactement . L'algorithme est correct.

Complexités :

  • Temporelle : La boucle effectue itérations. Chaque itération réalise un nombre constant d'instructions élémentaires. La complexité temporelle est : .
  • Spatiale : Seules deux variables de travail (i et f) sont utilisées en mémoire. La complexité spatiale supplémentaire est : (constante).

100 % gratuit

La suite du chapitre est sur Adloun

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →