Skip to content

Instantly share code, notes, and snippets.

@takkkun
Created February 27, 2014 11:33
Show Gist options
  • Select an option

  • Save takkkun/9248495 to your computer and use it in GitHub Desktop.

Select an option

Save takkkun/9248495 to your computer and use it in GitHub Desktop.
#!/usr/bin/env escript
%% -*- erlang -*-
main([]) ->
main([100]);
main([Limit|_]) when is_list(Limit) ->
main([list_to_integer(Limit)]);
main([Limit|_]) ->
Receiver = self(),
PrimeGenerator = spawn(fun() -> prime(Receiver, Limit) end),
loop(PrimeGenerator).
loop(PrimeGenerator) ->
receive
{PrimeGenerator, {prime, N}} ->
io:format("~p is a prime number~n", [N]),
loop(PrimeGenerator);
{PrimeGenerator, {done, Primes}} ->
io:format("done, prime numbers are number of ~p~n", [length(Primes)])
end.
prime(Receiver, Limit) ->
prime(Receiver, Limit, 2, []).
prime(Receiver, Limit, N, Primes) when Limit < N ->
Receiver ! {self(), {done, Primes}};
prime(Receiver, Limit, N, Primes) ->
case is_prime(N, Primes) of
true ->
Receiver ! {self(), {prime, N}},
prime(Receiver, Limit, N + 1, [N|Primes]);
false ->
prime(Receiver, Limit, N + 1, Primes)
end.
is_prime(_, []) -> true;
is_prime(N, [H|_]) when N rem H =:= 0 -> false;
is_prime(N, [_|T]) -> is_prime(N, T).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment