ChatGPTに円周率を計算するBashスクリプトを書かせてみた②

エフ
2025-06-11
2025-06-11

円周率

前回の続き

ChatGPTくんに円周率を計算するスクリプトを書かせてみたところ、
なんとなくそっけない内容(私にとっては)だったため、古代の浪漫を求めて再挑戦する



ChatGPTくん、私はもっと古代的な方法で円周率を計算したいわけだよ。
もうちょっと他の方法ないの?
例えばこんな感じの多角形を使う、みたいな。


円と多角形


ChatGPT
はい、多角形を使って円周率(π)を計算する方法があります。古代の数学者アルキメデスは、円内に正六角形を内接させ、同じ円の外接する正六角形を作成しました。それから、正六角形の周長と直径を正確に計算し、周長を直径で割ることで、円周率のおおよその近似値を求めました。

この方法は、次のステップで行われます:

正六角形の周長を計算します。
正六角形の直径を計算します。
周長を直径で割ることで、円周率の近似値を得ます。
この手法は、円周率を近似的に求める古典的な方法の一つであり、アルキメデスの偉大な発見の一部です。

アルキメデス
おう、それだよ、それ!
アルキメデスくんの方法をスクリプトにしてみてよ。


ChatGPT
もちろんです!アルキメデスの方法を使用して、正六角形を使って円周率(π)を近似的に計算するBashスクリプトを以下に示します。


#!/bin/bash

# 正六角形の辺の数(ここでは6)を設定
sides=6

# 正六角形の一辺の長さを計算
# 円の半径を1と仮定しています
radius=1
side_length=$(bc -l <<< "scale=10; (2 * $radius * s(180 / $sides))")

# 正六角形の周長を計算
perimeter=$(bc -l <<< "scale=10; $sides * $side_length")

# 正六角形の直径を計算
diameter=$(bc -l <<< "scale=10; 2 * $radius")

# 円周率の近似値を計算
pi=$(bc -l <<< "scale=10; $perimeter / $diameter")

# 結果を表示
echo "円周率 (π) の近似値は: $pi"


このスクリプトでは、正六角形の辺の数を6として、円周率の近似値を計算しています。正六角形の一辺の長さを求め、周長を直径で割ることでπの値を得ています。精度を高めるには、辺の数を増やすことができます。


ついに求めていたものが出てきたか。素晴らしい。
ということで実行。

円周率 (π) の近似値は: -5.9281897440
(処理時間:0m0.011s)

いやいやいや、3ですらないじゃないか。
これ合ってるの?

ChatGPTくん、こんな値が出たんだけども。


ChatGPT
申し訳ありません、先ほどの計算に誤りがありました。正しい円周率の近似値を再計算します。


え?どういうこと?間違ってるの?


ChatGPT
このスクリプトは正しいアプローチですが、一部修正が必要です。正六角形の辺の長さを計算する際に、半径を1と仮定しているため、正確な円周率の近似値は得られません。代わりに、円の直径を指定して計算することで、より正確な結果を得ることができます。

以下は修正したスクリプトです:


#!/bin/bash

# 円の直径を設定
diameter=12

# 正六角形の辺の数を設定
sides=6

# 正六角形の一辺の長さを計算
radius=$(bc -l <<< "scale=10; $diameter / 2")
side_length=$(bc -l <<< "scale=10; (2 * $radius * s(180 / $sides))")

# 正六角形の周長を計算
perimeter=$(bc -l <<< "scale=10; $sides * $side_length")

# 円周率の近似値を計算
pi=$(bc -l <<< "scale=10; $perimeter / $diameter")

# 結果を表示
echo "円周率 (π) の近似値は: $pi"



円周率 (π) の近似値は: -5.9281897440
(処理時間:0m0.011s)


一緒だね。
そもそもさっきの式から円の直径を変えただけだね。
最終的に直径で割るから、そりゃ値は変わらないよね。

そもそもどこが間違ってるんだろう。
ChatGPTくんに聞いてもわからないため、自分で考えてみる。
わかりやすく考えるため、一番最初の半径が1の円のスクリプトで考えてみたときに
正六角形の一辺の長さは1のはず。

にもかかわらず、

side_length=$(bc -l <<< "scale=10; (2 * $radius * s(180 / $sides))")

の計算結果が -1.9760632480
これや、これやんけ

そもそもs(180 / $sides)って要するにsin30度のことのはず、sin30度は0.5
この値が0.5であれば、上記の計算結果も1になって、計算も合うはず。

そして、この計算が正しければ、スクリプトの円周率の計算結果は3になって、
そこまでずれもなく、多角形の数を大きくすれば円周率に近づくはず。

そもそもなぜ、s(180 / $sides)の値が正しくないのか。
どうやらsin30度ではなく、sin30の値になっているような気がする。
sin30度という値にするためにはbashスクリプトを以下のように変更しなければいけない。

s(180 / $sides)

s(180 / $sides * a(1) / 45)

ラジアンに変換するために「a(1) / 45 」という項を追加する。
(※a(1) →アークタンジェント またか。)

これでラジアンに変換できたはず。
それぐらい自分で解決したまえよ、ChatGPTくん


ということでスクリプトを改良して6角形について実施。

円周率 (π) の近似値は: 2.9999999994

でました。それっぽい値。

では多角形を大きくしてみます。

100角形
円周率 (π) の近似値は: 3.1410759000

1000角形
円周率 (π) の近似値は: 3.1415874000

10000角形
円周率 (π) の近似値は: 3.1415910000


うむ。できた!できたけども。

アークタンジェントも使ってるし、sin、cosも登場してる。
sin、cosも円周率から割り出したものではないらしいんだけども、
思っていた計算と違う!
なんとなく、sin、cosも使いたくない!


うーん、このままでは終われない。
ちょっとこの内容でブログ引っ張りすぎじゃないのかね、という指摘が入ろうとも
このままでは終るわけにはいかない!


アークタンジェントやsin、cosを使わずに
正しくアルキメデスの方法で円周率を導き出すスクリプトを作成しなければ・・・
つづく