Le théorème de Zeckendorf : gagner à coup sûr au jeu de Fibonacci
Un jeu de jetons, une écriture unique des entiers, et un code qui sait où il s'arrête
Sommaire10 sections
On commence par un jeu. Sur la table, il y a un tas de vingt jetons. Tu joues en premier et tu prends autant de jetons que tu veux, à une seule condition : tu n’as pas le droit de prendre tout le tas. Ensuite, chacun son tour, on prend au moins un jeton et au plus le double de ce que l’autre vient de prendre. Celui qui ramasse le dernier jeton a gagné.
Les règles sont courtes, mais ne crois pas que tu vas gagner facilement. Avant de lire la suite, joue quelques parties contre l’ordinateur ci-dessous. Change la taille du tas, laisse-le commencer de temps en temps, et regarde ce qui se passe.
Si tu as joué honnêtement, sans chercher de stratégie dans un livre, tu as dû perdre la plupart de tes parties. L’ordinateur ne triche pas et il ne calcule pas toutes les suites de coups possibles : il applique une règle très courte, tirée d’un théorème qu’un élève de Terminale peut démontrer entièrement. C’est ce théorème qu’on va aller chercher, et on reviendra au jeu à la fin, quand tu sauras le battre.
Qui gagne avec 2, 3, 4 ou 5 jetons ?
Le réflexe à avoir face à un jeu comme celui-là, c’est de regarder les tout petits tas, là où on peut tout calculer à la main. On dit qu’une position est gagnante quand le joueur qui doit jouer peut gagner à coup sûr, quoi que fasse l’autre, et perdante dans le cas contraire.
Avec 2 jetons, tu n’as pas le droit de tout prendre, donc tu prends 1 jeton, et ton adversaire prend le dernier. Tu as perdu, et tu n’avais aucun autre choix : 2 est une position perdante pour celui qui commence.
Avec 3 jetons, tu peux en prendre 1 ou 2. Si tu en prends 1, il en reste 2 et ton adversaire a droit à 2 jetons, il prend tout. Si tu en prends 2, il en reste 1 et il le prend. Dans les deux cas tu perds, donc 3 est aussi perdante.
Avec 4 jetons, les choses changent. Tu prends 1 jeton, il en reste 3, et ton adversaire n’a droit qu’à 1 ou 2 jetons. S’il en prend 2, il en reste 1 et tu le prends. S’il en prend 1, il en reste 2, tu as droit à 2 jetons et tu prends tout. Tu gagnes à tous les coups, donc 4 est gagnante.
En continuant de cette façon, avec un peu de patience et une feuille de brouillon, tu obtiens ce tableau pour les tas de 2 à 13 jetons :
| Celui qui commence perd | Celui qui commence gagne |
|---|---|
| 2, 3, 5, 8, 13 | 4, 6, 7, 9, 10, 11, 12 |
Regarde la colonne de gauche : 2, 3, 5, 8, 13. Tu la reconnais ? Ce sont des nombres de Fibonacci, chacun étant la somme des deux précédents. Le suivant serait 21, puis 34, et c’est bien ce qu’on observe si on pousse le tableau plus loin.
Je te conseille vraiment de refaire ce tableau toi-même jusqu’à 8 au moins, parce qu’il change la façon dont tu vas présenter le sujet. Tu ne pars plus de la suite de Fibonacci pour aller chercher une application, tu tombes dessus en analysant un jeu, ce qui est beaucoup plus convaincant devant un jury.
Reste à comprendre pourquoi ce sont ces nombres-là, et surtout ce qu’il faut jouer quand le tas n’est pas un nombre de Fibonacci. Pour ça, il faut faire un détour par une autre question : comment écrire un entier avec des nombres de Fibonacci.
Écrire un entier avec des nombres de Fibonacci
Commençons par poser les choses proprement. La suite de Fibonacci est définie par ses deux premiers termes et par une relation de récurrence :
Chaque terme est la somme des deux précédents, ce qui donne les valeurs suivantes :
| 2 | 3 | 4 | 5 | 6 | |
|---|---|---|---|---|---|
| 1 | 2 | 3 | 5 | 8 | |
| 7 | 8 | 9 | 10 | 11 | |
| 13 | 21 | 34 | 55 | 89 |
Dans tout l’article, je n’utilise les termes qu’à partir de . Le nombre apparaît deux fois au début de la suite, sous le nom et sous le nom . Si on gardait les deux, le même nombre pourrait s’écrire de deux façons :
Ça casserait tout ce qui suit. Garde cette remarque en tête, c’est une question que le jury peut très bien te poser.
L’écriture de Zeckendorf
Voici l’objet central de l’article. Soit un entier. On appelle écriture de Zeckendorf de toute écriture de la forme
où est le nombre de termes, et où les indices vérifient deux conditions :
La première condition dit que les termes sont distincts et qu’on n’utilise jamais . La seconde dit qu’on ne prend jamais deux termes voisins dans la suite : si est dans la somme, ni ni ne peuvent y être.
Par exemple, est une écriture de Zeckendorf, puisque les indices , et sont espacés de . En revanche, n’en est pas une, parce que les indices et sont voisins. Pour , l’écriture de Zeckendorf est tout simplement .
On peut aussi noter une écriture de Zeckendorf avec des et des , comme en binaire. On aligne les termes de la suite du plus grand au plus petit, jusqu’à , et on met un sous chaque terme utilisé, un sous les autres. Pour , on lit de à :
Avec cette notation, la seconde condition devient très visuelle : deux ne sont jamais côte à côte.
Le théorème de Zeckendorf affirme que cette écriture existe toujours, et qu’il n’y en a qu’une.
Théorème de Zeckendorf. Tout entier possède une et une seule écriture de Zeckendorf.
Comment la trouver : l’algorithme glouton
Pour trouver l’écriture de Zeckendorf d’un entier, la méthode la plus naturelle consiste à prendre à chaque étape le plus grand terme de la suite qui tient dans ce qui reste. Avec , le plus grand terme inférieur ou égal à est , il reste ; le plus grand qui tient dans est , il reste , qui est lui-même un terme de la suite :
Cette méthode s’appelle un algorithme glouton : à chaque étape, on fait le choix qui paraît le meilleur sur le moment, sans jamais revenir en arrière. Avec , on obtient de la même façon l’exemple que j’avais pris dans l’article qui présente toute la série :
Essaie avec d’autres entiers dans le convertisseur ci-dessous. Il déroule l’algorithme étape par étape, coche les termes utilisés et affiche l’écriture en et . Tu vas voir que deux cases cochées ne sont jamais voisines.
La raison est courte. Soit un entier, et soit , avec , le terme que l’algorithme choisit à la première étape. C’est le plus grand terme inférieur ou égal à , donc le suivant dépasse :
Le reste vérifie alors :
Le reste est strictement plus petit que , donc l’algorithme ne pourra pas choisir à l’étape suivante : il prendra au mieux . Il saute toujours au moins une case.
Cette règle, jamais deux termes voisins, c’est le cœur du sujet. Sans elle, on perd l’unicité, puisque peut s’écrire , ou .
L’existence est donc réglée : l’algorithme glouton fournit une écriture de Zeckendorf, et il s’arrête forcément puisque le reste diminue strictement à chaque étape. Si tu veux la rédiger proprement, c’est une récurrence sur où l’hypothèse porte sur tous les entiers plus petits que , puisque le reste peut être n’importe lequel d’entre eux. On appelle ça une récurrence forte. Le nom n’est pas au programme, mais l’idée se comprend en une phrase. L’unicité, en revanche, demande un vrai argument.
Pourquoi il n’existe qu’une seule écriture
Tout repose sur un lemme qui dit, en gros, qu’une somme de termes non voisins ne peut pas aller très loin au-delà de son plus grand terme.
Lemme. Soit un entier, et soit une somme de termes de la suite, d’indices au moins égaux à , distincts et sans deux voisins, dont le plus grand terme est . Alors :
Avant de le démontrer, regarde à quoi il ressemble sur un exemple. La somme la plus grande possible s’obtient en prenant un terme sur deux, en descendant le plus bas possible. Avec :
On touche la borne sans jamais la dépasser.
Démonstration. On raisonne par récurrence forte sur . Pour tout entier , on note la propriété : « le lemme est vrai pour toutes les sommes dont le plus grand terme est ».
Initialisation. Pour , la seule somme possible est , et . Pour , la seule somme possible est , puisqu’on ne peut pas lui ajouter son voisin , et . Donc et sont vraies.
Hérédité. Soit un entier tel que soit vraie pour tout entier compris entre et . Prends une somme dont le plus grand terme est . Si , c’est réglé, puisque . Sinon, on écrit , où est une somme du même type dont le plus grand terme est un certain . Comme est interdit, on a , et l’hypothèse de récurrence appliquée à donne :
On en déduit :
La dernière égalité, c’est simplement la relation de récurrence de la suite. Donc est vraie, et le lemme est démontré pour tout entier .
L’unicité en découle presque immédiatement. Soit un entier, et suppose qu’il possède deux écritures de Zeckendorf différentes. On commence par retirer des deux côtés les termes qu’elles ont en commun : il reste deux sommes et , toujours égales, toujours sans termes voisins, mais qui n’ont plus aucun terme en commun. Elles ne sont pas vides toutes les deux, puisque les écritures de départ étaient différentes. Et si l’une était vide, l’autre vaudrait tout en contenant au moins un terme positif, ce qui est impossible.
On note le plus grand terme de et celui de . Comme et n’ont aucun terme commun, , et quitte à échanger les rôles de et , on peut supposer . Le lemme appliqué à donne alors :
Donc , ce qui contredit . L’écriture de Zeckendorf de est bien unique.
J’aime beaucoup cette preuve pour un oral, parce que chaque étape s’écrit au tableau en une ligne et que l’idée centrale se dit avec des mots : les petits termes, même tous réunis, ne peuvent jamais rattraper un grand. Si le jury te demande de refaire la démonstration pendant l’échange, c’est cette phrase qui doit te revenir en premier.
Retour au jeu : la stratégie de l’ordinateur
Retour aux jetons. La stratégie de l’ordinateur est simple : il calcule l’écriture de Zeckendorf du tas et il retire le plus petit terme, à condition que la règle du double le lui permette.
Reprends le tas de vingt jetons. Son écriture de Zeckendorf est , donc le bon premier coup consiste à prendre jetons. Il en reste , et ton adversaire a droit à au plus jetons. Voici une partie complète jouée de cette façon :
| Tas | Écriture de Zeckendorf | Coup | Limite pour l’autre |
|---|---|---|---|
| 20 | 13 + 5 + 2 | toi : 2 | 4 |
| 18 | 13 + 5 | lui : 3 | 6 |
| 15 | 13 + 2 | toi : 2 | 4 |
| 13 | 13 | lui : 4 | 8 |
| 9 | 8 + 1 | toi : 1 | 2 |
| 8 | 8 | lui : 2 | 4 |
| 6 | 5 + 1 | toi : 1 | 2 |
| 5 | 5 | lui : 2 | 4 |
| 3 | 3 | toi : 3 | gagné |
À chaque fois que c’est à toi de jouer, tu retires le terme en gras, et ton adversaire se retrouve devant un tas dont le plus petit terme dépasse ce qu’il a le droit de prendre : il est coincé. C’est déjà le cas à 18, où il lui faudrait retirer 5 avec une limite de 4. Avec 13, 8 ou 5, c’est le cas extrême, puisque le tas n’a qu’un seul terme.
Et ton adversaire, pourquoi il ne peut pas faire pareil ? Suppose que l’écriture de Zeckendorf du tas contienne au moins deux termes, et note le plus petit, avec . Tu retires jetons. Le plus petit terme qui reste est alors un certain , avec puisque deux termes ne sont jamais voisins. Ton adversaire, lui, a droit à au plus jetons. Or :
L’inégalité stricte vient de ce que pour tout entier . Ton adversaire ne peut donc jamais retirer en un seul coup le plus petit terme qui reste, et il ne peut pas copier ta stratégie. Il ne peut pas non plus prendre le dernier jeton tout de suite, puisque le tas restant vaut au moins , qui dépasse .
Attention, cette inégalité ne prouve pas tout. Elle explique pourquoi l’adversaire ne peut pas répliquer avec la même arme. La preuve complète demande en plus de vérifier que, si ton adversaire prend jetons, avec entier compris entre et , le nouveau tas a un plus petit terme inférieur ou égal à , que tu as donc le droit de retirer. Ce point-là est nettement plus technique. Devant le jury, tu peux l’admettre en le disant clairement, ce qui vaut beaucoup mieux qu’une preuve bâclée. Le résultat complet est connu depuis l’article de Michael Whinihan paru en 1963 : le premier joueur gagne si et seulement si le tas de départ n’est pas un terme de la suite de Fibonacci.
Remonte au jeu en haut de l’article, coche « Montrer la décomposition du tas » et regarde ce que fait l’ordinateur. Tu vas voir qu’il retire systématiquement le terme en vert, sauf s’il peut tout prendre d’un coup ou quand il est coincé, et que dans ce cas il se contente de prendre un seul jeton en espérant que tu te trompes.
Un médecin militaire belge, et celui qui a publié avant lui
Édouard Zeckendorf n’était pas mathématicien. Né à Liège en 1901, il y devient médecin en 1925, puis officier du service de santé de l’armée belge. Les Allemands le font prisonnier en 1940, et il passe toute la guerre dans des camps à soigner d’autres prisonniers alliés. Il quitte l’armée en 1957 avec le grade de colonel. Les maths, il les faisait à côté, en amateur.
D’après ce qu’il écrit lui-même, il tient son résultat dès 1939. Mais il ne publie sa démonstration qu’en 1972, dans le Bulletin de la Société royale des sciences de Liège. Entre-temps, quelqu’un d’autre l’a fait à sa place : en 1952, le mathématicien néerlandais Gerrit Lekkerkerker publie le théorème dans la revue Simon Stevin et le présente sous le nom de Zeckendorf. Le théorème porte donc ce nom depuis vingt ans quand Zeckendorf publie enfin sa propre version.
Le jeu, lui, a une autre histoire. Michael Whinihan le présente en 1963 dans le tout premier volume de The Fibonacci Quarterly, une revue entièrement consacrée à la suite de Fibonacci, et il en attribue l’invention à R. E. Gaskell, de l’université d’État de l’Oregon. On le trouve aujourd’hui sous le nom de « Nim de Fibonacci ».
Je trouve que ce petit pan d’histoire mérite une minute dans ton oral, à condition de le placer au bon endroit. Si tu l’utilises en accroche, il n’apporte pas grand-chose, puisque le jury ne sait pas encore de quoi parle le théorème. Placé après la démonstration, il montre au contraire qu’un résultat qu’on vient de prouver en dix lignes a été trouvé par un médecin qui faisait des maths à côté, et publié d’abord par quelqu’un d’autre.
Du jeu au codage : séparer des nombres sans séparateur
L’écriture de Zeckendorf a une conséquence très concrète en informatique, et c’est par là que le sujet rejoint la NSI. Imagine que tu doives envoyer une suite d’entiers, par exemple , , , sous la forme d’une seule suite de et de , sans espace ni virgule, et sans connaître à l’avance la taille des nombres. En binaire, tu enverrais , et , collés : . La personne qui reçoit ce message n’a aucun moyen de savoir où s’arrête chaque nombre.
Le code de Fibonacci règle ce problème. Il se construit en deux temps, à partir de l’écriture de Zeckendorf en et vue plus haut :
- on écrit ses chiffres dans l’ordre inverse, en commençant par celui de ;
- on ajoute un à la fin.
Pour , l’écriture de Zeckendorf lue de à est . On la retourne, puis on ajoute le final :
Comme deux termes de Zeckendorf ne sont jamais consécutifs, deux ne se suivent jamais à l’intérieur d’une écriture. La seule fois où on voit apparaître , c’est à la fin du mot, grâce au ajouté. Celui qui reçoit le message lit les bits un par un et sait qu’un nombre se termine dès qu’il rencontre deux à la suite depuis le début du mot en cours, puis il repart de zéro pour le nombre suivant. Pour la suite , , , on envoie , puis , puis , et le découpage se fait tout seul.
Le convertisseur affiche maintenant le code de Fibonacci de chaque entier, à côté de son écriture binaire.
Ce code a un prix : il est plus long que l’écriture binaire brute. Pour , il faut bits contre en binaire, et pour , bits contre . Mais la comparaison n’est pas équitable, parce que le binaire brut ne sait pas où il s’arrête.
Compare-le plutôt au code gamma d’Elias, un code binaire qui annonce d’abord la longueur du nombre avant de l’écrire, et qui sait donc lui aussi où il s’arrête. Il lui faut bits pour et bits pour : face à lui, le code de Fibonacci devient compétitif.
Alberto Apostolico et Aviezri Fraenkel ont aussi montré en 1987 qu’il résiste très bien aux erreurs. Avec la plupart des codes de ce type, un seul bit faux au milieu du message décale toute la lecture et rend le reste inutilisable. Avec le code de Fibonacci, l’erreur n’abîme qu’au plus trois nombres, parce que le lecteur se recale dès qu’il rencontre le prochain .
Pour être honnête avec toi, ce code reste réservé à des usages assez spécialisés : tu ne le trouveras ni dans un fichier ZIP ni dans une image PNG. Présente-le au jury comme une conséquence élégante du théorème, et ça suffit largement.
Trois oraux avec le même matériau
Tout ce qui précède peut nourrir trois oraux différents, selon la question que tu choisis de poser. À toi de voir lequel colle à tes spécialités.
-
« Peut-on gagner à coup sûr au jeu de Fibonacci ? » C’est l’oral le plus vivant. Tu pars du jeu, tu montres le tableau des petits tas, tu fais apparaître les nombres de Fibonacci, puis tu énonces le théorème de Zeckendorf et la stratégie qui en découle. Au tableau, tu dois pouvoir dérouler une partie complète sur un tas de 20 jetons. Tu démontres l’inégalité , valable pour tout entier , et tu admets le reste de la preuve de la stratégie, en le disant.
-
« Pourquoi chaque entier n’a-t-il qu’une seule écriture en nombres de Fibonacci ? » Si tu aimes les preuves, prends plutôt l’unicité comme fil rouge. L’algorithme glouton sert d’entrée en matière, et le cœur de l’exposé devient le lemme, démontré par récurrence, puis l’unicité qui en découle. Le jeu peut alors servir d’ouverture en fin d’exposé, au lieu d’en être le point de départ.
-
« Comment envoyer des nombres à la suite sans séparateur ? » Avec la NSI en spécialité, c’est sans doute celui-là que je choisirais. Le problème de transmission pose la question, le binaire brut montre pourquoi elle n’est pas triviale, et le code de Fibonacci y répond, à condition d’expliquer pourquoi ne peut apparaître qu’à la fin. Le théorème de Zeckendorf devient alors l’outil qui garantit que le code fonctionne, et tu peux en présenter la preuve d’unicité comme le moment mathématique de ton exposé.
Dans les trois cas, tu restes sur des notions que tu as vues en cours : les suites définies par récurrence, le raisonnement par récurrence, l’algorithmique avec une fonction Python qui décompose un entier, et l’écriture binaire. Pendant les vingt minutes de préparation, je te conseille de préparer sur ton brouillon un seul exemple numérique, déroulé en entier, plutôt que trois exemples survolés. Le jury retient plus facilement une décomposition qu’il a vue se construire sous ses yeux.
Si tu veux comparer avec d’autres façons d’aborder Fibonacci, l’article sur le théorème de Lamé part de l’algorithme d’Euclide, et l’article qui présente toute la série détaille les autres angles possibles.
Les questions qu’on peut te poser
Pendant l’échange, le jury cherche à voir si tu comprends ce que tu as présenté, et sur ce sujet, certaines questions sont prévisibles. Prépare au moins celles-ci.
Pourquoi commencer à et pas à ?
Parce que . Si tu autorises les deux, tu perds l’unicité tout de suite :
Dans les deux écritures, les indices ne sont pas voisins. Le piège vient de ce que deux indices différents donnent la même valeur, donc on n’en garde qu’un.
L’algorithme glouton marche-t-il avec n’importe quelle liste de nombres ?
Non. Prends des pièces de , et euros, et essaie de rendre euros avec le moins de pièces possible. Le glouton prend d’abord , puis , puis , soit trois pièces, alors que n’en demande que deux. C’est le problème du rendu de monnaie, que tu as peut-être croisé en NSI. Avec les nombres de Fibonacci, le glouton tombe toujours sur la bonne écriture, parce que le lemme force le choix du plus grand terme : si tu le laisses de côté, les termes plus petits, pris sans deux voisins, valent au plus et ne suffisent plus à atteindre . Attention quand même, les deux problèmes ne cherchent pas la même chose : le rendu de monnaie veut le moins de pièces possible, Zeckendorf veut une écriture unique.
Le code de Fibonacci est-il plus court que le binaire ?
Non, il est plus long que le binaire brut, d’environ pour les grands nombres. Pour écrire un grand entier , le binaire utilise environ chiffres, alors que l’écriture de Zeckendorf en utilise environ , où est le nombre d’or. Le rapport des deux longueurs vaut :
Son intérêt est ailleurs : il sait où il s’arrête, et il résiste bien aux erreurs.
Combien de termes contient en moyenne une écriture de Zeckendorf ?
C’est une question d’ouverture, et tu n’as pas besoin de la démontrer. Lekkerkerker a montré dans son article de 1952 que, pour un grand entier , les entiers tels que ont en moyenne un nombre de termes proche de :
Autrement dit, une écriture de Zeckendorf utilise en moyenne un peu plus d’une case sur quatre.
La revanche
Retourne au jeu du début : sur n’importe quel tas qui n’est pas un nombre de Fibonacci, tu sais maintenant gagner à coup sûr en commençant : tu décomposes, tu retires le plus petit terme, et tu recommences à chaque tour. Essaie avec 50 jetons, puis avec 100, en laissant la décomposition cachée, et vérifie que tu arrives à la retrouver de tête.
En 1957, un collégien de Brooklyn, George Bergman, va encore plus loin : il publie dans Mathematics Magazine un système de numération dont la base est le nombre d’or lui-même. Dans ce système, s’écrit , parce que :
Et on y retrouve la même règle que chez Zeckendorf : jamais deux côte à côte. Si tu cherches une ouverture pour la fin de ton exposé, tu la tiens.
Et si tu cherches un autre sujet, ils sont tous rassemblés sur la page Grand oral.
Sources
- Zeckendorf, É. (1972). Représentation des nombres naturels par une somme de nombres de Fibonacci ou de nombres de Lucas. Bulletin de la Société royale des sciences de Liège, 41, pp. 179-182.
- Lekkerkerker, C. G. (1952). Voorstelling van natuurlijke getallen door een som van getallen van Fibonacci. Simon Stevin, 29, pp. 190-195.
- Whinihan, M. J. (1963). Fibonacci Nim. The Fibonacci Quarterly, 1(4), pp. 9-13.
- Apostolico, A. et Fraenkel, A. S. (1987). Robust transmission of unbounded strings using Fibonacci representations. IEEE Transactions on Information Theory, 33(2), pp. 238-245.
- Bergman, G. (1957). A number system with an irrational base. Mathematics Magazine, 31(2), pp. 98-110.
- Kimberling, C. (1998). Edouard Zeckendorf. The Fibonacci Quarterly, 36(5), pp. 416-418.
- Knuth, D. E. The Art of Computer Programming, Volume 1: Fundamental Algorithms, section 1.2.8 « Fibonacci Numbers », exercice 34. Addison-Wesley, 3e éd., 1997.