Des casse-tête numériques à l'inverseur de Plouffe

J’utilise parfois l’Inverse Symbolic Calculator disponible ici et à chaque fois il me sidère. Comment fait-il pour retrouver l’expression mathématique correspondant à presque n’importe quelle valeur décimale, par exemple que ma date de naissance 1963.1225 est presque égale à $1000.\sum\limits\limits_{n=1}^{\infty}{\frac{1}{3^n.(3n^2+18n-1)}} $ ???
Ce n’est qu’en consultant le code source Maple de l’auteur original, Simon Plouffe , que j’ai réalisé que ce problème est proche de casse-têtes déjà abordés sur ce blog:
- Comment obtenir 100 avec 1,2,3,4,5,6,7,8,9 dans l’ordre
- Le cadran des trois neufs généralisé, consistant à écrire les entiers de 1 à 12 avec 3 chiffres identiques
- Le “jeu de l’année ”, où il faut obtenir les entiers de 0 à 100 en utilisant les 4 chiffres de l’année. En 2012 j’avais titré “c’est fini” en publiant un code Python vite fait mal fait qui résolvait ce problème
et d’autres comme :
- Les quatre quatre consistant à représenter tous les entiers possibles en utilisant 4 fois le chiffre 4
- et surtout les nombre de Friedman (A036057 ), qui sont ceux que l’on peut composer à partir de leurs chiffres , parfois même dans l’ordre (A080035 )
Du casse-tête à la génération de nombres
Lorsqu’on aborde ces problèmes comme des casse-tête, on a tendance à chercher une formule pour chaque nombre, par exemple pour le jeu de l’année 2018:
- chercher une formule donnant 1 avec 2,0,1 et 8 : grâce au 1 et le 0, on trouve la formule “dans l’ordre” 2*0+1^8 immédiatement
- puis (2+0)*1^8 = 2
- et 2+0+1^8 = 3
- pour 4 il faut apparemment se résoudre à utiliser les chiffres dans le désordre : 1/2 * 8 + 0 = 4
- puis -2 -1 + 0 + 8 = 5
- -2+0*1+8 = 6, dans l’ordre à nouveau
- -2+0+1+8 = 7
- ..et ainsi de suite facilement jusqu’à 28-10 = 18
Mais pour 19, on rame … Existe-t’il une solution ? Ou faut-il ajouter des opérations supplémentaires comme la factorielle ? Le seul moyen de répondre à ces questions serait d’essayer toutes les combinaisons possibles, mais ça en fait beaucoup, dont la plupart fourniront des résultats différents de 19. Alors autant en profiter pour résoudre le problème “à l’envers”, en générant tous les nombres possibles puis en cherchant dans les résultats si on a une solution pour 1,2,3, .. 19, … et ainsi de suite.
Un Python dévorant de l’AST défèque du LaTeX
Mon premier code python vite fait mal fait pour résoudre le jeu de l’année 2012 utilisait déjà quelques bonnes idées:
- une classe pour stocker les formules générées, indexées par le nombre généré
- une classe descendante pour générer les résultats par applications des fonctions et opérateurs monadiques
- une autre classe pour les opérateurs dyadiques habituels . +, - *, /, ^
- la fonction itertools.permutations pour générer toutes les combinaisons possibles des chiffres de base
$0 = \sin\left(\pi\right) \\\\ 1.1066376096750703e-08 = \sqrt{\sin\left(\pi\right)} \\\\ 0.0016220420328425947 = -\log_{10}\left(\tanh\left(\pi\right)\right) \\\\ 0.0053883069999880245 = -\log_2\left(\tanh\left(\pi\right)\right) \\\\ 0.08061223884710403 = -\cos\left(\log_2\left(\pi\right)\right) \\\\ 0.08637409704956384 = \arccos\left(\tanh\left(\pi\right)\right) \\\\ 0.10127515998198242 = \log_{10}\left(\arctan\left(\pi\right)\right) \\\\ 0.20029354112337366 = -\cos\left(\sqrt{\pi}\right) \\\\ 0.2178775601946847 = \log_{10}\left(\log_2\left(\pi\right)\right) \\\\ 0.2384115869826587 = -\cos\left(\cosh^{-1}\left(\pi\right)\right) \\\\ 0.2485749363470669 = \log_{10}\left(\sqrt{\pi}\right) \\\\ 0.25804463696400576 = \log_{10}\left(\cosh^{-1}\left(\pi\right)\right) \\\\ 0.2700486505921227 = \log_{10}\left(\sinh^{-1}\left(\pi\right)\right) \\\\ 0.28738870981373654 = -\cos\left(\sinh^{-1}\left(\pi\right)\right) \\\\ 0.303314471053353 = \cos\left(\arctan\left(\pi\right)\right) \\\\ 0.30351266745964006 = -\log_{10}\left(\log_{10}\left(\pi\right)\right) \\\\ 0.3364287992583597 = \log_2\left(\arctan\left(\pi\right)\right) \\\\ 0.3594631941472303 = \log_{10}\left(\Gamma\left(\pi\right)\right) \\\\ 0.40890356614612045 = -\cos\left(e^{\pi}\right) \\\\ 0.45987273106154514 = \tanh\left(\log_{10}\left(\pi\right)\right) \\\\ 0.4613649087218807 = \arctan\left(\log_{10}\left(\pi\right)\right) \\\\ 0.47692237272813737 = \sin\left(\log_{10}\left(\pi\right)\right) \\\\ 0.47866114168179535 = \sinh^{-1}\left(\log_{10}\left(\pi\right)\right) \\\\ 0.49714987269413385 = \log_{10}\left(\pi\right) \\\\ 0.5178835400771429 = \sinh\left(\log_{10}\left(\pi\right)\right) \\\\ 0.5203108468523976 = \arcsin\left(\log_{10}\left(\pi\right)\right) \\\\ 0.5253829059023629 = \cos\left(\sinh\left(\pi\right)\right) \\\\ 0.5403023058681398 = \cos\left(-\cos\left(\pi\right)\right) \\\\ 0.5426074954923101 = \tan\left(\log_{10}\left(\pi\right)\right) \\\\ 0.5434354838975394 = \cos\left(\tanh\left(\pi\right)\right) \\\\ 0.5455131633547174 = \tanh^{-1}\left(\log_{10}\left(\pi\right)\right) \\\\ 0.5616502280096894 = \cos\left(\cosh\left(\pi\right)\right) \\\\ 0.6573082860590352 = -\cos\left(\Gamma\left(\pi\right)\right) \\\\ 0.7050885566325225 = \sqrt{\log_{10}\left(\pi\right)} \\\\ 0.7097529597429991 = \cosh^{-1}\left(\arctan\left(\pi\right)\right) \\\\ 0.7237735884562356 = \log_2\left(\log_2\left(\pi\right)\right) \\\\ 0.7536217997630731 = \sin\left(\Gamma\left(\pi\right)\right) \\\\ 0.7600240731703095 = \tanh\left(\tanh\left(\pi\right)\right) \\\\ 0.7615941559557649 = \tanh\left(-\cos\left(\pi\right)\right) \\\\ 0.7835307228365398 = \arctan\left(\tanh\left(\pi\right)\right) \\\\ 0.7853981633974483 = \arctan\left(-\cos\left(\pi\right)\right) \\\\ 0.8257480647361592 = \log_2\left(\sqrt{\pi}\right) \\\\ 0.8273747768554852 = -\sin\left(\cosh\left(\pi\right)\right) \\\\ 0.839450936529972 = \sin\left(\tanh\left(\pi\right)\right) \\\\ 0.8414709848078965 = \sin\left(-\cos\left(\pi\right)\right) \\\\ 0.8508659131646942 = -\sin\left(\sinh\left(\pi\right)\right) \\\\ 0.8517867999026187 = \tanh\left(\arctan\left(\pi\right)\right) \\\\ 0.8572057292657407 = \log_2\left(\cosh^{-1}\left(\pi\right)\right) \\\\ 0.8787350885719889 = \sinh^{-1}\left(\tanh\left(\pi\right)\right) \\\\ 0.8789454194609376 = \cos\left(\log_{10}\left(\pi\right)\right) \\\\ 0.8813735870195429 = \sinh^{-1}\left(-\cos\left(\pi\right)\right) \\\\ 0.8970821993883932 = \log_2\left(\sinh^{-1}\left(\pi\right)\right) \\\\ 0.9003440704475638 = \Gamma\left(\log_2\left(\pi\right)\right) \\\\ 0.900952887864509 = \arctan\left(\arctan\left(\pi\right)\right) \\\\ 0.9038887978916361 = \Gamma\left(\arctan\left(\pi\right)\right) \\\\ 0.9125775986692777 = -\sin\left(e^{\pi}\right) \\\\ 0.9243607675016626 = \Gamma\left(\sqrt{\pi}\right) \\\\ 0.9290626405396939 = \tanh\left(\log_2\left(\pi\right)\right) \\\\ 0.934493916651473 = \Gamma\left(\cosh^{-1}\left(\pi\right)\right) \\\\ 0.9438777473631609 = \tanh\left(\sqrt{\pi}\right) \\\\ 0.9479867173951659 = \tanh\left(\cosh^{-1}\left(\pi\right)\right) \\\\ 0.9494040798538225 = \Gamma\left(\sinh^{-1}\left(\pi\right)\right) \\\\ 0.9528905139886873 = \sin\left(\arctan\left(\pi\right)\right) \\\\ 0.9528905139886874 = \tanh\left(\sinh^{-1}\left(\pi\right)\right) \\\\ 0.9578140369986211 = \sin\left(\sinh^{-1}\left(\pi\right)\right) \\\\ 0.9711642060910246 = \sin\left(\cosh^{-1}\left(\pi\right)\right) \\\\ 0.9796193833710564 = \tanh\left(\Gamma\left(\pi\right)\right) \\\\ 0.9797359324758174 = \sin\left(\sqrt{\pi}\right) \\\\ 0.99627207622075 = \tanh\left(\pi\right) \\\\ 0.9967455377116355 = \sin\left(\log_2\left(\pi\right)\right) \\\\ 0.9981342976878161 = \sqrt{\tanh\left(\pi\right)} \\\\ 0.9999999998138246 = \tanh\left(\sinh\left(\pi\right)\right) \\\\ 0.9999999998292396 = \tanh\left(\cosh\left(\pi\right)\right) \\\\ 1 = -\cos\left(\pi\right) \\\\ 1.002165608530718 = \Gamma\left(\tanh\left(\pi\right)\right) \\\\ 1.0082472571883836 = -\log_2\left(\log_{10}\left(\pi\right)\right) \\\\ 1.0263340602019209 = \arctan\left(\log_2\left(\pi\right)\right) \\\\ 1.050485479942499 = \arccos\left(\log_{10}\left(\pi\right)\right) \\\\ 1.0554569703792611 = \sinh^{-1}\left(\arctan\left(\pi\right)\right) \\\\ 1.0571243112754385 = \arctan\left(\sqrt{\pi}\right) \\\\ 1.0625345798933474 = \log_{10}\left(\sinh\left(\pi\right)\right) \\\\ 1.06415662192619 = \log_{10}\left(\cosh\left(\pi\right)\right) \\\\ 1.0664030390131651 = \arctan\left(\cosh^{-1}\left(\pi\right)\right) \\\\ 1.0780106889436865 = \arctan\left(\sinh^{-1}\left(\pi\right)\right) \\\\ 1.0871525572995602 = \cosh^{-1}\left(\log_2\left(\pi\right)\right) \\\\ 1.123666879319183 = \sqrt{\arctan\left(\pi\right)} \\\\ 1.1261453552196687 = \cosh\left(\log_{10}\left(\pi\right)\right) \\\\ 1.1465271558974195 = -\tan\left(\Gamma\left(\pi\right)\right) \\\\ 1.158412524612224 = \Gamma\left(\Gamma\left(\pi\right)\right) \\\\ 1.1587588521091652 = \arctan\left(\Gamma\left(\pi\right)\right) \\\\ 1.1694568594670662 = \sinh\left(\tanh\left(\pi\right)\right) \\\\ 1.1742984407142925 = \cosh^{-1}\left(\sqrt{\pi}\right) \\\\ 1.1752011936438014 = \sinh\left(-\cos\left(\pi\right)\right) \\\\ 1.194110883715635 = \log_2\left(\Gamma\left(\pi\right)\right) \\\\ 1.2005766322266866 = \cosh^{-1}\left(\cosh^{-1}\left(\pi\right)\right) \\\\ 1.2335303390478385 = \cosh^{-1}\left(\sinh^{-1}\left(\pi\right)\right) \\\\ 1.2626272556789115 = \arctan\left(\pi\right) \\\\ 1.2759642703421383 = \sinh^{-1}\left(\log_2\left(\pi\right)\right) \\\\ 1.2851054935188468 = \sqrt{\log_2\left(\pi\right)} \\\\ 1.3313353638003897 = \sqrt{\sqrt{\pi}} \\\\ 1.3369844095223622 = \sinh^{-1}\left(\sqrt{\pi}\right) \\\\ 1.3459295198712498 = \sqrt{\cosh^{-1}\left(\pi\right)} \\\\ 1.3560247354141104 = \sinh^{-1}\left(\cosh^{-1}\left(\pi\right)\right) \\\\ 1.3643763538418414 = \log_{10}\left(e^{\pi}\right) \\\\ 1.364659570483001 = \sqrt{\sinh^{-1}\left(\pi\right)} \\\\ 1.3803000710956943 = \sinh^{-1}\left(\sinh^{-1}\left(\pi\right)\right) \\\\ 1.4692507675331985 = \cosh^{-1}\left(\Gamma\left(\pi\right)\right) \\\\ 1.4731139338934116 = -\tan\left(\cosh\left(\pi\right)\right) \\\\ 1.4844222297453324 = \arctan\left(\sinh\left(\pi\right)\right) \\\\ 1.4844222297453329 = \arcsin\left(\tanh\left(\pi\right)\right) \\\\ 1.4847426355638642 = \arctan\left(\cosh\left(\pi\right)\right) \\\\ 1.5126261254322009 = \sqrt{\Gamma\left(\pi\right)} \\\\ 1.5276092782701145 = \arctan\left(e^{\pi}\right) \\\\ 1.5387102866214204 = \cosh\left(\tanh\left(\pi\right)\right) \\\\ 1.5430806348152437 = \cosh\left(-\cos\left(\pi\right)\right) \\\\ 1.5447113068682945 = \tan\left(\tanh\left(\pi\right)\right) \\\\ 1.5574077246549023 = \tan\left(-\cos\left(\pi\right)\right) \\\\ 1.565498441080122 = \sinh^{-1}\left(\Gamma\left(\pi\right)\right) \\\\ 1.5707963267948966 = \arccos\left(\sin\left(\pi\right)\right) \\\\ 1.619515792397743 = -\tan\left(\sinh\left(\pi\right)\right) \\\\ 1.6258930378825622 = \sinh\left(\arctan\left(\pi\right)\right) \\\\ 1.6440288952968114 = e^{\log_{10}\left(\pi\right)} \\\\ 1.6514961294723187 = \log_2\left(\pi\right) \\\\ 1.7724538509055159 = \sqrt{\pi} \\\\ 1.7824366004923267 = \Gamma\left(\log_{10}\left(\pi\right)\right) \\\\ 1.811526272460853 = \cosh^{-1}\left(\pi\right) \\\\ 1.8622957433108482 = \sinh^{-1}\left(\pi\right) \\\\ 1.9088028108306492 = \cosh\left(\arctan\left(\pi\right)\right) \\\\ 2.2317672777233026 = \tan\left(e^{\pi}\right) \\\\ 2.288037795340032 = \Gamma\left(\pi\right) \\\\ 2.5115065909006944 = \sinh\left(\log_2\left(\pi\right)\right) \\\\ 2.7032693828284353 = \cosh\left(\log_2\left(\pi\right)\right) \\\\ 2.7081671460884866 = e^{\tanh\left(\pi\right)} \\\\ 2.718281828459045 = e^{-\cos\left(\pi\right)} \\\\ 2.857680860275251 = \sinh\left(\sqrt{\pi}\right) \\\\ 2.9781881070693563 = \sinh\left(\cosh^{-1}\left(\pi\right)\right) \\\\ 3.027596389742777 = \cosh\left(\sqrt{\pi}\right) \\\\ 3.1378437356780546 = \cosh^{-1}\left(\sinh\left(\pi\right)\right) \\\\ 3.141592653589792 = \tan\left(\arctan\left(\pi\right)\right) \\\\ 3.1415926535897927 = \cosh\left(\cosh^{-1}\left(\pi\right)\right) \\\\ 3.141592653589793 = \pi \\\\ 3.141592653589798 = \tanh^{-1}\left(\tanh\left(\pi\right)\right) \\\\ 3.145313671595097 = \sinh^{-1}\left(\cosh\left(\pi\right)\right) \\\\ 3.296908309475615 = \cosh\left(\sinh^{-1}\left(\pi\right)\right) \\\\ 3.3328172064219332 = -\tan\left(\sinh^{-1}\left(\pi\right)\right) \\\\ 3.398343619656162 = \sqrt{\sinh\left(\pi\right)} \\\\ 3.4046957684235926 = \sqrt{\cosh\left(\pi\right)} \\\\ 3.5296634727370515 = \log_2\left(\sinh\left(\pi\right)\right) \\\\ 3.5346958487132114 = e^{\arctan\left(\pi\right)} \\\\ 3.5350517797370395 = \log_2\left(\cosh\left(\pi\right)\right) \\\\ 3.8342726461888614 = \cosh^{-1}\left(e^{\pi}\right) \\\\ 3.8352063682330924 = \sinh^{-1}\left(e^{\pi}\right) \\\\ 4.0734773774299144 = -\tan\left(\cosh^{-1}\left(\pi\right)\right) \\\\ 4.532360141827194 = \log_2\left(e^{\pi}\right) \\\\ 4.810477380965351 = \sqrt{e^{\pi}} \\\\ 4.877057334015103 = \sinh\left(\Gamma\left(\pi\right)\right) \\\\ 4.891500379796746 = -\tan\left(\sqrt{\pi}\right) \\\\ 4.97852269647036 = \cosh\left(\Gamma\left(\pi\right)\right) \\\\ 5.21477597372913 = e^{\log_2\left(\pi\right)} \\\\ 5.885277250018028 = e^{\sqrt{\pi}} \\\\ 6.119780760659149 = e^{\cosh^{-1}\left(\pi\right)} \\\\ 6.438500963065408 = e^{\sinh^{-1}\left(\pi\right)} \\\\ 9.855580030485463 = e^{\Gamma\left(\pi\right)} \\\\ 11.548739357257746 = \sinh\left(\pi\right) \\\\ 11.591953275521519 = \cosh\left(\pi\right) \\\\ 12.364692408582613 = -\tan\left(\log_2\left(\pi\right)\right) \\\\ 15.91198914827845 = -\log_{10}\left(\sin\left(\pi\right)\right) \\\\ 23.140692632779267 = e^{\pi} \\\\ 52.85848379720901 = -\log_2\left(\sin\left(\pi\right)\right) \\\\ 51823.14673489771 = \sinh\left(\sinh\left(\pi\right)\right) \\\\ 51823.14674454591 = \cosh\left(\sinh\left(\pi\right)\right) \\\\ 54111.72095476127 = \sinh\left(\cosh\left(\pi\right)\right) \\\\ 54111.72096400142 = \cosh\left(\cosh\left(\pi\right)\right) \\\\ 103646.29347944363 = e^{\sinh\left(\pi\right)} \\\\ 108223.44191876269 = e^{\cosh\left(\pi\right)} \\\\ 13376324.257428396 = \Gamma\left(\sinh\left(\pi\right)\right) \\\\ 14841077.907790806 = \Gamma\left(\cosh\left(\pi\right)\right) \\\\ 5608479311.233809 = \cosh\left(e^{\pi}\right) \\\\ 11216958622.467619 = e^{e^{\pi}} \\\\ 8165619676597684 = \Gamma\left(\sin\left(\pi\right)\right) \\\\ 1742626626902657859584 = \Gamma\left(e^{\pi}\right) $
\[/expand\]http://villemin.gerard.free.fr/Wwwgvmm/Nombre/NbCycliq.htm
la version “portable” est ul
http://www.plouffe.fr/simon/constants/
https://www.johndcook.com/blog/2013/04/30/recognizing-numbers/
la fonction nsimplify de SymPy

