3.6 Retour sur le problème des pièces de monnaie

Dans le problème des pièces de monnaie, nous avons résolu le problème à l’aide d’une récurrence, puis d’une fonction génératrice ordinaire, et nous avons remarqué que les deux méthodes nous donnaient des solutions différentes. À l’aide de la récurrence, notre solution tenait compte de l’ordre des pièces, alors qu’avec les fonctions génératrices ordinaires, notre solution n’en tenait pas compte. Une question intéressante se pose maintenant. Est-ce que les fonctions génératrices exponentielles pourraient nous permettre d’obtenir la même solution que celle que nous avions obtenue à l’aide de la récurrence ? À première vue, la réponse semble être oui, mais en essayant, on remarque assez rapidement qu’il y a un problème.

(n=0x2n(2n)!)(n=0x5n(5n)!)=1+0x11!+1x22!+0x33!+1x44!+1x55!+1x66!+21x77!+1x88!+126x99!+2x1010!+\displaystyle\left(\sum_{n=0}^{\infty}\frac{x^{2n}}{(2n)!}\right)\left(\sum_{n% =0}^{\infty}\frac{x^{5n}}{({5n})!}\right)=1+0\frac{x^{1}}{1!}+1\frac{x^{2}}{2!% }+0\frac{x^{3}}{3!}+1\frac{x^{4}}{4!}+1\frac{x^{5}}{5!}+1\frac{x^{6}}{6!}+21% \frac{x^{7}}{7!}+1\frac{x^{8}}{8!}+126\frac{x^{9}}{9!}+2\frac{x^{10}}{10!}+...

Les valeurs semblent correctes, sauf pour 7\displaystyle 7 et 9\displaystyle 9 qui nous donnent des valeurs complètement absurdes. Que s’est-il passé ? On remarque assez rapidement que 7\displaystyle 7 et 9\displaystyle 9 pence sont les deux plus petits montants qui nécessitent à la fois des pièces de 2\displaystyle 2 pence et de 5\displaystyle 5 pence. Le problème se répète par la suite pour tous les montants qui nécessitent ces deux pièces. Le problème est que la fonction génératrice exponentielle considère les pièces de deux pence et de cinq pence non pas comme une seule pièce, mais plutôt comme 2\displaystyle 2 et 5\displaystyle 5 pièces individuelles respectivement. Les fonctions génératrices exponentielles ne peuvent donc pas nous permettre d’obtenir directement la même solution que celle que nous avions obtenue à l’aide de la récurrence.

Il y a cependant une façon de contourner ce problème, mais il nous faut utiliser une combinaison de fonctions génératrices ordinaires et exponentielles, et donc cela nécessite deux variables. Si nous considérons x\displaystyle x comme une variable représentant les montants et y\displaystyle y une seconde variable tenant compte du nombre de pièce. Comme seul les pièces individuelles doivent tenir compte de l’ordre, ces seulement le y\displaystyle y qui sera une fonction génératrice exponentielle, les x\displaystyle x resteront sous la forme d’une fonction génératrice ordinaire. On obtient donc:

(n=0x2nynn!)(n=0x5nynn!)=+(2y22!)x7+(y44!)x8+(3y33!)x9+(y55!+y22!)x10+\displaystyle\left(\sum_{n=0}^{\infty}x^{2n}\frac{y^{n}}{n!}\right)\left(\sum_% {n=0}^{\infty}x^{5n}\frac{y^{n}}{{n}!}\right)=...+\left(2\frac{y^{2}}{2!}% \right)x^{7}+\left(\frac{y^{4}}{4!}\right)x^{8}+\left(3\frac{y^{3}}{3!}\right)% x^{9}+\left(\frac{y^{5}}{5!}+\frac{y^{2}}{2!}\right)x^{10}+...

Ceci nous indique que pour faire un montant de 7\displaystyle 7 pence, il y a deux façons en utilisant deux pièces. Pour faire un montant de 8\displaystyle 8 pence, il y a une seule façon en utilisant quatre pièce. Pour faire un montant de 9\displaystyle 9 pence, il y a 3\displaystyle 3 façons en utilisant trois pièces, puis pour faire un montant de 10\displaystyle 10 pence, il y a une façon en utilisant cinq pièce et une façon qui utilise deux pièce (et donc 2 façons au total). Ceci correpond donc à ce que nous avions obtenu en utilisant une récurrence. On peut ensuite utiliser le code Python suivant pour obtenir un tableau complet.

Listing 24: Pièces de monnaie: Fonctions génératrices à deux variables

              1
              
              
              
            from sympy import *


              2
              
              
              
            from pandas import *


              3
              
              
              
            init_printing()


              4
              
              
              
            


              5
              
              
              
            x = Symbol(’x’)


              6
              
              
              
            y = Symbol(’y’)


              7
              
              
              
            rep = [1]


              8
              
              
              
            p2 = sum([x**(2*n)*y**n/factorial(n) for n in range(0,11)])


              9
              
              
              
            p5 = sum([x**(5*n)*y**n/factorial(n) for n in range(0,11)])


              10
              
              
              
            for i in range(1,16):


              11
              
              
              
                polynome = expand(p2*p5).coeff(x**i)


              12
              
              
              
                rep.append(sum([polynome.coeff(y**j) * factorial(j) for j in range(1,21)]))


              13
              
              
              
            rep = DataFrame([rep])


              14
              
              
              
            rep.index = ["Valeurs"]


              15
              
              
              
            rep
n\displaystyle n 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
an\displaystyle a_{n} 1 0 1 0 1 1 1 2 1 3 2 4 4 5 7 7