Confinement, Sha25, Garderie Pokémon
Confinement.. confinement, le confinement est long et pour m’occuper, j’ai participé aux différents challenges proposés par h25
Je vous présente ici comment j’ai abordé un des problèmes proposé, “La garderie Pokémon”
Sacha est hyper fier de ses Pokémon, mais ils n’arrêtent pas de se reproduire ! Au début, c’était simple de tous les nommer, mais Sacha commence à en avoir marre et leur donne de drôles de surnoms : “Spiderman”, “Cheh”, ou encore “Wallah je suis un chacal Le tripe des roulacast chegt conduit !”.
Mais quand cette folie reproductrice prendra-t-elle fin ? Nous avons réussi à modéliser la taille de la population de ses Pokémon en utilisant le programme ci-dessous, mais nos machines ne semblent pas assez puissantes pour calculer ce nombre…
Première impression, le nombre est grand, très GRAND, très très GRAND !
Il parait immédiatement que le calcul direct ne pourra pas aboutir. La récursion est une impasse, les astuces classiques comme la mémoization ne suffiront pas non plus.
\[u_{n} = 6 \times u_{n-1} + u_{n-2}\]La formule ressemble à celle de la suite de Fibonacci, qui est un exercice très classique pour de l’optimisation. Mes souvenirs me rapellent deux choses, on peut trouver une formule analytique et il peut être modélisé comme un produit matriciel.
La formule analytique
Je commence ma recherche documentaire sur wikipédia, c’est un problème bien étudié, mais ça semble bien compliqué.
Le produit matriciel
J’en ai des souvenirs assez brumeux, mais je recherche à construire la matrice correspondant au problème. J’utilise un calculateur en ligne pour tester les cxxxx de coefficients à mettre dans la matrice.
\[\begin{pmatrix} 6 & 1 \\ 1 & 0 \end{pmatrix} \times \begin{pmatrix} u_{n-1} \\ u_{n-2} \end{pmatrix} = \begin{pmatrix} 6 \times u_{n-1} + u_{n-2}\\ u_{n-1} \end{pmatrix}\]La matrice est construite, il reste maintenant à l’élever à la puissance LE NOMBRE ENORME pour arriver au résultat.
Une implémentation de la classe matrice, avec le modulo (inhabituel)
il faut se méfier des overflows :(
Je teste avec fibonacci, puis avec le sujet.
Done.
Le calcul est incroyablement rapide !!! L’exponentiation rapide a réduit le nombre de multiplications à 1394.
Cet exercice m’a permis de me replonger rapidement dans le calcul matriciel, quelques galères sur les overflows et un effet whaoua lors du run.
Have fun & KeepCoding !