三角数の約数(1)
30分プログラム、その271。三角数の約数 via Project Euler、その2。
ひとつのマシンで無理ならErlangで分散処理してやろうと、Erlangで書き直してみた。
プロセスAでは偶数番目の三角数のチェックを、プロセスBでは奇数番目の三角数のチェックをするという戦略。実際は、偶数奇数よりも細かく分ける予定。
並列計算するように書いただけで時間が切れたので、続きはまた明日。あと、計算のキャンセルとかも必要だろうなぁ。
使い方
1> problem12:start(). 7 8 none
ソースコード
-module(problem12). -export([start/0]). divisor_count(N)-> length(lists:filter(fun(X)-> N rem X =:= 0 end, lists:seq(1,N))). tri(N) -> N*(N+1) div 2. loop(Pid,Target,N,Step)-> % io:format("I'm check ~p~n",[N]), case divisor_count(tri(N)) >= Target of true -> Pid ! {self(),N}; _ -> loop(Pid,Target,N+Step,Step) end. wait_for_response([])->none; wait_for_response(L)-> receive {Pid,N} -> io:format("~p~n",[N]), L2 = lists:delete(Pid,L), wait_for_response(L2) end. start()-> S = self(), P2 = spawn(fun()->loop(S,5,3,2) end), P1 = spawn(fun()->loop(S,5,2,2) end), wait_for_response([P1,P2]).