円周率の計算(円に内接する多角形と外接する多角形の周囲の長さを使う)

下記のページを参考にしました
https://w3e.kanazawa-it.ac.jp/e-scimath/contents/t16/textbook_t16_all.pdf

円に内接する正n角形の周の長さと、
円に外接する正n角形の周の長さとから、
円に内接する正2n角形の周の長さと、
円に外接する正2n角形の周の長さが計算できるそうです。

円に内接する正n角形の周の長さを a_{n}
円に外接する正n角形の周の長さを b_{n}とすると、

 \displaystyle
b_{2n} = \frac{2a_{n}b_{n}}{a_{n}+b_{n}} \\
a_{2n} = \sqrt{a_{n}b_{2n}}

となるそうです。

これをPythonで実装しました。

import math

# 半径0.5の円に内接する正六角形の周の長さ
a = 3.0
# 半径0.5の円に外接する正六角形の周の長さ
b = 2.0 * math.sqrt(3)
print((a + b) / 2.0)

for _ in range(10):
    b = 2.0 * a * b / (a + b)
    a = math.sqrt(a * b)
    print((a + b) / 2.0)

結果

3.232050807568877
3.1606094252018613
3.1461442776893693
3.142718209089151
3.1418732752679386
3.1416627611326433
3.141610177484353
3.141597034376504
3.1415937487747883
3.1415929273853114
3.141592722038627