Sujet : Re: 0!=1 ?
De : talon (at) *nospam* niobe.lpthe.jussieu.fr (Michel Talon)
Groupes : fr.sci.mathsDate : 16. Mar 2023, 00:49:46
Autres entêtes
Organisation : Guest of ProXad - France
Message-ID : <6412599a$0$3011$426a74cc@news.free.fr>
References : 1 2 3 4 5 6 7 8
User-Agent : Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.8.0
Le 15/03/2023 à 19:06, Dominique a écrit :
Et je résous mon énigme arithmétique du premier coup 😄
En fait le programme python qui fait la même chose que le programme maxima est (avec l'ajout du timer):
from math import factorial
import time
start_time = time.time()
result=False
cpt=1
while not result:
nb=str(cpt)
nb1=[int(x) for x in nb]
nb2=0
for i in nb1:
nb2+=factorial(i)
if nb2==cpt:
print(cpt)
if cpt==100000:
result=True
cpt += 1
print("--- %s seconds ---" % (time.time() - start_time))
Ce qui donne:
>>> 1
2
145
40585
--- 0.3823738098144531 seconds ---
Il est donc *beaucoup* plus rapide que le programme maxima. Ce qui facilite beaucoup les choses c'est la possibilité de convertir le nombre en string et d'itérer sur les chiffres nb1=[int(x) for x in nb]
Je découvre juste qu'il existe une possibilité similaire avec maxima:
(%i1) subst("+","[", map("!",map(parse_string,sexplode(string(40585)))));
(%o1) 40585
Ici string(n) convertit n en string, sexplode crée une liste des chiffres, parse_string convertit chaque chiffre en nombre, et on ajoute la factorielle. On obtient une liste de factorielles qu'on convertit en somme par le subst. C'est donc exactement ce que tu fais. Le programme équivalent au tien est donc:
(%i2) for n from 1 thru 100000 do if (n=subst("+","[", map("!",map(parse_string,sexplode(string(n)))))) then print(n);
1
2
145
40585
(%o2) done
(%i3) time(%);
(%o3) [5.116]
Il est clairement toujours beaucoup plus lent que le programme python.
-- Michel Talon