ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

円周率 - π - パイコミュの円周率の計算

  • mixiチェック
  • このエントリーをはてなブックマークに追加
円周率の計算に関するトピックです。

暗算、手計算、そろばん、電卓、パソコン、スパコン等、手段は問いません。
計算に使った公式の話題や計算方法の工夫、実装のアルゴリズムなど、
円周率の計算に関することなら何でもありです。

コメント(35)

トピック「何桁?」
http://mixi.jp/view_bbs.pl?id=476101&comm_id=77481

169から続きです。

> 168
UltraSPARC T2は多数のスレッドを切り替えながら実行することで、メモリアクセスを隠蔽し高スループットを得る仕組みですので、全スレッドがメモリに負荷をかける円周率の計算では性能は出ないでしょう。
その点Opteronは、Crayのスーパーコンピュータに使われるぐらいですので、単体での性能も高いのでしょうね。

> 169
確かにアークタンジェント単位でのマルチスレッド化では、負荷バランスは悪いです。
ただAtom 330自体が2コアですので、3スレッド以上同時実行しても数%程度しか速くなりません。
それとアークタンジェント自体をマルチスレッドで求める場合、4スレッドに分けるとatan(1/x)の計算ではxの8乗で除算を行う必要があり、xが256以上では64bitでもオーバーフローしてしまいます。
何かいい方法はないものでしょうか。
アークタンジェントの計算自体をマルチスレッド化してみました。
19万桁の計算で、計算時間はシングルスレッド版の38%に短縮されました。

ワークエリアがすべてキャッシュに収まるためか、ハイパースレッディングの効果が意外とありますね。
スレッド間の排他制御が全くないのでそれも有利に働いているのでしょう。

4コアのCPUで動かしてみたいですね。
CORE2QUAD所有してます。Linux上のGCCでコンパイルできるなら測定できますよ。
ソースコードを以下のURLに置きました。
https://expres.homeserver.com/WebFoldersShare/mixi/machin.tgz
ユーザ名:mixi
パスワード:Tp14159

マチンの公式で円周率を求める、シングルスレッド、マルチスレッドのプログラムになります。
% tar xzf machin.tgz
% cd machin
% make time
で計測できるはずです。

こちらでの実行結果は以下の通りです。
% make time
cc -O -c pi64-machin.c
cc -O -c b64math.c
cc -o pi64-machin pi64-machin.o b64math.o
cc -O -c mt-pi64-machin.c
cc -o mt-pi64-machin mt-pi64-machin.o b64math.o -lpthread
time ./pi64-machin 10000 > /dev/null
336.99 real 332.43 user 0.00 sys
time ./mt-pi64-machin 10000 > /dev/null
126.87 real 491.13 user 0.00 sys

こちらのOSはFreeBSDですのでLinuxだと表示が違うかもしれません。
それぞれのreal(実行時間)を教えて下さい。
Quad Coreだとほぼ1/4の時間になると思います。
time ./pi64-machin 10000 > /dev/null
63.48user 0.00system 1:03.47elapsed 100%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+245minor)pagefaults 0swaps
time ./mt-pi64-machin 10000 > /dev/null
62.73user 0.00system 0:15.95elapsed 393%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+564minor)pagefaults 0swaps
とでました。4倍になってますね。
自分はLinuxにころびましたです。
結果の報告ありがとうございます。
4コアだとちゃんと4倍速くなりますね。
マルチコアCPUが主流の現在、円周率の計算もマルチスレッド化が容易なアルゴリズムが有利でしょうね。

それにしてもAtomに比べて8倍も速いとは・・・
高速なアルゴリズムやCPUに合わせた最適化も重要ですが、高速なCPUを用いることも重要ですね。
Atomに関するインテルの最適化のドキュメントによると、語長の長いDIV命令は遅いので避けるべきだそうです。
x86は、ずいぶん短い命令列で多倍長の演算が書けるのですね。
コーディングも凄くきれいですし素因数分解とか書いてみると
おもしろいかもしれませんね。
x86のアセンブラだと除算命令一つで128bit÷64bitを計算して商と剰余を一度に求めることが出来ますので、簡単に多倍長整数÷整数の除算が書けます。
この除算が出来ると多倍長整数を固定小数点数と見なすことで、arctan(1/x)の形のアークタンジェントの値を任意の精度で求めることが出来て、円周率の計算に利用できます。

素因数分解は暗号に関係することから興味深い分野ですね。
こちらで公開されている「UBASIC によるコンピュータ整数論」にいろいろな高速素因数分解法が載っています。
http://www.rkmath.rikkyo.ac.jp/~kida/kima.htm
現物が手元にあります。(あるだけですけど)
楕円曲線法とか結構短いソースですよね。
現物をお持ちでしたか。
UBASIC自体、多倍長の計算が出来て組み込みの代数的関数もあって面白いですよね。

