/* Euler #10 in Picat. Problem 10 """ The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. Find the sum of all the primes below two million. """ This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ main => time(go). go => euler10. % using the built-in primes/1 % 0.58s euler10 => println(sum(primes(2000000))). % 0.82s euler10a => writeln(sum(sieve(2000000))). sieve(N) = Res => Sieve = new_array(N), foreach(I in 2..round(sqrt(N)), J in I*I..I..N) Sieve[J] := 1 end, Res := [I : I in 2..N, var(Sieve[I])]. % 7.53s % slower euler10b => Sum = 2, foreach(I in 3..2..2000000) if prime(I) then Sum := Sum + I end end, writeln(Sum). % using list comprehension instead % 7.44s (7.54s) euler10c => % writeln(sum([I : I in 1..2000000, prime(I)])). % 7.54s writeln(2+sum([I : I in 3..2..2000000, prime(I)])). % 7.46s % 7.78s euler10d => Sum = 2, % for 2 I = 3, while(I <= 2000000) if prime(I) then Sum := Sum + I end, I := I + 2 end, writeln(Sum). % % recursion approach. % It seems to be slightly faster than any other of the loop/list comprehension % approaches. % % 7.43s euler10e => e10e(Sum), println(Sum). e10e(Sum) => e10e(3,2,Sum). e10e(N,S0,S) ?=> N > 2000000, S = S0. e10e(N,S0,S) => N <= 2000000, (prime(N) -> S1 = S0+N ; S1 = S0 ), e10e(N+2,S1,S).