私は 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,リスト) %% 終わり。