三角数の約数(3)

30分プログラム、その273。三角数の約数 via Project Euler、その3。
まだ解けない。同じマシンで動かしているのに別のErlangノードと通信できない。他のマシンだと、同じ方法でできるのになぁ。
できるマシンでしばらく動かしてみたけれど、解ける気配がしない。やっぱり、力技じゃあ無理かもしれない。

使い方

1> problem12:start().
...

ソースコード

-module(problem12).
-export([start/0,run/4]).

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)->
    receive
	M when M < N -> Pid ! {self(),M}
    after 0->
%	    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
    end.

run(S,Target,Start,Step) ->
    spawn(fun()->loop(S,Target,Start,Step) end).

wait_for_response([],R)->R;
wait_for_response(L,R)->
    receive
	{Pid,N} ->
	    io:format("~p~n",[N]),
	    L2 = lists:delete(Pid,L),
	    lists:foreach(fun (X) -> X ! N end,L2),
	    wait_for_response(L2,[N|R])
    end.

connect(Host)->
    net_adm:ping(Host),
    {Mod,Bin,Filename} = code:get_object_code(problem12),
    rpc:call(Host,code,load_binary,[Mod,Filename,Bin]).
    
start()->
    connect(alice@localhot),
    S = self(),
    Target = 501,
    P1 = run(S,Target,2,3),
    P2 = rpc:call(alice@localhot,problem12,run,[S,Target,3,3]),
    P3 = run(S,Target,4,3),
    lists:min(wait_for_response([P1,P2,P3],[])).