この記事を見て、私も昔円周率を計算したことがあるのを思い出しました。当時(5年前)のマシン(おそらくCore2あたり)で1億桁が15分ほどだったようです。ナイーブ乗算、カラツバ法、そしてFFT乗算の実装にいたり、円周率へ。チュドノフスキーの公式へ至りました。内容充実しててすごいです。円周率を計算したい方にはとても参考になると思います。そんなわけで円周率熱が再燃してきたので、再びちょこっと書いてみました。https://github.com/tanakh/piHaskellで書いてあります。Haskellには円周率のような計算を行うにおいて、優れた点がいくつかあります。実際に円周率を計算しているコードです。シンプルに書いて、それなりに速いです。Corei5-2400のマシンで100万桁2.2秒、1億桁で629秒程度でした。並列化が容易と書きましたが、並列化はしていません。速くならなかったからです。並列化が必要なんだと思います。ここへ至る道程は実はそれほど容易なものではなかったのです。これはいくつかの問題を抱えていました。まともに計算を行うには、それらを解消する必要がありました。今のGHCでは安心して計算が行えるようになったのです。それらが今のGHCでは解消されてる、やったね!ということを少しご紹介したいと思います。文字列への変換GHCのInteger(多倍長整数型)は、内部的には2進表現で保持されています。LSBから順に、延々と必要な分だけビット列が並んでいるというものです。ここでその処理が発生することになります。ところで、基数変換(ここでは2進→10進)は実は自明な処理ではありません。ことIntegerに関して言えば裏ですごい基数変換アルゴリズムが走ることになるのです。自明なのは、10で割り続けるというものでしょうか。大きな数を10で割る。割った余りが一番下の桁です。