Adloun

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.