Un rang d'arrêt qu'aucune formule ne donne
Exercice d'entraînement · niveau 2 · mathématiques approfondies (ECG 1re année), chapitre 11 — Informatique et algorithmique · Boucles, arrêt et algorithmes
Énoncé
Écrire une fonction qui renvoie le plus petit entier tel que , pour un réel donné. Justifier que la boucle s'arrête, puis donner les résultats pour et .
Corrigé
Ce qu'on montre. Qu'une boucle while est le bon outil quand le nombre d'itérations n'est pas connu d'avance — et que sa terminaison se démontre, elle ne se constate pas.
Le programme.
def rang_depassement(S):
"""Plus petit n tel que 1 + 1/2 + ... + 1/n depasse S."""
n = 0
somme = 0.0
while somme <= S: # on s'arrete des que le seuil est franchi
n = n + 1
somme = somme + 1 / n
return n
print(rang_depassement(5)) # 83
print(rang_depassement(10)) # 12367
La terminaison. À la sortie de chaque tour, la variable somme contient . La série harmonique diverge : . Il existe donc un rang à partir duquel , et la condition somme <= S devient fausse : la boucle s'arrête. C'est bien la divergence, et rien d'autre, qui garantit l'arrêt — si l'on remplaçait par , la boucle tournerait indéfiniment pour tout .
Les résultats. Le programme donne pour et pour .
Ce que ces deux nombres racontent. Passer de à multiplie le rang par près de . C'est cohérent avec l'encadrement classique : franchir demande de l'ordre de , et . La croissance est exponentielle en : pour , il faudrait environ termes.
Point délicat. L'accumulation se fait en flottants, et les termes ajoutés deviennent minuscules devant la somme courante. Pour de grands , l'addition finit par ne plus rien changer et le programme boucle sans fin — non par un défaut de mathématiques, mais par un défaut d'arithmétique. Un critère d'arrêt purement numérique doit toujours être confronté à la précision de la machine.
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.