Alors voilà : J'essaie de calculer la somme de tous les nombres premiers inférieurs à deux millions (pour ce problème ), mais mon programme est très lent. Je sais que l'algorithme en lui-même est terriblement mauvais et qu'il s'agit d'un algorithme de force brute, mais il me semble beaucoup plus lent qu'il ne le devrait.
Ici, je limite la recherche à 20 000 afin que le résultat ne soit pas attendu trop longtemps.
Je ne pense pas que ce prédicat soit difficile à comprendre mais je vais quand même l'expliquer : je calcule la liste de tous les nombres premiers inférieurs à 20 000 et je les additionne. La partie somme est bonne, la partie nombres premiers est très lente.
problem_010(R) :-
p010(3, [], Primes),
sumlist([2|Primes], R).
p010(20001, Primes, Primes) :- !.
p010(Current, Primes, Result) :-
(
prime(Current, Primes)
-> append([Primes, [Current]], NewPrimes)
; NewPrimes = Primes
),
NewCurrent is Current + 2,
p010(NewCurrent, NewPrimes, Result).
prime(_, []) :- !.
prime(N, [Prime|_Primes]) :- 0 is N mod Prime, !, fail.
prime(ToTest, [_|Primes]) :- prime(ToTest, Primes).
J'aimerais avoir une idée de la raison pour laquelle il est si lent. S'agit-il d'une bonne implémentation de l'algorithme stupide de force brute, ou y a-t-il une raison quelconque qui fait que Prolog tombe ?
EDIT : J'ai déjà trouvé quelque chose, en ajoutant les nouveaux nombres premiers au lieu de les laisser en tête de liste, j'ai des nombres premiers qui apparaissent plus souvent au début, donc c'est ~3 fois plus rapide. J'ai encore besoin d'un peu d'aide :)