円周率の計算に戻ると、PCで円周率の世界記録を更新した方法が論文として公開されています。
http://bellard.org/pi/pi2700e9/pipcrecord.pdf

10進数で2兆7千億桁の数値を2進数で保持するだけで、1TB以上必要なんですね。
ワークエリアとしてディスクも7.2TB必要だとか。
2^N-1と2^N+1の剰余系での乗算はほとんど同じなので
同時に計算してその結果に中国剰余定理を使って2^(2N)-1の
剰余を求めるのはおもしろいですね。
理論と実装の工夫、x86に対する最適化、あと物量(HDD、計算時間)で世界記録を達成してますね。
いやすばらしい。

スーパーコンピュータでもメインメモリは1TBほどなので、同じような工夫は必要なようです。
http://www.aoni.waseda.jp/ushiro/Pi/PiToda.pdf
筑波大の結果は多分オンメモリで計算してそうです。
時間の流れもありますが日本製スパコンがお高いというのもありそうです。
後先生のページはおもしろいですね。
>>kazuさん

そういえばx86系で世界記録を更新する際。
πを特定の桁だけをチェックする方程式を使ったらしくきになる所です。

あとFFTで巨大な整数演算を高速化するとかのテクニックとか使われてるんでしょうか。
3週間近く前の発言に対してのレスで申し訳ないですが…
>2 ひろのぶさん
すみません,私がマシン形状を勘違いしていたようでした.
UltraSPARC T2だと1CPUで64スレッド行けるのですね.
スレッド数が多いのでマルチCPUかと思っていました.
http://www.cc.u-tokyo.ac.jp/publication/news/VOL11/No1/200901tuning.pdf
の2ページ目にあるようなNUMA環境を想定していたので
「ボード上のネットワーク」という発言をしていました.

>14 kazuさん
1兆桁計算した時のマシン(SR8000)は2001年導入のものですからね.
当時は1TBでも大容量です.>15 でmsftたんさんが書かれている
筑波の計算だとメモリを13.5TB使ってるとありますし,今のスパコン
として見ればむしろ小容量です.
http://www.hpcs.is.tsukuba.ac.jp/~daisuke/pi-j.html

>15 クマーさん
チェック方法はBBPの公式とかBBPのアルゴリズムとか呼ばれている
方法です.式は同系統で最も効率が良いと言われる,Bellard本人が
発見したものを使ってます.
が,実はメイン計算(Chudnovskyの公式)と平行して行っていた全桁検証
計算(Ramanujanの公式)が途中でHDDエラーを起こしたために
(時間的な問題で)部分チェックに切り替えた,と書いてます.
http://bellard.org/pi/pi2700e9/pipcrecord.pdf

FFTについても書かれてますね.多段階に組み合わされているみたいで,
各要素が多倍長になるものはSchonhage-Strassen(2^n+1の剰余環でのFFT)を,
各要素が倍精度に収まる所では普通のFFTを行ってるそうです.
FFTの長さが毎回異なるためにsin/cosは毎回計算,ともありますね.
> 15 クマーさん

Periaさんが説明してるように、BBPのアルゴリズムというのを用いて最後の桁を計算して検算しています。
BBPのアルゴリズムを用いると、2進数表現の任意の桁の値を非常に効率よく求めることが出来ます。
同様な方法で、10進数表現の任意の桁の値を求める方法はまだ知られていないようです。

FFTの利用はテクニックというよりは、この円周率計算の要ですね。
多倍長数の長さに応じて、複数の手法を使い分けています。

> 17 Periaさん

スーパーコンピュータの場合、メモリはたくさんあってもそれが分散しているので、プログラミングは大変ですね。
もう単一メモリのスーパーコンピュータは出てこないのでしょうね。
>kazu さん
>同様な方法で、10進数表現の任意の桁の値を求める方法はまだ知られていないようです。
とのことですが,計算量が O(n) でなければ一応知られています.
やはり Bellard が発見した O(n^2) の方法です.
http://bellard.org/pi/pi_n2/pi_n2.html

あとスパコンについてですが,実際に単一メモリで,1TFLOPS(今のスパコンとしては
低性能)のモノができたとしてもメモリアクセスが遅そうですよね,そもそも.
上記(>17)のNUMAをでっかくしたイメージがあります.
分散メモリは何が悪いか,というとプログラムが書きにくいのが悪いんだと思います.
FORTRAN2008で採用されたco配列のように,簡単に別ノードのメモリにアクセスできる
方法が他言語の仕様にも含まれていけばいいなぁと思います.MPI面倒い.
多倍長浮動小数の表現方法は,IEEE754のような規格には定義されていないので
プログラムを作る人が自由に決めて良いと思います.
手続き型言語での定番の形式は配列に数桁分ずつ値を持つ方法ですかね.

