Qual é o gargalo nesse predicado relacionado aos primos?
Então aqui está: estou tentando calcular a soma de todos os números primos abaixo de dois milhões (paraeste problem), mas meu programa é muito lento. Eu sei que o algoritmo em si é terrivelmente ruim e uma força bruta, mas parece muito mais lento do que deveria para mi
Aqui limito a pesquisa a 20.000, para que o resultado não seja esperado por muito temp
Eu não acho que esse predicado seja difícil de entender, mas vou explicar de qualquer maneira: calculo a lista de todos os números primos abaixo de 20.000 e depois os somatório. A parte da soma é boa, a parte dos primos é muito lent
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).
Gostaria de ter uma ideia de por que é tão lento. É uma boa implementação do algoritmo estúpido de força bruta ou existe algum motivo para fazer o Prolog cair?
EDIT: Eu já encontrei algo, acrescentando novos números primos em vez de deixá-los no topo da lista, eu tenho números primos que ocorrem com mais frequência no início, por isso é ~ 3 vezes mais rápido. Ainda precisamos de algumas dicas:)