三角数の約数(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]).