ChatGPTくんにアルキメデスの方法で円周率を計算するスクリプトを書かせてみたところ、
全然正しいと思われる数値が出力されない。
どうにか間違いを修正してやり、正しい値が出るようになったものの、
アークタンジェントや、sin、cosを使わない形で計算したい!
ということで、再挑戦。
ひとまずChatGPTくんに聞いてみる。
三角関数を使わずに円に内接する多角形の辺の長さを求めたいんだけども
ChatGPT
はい、もちろんです!
1.中心角を求める:
正多角形の中心角は ( \frac{360^\circ}{n} ) です。
2.二等辺三角形の高さを求める:
二等辺三角形の高さは、円の半径 ( r ) から求められます。
3.ピタゴラスの定理を使って辺の長さを求める:
二等辺三角形の高さを ( h ) とすると、底辺の半分は ( \frac{a}{2} ) です。
ピタゴラスの定理より、次の式が成り立ちます: [ r^2 = h^2 + \left(\frac{a}{2}\right)^2 ]
ここで、( h = r \cos\left(\frac{180^\circ}{n}\right) ) です。
4.辺の長さを求める:
上記の式を変形して、辺の長さ ( a ) を求めます: [ a = 2 \sqrt{r^2 - h^2} ]
ここで、( h = r \cos\left(\frac{180^\circ}{n}\right) ) です。
この方法を使うことで、三角関数を直接使わずに円に内接する多角形の辺の長さを求めることができます。
ふむふむ。ちなみに聞かずともわかるけども
「\cos」の部分って?
ChatGPT
はい、「cos(コサイン)」です!
三角関数やんけ!
ということでなかなか難しい。
自分なりにいろいろ調べたんですが
単純に円に内接する多角形の辺の長さを三角関数を使わずに計算するのはおそらく無理。
ということで、条件をもう少し限定することで求められるみたい。
以下、調べた内容を自分なりに落とし込む。
例えば、図の通り、半径1の円に内接する正四角形を考える。
この図の線ABは四角形の1辺、この1辺に円の中心から線を引き、
その線と円との交点D作成するとき、線ADは正八角形の一辺になる。
線ABをa
線ADをa'
とした時に、aからa' を求められる。
以下はその過程。もはやLinuxはあまり関係なくただの数学。
三角形ACDと三角形ADEは相似
※各角度が同じため
そのため、辺の比 AD:DC = DE:AD
この式を変形して、AD×AD = DC×DE
半径1の円の直径になるのでDC = 2
また AD = a' および DE = 1-OE
つまり a' ×a' = 2×DE = 2×(1-OE)
ピタゴラスの定理により
AO×AO = OE×OE + AE×AE で OE = 1 および AE = a/2 なので
OE×OE = 1 - (a/2 × a/2)
a' ×a' = 2 - 2×OE = 2 - 2×√1 - (a/2 × a/2)
というわけで
正四角形の辺の長さをaとしたときに正八角形の辺の長さを求めることができる。
同じようにしていくと正八角形の辺を2等分して得られる正十六角形の辺の長さを求められる。
正n角形の辺の長さaがわかれば、正2n角形の長さを求められる。
順々に正2n角形の辺の長さがわかれば、正4n角形の辺の長さが求まる。
※2の階乗づつ増えていく
この式を使ってChatGPTくんにうまく円周率を出させたい。
ChatGPTくんと結構な回数の対話をしながら、
正N角形の辺の長さとNの初期値を出してやれば
順に正(N×2の階乗)角形までの円周率の近似値を順に計算するスクリプトを作成。
※一旦10乗まで#!/bin/bash
# 正N角形の辺の長さを入力
read -p "正N角形の辺の長さを入力してください: " a
# 正N角形の辺の数を入力
read -p "正N角形のNの値を入力して下さい: " N
# 初期値として正N角形の辺の長さを設定
current_a=$a
# 円の半径
radius=1
# nの値を2の階乗で計算
for i in {1..10}
do
n=$(echo "2^$i * $N" | bc)
current_a=$(echo "scale=10; sqrt(2 - sqrt(4 - $current_a^2))" | bc -l)
perimeter=$(echo "scale=10; $n * $current_a" | bc -l)
pi_approx=$(echo "scale=10; $perimeter / (2 * $radius)" | bc -l)
echo "$n角形の辺の長さは: $current_a"
echo "円周率 (π) の近似値は($n角形の場合): $pi_approx"
done
例えば、半径1の円の正四角形の辺の長さはルート2なので、
aを1.41421356237
Nを4 とする。
スクリプトを実行すると以下の値を求められるので入力。
正N角形の辺の長さを入力してください: 1.41421356237
正N角形のNの値を入力して下さい: 4
その出力結果が以下
8角形の辺の長さは: .76536686473
円周率 (π) の近似値は(8角形の場合): 3.0614674589
16角形の辺の長さは: .39018064403
円周率 (π) の近似値は(16角形の場合): 3.1214451522
32角形の辺の長さは: .19603428067
円周率 (π) の近似値は(32角形の場合): 3.1365484907
64角形の辺の長さは: .09813534867
円周率 (π) の近似値は(64角形の場合): 3.1403311574
128角形の辺の長さは: .04908245704
円周率 (π) の近似値は(128角形の場合): 3.1412772505
256角形の辺の長さは: .02454307662
円周率 (π) の近似値は(256角形の場合): 3.1415138073
512角形の辺の長さは: .01227176922
円周率 (π) の近似値は(512角形の場合): 3.1415729203
1024角形の辺の長さは: .00613591394
円周率 (π) の近似値は(1024角形の場合): 3.1415879372
2048角形の辺の長さは: .00306796023
円周率 (π) の近似値は(2048角形の場合): 3.1415912755
4096角形の辺の長さは: .00153398174
円周率 (π) の近似値は(4096角形の場合): 3.1415946035
※実行時間 0m14.130s
うーむ。満足。
4096角形の円周率の近似値!
他にも初期値を変更してみる。
正六角形だと半径1の円に内接する辺の長さが1になるので、
スクリプトを実行して、以下を入力。
正N角形の辺の長さを入力してください: 1
正N角形のNの値を入力して下さい: 6
実行結果が
12角形の辺の長さは: .5176380902
円周率 (π) の近似値は(12角形の場合): 3.1058285412
24角形の辺の長さは: .2610523845
円周率 (π) の近似値は(24角形の場合): 3.1326286140
48角形の辺の長さは: .1308062586
円周率 (π) の近似値は(48角形の場合): 3.1393502064
96角形の辺の長さは: .0654381662
円周率 (π) の近似値は(96角形の場合): 3.1410319776
192角形の辺の長さは: .0327234640
円周率 (π) の近似値は(192角形の場合): 3.1414525440
384角形の辺の長さは: .0163622797
円周率 (π) の近似値は(384角形の場合): 3.1415577024
768角形の辺の長さは: .0081812101
円周率 (π) の近似値は(768角形の場合): 3.1415846784
1536角形の辺の長さは: .0040906112
円周率 (π) の近似値は(1536角形の場合): 3.1415894016
3072角形の辺の長さは: .0020453117
円周率 (π) の近似値は(3072角形の場合): 3.1415987712
6144角形の辺の長さは: .0010226925
円周率 (π) の近似値は(6144角形の場合): 3.1417113600
※実行時間 0m4.418s
問題なし!
ということで長くなりましたが、初期値を正しい値さえ出してやれば
多角形を計算して、円周率の近似値を出すスクリプトを無事作成できました。
※三角関数を使わずに!
最後にもうちょっと数を増やすとどうなるか検証
10乗から100乗に変更。
ただそれだけだと「scale=10」という記載で、
小数点10桁までという制限に引っ掛かり、すぐに正しい値が出なくなるので、
この値も「scale=100」小数点100桁までに変更し、実行。
正N角形の辺の長さを入力してください: 1
正N角形のNの値を入力して下さい: 6
実行結果は長くなるので全部は記載しませんが、一番最後の出力が
円周率 (π) の近似値は(7605903601369376408980219232256角形の場合): 3.1415926535897932384626433832795028841973137317537174734622005905300445108013841189804390168840372224
実行時間
real 0m5.065s
という結果が出ました。実行時間も短く7605903601369376408980219232256角形で円周率の近似値を求めています。
どのぐらいの精度で求められているか確認したかったため、
再度、ChatGPTくんに聞いてみた。
この値のどこまで円周率と一致してますか?
ChatGPT
あなたが提供した値:
3.1415926535897932384626433832795028841973137317537174734622005905300445108013841189804390168840372224
円周率と比較すると、以下のようになります:
3.141592653589793238462643383279502884197
ここまで一致しています。つまり、小数点以下36桁まで一致しています。これは非常に高精度な近似値ですね!
やった。なかなかいい感じ。
調子に乗って、200乗、「scale=1000」で計算してみました。
円周率 (π) の近似値は(9641628265553941653251772554046975615133217962696757011808256角形の場合): 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470382544908553461002143252124389639802699218409068217967914344490284531965373201296401050469068822634235373643439376243464867956479123381789418281877504812680599255157015853840304585578734293136741052266314327442213383717796046038712555736682118746201794190139953054769998740144347940029398498510549065359093392719012236070809695847958895163226680832225647812757513194630559189666967264336941168027161468963280980800370593963378811633823363289500249452574783811686750977446597276675052098806327525975086476743268837421919643215367454170368974217279422210542162816950710043913352124440717133124837862081565953453271264963333487273323641181313916697655612274236075848234653004514407232243381772335462650856554586865117052602744497875577243193244416852940200046705241765802728667759920087594772172435077947175227968891285176298830428768970053608005854611794049836230238094048108740608
実行時間
real 4m10.598s
さすがに少し時間がかかりました。
今度もChatGPTくんに一致率を聞いてみる
ChatGPT
この質問にはお答えできません!
答えないんかい!
数字の桁数とかで受け付けないのかも。
仕方がないので地道に確認してみると小数点以下121桁まで円周率と一致!
以下、実際の121桁までの円周率です。
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470
そうそう、こういうことを計算でしたかったんです。
このテーマ、これにて、終了します!