モンテカルロ法を使って円周率を求め続けるプログラムを作った

こんにちは、こんばんは
ある日、パソコンに負荷を与えたくなったのでこの記事を作りました。

円周率ってなんぞ?

wiki見てください。

いきさつ

手持無沙汰なパソコンが一つあって、リソースがもったいないなーと思っていました。
分かりやすくてマシンへの負荷が多くて面白い計算はないかなと考えていたところ、円周率の計算が思い当たりました。
負荷を与えるという点ではビュフォンの針でもよかったのですが、グラフでは表しづらく円と円周率の関係をわかりやすく表示できるものはないかなと考えて、モンテカルロ法を採用しました。

モンテカルロ法とは

モンテカルロ法は円の公式に対してランダムな点を適当にとり、検証回数と当選回数(円の中に点が入った回数)の割合を求める方法です。

利点

・計算がとても簡単

欠点

・真の値を求めるために膨大な計算回数が必要
・計算回数が多すぎて時間がかかりすぎる
・乱数のランダム性で結果が変わる

以下の式で求められます
まず円の公式は
\begin{align} (x-a)^2+(y-a)^2=r^2 \end{align}
で表せられます。
そして原点に円を設定するとaは0になるので
\begin{align} x^2+y^2=r^2 \end{align} 
また半径は1に設定するとr=1になり
\begin{align} x^2+y^2=1^2 \end{align}
これを円の内側だけに入った点だけ取る条件式にすると
\begin{align} \sqrt{x^2+y^2}<1 \end{align} 
すべての円があって、そこに横縦それぞれ2ずつの正四角形があったとき、以下の図のようなイメージになります 
その四角形の中に入るようにランダムに点を打っていったときに
円に入った点の数をNin、円に入らなかった点をNoutとします
そうすると円周率は
\begin{align} π=\frac{Nin}{Nout} \end{align} 

効率的な円周率の計算方法

天才たちは日々、効率化をしています。よって円周率の求め方も効率化されています。
2022年6月にGoogleの社員がGoogleCloud(めっちゃでかいサーバー)を利用して157日23時間かけて100兆桁を計算しました。おそらくモンテカルロ法で100兆桁を計算するには惑星の一生レベルの時間がかかると思います。
このGoogle社員が求めるのに使った公式はChudnovsky(チュドノフスキー)の公式を用いて計算したそうです。またこの公式にBinary Splitting Methodというのを落とし込んでやると円の漸近線(ギリギリ被らないグラフの線のこと)にとてもつもない速さで収束(グラフの線に限りなく近づくこと)するそうです。自分も理解してないので計算法はよくわかんね。勉強します。
とてもすごい人がチュドノフスキーの公式を用いて円周率を計算していたので乗っけておきます。

プログラム

コードが長くなってしまったので載せません。
またコードに自信がないので載せません。
以上です。

動いている様子

S218の前で運が良ければやっています。
実際に145時間処理をしてみました。
70時間あたりの時に、3.141594...ぐらいになっていて最終的にどんどん離れて行ってしまってるので、まあ、小数点4桁まで精度は保証できそうです。
 

コメント

このブログの人気の投稿

DockerのNextcloudでエラーが出た SQLSTATE[08006] [7]

Arduinoで電流を測定する