Adloun

La conjecture de Syracuse

Exercice supplémentaire · niveau 3 (difficile) · sciences numériques et technologie (seconde), chapitre 4 — Les boucles · La boucle non bornée : while

Énoncé

On part d'un entier n strictement positif et on répète : s'il est pair on le divise par , sinon on le remplace par . On s'arrête quand on atteint .

Écrire une fonction duree_vol(n) renvoyant le nombre d'étapes, et la tester sur , et . Pourquoi ne peut-on pas démontrer que cette boucle se termine ?

Corrigé

def duree_vol(n):
    etapes = 0
    while n != 1:
        if n % 2 == 0:
            n = n // 2
        else:
            n = 3 * n + 1
        etapes = etapes + 1
    return etapes

print(duree_vol(6))    # 8
print(duree_vol(7))    # 16
print(duree_vol(27))   # 111

Le vol de est court, celui de passe par avant de retomber.

Pourquoi on ne peut rien démontrer : dans toutes les boucles vues jusqu'ici, on exhibait une quantité entière positive strictement décroissante. Ici, la valeur diminue quand est pair mais augmente quand il est impair ; aucune quantité décroissante n'est connue.

Que la boucle s'arrête pour tout entier de départ est la conjecture de Syracuse, vérifiée par ordinateur jusqu'à des nombres gigantesques, mais non démontrée à ce jour. C'est le seul programme de ce livre dont personne ne sait prouver qu'il se termine.

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.