スキップしてメイン コンテンツに移動

投稿

ラベル(Erlang)が付いた投稿を表示しています

円周率を1万桁まで求める

マチンの公式 で円周率を1万桁まで求めるプログラムを、Python, Erlang, Haskell, C++で書いてみた。出力結果の最後の数桁はずれているかも。また、実行時間を測ったりもしているが、1万桁程度ならどのコードでも瞬時に求まる。 まずは素直にPythonで。実行時オプションで桁数指定、実行時間測定付き。オプションなしで1万桁まで求める。 pi.py #!/usr/bin/env python import sys, time N = 10**10000 def arctan(m): global N c = N a = b = c / m m2 = m * m s = k = 1 while c: b /= m2 k += 2 c, s = b / k, -s a += c * s return a def main(args): global N if len(args) > 1: N = 10**int(args[1]) t1 = time.time() pi = str((arctan(5) * 4 - arctan(239)) * 4) t2 = time.time() print pi[0] + '.' + pi[1:] print "Time: %f" % (t2 - t1) if __name__ == "__main__": main(sys.argv) 実行: $ ./pi.py 次にErlangで求めてみる。 pi.erl -module(pi). -export([pi/0]). pi()->N=e(10,10000),(a(5,N)*4-a(239,N))*4. e(B,N)->e(B,N,1). e(_,0,R)->R; e(B,N,R)->e(B,N-1,R*B). a(X,N)->a(X,N div X,N div X,N,1,1). a(_,A,_,0,_,_)->A; a(M,A,B,_,S,K)->...

Erlang基礎文法最速マスター

先日、 Lua基礎文法最速マスター を書いてみたが、予想以上に自分自身への学習効果が高かった。そこで、普段使っているPythonと同じぐらいに使いこなしたいと思っていたErlang(アーラン)の基礎文法最速マスターを書いてみることにした。 Erlangが関数型プログラミング言語であることもあり、書き下すのは思ったよりも大変だったが、学習効果はかなりあったと思う。言語を習得したいときはこのようなまとめを書いてみるのが良さそうだ。 ただ、手続き型プログラミング言語に比べて異なる部分があまりにも大きいので、すべてを説明することは難しく、これを読んだだけですぐに使えたりはしないかもしれない。また、間違っていたり、足りない部分などがあったら、教えて頂けるとありがたい。 1. 基礎 対話環境 コマンドラインからerlを実行すると対話環境(シェル)になります。コマンドの最後にはピリオド(.)が必要です。help()で簡単な説明を読むことができます。 $ erl 1> A = 10. % Aに10を束縛. 10 2> B = A * 5. % BにA * 5 (50)を束縛. 50 3> hello. % helloはアトム(定数のようなもの/後述). hello 4> b(). % 現在の束縛変数を表示. A = 10 B = 50 ok 5> A = 20. % 変数は一度しか代入(束縛)できない. ** exception error: no match of right hand side value 20 6> f(). % 束縛変数をすべてクリアする. ok 7> A = 20. % 再度束縛できる. 20 8> q(). % Erlangシェルを終了させる. ok 画面出力 io:formatで書式指定の出力を行うことができます。 ~p : 整形して出力. ~s : 文字列を出力. ~f : 浮動小数点数を出力. ~w : Erlangの標準構文として出力(アトムならそのまま、文字列ならリストとして出力など) ~n : 改行. io:format("Hello world~...

ErlangでFizzBuzz問題、それをC++のテンプレートで表現する

今更ながら FizzBuzz問題 を解いてみる。今回はErlangで解いてみた。それだけだとつまらないので、それをC++のテンプレートで表現してみた。因みにErlangを使っているけど並列処理はしていない。 まずは普通に何の工夫もなく書いてみた。 -module(fizzbuzz). -export([fb/1]). fb(0) -> ok; fb(N) -> fb(N - 1), if N rem 15 =:= 0 -> io:put_chars("FizzBuzz"); N rem 3 =:= 0 -> io:put_chars("Fizz"); N rem 5 =:= 0 -> io:put_chars("Buzz"); true -> io:write(N) end, io:nl(). うーん、面白くない。どうせなら if をなくしてしまおう。というわけで、今度は以下のように書いた。 -module(fizzbuzz). -export([fb/3, fizzbuzz/1]). fb(_, 0, 0) -> io:put_chars("FizzBuzz\n"); fb(_, 0, _) -> io:put_chars("Fizz\n"); fb(_, _, 0) -> io:put_chars("Buzz\n"); fb(N, _, _) -> io:write(N), io:nl(). fizzbuzz(0) -> ok; fizzbuzz(N) -> fizzbuzz(N - 1), fb(N, N rem 3, N rem 5). 少しは関数型プログラミングっぽいかなぁ? これをC++のテンプレートで書いてみると以下のようになる。 #include <iostream> template<int N, int M3, int M5> struct FB { FB() { std::cout << N ...

プログラミング言語Erlangを覚えよう

以前から関数型プログラミング言語であるErlang(アーラン)を覚えたかったので、「 プログラミング言語Erlang入門 」を読んだ。この本自体は本当に入門者というか初心者向けの本となっている。しかし、自分自身はほとんど関数型言語について知識がないので、こういった入門書で概略を掴めるのはありがたい。C言語などの命令型プログラミング言語と比べるとスタイルが大きく異なり、それらの知識をベースとすることができないので、先日の Luaの入門書 ほどお手軽ではなかったが、内容自体は非常に簡易なので1日あれば余裕で理解できるだろう。 概略以上のことを学びたいのなら最初から「 プログラミングErlang 」を読むのが良い。こちらも手元にあるが、かなり良い本だと思う。ちゃんとしたプログラムを書きたいのならこちらがお勧め。 ところで、Erlangは並列処理言語としても注目を集めている。非常に効率よく並列処理ができるのが特徴で、それぞれのスレッドが完全に独立して動くように設計されている。独立しているスレッドであるためErlangではそれをプロセスと呼んでいる。spawn()関数で各プロセスを実行することができ、非常に簡単に並列処理プログラムを作ることができる。 「 プログラミングErlang 」に内包リストを使ってアナグラムを標準出力に表示するプログラムが載っていたのだが、それを並列処理化して一つのファイルに書き出すように変更したプログラムを書いたので、このエントリの最後に示しておく。二つの文字列を二つのプロセスを使って同時にアナグラムを生成し、その結果を一つのファイルに書き出している。このコードでおぼろげながらでもErlangの雰囲気が分かるだろうか。 test.erl -module(test). -export([perms/1, write/3, wait/1, anagram/2]). %% 順列生成. perms([]) -> [[]]; perms(L) -> [[H|T] || H <- L, T <- perms(L--[H])]. %% ファイルへの書き出し. %% S: ファイル, L: 文字列, P: プロセス識別子. write(S, L, P) -> lists:foreach(fun...