【数学】えんしゅーりつ【丸】

私はテスト前最後の授業の終わりの鐘を聞き、またテストが始まるのかとやや面倒くさく思いながら
家に帰り、帰宅の一杯を飲んだ後 空いた小腹を満たそうと思い、菓子入れに目をやった。
しかしそこには数カ月前からあるのど飴しか影がなかった。 ちくしょう昨日のとんがりコーン
が最後の菓子だったのか、  と後悔しながら結露の出始めた牛乳を直しに冷蔵庫へ向かった。
冷蔵庫にしまい終えたら ふと、氷が食べたいと思い冷凍室を開けると、そこには雪見だいふくがあるではないか。
この時間からアイスの類を食べるのはいかがなものかと思いながら 私は口の中の
甘酸っぱいのど飴を噛み殺し飲んだ。私は高まるテンションを抑えながら、雪見だいふく
をテーブルまで持って行き、ラベルを開けた。
するとそこには!!

【問】 ここに雪見だいふくがある、上から見たときの面積を求めたい。半径とか各部位の長さは後から教えるから、円周率を百桁ほどプログラムでも組んでもとめよ。

うむ、 なんとも使い古されたネタである。 円周率を求めるなどなんのためになるのだ。
だいたい3.1415926535ぐらい っていう認識で誤差は分子レベルまで縮まるはずではないか。
そう思いながら私はコードを組にPCに向かった。
実際円周率数百桁なんて大した時間もかからないだろう。
しかし百桁とはなんと貪欲な問題なのだろう。メモリ的にはきっとどうって事ないからまぁ良い。

pythonで組む。
とりあえずdecimalさんにお世話になるつもりだがsqrtとかatanとかは引数がdoubleなので使えない。
だから収束は遅いが
 \frac{\pi}{4} = 1 - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + \cdots +(-1)^n \frac{1}{2n + 1} \cdots
を利用させてもらう

しかーし この式、収束が非常に遅いので、相当数のループをすることになる。
そして100けた表示するdecimalさん  これは絶対に時間がかかる。

>>> abs(pis(100000))
Decimal("3.141582653589793488462643352029502893728419393964949575908635991959269055172987594527216824734804418")

やはり精度低い
ちなみに1000000にすると終わりませんでした。

ではやはりsqrtとかを使わないといけなさそうだ。
というわけでsqrt自作。
ニュートン法使用。

円周率算出アルゴリズムはガウス=ルジャンドルのアルゴリズムですお。
暗に楕円積分しております。
ガウス=ルジャンドルのアルゴリズムとは
 a = 1, \quad b = \sqrt{1/2}, \quad t = 1/4, \quad p = 1
4変数の初期値をこのように設定し、
x = (a+b)/2
 t = t-p(a-x)^2
 b = \sqrt{ab}
 a = x
 p = 2p

という処理を繰り返すと
 \frac{(a+b)^2}{4t}
がπに近似していきます
精度は処理ごとに約2倍(桁数)になっていきます


さてこちら 処理数に対する精度は格段に高くなったはず

>>> pi2(5)
Decimal("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998625628703211672039")
>>> pi2(6)
Decimal("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117071")
>>> pi2(7)
Decimal("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117071")

どうやら6回で100桁の精度まで行けました。
☆YATTA☆

面積

さぁこれで円周率がわかったので。どうやら雪見だいふくの半径は3.5cmくらいなので

>>> ensyuritu*dd("3.5")**2
Decimal("38.48451000647496717116738144517391033141532514234504630694307125577075097700606023319342661044093412")

面積は38.48451...平方センチメートルくらいでーす 
答えが出たー