私は projecteuler.net の問題を解いて Erlang でのプログラミング方法を学んでいますが、200 万未満の素数をすべて 1 分以内に作成できる素数ジェネレータを作成するのに最も苦労しています。シーケンシャル スタイルを使用して、エラトステネスのふるいを含む 3 種類のジェネレーターを既に作成しましたが、どれも十分に機能しません。
並行 Sieve がうまく機能すると考えましたが、bad_arity メッセージが表示され、その理由がわかりません。なぜ私が問題を抱えているのか、または適切にコーディングする方法について何か提案はありますか?
これが私のコードです。コメントアウトされたセクションは、私が物事を並行させようとした場所です:
-モジュール (プライムサーバー)。
-compile(export_all)。
開始() ->
register(primes, spawn(fun() -> loop() end)))。
is_prime(N) -> rpc({is_prime,N})。
rpc(リクエスト) ->
素数!{self(), リクエスト},
受け取る
{素数、応答} ->
応答
終わり。
ループ() ->
受け取る
{From, {is_prime, N}} ->
もしも
Nから!{素数、偽};
N =:= 2 -> から ! {素数、真};
N レム 2 =:= 0 -> から ! {素数、偽};
真 ->
値 = is_not_prime(N),
Val = not(lists:member(true, Values)),
から !{プライム、ヴァル}
終わり、
ループ()
終わり。
for(N,N,_,F) -> [F(N)];
for(I,N,S,F) when I + S [F(I)|for(I+S, N, S, F)];
for(I,N,S,F) when I + S =:= N -> [F(I)|for(I+S, N, S, F)];
for(I,N,S,F) I + S > N -> [F(I)] の場合。
get_list(I, リミット) ->
もしも
私
[私*A || あ
[]
終わり。
is_not_prime(N) ->
for(3, N, 2,
楽しい(私) ->
List = get_list(I,trunc(N/I)),
リスト:メンバー(N,リスト:フラット化(リスト))
終わり
)。
%%L = for(1,N, fun() -> spawn(fun(I) -> wait(I,N) end) end),
%%SeedList = [A || あ
%% リスト:foreach(fun(X) ->
%%ピッド! {リスト内、X}
%% 終了, SeedList)
%% エンド、L)。
%%wait(I,N) ->
%% リスト = [I*A || リスト:メンバー(X,リスト)
%% 終わり。