ああ、円周率の謎に迫りたい。円周率を感じたい。
Linuxエンジニアとしてbashスクリプトで円周率を計算したい。
ということで円周率を計算するスクリプトを作成することにしました。
ええっと、確か、円に多角形を書いて、その長さで近似値を求めるとかだったような。
そうそう、こんな図。
ということでスクリプトを考える。
多角形の長さの計算を・・・。
うーん。うーん。・・・とっかかりも出てこない。
ChatGPTくん、ちょっと来たまえ、
少し君に任せたい仕事があるんだけども。
円周率の計算をbashのスクリプトで出してもらえないかね
ChatGPT
はい。かしこまりました。#!/bin/bash
# 計算する小数点以下の桁数を設定
decimal_places=10
# bcコマンドを使用して円周率を計算
pi=$(echo "scale=$decimal_places; 4*a(1)" | bc -l)
# 結果を表示
echo "円周率 (π) の値は: $pi"
むむむ。短い。そんなのでいいの?
とりあえず、実行してみる
円周率 (π) の値は: 3.1415926532
(処理時間:0m0.005s)
うむ。正しいじゃないか。
ちなみにこのスクリプトの内容がようわからんなあ。
ChatGPTくん、この「4*a(1)」の部分ってどういうことなの?
ChatGPT
4*a(1):これは、円周率(π)を計算するための式です。a(1)は、bcコマンドの中でアークタンジェント(逆正接)を計算する関数です。アークタンジェントの値が1のとき、結果はπ/4になります。したがって、これを4倍することでπの値を得ることができます。
うん?待て待て。それって、アークタンジェントの値を引っ張ってきてるだけじゃないの?
それって計算って言えるの?
いや結果は正しいよ。でも違うんだよなあ
浪漫がないんだよなあ。すでにある値をいじってるだけだもんね。
ChatGPTくん、アークタンジェントの値を使わずに計算できないのかね?
ChatGPT
もちろんです!円周率(π)をアークタンジェントの値を使わずに計算する方法があります。以下は、無限級数を使用して円周率を近似的に求める方法です。
この式は、ライプニッツ級数として知られています。無限級数の各項は、交互に正と負の値を持ち、徐々に円周率に収束していきます。ただし、この方法は収束が遅いため、多くの項を足し合わせる必要があります。
もしさらなる詳細が必要であればお知らせください。
うーん。それでいいんだっけ?
それってライプニッツさんが近似値を見つけただけなんじゃないの?
うーん、まあいいか。じゃあそのライプニッツ級数で円周率を出すスクリプトを作ってみてよ。
ChatGPT
もちろんです!#!/bin/bash
# 計算する項数(精度)を設定
terms=1000000
# Leibnizの公式を使用してπを計算
pi=0
for ((i=0; i<$terms; i++))
do
sign=$((i % 2 == 0 ? 1 : -1))
term=$(bc -l <<< "scale=20; $sign / (2*$i + 1)")
pi=$(bc -l <<< "scale=20; $pi + $term")
done
pi=$(bc -l <<< "scale=10; 4 * $pi")
# 結果を表示
echo "円周率 (π) の近似値は: $pi"
ふむふむ。なるほど。
ということで実行。
お、思っていたよりも時間がかかるぞ。計算している感じ。
ちょっとterms=1000000は大きすぎるのか。
1000000項計算するってことだもんね。
うーん。30分待っても結果が出ない。
一旦強制終了。
terms=1000に変更して、実行。
円周率 (π) の近似値は: 3.14059265383979292624
(処理時間:0m4.028s)
うむ。最低限の値は出た。
terms=10000に変更して、実行。
円周率 (π) の近似値は: 3.14149265359004323852
(処理時間:0m40.360s)
よし、もういっちょ
terms=100000に変更して、実行。
円周率 (π) の近似値は: 3.14158265358979348040
(処理時間:6m42.541s)
やっぱりこの方法だと計算に時間かかりますね。
うーん。どんどん正確な値に近づいてますが、
値も出るには出たが。これは円周率とは言えないのではないか。
これでは足りない。何かが足りない!
ということで、
つづく