3.2 Quelques exemples
Les fonctions génératrices peuvent être utilisées pour résoudre une grande variété de problèmes. En fait, la plupart des problèmes de combinatoire peuvent être étudiés d’une manière ou d’une autre en termes de fonction génératrice. C’est ce que nous allons essayer d’illustrer immédiatement à l’aide de quelques exemples.
Exemple 3.2.1.
De combien de façons peut on choisir 5 billes parmi un sac contenant 8 billes, toutes de couleurs différentes. Dans ce cas, pour chacune des billes, on peut soit la choisir, soit ne pas la choisir. C’est à dire que pour chacune des billes, la fonction génératrice est donnée par . Il faut ensuite multiplier cette fonction génératrice pour chacune des billes. La fonction génératrice décrivant le problème est donc:
Comme nous devons choisir billes, il nous faut maintenant trouver le coefficient de dans la fonction génératrice. Pour ce faire, on peut développer l’expression rapidement à l’aide de Python.
1 from sympy import *2 from pandas import *3 init_printing()45 x = Symbol(’x’)6 expand((1+x)**8)
Ce qui nous donne:
La solution du problème est donc . Remarquez que nous pouvons comme dans le chapitre précédent, créer un tableau permettant de représenter les différentes possibilités.
1 from sympy import *2 from pandas import *3 init_printing()45 x = Symbol(’x’)6 polynome = Poly((1+x)**8).all_coeffs()7 polynome.reverse()8 tableau = DataFrame([polynome])9 tableau.index = ["Valeurs"]10 tableau
Ce qui nous donne:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
| Valeurs | 1 | 8 | 28 | 56 | 70 | 56 | 28 | 8 | 1 |
Remarquez que cette même solution aurait pu être obtenu avec les principes de base. En utilisant le principe du produit, nous avons façons de choisir les billes avec de l’ordre. Pour enlever l’ordre, nous devons ensuite appliquer le principe d’équivalence et diviser par , ce qui nous donne:
En fait, ce que notre exemple illustre est que si nous voulons choisir billes, alors en résolvant le problème à l’aide des principes de bases, puis à l’aide des fonctions génératrices, on obtient alors l’égalité suivante:
Exemple 3.2.2.
De combien de façon peut on choisir 5 billes qui peuvent être choisi parmi des billes de couleur jaune, rouge et bleue? Dans ce cas, l’idée est similaire à l’exemple précédent, sauf que notre fonction génératrice pour chacune des billes doit tenir compte que l’on peut choisir soit ou billes d’une même couleur. Donc pour chacune des couleurs, la fonction génératrice sera . Il nous faut ensuite multiplier cette fonction par elle même trois fois pour tenir compte des trois couleurs possible. La fonction génératrice d’écrivant le problème est donc:
En utilisant Python, il nous est maintenant facile de le développer.
1 from sympy import *2 from pandas import *3 init_printing()45 x = Symbol(’x’)6 expand((1+x+x**2+x**3+x**4+x**5)**3)
Ce qui nous donne:
Comme nous voulons choisir billes, c’est le coefficient de qui nous intéresse. La solution du problème est donc . Il est aussi bien entendu possible de construire à l’aide de Python un tableau de valeur.
1 from sympy import *2 from pandas import *3 init_printing()45 x = Symbol(’x’)6 polynome = Poly((1+x+x**2+x**3+x**4+x**5)**3).all_coeffs()7 polynome.reverse()8 tableau = DataFrame([polynome])9 tableau.index = ["Valeurs"]10 tableau
Ce qui nous donne:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |
| Valeurs | 1 | 3 | 6 | 10 | 15 | 21 | 25 | 27 | 27 | 25 | 21 | 15 | 10 | 6 | 3 | 1 |
Il faut cependant faire attention, car les valeurs pour sont potentiellement incorrectes. Ceci vient du fait que, dans notre fonction génératrice, nous avons considéré qu’il était possible de choisir un maximum de billes de chaque couleur. Si on souhaite que notre tableau soit correcte pour toutes les valeurs de , on peut modifier notre fonction génératrice comme suit:
Ce qui nous donne en utilisant Python:
1 from sympy import *2 from pandas import *3 init_printing()45 x = Symbol(’x’)6 polynome = Poly(series(1/(1-x)**3, x, n=16).removeO()).all_coeffs()7 polynome.reverse()8 tableau = DataFrame([polynome])9 tableau.index = ["Valeurs"]10 tableau
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |
| Valeurs | 1 | 3 | 6 | 10 | 15 | 21 | 28 | 36 | 45 | 55 | 66 | 78 | 91 | 105 | 120 | 136 |
Remarquez que, comme pour le problème précédent, ce n’est pas la seule approche possible. Nous aurions très bien pu considérer que le problème consiste à choisir billes parmi sans ordre et avec remise, ce qui nous donne:
En combinant ces deux approches, nous avons en fait montré que:
Exemple 3.2.3.
De combien de façon peut on acheter 10 billes rouge si celle si sont vendu en paquet de 1, 2 et 3? Nous allons traiter séparément les paquets de , et pour ce qui est de leur fonction génératrice. Dans le cas des paquets de , nous avons une seule façon d’acheter bille, billes, billes, etc. On a donc la fonction génératrice suivante:
Dans le cas des paquets de , nous avons une seule possibilité d’en acheter , et façon d’en acheter . Ensuite, nous avons à nouveau façon d’en acheter et façon d’en acheter , etc. La fonction génératrice est donc:
De la même manière, la fonction génératrice pour les paquets de sera:
La fonction génératrice décrivant le problème sera donc:
C’est le coefficient de qui nous intéresse. À l’aide de Python, on obtient facilement le résultat:
1 from sympy import *2 from pandas import *3 init_printing()45 x = Symbol(’x’)6 p1 = sum([x**i for i in range(0,11)])7 p2 = sum([x**(2*i) for i in range(0,6)])8 p3 = sum([x**(3*i) for i in range(0,4)])9 expand(p1*p2*p3).coeff(x**10)
La réponse finale est donc . Plus généralement, si on souhaite acheter boules (plutôt que ), la fonction génératrice devient alors:
1 from sympy import *2 from pandas import *3 init_printing()45 x = Symbol(’x’)6 FGO = 1 / ((1-x)*(1-x**2)*(1-x**3))7 polynome = Poly(series(FGO, x, n=16).removeO()).all_coeffs()8 polynome.reverse()9 tableau = DataFrame([polynome])10 tableau.index = ["Valeurs"]11 tableau
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |
| Valeurs | 1 | 1 | 2 | 3 | 4 | 5 | 7 | 8 | 10 | 12 | 14 | 16 | 19 | 21 | 24 | 27 |
Exemple 3.2.4.
De combien de façon peut on choisir 10 billes parmi des billes jaunes, rouges, bleues et vertes, si on veut au moins 2 billes jaunes, au plus 3 billes rouges, un nombre pair de billes bleues et entre 2 et 4 billes vertes ? Dans ce cas, en appliquant la même idée que précédemment, on obtient que la fonction génératrice décrivant le problème est:
La solution cherchée est celle correspondant au coefficient de .
1 from sympy import *2 from pandas import *3 init_printing()45 p1 = sum([x**i for i in range(2,11)])6 p2 = sum([x**i for i in range(0,4)])7 p3 = sum([x**(2*i) for i in range(0,6)])8 p4 = sum([x**i for i in range(2,5)])910 expand(p1*p2*p3*p4).coeff(x**10)
Dans notre cas, il y a donc façons de choisir les billes.