La conjecture de Collatz affirme que la boucle de Syracuse s'arrête…
Exercice supplémentaire · niveau 2 · NSI (première), chapitre 3 — Langages et programmation · Ce que l'on ne sait pas décider
Énoncé
La conjecture de Collatz affirme que la boucle de Syracuse s'arrête pour tout entier . Elle n'est pas démontrée. Vérifier qu'elle tient pour tous les , relever le record de longueur de vol, et dire précisément ce que cette vérification établit et ce qu'elle n'établit pas.
Corrigé
def syracuse_vol(n):
etapes = 0
while n != 1:
if n % 2 == 0:
n = n // 2
else:
n = 3 * n + 1
etapes = etapes + 1
return etapes
record = -1
for n in range(1, 100000):
v = syracuse_vol(n)
if v > record:
record = v
champion = n
print(champion, record) # 77031 350
Le programme se termine : les valeurs atteignent bien . Le record est détenu par , avec étapes ; les précédents détenteurs sont ( étapes), () et ().
Ce que cela établit. Que la conjecture est vraie pour ces valeurs-là. Rien de plus. C'est une propriété de entiers, pas de .
Ce que cela n'établit pas. Que la boucle s'arrête pour tout . Elle a été vérifiée par ordinateur jusqu'à des valeurs de l'ordre de — sans preuve pour autant. Le programme ci-dessus est lui-même un jeu de tests : « le succès d'un jeu de tests ne garantit pas la correction », et ici « correction » veut dire « terminaison ».
Le point subtil, et il est important : si la conjecture était fausse, le programme ci-dessus ne rendrait pas un résultat faux — il ne s'arrêterait pas. On ne pourrait jamais distinguer « la boucle tourne encore » de « la boucle ne s'arrêtera jamais ». C'est exactement la difficulté de l'exercice suivant.
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.