| Paste number 89961: | A prime sieve |
| Pasted by: | Omnifarious |
| When: | 3 months, 2 days ago |
| Share: | Tweet this! | http://paste.lisp.org/+1XEX |
| Channel: | #erlang |
| Paste contents: |
-module(sieve).
-export([primesieve/1, primeproc/1]).
primesieve(2) ->
[2];
primesieve(MaxToBeTested) when MaxToBeTested > 2 ->
NextStep = spawn(sieve, primeproc, [3]),
[2 | primesieve(3, NextStep, MaxToBeTested)].
primesieve(CurNum, NextStep, MaxToBeTested) when CurNum < MaxToBeTested ->
NextStep ! CurNum,
primesieve(CurNum + 2, NextStep, MaxToBeTested);
primesieve(_, NextStep, _) ->
NextStep ! {finished, self()},
receive
{result, Result} ->
Result
end.
primeproc(Starting) ->
receive
{finished, Parent} ->
Parent ! {result, [Starting]};
CurNum when CurNum rem Starting == 0 ->
primeproc(Starting);
CurNum ->
primeproc(Starting, spawn(sieve, primeproc, [CurNum]))
end.
primeproc(Starting, NextStep) ->
receive
{finished, Parent} ->
NextStep ! {finished, self()},
receive
{result, Result} ->
Parent ! {result, [Starting | Result]}
end;
CurNum when CurNum rem Starting == 0 ->
primeproc(Starting, NextStep);
CurNum ->
NextStep ! CurNum,
primeproc(Starting, NextStep)
end.
This paste has no annotations.