This repository has been archived on 2024-01-26. You can view files and clone it, but cannot push or open issues or pull requests.
coding-corner/2017-04-11/joe_euler87.erl

37 lines
1.1 KiB
Erlang
Raw Permalink Normal View History

-module(joe_euler87).
-export([go/0]).
go() ->
Max = 50000000,
Primes = sieve(Max),
Sums = find_pow234(Max, Primes),
length(Sums).
%%% find all solutions for X^2+Y^3+Z^4 smaller Max
find_pow234(Max, Primes) ->
XPrimes = lists:takewhile(fun(P) -> pow2(P) < Max end, Primes),
YPrimes = lists:takewhile(fun(P) -> pow3(P) < Max end, Primes),
ZPrimes = lists:takewhile(fun(P) -> pow4(P) < Max end, Primes),
lists:usort(lists:filter(
fun(Num) -> Num < Max end,
[powsum234(A, B, C) || A<-XPrimes, B<-YPrimes, C<-ZPrimes])).
%%% generate a list of all primes smaller Max
sieve(Max) ->
Until = trunc(math:sqrt(Max)),
sieve([], 2, 3, Until).
sieve(Primes, LastPrime, N, Until) when (N > Until) ->
lists:append(Primes, [LastPrime]);
sieve(Primes, LastPrime, N, Until) ->
case lists:all(fun(P) -> (N rem P)=/=0 end, Primes) of
true -> sieve(lists:append(Primes, [LastPrime]), N, N+2, Until);
false -> sieve(Primes, LastPrime, N+2, Until)
end.
%%% helper functions
powsum234(X, Y, Z) -> pow2(X) + pow3(Y) + pow4(Z).
pow2(X) -> X*X.
pow3(X) -> X*X*X.
pow4(X) -> X*X*X*X.