4.7 Quelques problèmes supplémentaires
Dans cette section, nous voulons examiner quelques problèmes supplémentaires qui, en apparence, se ressemblent beaucoup. L’important ici est de porter une attention particulière aux différences entre chacun, et cela nous amène à utiliser une méthode ou une autre pour résoudre chacun de ces problèmes.
Exemple 4.7.1.
Une usine produit des crayons de couleurs différentes. Chacune de ces couleurs sont disponible en très grande quantité. De combien de façon un client peut-il choisir crayons de sorte qu’au moins deux d’entre eux soient de la même couleur ? On remarque ici qu’il est plus facile de compter le complément plutôt que de répondre directement à la question. il est facile de voir que le problème se fait sans ordre. Nous allons donc commencer par compter le nombre de façon de choisir couleurs parmi avec remise, et soustraire le nombre de façon de choisir couleurs parmi sans remise. On a donc:
Il y a donc façon différente de choisir crayons de sorte qu’au moins deux d’entre eux soient de la même couleur.
Exemple 4.7.2.
Une usine produit des crayons de couleurs différentes incluant des crayons bleus. Chacune de ces couleurs sont disponibles en très grande quantité. De combien de façons un client peut-il choisir crayons de sorte qu’au moins deux d’entre eux soient bleus ?
Première méthode: On peut travailler avec le complément et compter toutes les possibilités sans tenir compte de la contrainte sur le nombre de crayon bleu, puis on enlève les cas où nous avons aucun ou un seul bleu. On a donc:
Il y a donc façons de choisir les crayons de sorte qu’au moins deux soient bleus.
Deuxième méthode: On peut aussi résoudre le problème à l’aide d’une fonction génératrice ordinaire. Dans ce cas, nous avons la fonction génératrice suivante:
La réponse est alors obtenu en cherchant le coefficient de . Le code Python ci-dessous nous permet de retrouver facilement la réponse.
1 from sympy import *2 from pandas import *3 init_printing()45 x = Symbol(’x’)6 series(x**2/(1-x)**(10),x,n=8).removeO().coeff(x**7)
Il est intéressant de remarquer que Python n’est pas vraiment nécessaire pour trouver la solution du problème. En effet, la fonction génératrice que nous avons obtenu peut facilement être réécrite sous forme d’un somme pour en extraire les coefficients. On a donc:
La solution du problème, c’est à dire le coefficient de est donc .
Troisième méthode: La solution que nous avons obtenu à partir des fonctions génératrices est tellement simple qu’il devrait être possible d’en trouver une interprétation combinatoire simple. En effet, comme le client souhaite avoir au moins deux crayons bleus et que l’ordre n’est pas importante, le client peut tout simplement commencer par prendre les deux crayons bleus (1 option), puis choisir les cinq autres crayons parmi les options possibles sans ordre et avec remise, ce qui nous donne immédiatement:
Exemple 4.7.3.
Combien de mots de lettres ne contiennent pas la combinaison ?
Première méthode: Pour répondre à la question, commençons par considérez tout les mots de lettres. Ceci est facile à calculer, il s’agit de . Maintenant, nous allons soustraire tout les mots qui contiennent la séquence . Pour ce faire, on doit premièrement choisir les lettres manquantes, ce qui peut être fait de façon, puis pour chacune des lettres choisir si elles vont avant ou après le , ce qui peut peut être fait de façons. On remarque maintenant que les mots contenant deux fois la suite ont été soustrait deux fois, il nous faut donc les ajouter à nouveau. En suivant la même idée, on choisit les lettres manquantes, ce qui peut être fait de façons, puis on choisit à quel endroit les placer, soit avant, entre ou après les deux , ce qui peut être fait de façons. En continuant de la même façon, on obtient finalement:
Deuxième méthode: On peut aussi résoudre le problème à l’aide d’une récurrence. Dénotons par le nombre de mots de lettre qui ne contiennent pas la suite . On remarque premièrement que pour tout les mots de longueur , on peut toujours ajouter une lettre quelconque, sauf dans le cas ou le mot se terminerais par . On a donc la récurrence suivante:
1 def a(n):2 if n == 1:3 return 264 if n == 2:5 return 26**2 - 16 else:7 return 26*a(n-1)-a(n-2)89 a(8)
Troisième méthode: On peut aussi résoudre le problème à l’aide d’un automate. Dans ce cas, on définit trois états: et . L’état représentant les mots se terminant par , l’état ceux se terminant par , puis l’état pour les mots se terminant par n’importe quelle autre lettre.
Cet automate nous permet alors d’obtenir le système de récurrence suivant:
avec les valeurs initiales et . Le code Python suivant peut alors nous permettre d’obtenir facilement la solution.
1 def a(n):2 if n == 1:3 return 14 else:5 return a(n-1) + b(n-1) + x(n-1)67 def b(n):8 if n == 1:9 return 110 else:11 return b(n-1) + x(n-1)1213 def x(n):14 if n == 1:15 return 2416 else:17 return 24*(a(n-1) + b(n-1) + x(n-1))1819 a(8) + b(8) + x(8)
Quatrième méthode: Une autre approche pour travailler avec un automate consiste à travailler avec le complément. Dans ce cas, nous allons commencer par compter le nombre de mots qui contiennent .
À partir de cet automate, on obtient le système de récurrence suivant:
avec les valeurs initiales et . La solution du problème est donc:
1 def a(n):2 if n == 0:3 return 14 else:5 return 25*a(n-1) + 24*b(n-1)67 def b(n):8 if n == 0:9 return 010 else:11 return a(n-1) + b(n-1)1213 def c(n):14 if n == 0:15 return 016 else:17 return b(n-1) + 26*c(n-1)1819 26**8 - c(8)
Exemple 4.7.4.
Combien de mots de lettres ne contiennent pas la combinaison ? Dans ce cas, bien que le problème puisse à première vu sembler très semblable à l’exemple ci-dessus, la solution reste très différente. Le fait que les deux lettres soient identiques veut dire qu’il est possible que la suite AA apparaisse deux fois dans le même mot de manière disjointe, par exemple ou sous la forme d’une suite .
Première méthode: On peut premièrement utiliser une seule récurrence. Dans ce cas nous avons:
La solution du problème étant donné par la valeur de . Le code Python suivant peut nous permettre d’obtenir facilement la réponse.
1 def a(n):2 if n == 1:3 return 264 if n == 2:5 return 26**2-16 else:7 return 25*a(n-1) + 25*a(n-2)89 a(8)
On obtient donc la solution .
Deuxième méthode: On peut aussi résoudre le problème à l’aide d’un automate. Dans ce cas, on définit trois états: et . L’état représentant les mots se terminant par , l’état ceux se terminant par , puis l’état pour les mots se terminant par n’importe quelle autre lettre.
Cet automate nous permet alors d’obtenir le système de récurrence suivant:
avec les valeurs initiales et . Le code Python suivant peut alors nous permettre d’obtenir facilement la solution.
1 def a(n):2 if n == 1:3 return 14 else:5 return b(n-1) + x(n-1)67 def b(n):8 if n == 1:9 return 110 else:11 return a(n-1) + b(n-1) + x(n-1)1213 def x(n):14 if n == 1:15 return 2416 else:17 return 24*(a(n-1) + b(n-1) + x(n-1))1819 a(8) + b(8) + x(8)
Troisième méthode: Une autre approche pour travailler avec un automate consiste à travailler avec le complément. Dans ce cas, nous allons commencer par compter le nombre de mots qui contiennent .
À partir de cet automate, on obtient le système de récurrence suivant:
avec les valeurs initiales et . La solution du problème est donc:
1 def a(n):2 if n == 0:3 return 14 else:5 return 25*a(n-1) + 25*b(n-1)67 def b(n):8 if n == 0:9 return 010 else:11 return a(n-1)1213 def c(n):14 if n == 0:15 return 016 else:17 return b(n-1) + 26*c(n-1)1819 26**8 - c(8)
Exemple 4.7.5.
Un sac contient billes, toutes de couleurs différentes. De combien de façon différente Mélanie, Julie et Anne peuvent-ils choisir chacun une bille ? Pour répondre à la question, au moins deux approches sont possible. Premièrement, nous pouvons utiliser le principe du produit, ce qui nous donne directement possibilités. Nous pouvons aussi regarder le problème en terme d’objets que nous voulons choisir. Dans ce cas, il s’agit de choisir objets parmi avec ordre et sans remise, ce qui nous donne:
À noter que les deux méthodes sont bien entendu complètement équivalentes.
Exemple 4.7.6.
Un sac contient billes, toutes de couleurs différentes. De combien de façon différente René peut-il choisir billes ? L’idée est très semblable à l’exemple précédent, mais cette fois comme une seule personne doit choisir les billes, l’ordre n’est pas importante. On doit donc choisir objets parmi sans ordre et sans remise, ce qui nous donne:
Exemple 4.7.7.
Un sac contient billes. Parmi les billes, sont bleus, sont jaunes, sont vertes et sont rouges. De combien de façon différente René peut-il choisir billes ? Dans ce cas, comme nous avons plus de billes de chaque couleur que de billes que nous souhaitons choisir, le problème se fait avec remise. On doit donc choisir objets parmi sans ordre et avec remise. On a donc:
Exemple 4.7.8.
Un sac contient billes. Parmi les billes, sont bleus, sont jaunes, sont vertes et sont rouges. De combien de façon différente Loïk, Isabelle et Élise peuvent-ils choisir chacun une bille ? Dans ce cas, le problème revient à choisir objets parmi avec ordre et avec remise. On a donc possibilités.
Exemple 4.7.9.
Un sac contient billes, toutes de couleurs différentes. De combien de façon différente Michel, René et Marie peuvent-ils choisir chacun billes ? Dans ce cas, nous allons utiliser le principe du produit. Michel doit choisir billes parmi choix sans ordre et sans remise ET René doit choisir billes parmi choix sans ordre et sans remise ET Marie doit choisir billes parmi choix sans ordre et sans remise. On obtient donc:
Exemple 4.7.10.
Un sac contient billes. Parmi les billes, sont bleus, sont jaunes, sont vertes et sont rouges. De combien de façon différente Sarah peut-elle choisir billes ? Dans ce cas, le problème revient essentiellement à choisir objets parmi , sans ordre et avec remise. On a donc:
Par contre, il est impossible d’avoir billes rouges, car il n’y en a pas suffisamment. Il faut donc retiré une possibilité de la réponse. On a donc possibilités. À noter qu’ici une deuxième approche peut s’avérer intéressante et serait particulièrement intéressante dans le cas où nous aurions plus de contrainte. Il s’agit d’utiliser les fonctions génératrices. On peut en effet choisir ou billes bleus, ce que l’on peut dénoter à l’aide de la fonction génératrice . Il en est de même pour les billes jaunes et les billes vertes. Pour ce qui est des billes rouges, nous pouvons choisir ou billes rouges seulement, ce qui nous donne la fonction génératrice . En multipliant le tout, on obtient donc:
Notre réponse sera donc le coefficient de , ce qui correspond au nombre de façon de choisir billes. On obtient donc à nouveau .
Exemple 4.7.11.
Un sac contient billes. Parmi les billes, sont bleus, sont jaunes, sont vertes, sont rouges. De combien de façons différentes peut-on distribuer les billes parmi enfants si chaque enfant reçoit exactement une bille ? Dans ce cas, deux idées sont possibles. Dans un premier temps nous allons utiliser le principe du produit:
Distribuer les billes bleus sans ordre et sans remise (3 parmi 25)
ET
Distribuer les billes jaunes sans ordre et sans remise (5 parmi 22)
ET
Distribuer les billes vertes sans ordre et sans remise (7 parmi 17)
ET
Distribuer les billes rouges sans ordre et sans remise (10 parmi 10)
Ce qui nous permet d’obtenir:
Nous pouvons aussi de manière complètement équivalente interpréter le problème comme le problème du MISSISSIPPI, ce qui nous donne la réponse un peu plus rapidement.
Exemple 4.7.12.
Un sac contient billes. Parmi les billes, sont bleus, sont jaunes, sont vertes, et sont rouges. De combien de façon différente John peut-il choisir billes si parmi les billes au moins une est verte ? De ce cas, nous allons procéder en calculant le complément, ce qui nous simplifiera grandement le travail. Nous allons donc compter le nombre total de possibilité, puis soustraire celle qui n’ont aucune bille verte. On a donc:
Ici, la méthode des fonctions génératrices peut à nouveau s’avérer intéressante. En effet, la fonction génératrice correspondante aux billes bleus, aux billes jaunes et aux billes vertes est dans chacun des cas . À noter que nous n’avons pas mis le terme , car il est impossible de choisir billes de l’une de ces couleurs. Par contre, celle correspondante aux billes vertes sera , car nous devons en choisir au moins une. En multipliant le tout nous obtenons donc:
La réponse chercher sera donc le coefficient de , qui est bien entendu comme nous l’avions déjà trouvé.
Exemple 4.7.13.
Un sac contient billes. Parmi les billes, sont bleues, sont jaunes, sont vertes et sont rouges. De combien de façon peut-on donner une bille à chacun des enfants de la classe de maternelle de Mme Untel ? Ici le problème est similaire à celui du MISSISSIPPI dans le cas où nous voulions former un mot contenant seulement certaine des lettres. Nous allons donc utiliser l’approche des fonctions génératrices exponentielles. On a donc:
La solution du problème est le coefficient de . On a donc qu’il y a façons de distribuer les billes.
Exemple 4.7.14.
Un sac contient billes. Parmi les billes, sont bleues, sont jaunes, sont vertes et sont rouges. De combien de façon Sophie peut-elle choisir billes? On remarque immédiatement que le problème est très similaire au précédent, mais cette fois l’ordre n’est pas importante. Nous allons donc prendre la même approche que pour l’exemple précédent, mais en utilisant les fonctions génératrices ordinaires plutôt que les fonctions génératrices exponentielles.
La solution est le coefficient de . Sophie a donc possibilités pour choisir billes.
Exemple 4.7.15.
enfants sont placés sous forme d’un rang. De combien de façons différentes peut-on leur remettre à chacun une bille qui peuvent être bleue, verte, orange ou jaune de sorte qu’un enfant recevant une bille bleue ne soit jamais à côté d’un enfant recevant une bille orange ou jaune ? Pour ce faire, nous allons commencer par modéliser le problème à l’aide d’un automate.
Si on dénote par le nombre de solution possible avec enfants (les solutions valides), et on dénote par:
| Nombre de solutions valides se terminant par une boule bleue | |
| Nombre de solutions valides se terminant par une boule verte | |
| Nombre de solutions valides se terminant par une boule orange | |
| Nombre de solutions valides se terminant par une boule jaune |
alors à partir de l’automate on obtient le système d’équations définies par récurrence suivant:
avec les valeurs initiales . À l’aide de Python, ou même à la main, il devient alors relativement facile de construire une table de valeurs.
1 from sympy import *2 from pandas import *3 init_printing()45 def a(n):6 if n == 1:7 return 18 else:9 return a(n-1) + b(n-1)1011 def b(n):12 if n == 1:13 return 114 else:15 return a(n-1) + b(n-1) + c(n-1) + d(n-1)1617 def c(n):18 if n == 1:19 return 120 else:21 return b(n-1) + c(n-1) + d(n-1)2223 def d(n):24 if n == 1:25 return 126 else:27 return b(n-1) + c(n-1) + d(n-1)2829 def x(n):30 return a(n) + b(n) + c(n) + d(n)3132 tableau = DataFrame({33 "a(n)": [a(n) for n in range(1,11)],34 "b(n)": [b(n) for n in range(1,11)],35 "c(n)": [c(n) for n in range(1,11)],36 "d(n)": [d(n) for n in range(1,11)],37 "x(n)": [x(n) for n in range(1,11)]38 })39 tableau.index = [n for n in range(1,11)]40 tableau
| 1 | 1 | 1 | 1 | 1 | 4 |
| 2 | 2 | 4 | 3 | 3 | 12 |
| 3 | 6 | 12 | 10 | 10 | 38 |
| 4 | 18 | 38 | 32 | 32 | 120 |
| 5 | 56 | 120 | 102 | 102 | 380 |
| 6 | 176 | 380 | 324 | 324 | 1204 |
| 7 | 556 | 1204 | 1028 | 1028 | 3816 |
| 8 | 1760 | 3816 | 3260 | 3260 | 12096 |
| 9 | 5576 | 12096 | 10336 | 10336 | 38344 |
| 10 | 17672 | 38344 | 32768 | 32768 | 121552 |
La solution de notre problème est donc possibilités. Pour résoudre le problème, nous aurions aussi pu réécrire notre système d’équations définie par récurrence sous forme matricielle, et appliquer les méthodes de l’algèbre linéaire pour le résoudre. Dans ce cas, nous aurions obtenu l’équation:
La solution de notre problème étant la somme des éléments du vecteur de droite, ce qui nous donne bien entendu la même valeur que nous avions trouvé précédemment.
Il aurait aussi été possible de trouver une seule récurrence utilisant uniquement la suite . Bien que cette dernière soit sans doute plus intéressante, en particulier lorsqu’il s’agit de faire les calculs à la main, la trouver dans le cas présent n’est pas trivial sans avoir recours au technique de l’algèbre linéaire. La méthode la plus simple consiste à trouver le polynôme caractéristique de la matrice :
En remplaçant les par , les par , les par et les par , on obtient la récurrence suivante:
où les valeurs initiales ont été trouvé indépendamment par simple énumération. Notez finalement que bien que la méthode que nous avons utilisé ci-dessus soit particulièrement complexe, vérifier que la récurrence est correcte est pour sa part un problème facile.