Erlang勉強会に向けて予習的な

Erlang 分散システム勉強会に参加するので予習

とりあえずproject euler 10を書いてみた。

 -module(project_euler).
 -export([is_prime/1, is_prime/2]).
 -export([add/2]).
 -export([loop/2, loop/3]).

%% check the prime number method.
%% arg: <integer> N
is_prime(N) ->
    M = 3,
    if
        N < 2 -> false;
        N == 2 -> true;
        N == 3 -> true;
        N rem 2 =:= 0 -> false;
        true -> is_prime(N, M)
    end.
is_prime(N, M) ->
    if
        N rem M =:= 0 -> false;
        M * M =< N -> is_prime(N, M+2);
        true -> true
    end.

add(N, M) -> N + M.

loop(N, M) -> loop(N, M, 0).
loop(N, M, Sum) when N > M -> Sum;
loop(N, M, Sum) ->
    case is_prime(N) of
        true  -> loop(N+1, M, add(N, Sum));
        false -> loop(N+1, M, add(0, Sum))
    end.

コンパイルコマンドラインから実行。

$ erlc project_euler.erl
$ ls
project_euler.erl project_euler.beam
$ erl -eval 'io:format("~s", [project_euler:loop(1,2000000)])' -noshell -s init stop
{"init terminating in do_boot",{badarg,[{io,format,[<0.23.0>,"~s",[142913828922]]},{erl_eval,do_apply,5},{init,start_it,1},{init,start_em,1}]}}

Crash dump was written to: erl_crash.dump
init terminating in do_boot ()

あれー。結果は取り出せたのにエラーが。。。

しかもおっそいし!

c++のが全然早いじゃん。。。

書き方が悪いんだろうけどよくわかんないなー。

erlシェルからも実行してみる

$ erl
Erlang R13B03 (erts-5.7.4) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4  (abort with ^G)
1> project_euler:loop(1,2000000).
142913828922

エラーは出ないけどおっそい!!!

絶対書き方だよなぁ。。。

あと-noshellで実行したときにエラー出る原因がわからん。

  • [追記]

io:formatに結果渡す時にintegerからlistに変換しないといけなかったみたい。

$ erl -eval 'X=project_euler:loop(1,2000000),io:format("~s~n", [integer_to_list(X)])' -noshell -s init stop
142913828922