Exercice Python
Approche de résolution proposé par Souvenir MEGNIGBETO. Vos commentaires et idées
d'améliorations sont les bienvenus sur le discord: [Link] Vous
pourrez toujours proposer une version R du code!
Suite de Syracuse
On considère la suite de syracuse définie par U0 = v et
Un+1 = Un /2 si Un est pair
Un+1 = 3Un + 1 sinon
On a vérifié numériquement jusqu'à v = 2
62
, que quelque soit la valeur initiale v, la suite
fini par prendre les valeurs 1, 4, 2, 1, 4, 2, ...
Ecrire une fonction qui calcul un terme de la suite en fonction du terme précédent.
Ecrire une fonction qui calcul et affiche en fonction de n et de la valeur initiale vles n
premiers termes de la suite U0 , U1 , . . . , Un−1
Définir une fonction qui détermine en fonction de la valeur initiale v, la longueur du
"vol de syracuse", c'est à dire le premier indice n pour lequel Un = 1 .
Enfin, écrire un programme qui trouve toutes les longueurs des plus longs vols pour
les valeurs initiales v de 3 à 100000. Le programme doit afficher tous les couples
(v, d) où d est la longueur du vol de Syracuse pour la valeur initiale v si d est
strictement supérieur à la longueur de tous les vols précédents.
1. Fonction de calcul d'un terme de la suite en fonction du terme précédent
In [ ]: def syracuseTerme(preced):
if(preced%2 == 0):
actuel = int(preced/2)
else:
actuel = 3*preced + 1
return actuel
In [ ]: syracuseTerme(52)
Out[ ]: 26
2. Calcul des n premiers termes de la suite en fonction de la valeur initial et de v
In [ ]: def nTermesSyracuse(v,n):
u = []
[Link](v)
for i in range(1,n):
[Link](syracuseTerme(u[i-1]))
return u
In [ ]: nTermesSyracuse(17,18)
Out[ ]: [17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1, 4, 2]
3. Fonction pour déterminer le vol de syracuse
In [ ]: def vol(v):
i=0
u = v
while u!=1:
i = i+1
u = syracuseTerme(u)
return(i)
In [ ]: vol(17)
Out[ ]: 12
4. Affichage des plus long vols avec v entre 3 et 100000
In [ ]: d = vol(3)
print((3,d))
for v in range(3,100000):
if vol(v) > d:
d=vol(v)
print((v,d))
(3, 7)
(6, 8)
(7, 16)
(9, 19)
(18, 20)
(25, 23)
(27, 111)
(54, 112)
(73, 115)
(97, 118)
(129, 121)
(171, 124)
(231, 127)
(313, 130)
(327, 143)
(649, 144)
(703, 170)
(871, 178)
(1161, 181)
(2223, 182)
(2463, 208)
(2919, 216)
(3711, 237)
(6171, 261)
(10971, 267)
(13255, 275)
(17647, 278)
(23529, 281)
(26623, 307)
(34239, 310)
(35655, 323)
(52527, 339)
(77031, 350)