2.2 Problème de chaines binaires
Combien y a-t-il de chaines binaires de longueur ne contenant pas deux consécutifs? Pour ce faire, nous pourrions bien évidement énumérer toutes les possibilités, mais à première vu il semble y en avoir beaucoup. Nous allons donc plutôt prendre l’approche de définir une relation de récurrence. Posons le nombre de chaine binaire de longueur ne contenant pas deux consécutif. Il est facile de voir que et . Maintenant, remarquons qu’une chaine binaire de longueur avec doit soit se terminer par un ou bien par un . Pour toutes les chaines de longueur , il est toujours possible d’ajouter un à la fin pour obtenir une chaine binaire de longueur satisfaisant le problème, par contre ceci n’est pas possible avec car on risquerait d’obtenir une chaine qui se termine par . Donc si une chaine binaire de longueur ne contient pas pas deux consécutif et se termine par , alors elle doit obligatoirement se terminer par . On remarque alors qu’il que ceci correspond en fait au nombre de chaine de longueur qui satisfait le problème. Ceci peut-être visualisé sous forme du diagramme suivant:
À partir de ces informations, on obtient donc la récurrence suivante:
À partir de la récurrence, il devient maintenant beaucoup plus simple de répondre à la question. Il est possible de la résoudre pour obtenir une formule explicite, mais dans le cas présent, comme nous cherchons uniquement la valeur, on peut utiliser le code suivant:
1 from sympy import *2 from pandas import *3 init_printing()45 def a(n):6 if n == 1:7 return 28 if n == 2:9 return 310 else:11 return a(n-1) + a(n-2)1213 a(10)
qui nous permet d’obtenir directement la valeur de . Remarquons cependant que dans la plupart des cas, il est plus intéressant de faire un tableau de valeurs complet. Ceci peut bien entendu être obtenu à la main, mais aussi automatiquement à l’aide de Python en utilisant plutôt le code suivant:
1 from sympy import *2 from pandas import *3 init_printing()45 def a(n):6 if n == 1:7 return 28 if n == 2:9 return 310 else:11 return a(n-1) + a(n-2)1213 tableau = DataFrame([[a(n) for n in range(1,11)]])14 tableau.columns = [n for n in range(1,11)]15 tableau.index = ["Valeurs"]16 tableau
Ce dernier code nous permet alors d’obtenir le tableau suivant:
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
| 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | 89 | 144 |
À nouveau, on obtient que le nombre de chaînes binaires de longueur qui ne contient pas deux consécutifs est . Alternativement, on peut aussi répondre à cette question à partir d’un système d’équations définie par récurrence. Ceci peut-être accompli à partir de variable intermédiaire et d’un automate. Nous allons donc définir les variables suivantes:
| Les chaînes binaires de longueur qui ne contiennent pas deux consécutif et qui se termine par un | ||
| Les chaînes binaires de longueur qui ne contiennent pas deux consécutif et qui se termine par un |
D’après la définition, nous savons que si le dernier chiffre est un , on peut toujours ajouter un ou un . Par contre, si le dernier chiffre est un , alors on peut uniquement ajouter un . Ceci nous donne donc l’automate suivant:
Ceci nous donne le système suivant:
Avec les valeurs initiales . À nouveau, Python peut nous permettre de compléter directement un tableau avec les différentes valeurs.
1 from sympy import *2 from pandas import *3 init_printing()45 def x(n):6 if n == 1:7 return 18 else:9 return y(n-1)1011 def y(n):12 if n == 1:13 return 114 else:15 return x(n-1) + y(n-1)1617 tableau = DataFrame({18 "x_n": [x(n) for n in range(1,11)],19 "y_n": [y(n) for n in range(1,11)],20 "Somme": [x(n) + y(n) for n in range(1,11)]21 })22 tableau.index = [n for n in range(1,11)]23 tableau
Ce qui nous permet cette fois d’obtenir le tableau suivant. Notez que ce tableau, en plus de nous donner le nombre de chaînes qui ne contiennent pas deux consécutifs, les séparent en nombre de ces chaînes qui se terminent par un et en chaînes qui se terminent par un .
| Somme | |||
| 1 | 1 | 1 | 2 |
| 2 | 1 | 2 | 3 |
| 3 | 2 | 3 | 5 |
| 4 | 3 | 5 | 8 |
| 5 | 5 | 8 | 13 |
| 6 | 8 | 13 | 21 |
| 7 | 13 | 21 | 34 |
| 8 | 21 | 34 | 55 |
| 9 | 34 | 55 | 89 |
| 10 | 55 | 89 | 144 |
Bien qu’il soit possible de travailler directement avec ce système, dans le cas présent il est aussi facile de le simplifier pour obtenir la récurrence que nous avions déjà obtenu. Comme nous sommes intéressé par les chaînes qui se termine par et celle qui se termine , la solution du problème est donné par la récurrence suivante:
On remarque immédiatement qu’il s’agit de la même récurrence que nous avions obtenu précédemment.