Aller au contenu

Leçon 8

Python, suites de Syracuse et de Fibonacci

Vidéo 8 : Python, suites de Syracuse et de Fibonacci · 3 min 20 s · sous-titres en français

Le cours écrit

8.1 La suite de Syracuse

On choisit un entier a>0a > 0, et on pose u0=au_0 = a. Pour tout entier naturel nn :

  • si unu_n est pair, un+1=un2u_{n+1} = \dfrac{u_n}{2} ;
  • si unu_n est impair, un+1=3un+1u_{n+1} = 3u_n + 1.

Cette suite est définie par un algorithme, avec un test sur la parité. En partant de 66, on obtient 6,3,10,5,16,8,4,2,16, 3, 10, 5, 16, 8, 4, 2, 1. Arrivée à 11, la suite tourne en rond : 4,2,1,4,2,1…4, 2, 1, 4, 2, 1\ldots

En Python, on découpe le travail en deux fonctions : c'est la programmation modulaire. La fonction suivant calcule le terme d'après, et la fonction syracuse construit la liste. Les symboles // donnent le quotient entier.

def suivant(u):
    if u % 2 == 0:
        return u // 2
    return 3 * u + 1

def syracuse(a, n):
    L = [a]
    for k in range(n):
        L.append(suivant(L[k]))
    return L
>>> syracuse(6, 8)
[6, 3, 10, 5, 16, 8, 4, 2, 1]

8.2 Une conjecture ouverte

Départ aa Étapes pour arriver à 11 Plus grand terme
66 88 1616
77 1616 5252
2727 111111 9 2329\,232

Pour tous les nombres testés, la suite finit par arriver à 11. Mais personne n'a su le démontrer : cet énoncé reste une conjecture. Vérifier de très nombreux cas ne fait pas une démonstration.

8.3 La suite de Fibonacci

Elle vient d'un problème de comptage de lapins. Un jeune couple devient adulte en un mois, et chaque mois, tout couple adulte donne naissance à un nouveau couple. On part d'un jeune couple.

Mois 00 11 22 33 44 55 66
Couples 11 11 22 33 55 88 1313

Les couples d'un mois sont ceux du mois précédent, plus les nouveau-nés. Il y a autant de nouveau-nés que de couples adultes, c'est-à-dire que de couples présents deux mois plus tôt. Chaque nombre est donc la somme des deux précédents : F0=1,F1=1et, pour tout entier naturel n,Fn+2=Fn+1+Fn.F_0 = 1, \quad F_1 = 1 \quad \text{et, pour tout entier naturel } n, \quad F_{n+2} = F_{n+1} + F_n.

Il faut cette fois deux termes pour calculer le suivant, donc deux premiers termes pour démarrer.

def fibonacci(n):
    L = [1, 1]
    for k in range(n - 2):
        L.append(L[k] + L[k + 1])
    return L
>>> fibonacci(10)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

Une liste garde tous les termes, ce qui permet de les comparer. On peut ainsi écrire max(syracuse(7, 16)), qui renvoie 5252, et len(fibonacci(10)), qui renvoie 1010.

Lire le cours complet du chapitre

Exercices 15 et 16

  • Exercice 15 : Syracuse à la main et en Python
  • Exercice 16 : monter un escalier

Exercices du chapitre (PDF, 167 Ko)

Corrigés

Cherche d'abord les exercices sur ta feuille, puis compare avec le corrigé détaillé.

Corrigés du chapitre (PDF, 159 Ko)

Tu es hors connexion. Les chapitres téléchargés restent disponibles dans Hors connexion.