Help us understand the problem. What is going on with this article?

アルキメデスが求めた円周率:√3を何故 265/153 で近似したのか?

はじめに

アルキメデスが円周率の近似値を求める際に√3の近似値として265/153を使っていたとのことです。
Wikipedia:円周率の歴史
何故、265/153を用いたのかは今や分かりませんが、265/153がどれくらい√3を近似できるかを調べる事でその必然性を探ってみました。

√3≒265/153の求め方

アルキメデスは以下の不等式を使って段階的に√3を求めたと考えられているそうです。
アルキメデスによる円周率の計算(平成12年)

a±\frac{b}{2a±1} < \sqrt{a^2+b} < a±\frac{b}{2a}\\

最初に $\sqrt{3}=\sqrt{2^2-1}$と置いて計算すると以下が得られます。

\frac{5}{3} < \sqrt{3} < \frac{7}{4}\qquad①\\

次に左辺の分母3を払って

5 <\sqrt{27} < \frac{21}{4} \\

として、$\sqrt{27}=\sqrt{5^2+2}$と置いて冒頭の不等式にあてはめて計算すると、5/3よりも$\sqrt{3}$に近い19/11を得ることができます。(上限値としては、同様に7/4よりも近い26/15が得られています)

\frac{19}{11} <\sqrt{3} < \frac{26}{15}\qquad② \\

更に右辺の分母を払って $\sqrt{15^2×3}=\sqrt{26^2-1}$ とし、同様の計算をすることで、下記のように19/11よりも近い265/153が得られます。

\frac{265}{153} <\sqrt{3} < \frac{1351}{780}\qquad③\\

段階的に√3を求める意味

話しが少し横道にそれますが、①②③と段階的に求める方法について以下の疑問が出てきます。
疑問1.段階的に求める理由
疑問2.更に段階的に求める事で√3に近づくのか

疑問1については、①②③と求める段階で使っているのは、右辺または左辺の分母と$\sqrt{3}$だけであることから、段階的に求める意味はないのではないかと思われます。
疑問2については、真ん中の√3に掛け合わせる数字が①②③の段階で大きくなっていることから、$\sqrt{n^2×3}\quad$ で$n$を大きくすることで、$\bigl(a±\frac{b}{2a±1}\bigr)÷n\quad$$ $$\bigl(a±\frac{b}{2a}\bigr)÷n\quadが$$\sqrt{3}$に近づいているのではないかと考えられます。

実際に$\bigl(a±\frac{b}{2a±1}\bigr)÷n$を$n=1,2,3,\cdots,1000$まで変化させて描くと$\sqrt{3}$に収束していくように見えます。
(図を描いたコードについては補足に載せました)
キャプチャ.JPG
※ $\bigl(a±\frac{b}{2a±1}\bigr)÷n$:緑 $\sqrt{3}$:赤

265/153がどれだけ√3に近いのか

ここからが本題でになります。
265/153がどれだけ$\sqrt{3}$に近い優れた値であるかを、以下のように求めてみました(力技です)。
(1)分母を$1,2,3,\cdots,100000$まで増やしながら
(2)分子を分母×$\sqrt{3}$より小さな整数を求める($\sqrt{3}$より小さな有理数を求める)
(3)分子÷分母の小数点以下含む10桁と$\sqrt{3}$の小数点以下以下含む10桁を比較し
(4)一致桁数の長い最小分母、分子を求める

  • √3との一致桁数を求める
import math
def numberDigits(n):
    r3 = str(int(math.sqrt(3)*10**10))
    a3 = str(int(n*10**10))
    for k in range(11):
        if r3[k] == a3[k]: continue
        else: break
    return k
  • 分母を$1,2,3,\cdots,100000$まで増やしながら一致桁数の多い分母、分子の組み合わせを求める
N = 100000
T = [0 for n in range(11)]

for n in range(2,N):
    h = int(n*math.sqrt(3))
    k = numberDigits(h/n)
    if T[k] == 0: T[k] = n
  • 求めた結果を表示
for n in T:
    if n > 1:
        h = int(n*math.sqrt(3))
        k = numberDigits(h/n)
        print(str(h) + "/" + str(n) + " : " + str(k))

上記の実行結果が以下である。
キャプチャ2.JPG

  • 265/153は$\sqrt{3}$と5桁等しい最初の組み合わせである
  • 265/153の次が1桁上がった2340/1351である

さいごに

アルキメデスにとって265/153はある程度の精度があり(5桁)円周率の計算をするのに適度な大きさの数字だったのではないかと考えています。
実際に円周率を求める際にはでは二乗の計算があり(参照:アルキメデスと円周率)、計算量の点からも適度な大きさだったのではないかと想像しています。

補足

  • $n=1,2,3,\cdots,1000$ について$\bigl(a±\frac{b}{2a±1}\bigr)÷n\quad$ $\bigl(a±\frac{b}{2a}\bigr)÷n$を計算
import math
def r3n(a, b, n):
    return [n, (a-b/(2*a-1))/n, (a-b/(2*a))/n]
def r3p(a, b, n):
    return [n, (a+b/(2*a+1))/n, (a+b/(2*a))/n]
N = 1000
T = []
for n in range(1, N):
    a = int(math.sqrt(3*n**2))
    if (3*n**2 - a**2) > ((a+1)**2 - 3*n**2):
        a = a+1
        b = a**2 - 3*n**2
        T.append(r3n(a, b, n)) 
    else:
        b = 3*n**2 - a**2
        T.append(r3n(a, b, n))
  • √3のグラフ作成の準備
R3 = []
for n in range(1, N):
    R3.append([n, math.sqrt(3)])
  • $\bigl(a±\frac{b}{2a±1}\bigr)÷n$と√3のグラフを描画
import pandas as pd
df = pd.DataFrame(data=T, columns=['number', 'lower', 'upper'])
df2 = pd.DataFrame(data=R3, columns=['number', 'value'])
plt.figure(figsize=(16,4))
plt.plot(df['number'], df['lower'], color = 'green')
plt.plot(df2['number'], df2['value'], color = 'red')
plt.show()
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away