2007-01-01から1年間の記事一覧

複素数(1)

DではC/C++より簡単に複素数を扱える。 import std.cstream;void main(char[][] args) { cdouble c = 1 + 2i; dout.writefln(c); // 1+2i // cdouble d = 1 + i; // これはダメ cdouble d = 1 + 1i; dout.writefln(d); // 1+1i cdouble e = 1.4 + 2i; cdoubl…

Perlの代替として(12)

バッファつき入出力 こう書くと速いらしい。 import std.stream; import std.cstream; import std.conv;import std.date; import std.process;void main(char[][] args) { d_time starttime = getUTCtime(); long sum = 0L; Stream istream = new BufferedFi…

Perlの代替として(11)

ファイルの読み込み ファイルを読むのがやけに遅い。 例えば、こんな100万行のファイルを読む。 0 1 … 999998 999999 Perlでこうやって吐いて、リダイレクトする。 $n = 1e6; for(my $i = 0; $i printf "%d\n", $i; }これをふつうにDとPerlで読むと、 次のよ…

交通死亡事故(3)

面白くないので、曜日ごとの死亡者数でも。 日,847 月,869 火,886 水,905 木,906 金,1009 土,930 金曜日が多い。 やはり酔っ払いが多いのだろうか。 意外と平均的だが、金曜日が多いのは有意ではある。 2002年も調べてみた。 日,1165 月,1160 火,1176 水,115…

交通死亡事故(2)

前回、最も死亡者数の少なかった日は何人だったかを推定したが、 実際にはどうだったのだろうか。 ITARDAのサイトにそのデータがある。 例えば、http://www.itarda.or.jp/kouki/060101.html見て分かるように、 日付のファイルにその日の死亡者数が書かれてい…

交通死亡事故(1)

去年の交通事故死亡者の数は6352人だったという。 最も少なかった日は何人死亡しただろう。とりあえず、乱数で10万回(10万年)回してみた。 これでそんなに間違いはないだろう。 p0 = 0.00002 p1 = 0.00023 p2 = 0.00148 p3 = 0.00873 p4 = 0.03603 p5 = 0.…

Perlの代替として(10)

map Perl5以降にはmapというすばらしい関数がある。 次は、配列の各要素を2倍にする。 my @a = ( 1, 2, 3 ); my @b = map { $_ * 2 } @a;for(@b) { print $_, ","; } print "\n"; こんな関数はDにはないが、自作するのは簡単。 import std.cstream;void main…

Perlの代替として(9)

可変個引数 Perlではサブルーチンの引数は配列に変換されるので、 最初から可変個引数のようなものである。 print sum(1, 2, 3), "\n";sub sum { my $result; for(@_) { $result += $_; } return $result; }Dでも同じように書ける。 import std.cstream;void…

Perlの代替として(8)

テンプレート Perlは型付けがないので関係ないが、 D言語ではテンプレートが使える。 T max(T)(T a, T b) { return a > b ? a : b; }C++と比べるとずいぶん簡単な記述だ。 C++だとこうかな?(試していない) template T max(T a, T b) { return a > b ? a :…

Perlの代替として(7)

delegate Perlのように、 @a = sort { $a->[1] $b->[1] } @a;というように、関数を引数に使いたかったのだが、 なぜかDの配列のsortではそれができないのだった。 しかし、sort自作すればそれができる。 delegateは関数みたいなもので、 あまり面白くはない…

Perlの代替として(6)

sort(2) クラスのオブジェクトのソートは次のようにする。 import std.stream; import std.cstream; import std.string;void main(char[][] arg) { class cData { int rank, value; this(int a, int b) { rank = a; value = b; } int opCmp(Object o) { cD…

Perlの代替として(5)

sort(1) こんな感じでソートする。 import std.stream; import std.cstream; import std.string;void main(char[][] arg) { auto a = [ 3, 11, 2 ]; a.sort; dout.writefln(join(a)); // 2,3,11 }char [] join(int [] a, char [] sep = ",") { char [] str…

Perlの代替として(4)

連想配列 int[char [] ] totalTime;と宣言すると、keyが文字列の連想配列になる。 もちろん、普通に代入できる。 totalTime[str] = 5;keyがあるかを調べるには次のようにする。 if(str in totalTime) { ...列挙は次のようにする。 foreach(str; totalTime.ke…

Perlの代替として(3)

実用的なプログラムを作ってみる これくらいわかっていれば実用的なプログラムが作れるのではないか。 そう思って次のようなものを作ってみた。 プログラムを実行したときに、ある部分の実行時間を知りたいとする。 そこで、C/C++のコードのところどころに、…

Perlの代替として(2)

文字列 カンマ区切りのテキストを読んで、2カラム目を合計する。 while(<>) { split ','; $sum += $_[1]; } print $sum, "\n";これをD言語にすると、 import std.stream; import std.cstream; import std.string; import std.conv;void main(char[][] arg) {…

Perlの代替として(1)

D言語は、本来C++の代替と捉えるべきと思うが、 ここではPerlのように書けるがずっと高速な言語と位置づけて、 Perlで書いたプログラムをD言語で書いてみる。 Perlもたまに遅いと感じることがあるので、 それをDで書き直してみたいというのはあるが、 実際に…

すごろく(8)

本当に、進むマス数の平均の逆数に、 そのマスに止まる確率が収束するのだろうか。 一度にnマス進む確率をqnとする。 一度に進める最大のマス数をNとすると、 q1 + ... + qN = 1 m = q1 + ... + NqN nマス目に止まる確率は、 ここで、pn = 0 (n これより、 …

すごろく(7)

サイコロ1個のときと同じように、pnの収束する値を求める。 収束性は、同様に考えて問題ない。 より、 とおくと、 だから、a13を計算すればよい。 前回計算したp2 〜 p13を用いて、 a13を実際にプログラムを用いて計算すると、 a13 = 36 となった。 よって、…

すごろく(6)

漸化式で確率を求める。 p0 = 1 p1 = 0 として、 これをプログラムを書いて求めればいいが、どうしても数値誤差が出る。 しかし、割り算は36で割っているだけなので、36進数なら誤差は出ない。 ここは、表記しやすい6進数を使おう。 そうすると、 p[2] = 0.0…

すごろく(5)

サイコロを2つ振ることにする。 確率が収束するのは同じように証明できる。 シミュレーションの結果だと、1/7に収束するっぽい。 p[2] = 0.027998 p[3] = 0.055439 p[4] = 0.083897 p[5] = 0.114852 p[6] = 0.146368 p[7] = 0.182016 p[8] = 0.166205 p[9] =…

すごろく(4)

前回、pnが収束する値を求めたが、 もちろん収束することを証明しなければならない。 わかりやすくするために、 an = pn - 2 / 7 とおいて、anが0に収束することを示す。 実際に値をプロットしてみる。anの絶対値をプロットしている。 ただし、赤は正、青は…

すごろく(3)

pnが収束する値を求める。 まず、 p1 = 1 / 6 p2 = 1 / 6 + 1 / 36 = 7 / 36 nが6以下のとき、 pn = pn-1 + pn-1 / 6 = 7 / 6 * pn-1 だから、 nが6より大きいとき、 より、 再帰的に、 が成り立つ。 右辺を具体的に計算すると6になるから、 pn は p に収束…

すごろく(2)

漸化式で確率を求める。 nマス先に止まる確率をpnとする。 p0 = 1とする。 まず、次のマスに止まる確率は、サイコロを振って1の目が出る確率だから、 p1 = 1 / 6 n = 2のときは、 2の目が出る確率+1の目が出てそのあと1つ先に止まる確率だから、 p2 = 1 / 6…

すごろく(1)

すごろくのあがりにピタリと止まる確率を求める。 例えば、あがりの1つ前のマスなら、サイコロを振って1が出なければならないので、確率は1/6となる。2つ前ならそれよりは大きくなる。 50マス前からサイコロを振って、止まったマスを記録し、100万回繰り返し…

list(3)

STL

iteratorのincrement こう書くと、iteratorのincrementの速度を純粋に比較できる。 void procVector() { vector v; for(int k = 0; k v.push_back(k); int a = 0; typedef vector::const_iterator CIT; for(int i = 0; i for(CIT p = v.begin(); p != v.end(…

Visual Studioでのリダイレクト

C++

Visual Studio.net2003(VS)で、引数の指定のところにコマンドプロンプトでするようにリダイレクトの指定をすると、ちゃんとリダイレクトしてくれる。 私はいつも、標準エラー出力をリダイレクトするようにしている。 調べた限りだと意外と知られていない技…

list(2)

STL

sequential access listにランダムアクセスはできないので、 これの速度を調べる。 const int m = 1000; // コンテナの大きさ const int n = (int)(1e10 / m); // 繰り返し回数void procVector() { vector v; for(int k = 0; k v.push_back(k); int sum = 0;…

list(1)

STL

仕事でlistを使っているところがあって、 こんなところでなにもわざわざlistを使わなくてもと思っていたが、 最近全部vectorにしたら、想像以上に速くなった。 listはどういうときに使えるか考えてみる。 以下のベンチマークは、 VC2003+Windows XPで行って…

大きな整数の表現

C++

例えば、定数で1億がほしいときふつうはこう書くだろうか。 const int n = 100000000;しかし、パッと見で1億とわかるだろうか。 こういうときは、コメントを書くとすぐにわかる。 const int n = 100000000; // 1億しかし、例えば一桁変えて、 でもすぐに戻す…

ジャンケンで決着がつくまでの回数(7)

期待値E(n)をもう一度代数的に検討してみよう。 (P(n, 1) + ... + P(n, n-1))E(n) = 1 + P(n, 1)E(n) + ... + P(n, n-1)E(n-1) の左辺は、 (2n - 2)/3nE(n) 整理して、 ここで、 という母関数を考えると、 となる。 これを解くのは難しそうだが、 とりあえず…