D言語

フィボナッチ数列の計算法(3)

前に、http://blog.livedoor.jp/dankogai/archives/50958771.htmlを見て、フィボナッチ数の計算がO(1)なのはちょっと気持ち悪いがいいんじゃない?と思ったが、この続きのような記事を見て、ハッとした。http://blog.livedoor.jp/dankogai/archives/50962361…

フィボナッチ数列の計算法(2)

前回の宿題。 べき乗計算に指数の計算を使う(powを使う)場合、80ビット浮動小数点数を使うと、フィボナッチ数列を何項目まで正しく求められるだろうか。 D言語でIntelの場合、realは80ビット浮動小数点数となる。これを用いた計算と、64ビット整数で前回の…

複素数(11)

あとのためにまとめておこう。 D言語での複素数 あれこれ http://d.hatena.ne.jp/inamori/20071005/p1exp http://d.hatena.ne.jp/inamori/20071008/p1cos/sin/tan http://d.hatena.ne.jp/inamori/20071009/p1log http://d.hatena.ne.jp/inamori/20071011/p1s…

複素数(10)

cdouble exp(cdouble z)などを実装してきたが、 cdouble以外のcfloat、crealも同じコードで済む。 何度も同じコードを書きたくないとき、 D言語ではmixinを使うらしい。 import std.cstream;void main(char[][] args) { dout.writefln(pow(2.0f, 5)); dout.w…

複素数(9)

純虚数の場合 引数が純虚数だと速くなる可能性があるので、 それ用にも書いてみる。 ここまでは一価だからやさしい。 log 虚部は[-π, π]だから、 sqrt 符号はyの正負による。 acos 実部が[0, π]だから、-を取る。 asin 実部が[-π/2, π/2]だから、 -を取ると…

複素数(8)

べき乗 powの値域は非常に複雑。 だが、log zは2πiの周期を持つから、alog zは2πaiの周期になる。 aによって3種類に分かれる。 1)aが整数の場合 一価関数となる。 2)aが整数でない有理数の場合 a = m / nと表すと(m, nは互いに素、n > 0)、 n価関数となる…

複素数(7)

atan より、 ただし、logが2π周期だから、 値は、実数がπ周期。C99では、http://docs.hp.com/ja/B2355-60104-06/catan.3M.html値域は、[-π/2, π/2]。 素直に計算すればよい。 import std.cstream; import std.math;void main(char[][] args) { dout.writefln…

複素数(6)

acos をzとおくと、eiZの2次方程式となり、 これを解くと、 より、 ただし、logが2π周期で、頭に±がついている。 主値は、C++では定義されていない? C99ではあるらしい。http://docs.hp.com/ja/B2355-60104-06/cacos.3M.html値域は、実部が[0, π]だというこ…

複素数(5)

atan2 前回のlogで、 log(-1+0i); // 0+3.14159i log(-1-0.0i); // 0+3.14159iとなる。これは、atan2が次のようになるためである。 atan2(0.0, -1); // 3.14159 atan2(-0.0, -1); // -3.14159 sqrt z = reiθ とすると、 sqrt(z) = sqrt(r)eiθ/2 となる。 主…

複素数(4)

対数関数 指数関数の逆関数だから、 とおいて、 atan2は便宜的に使った。 だから、 ところが、atan2は周期2πの多価関数だから、logも同様となる。 例えば、を考えると、 となるが、同時に、 となるため、は多価関数である。 プログラムとして、 返り値が複数…

複素数(3)

三角関数 三角関数は指数関数とは姉妹のようなものである。 オイラーの公式より、 これらから、 z = x + iy を代入して、 sin, tanは、 これらより、 import std.cstream; import std.math;void main(char[][] args) { cdouble c = 1 + 0.1i; dout.writefln(…

複素数(2)

指数関数 これはやさしい。 オイラーの公式、 より、 import std.cstream; import std.math;void main(char[][] args) { cdouble c = 1 + 0.1i; dout.writefln(exp(c)); // 2.7047+0.271375i }cdouble exp(cdouble c) { double im = c.im; return std.math.e…

複素数(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で読むと、 次のよ…

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で書き直してみたいというのはあるが、 実際に…

配列の速さ(2)

D言語の配列の速度を調べる。 今回はオプションの違いで比べた。 -release -O とすると、C++の配列/vectorとだいたい同じ速度になった。 連想配列のときは-Oをつけたら遅くなったのよね。

配列の速さ

前回と同じようにD言語の配列の速度を調べる。 D言語の配列のソースは次、 import std.cstream; import std.date;const int n = 256;struct pair { int first; int second; }void main() { d_time t0 = getUTCtime(); pair[n] m; for(int i = 0; i m[i].firs…

ハッシュの速さ

昨日速度を調べたのは、D言語と比較したかったから。 D言語についてはこのあたりから。 http://www.kmonos.net/alang/wnd/ D言語のハッシュは、 int[int] a;のように宣言して、 a[1] = 2;のように非常に自然に扱える。 が、速度を比較するとやっぱり遅い。2…