La suite de Syracuse est une suite très connue.
Elle est construite de la manière suivante :
u_0 = N \in \mathbb{N}
et pour tout n \in \mathbb{N} : \begin{cases} u_{n+1} = \frac{u_n}{2} \text{ si } n \text{ est pair} \cr \cr u_{n+1} = 3u_n+1\text{ si } n \text{ est impair} \end{cases}
La conjecture de Syracuse est la suivante :
Pour tout N \in \mathbb{N}, il existe un indice n tel que u_n=1.
On veut écrire un algorithme qui, pour N donné, renvoie le premier indice n tel que u_n=1.
Soit N = 100.
Quelle est la valeur du terme u_5 ?
On a N=100.
Donc u_0=100.
u_0 est pair donc u_1 = \frac{u_0}{2}=50
u_1 est pair donc u_2 = \frac{u_1}{2}=25
u_2 est impair donc u_3 = 3u_2+1=76
u_3 est pair donc u_4 = \frac{u_3}{2}=38
u_4 est pair donc u_5 = \frac{u_4}{2}=19
La valeur de u_5 est donc 19.
Soit u un entier naturel.
Quelle commande Python permet de tester si u est pair ?
En langage Python, l'opérateur a%b permet de calculer le reste de la division euclidienne de a par b.
Si un nombre est divisible par deux, alors le reste de sa division euclidienne par 2 est nul.
La commande qui permet de tester si un nombre u est pair est donc : u%2==0.
Quelle fonction écrite en Python permet, pour p et N donnés, de calculer u_p ?
Soit N \in \mathbb{N}.
Afin de calculer le terme d'indice p de la suite de Syracuse (u_n), il faut calculer tous les termes précédents.
C'est pourquoi une boucle for entre pour k variant entre 0 et p-1 est nécessaire pour calculer le terme u_p.
Il suffit ensuite de tester si le terme est pair ou non pour calculer le terme suivant.
La fonction écrite en Python qui permet pour N et p donnés de calculer u_p est donc :
def u(N,p):
u=N
for k in range(0,p):
if u%2==0:
u=u/2
else:
u=3*u+1
return u
Quelle fonction écrite en Python permet, pour N donné, de déterminer le plus petit entier n tel que u_n=1 ?
On se base sur la fonction qui a été écrite pour la question précédente.
Cette fois, on ne connaît pas le nombre de boucles nécessaires pour trouver n. Une boucle for n'est donc pas adaptée.
Il faut utiliser une boucle qui va s'enchaîner tant que u n'est pas égale à 1, la boucle while est faite pour cela. Afin de connaître l'indice, il faut ajouter un compteur n qui va nous indiquer l'indice du dernier terme calculé.
La deuxième différence est la valeur retournée, cette fois on ne retourne pas u mais n.
La fonction écrite en Python qui permet pour N donné de calculer le plus petit indice n tel que u_n=1 est donc :
def u(N):
u=N
n=0
while u!=1:
n+=1
if u%2==0:
u=u/2
else:
u=3*u+1
return n