C言語での例を挙げると
int pi[] = {3, 14159, 26535, 89793, 23846};
という感じで.
これと同じ方法をLispで書けば
(3 14159 26535 89793 23846)
という感じでしょうか.

勿論四則演算を行うためにはそれ用の関数を定義する必要がありますが.
Emacs Lispでも動きました。なぜか出力が一桁少ないですが。

(pi)
3.141592653589793

Common Lispの有理数は多倍長整数の比で表現されますので、多倍長浮動小数点数の代わりに使えます。
ただし、出力は分数形式になってしまいますが。
clisp の有理数で計算してみました。

(pi)
265231984363320332474665054275863923/84425962754989445056074374499532800

(float (pi) 0d0)
3.141592653589793d0

計算桁数を増やすと表示がとんでもないことになりそうだ。
ひろのぶさんに影響されてアークタンジェント公式を使った円周率計算のプログラムをCommon Lispで書いてみました。
Emacs Lisp以外のLispでプログラムを書くのは初めてかも。
マチンの公式を使っています。

(defun pi(k)
(defun b(x n) (let ((m (1+ (* n 2)))) (/ (expt x m) m (expt -1 n))))
(defun a(x i) (let ((s (b x i))) (if (< (abs s) (expt 10 (- k))) s (+ s (a x (1+ i))))))
(* 4 (- (* 4 (a 1/5 0)) (a 1/239 0))))

(pi 100)
438046631209219477002827646684735850251503415633731761763504872419447893570386371
711090238622247370954755442840514615838937032270140287196247487771334380182721806
832903470774869560266861282543782946073528634755583766652789963823246103050148087
3274376985921784/1394345733233995783885489324228589777865253969424197861856666256
746741235320432592915622403527837204105979335626925634054100021111467784075841121
167600081729682842470268981931162496722301666431813299835995117087854831307291991
748797954642213881015777587890625

さすがに分数ではワケ分からないので、小数に変換してみます。

(defun p (r n)
(let ((i (truncate r))) (if (< n 0) nil (cons i (p (* 10 (- r i)) (1- n))))))

(p (pi 100) 100)
(3 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 2 3 8 4 6 2 6 4 3 3 8 3 2 7 9 5 0 2 8 8 4 1 9
7 1 6 9 3 9 9 3 7 5 1 0 5 8 2 0 9 7 4 9 4 4 5 9 2 3 0 7 8 1 6 4 0 6 2 8 6 2 0
8 9 9 8 6 2 8 0 3 4 8 2 5 3 4 2 1 1 7 0 6 7 9)

最初の3と1の間に小数点があると見なして下さい。
100桁計算してみましたが、とりあえずちゃんと計算できてるようです。

多倍長数の計算が言語に組み込まれているとアークタンジェント公式のプログラムも簡単に書けますね。
昨日公表された全国学力調査のなかで、中学3年生の円柱の体積を求める問題が大きく報道されていました。
論点は3年前の小学6年生の時の円の面積を求める問題との関連で、公式の理解がきちんとなされいないとされていていました。
NHKではピザパイを例に中心点を通る等分割片を並べかえる手法で関係性を理解させる必要性をのべていました。

この関連で先人が円周率を求める公式を編み出すに至った思考過程が知りたくなりました。

例えば
マチンさんの
 π=16 arctan(1/5) − 4 arctan(1/239)

Nilakantha Somayajifさんの
π/4=1/1-1/3+1/5-1/7+1/9-・・・・・・・・

がどのようなステップを経て考え出されたのでしょうか。
今まで忘れてましたが、確かに円の面積の求め方で、ピザパイ型の模型を使った説明を受けました。
円の面積を求める公式ぐらい丸暗記で問題ないと思いますけどわーい(嬉しい顔)

初期の円周率の求め方は、円に内接する多角形と外接する多角形の辺の長さで円の円周を近似する方法が使われています。
アルキメデスがこの方法で円周率の近似値を求めています。

微分積分法が発見されてからは、arctan(1)=π/4等の公式を変形させた方法が使われてます。
マチンの公式は tan(x)=1/5 に倍角公式を適用することにより導くことが出来ます。

マチンの公式 - Wikipedia
http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%81%E3%83%B3%E3%81%AE%E5%85%AC%E5%BC%8F

π/4 = 1 - 1/3 + 1/5 ・・・のライプニッツ級数は arctan(x) のテイラー展開に x=1 を代入することで得られます。
ただこの級数を最初に発見した14世紀のインドのマーダヴァがどうやって求めたかは分かりません。

