Exercice : Suite de Syracuse#
À faire
2025-2026
Extraire le code dans un fichier pour le compiler.
En mathématique, on appelle suite de Syracuse une suite d’entiers naturels définie de la manière suivante : On part d’un nombre entier plus grand que zéro ; s’il est pair, on le divise par 2 ; s’il est impair, on le multiplie par 3 et on ajoute 1. En répétant l’opération, on obtient une suite d’entiers positifs dont chacun ne dépend que de son prédécesseur.
Par exemple, à partir de 14, on construit la suite des nombres : \(14, 7, 22, 11, 34, 17,\) \(52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 4, 2\dots\). C’est ce qu’on appelle la suite de Syracuse du nombre 14.
Lorsque le nombre \(1\) a été atteint, la suite des valeurs \(1, 4, 2, 1, 4, 2\dots\) se répète indéfiniment en un cycle de longueur 3, appelé cycle trivial.
Dans un nouveau fichier, définissez la procédure
syracuse
qui prend en paramètre une variable contenant un terme de la suite, calcule le terme suivant et le range dans la même variable.BEGIN SOLUTION
void syracuse(int &u) { if (u % 2 == 0) u = u / 2; else u = 3 * u + 1; }
END SOLUTION
Dans le terminal, tapez la commande
git add
suivie du nom de votre fichier, afin que votre fichier soit pris en compte dans les futures soumissions de votre TP. Ceci est à faire à chaque fois que vous créez un nouveau fichier, nous ne le rappellerons plus dans la suite.La fonction suivante calcule le nombre de fois qu’il faut itérer la suite pour arriver sur \(1\), à partir d’un \(u_n\) donné.
int longueurTransient (int un){ int i=0; while (un != 1) { syracuse(un); i++; } return i; }
Cette fonction pourrait ne pas être définie pour tous les entiers. La conjecture de Syracuse dit qu’elle l’est, mais personne ne l’a jamais démontré! Écrivez un programme principal qui calcule cette fonction
longueurTransient
sur les nombres de 1 à 1000, et affiche le résultat, pour étudier son comportement.BEGIN SOLUTION
void main() { for (int i = 1; i < 1000; i++) cout << longeurTransient(i) << ", "; }
END SOLUTION