Liste des Groupes | Revenir à fs maths |
Le 10/11/2024 à 12:25, Michel Talon a écrit :OK c'est génial le lisp (franchement rarement vu langage aussi peu lisible) :)>En fait j'avais mal compris la documentation lisp de floor, et oublié qu'il y a une fonction mod, si bien que j'ai réécrit le programme avec ces fonctions et des déclarations appropriées, et j'ai enfin un temps d'exécution correct, tout en étant plus proche de ton programme:
Autrement dit floor est une fonction très compliquée qui prend
beaucoup de temps à l'exécution. De fait utilisant le profiler de
lisp on voit que presque tout le temps d'exécution est à cet
endroit.
(time
(let ((i 0)(p 1)(q 10)(m 1)(a 1)(b 1))
(declare (fixnum i p q m a b)
(optimize (speed 3)(safety 0)))
(do ((n 2 (incf n)))
((> n (expt 10 7)) 'DONE)
(if (>= n q)
(progn (setq p q)
(setq q (* 10 q))))
(setq m (* n n))
(setq a (floor m q))
(setq b (mod m q))
(if (and (= n (+ a b))
(>= a p))
(progn (incf i)
(format t "~d ~d ~d ~%" i n m)))))))
Ce qui donne:
1 9 81
2 45 2025
3 55 3025
4 99 9801
...
44 9372385 87841600588225
45 9999999 99999980000001
Evaluation took:
0.643 seconds of real time
0.641880 seconds of total run time (0.641880 user, 0.000000 system)
99.84% CPU
961,544,359 processor cycles
32,736 bytes consed
En particulier il y a infiniment moins de mémoire allouée au calcul (bytes consed ...).
Du coup je suis monté jusqu'à 10^9 le calcul prend 67s. les derniers résultats sont:
Les messages affichés proviennent d'usenet.