インドと言えば、ラマヌジャンの漸化式も効率的に円周率を求める公式として有名です。

シュリニヴァーサ・ラマヌジャン - Wikipedia
http://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%A5%E3%83%AA%E3%83%8B%E3%83%B4%E3%82%A1%E3%83%BC%E3%82%B5%E3%83%BB%E3%83%A9%E3%83%9E%E3%83%8C%E3%82%B8%E3%83%A3%E3%83%B3

πがライプニッツ級数のような簡単な公式で計算できるのは、基本的な定数であるからでしょうね。
だからいろいろな式にπが現れ、その式を使っていろいろな方法で円周率を求めることが出来るのです。

これからも人々が円周率に興味を持つ限り、様々な方法が発見されることでしょう。
何桁?
http://mixi.jp/view_bbs.pl?id=476101&comment_count=186&comm_id=77481
からとしちゃんさんの発言を一部引用.

> 実際問題として、この記録を抜くためには、現時点でどのくらいの初期投資(費用)がかかりますか?
> もちろん、RAID0でSSD繋ぎまくって、最新のCPUで最大のメモリ載せれば、勝てそうな気はします。
>
> 近藤さんのPCのスペックを見ても、かなりの投資をされていると思います。
> どなたか、協力して、10兆桁?は無理でも、もう少しいけませんかね。
> 学術的にも、意味があると思いますし。
> Wondowsを使ってるようですが、Linuxの方が速いでしょうか。

…について,とりあえず知ってる限りでお答えします.
金額→不明.というより各部品の価格調査が面倒なのでやってないだけです.
RAID→とりあえず現状の計算ではHDD読み書きがボトルネックになっているので,SATA3の下に多量のSSDをRAIDで組むと速くなります.6兆桁だと大体30TBは必要になります.
協力→π計算ルーチンで最も時間を要する部分はFFTやNTTと呼ばれる部分で,どちらもCPU間やCPU-HDD間の通信に大きな負荷がかかります.なので複数台マシンでやるにしてもインターネットを介した通信を行うつもりでは時間が100倍以上伸びます.そういう意味では強力とはマシンを複数台用意するための単なる資金援助となり得ます.
学術的→プログラムを新規作成しないのであれば,学術的意味はありません.
OS→5兆桁計算用のプログラムを作ったYeeさんの資料によると,Windowsでは計算とHDD読み書きを並行してできないということなので,彼のプログラムを上手くLinuxに移植し非同期I/Oを実現できれば高速になります.

読みにくいとは思いますが,疑問点には答えられたでしょうか.
Periaさん。ありがとうございます。
ケースやUPSを入れずに、計算しても最安値で110万円近くなりました。ご本人が百数十万円と言っているような報道があるので、その程度だと思われます。

金田研究室ではまず20兆ケタの計画があるようですので、単にマシンパワーと同じ計算式をつかって、桁数を伸ばそうとしても、計算が終わる間に20兆桁が先に出てしまうという、結果になりそうです。あのクラスのPC?は他に使い道がなさそうなので、無謀なことを考えるのはやめておきます。
Yahooの人がBBPのアルゴリズムをHadoopに載せて
2000兆ビット目を求めたらしいですね.
http://people.apache.org/~szetszwo/
頭っからの連続記録ではないのでこっちのトピックに.


>32:としちゃんさん
20兆桁の計画に関して,情報源は教えていただけますか?
本人から直接聞いた,というような確認の取りにくいものでも構わないのですが…
πの日まであと一ヶ月なのでπの話題を・・・

円周率の計算の歴史に必ず登場するENIACですが、2035桁の円周率を求めたのだから数KBのメモリを持っているのだと漠然と思っていました。

ところがENIACは20語(1語10進10桁)しかメモリが無かったのですね。
工夫して2000桁以上の計算を行ったようです。
現在も10兆桁の数値はメインメモリに収まらないわけですが、苦労は昔も同じだったのですね。

ENIACでの円周率の計算の発案者はあのフォンノイマンのようです。
円周率に現れる数字の分布にに興味があったとか。

現在ならBBPアルゴリズムなど任意の桁の数値を求めるアルゴリズムがありますが、さすがにENIACではBBPアルゴリズムは動かないかな。

ENIACは1チップ化されてますね。
残念なことに物理的なパッチボードによるプログラミングはできないようです。

ENIAC-on-a-Chip - Penn Printout, Mar 96
http://www.upenn.edu/computing/printout/archive/v12/4/chip.html

2012年は円周率の計算記録は更新されませんでしたね。
今年はどうでしょう。

ログインすると、残り6件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

円周率 - π - パイ 更新情報

円周率 - π - パイのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング