問い
円周率の値はいくつですか?
答え
3.14 に決ってるでしょ。小学校で習ったよ。
さて導入です
小学校では円周率は 3.14 と教えます。しかし、理論(なぜその値になるのか)は教えません。
なぜ円周率は 3.14 なのでしょうか?
ひとつの解法
まずは、小学校で習った 3.14 はいったん忘れてください。頭から消去してください。
円を正多角形で近似するという方法があります。例えば、円に内接する正四角形はとても円とは思えません。しかし角数を 5, 6, 7, ... と増やしていくと、どんどんその正n角形は円に近似していきそうな気がしますよね?
円に内接する正六角形
円に内接する正六角形を考えます。

円の中心から6つの頂点を結ぶと、三角形が6つできます。1つの三角形に着目すると、頂角は 360 度を 6 つに分けているので 60° です。頂角を挟む二辺の長さは半径なので等しい。よって、頂角 60° の二等辺三角形です。二等辺三角形は底角が等しくなります。また三角形の内角の和は 180° なので、頂点が 60° であれば、底角は 60° になり、すべての角度が 60° となります。ということは、一辺の長さが半径である、正三角形であることがわかります。つまり、半径 1 の円に内接する正六角形の辺の長さは 6 であることがわかります。
円周率とは直径と円の外周の長さの比率のことです。
単位円(半径が1の円)に内接する正六角形の場合では、直径と正六角形の外周の比は、
2 * x = 6
こうなるので比率は 3 です。つまり円周率が 3 だとすると、円にはならず正六角形になるわけです。正六角形と円ではぜんぜん見た目が違いますよね?当たり前ですが、円に内接する正六角形よりも円は外側にありますよね。
ということは、
円周率は 3 より大きい
ということがわかります。
円に外接する正四角形
円に外接する正四角形は、一辺の長さが直径と等しくなります。半径の長さは 1 なので直径は 2、つまり正方形の辺の長さは 8 となります。この正四角形についても、直径と正四角形の辺の長さの比と考えてみます。
2 * x = 8
比率は 4 ですね。もし円周率が 4 だとすると、単位円に外接する正四角形となります。正四角形はとても円とは思えません。当たり前ですが、円に外接する正四角形より円は内側にありますよね。
ここで円周率についてさらなる手掛かりが得られます。
円周率は 4 より小さい
ことがわかります。
まとめると、単位円の外周の長さは、内接する正六角形よりは長く、外接する正四角形よりは短いはずです。つまりこれを式で表すと、
3 < 円周率(π) < 4
このようになることがわかります。
では円周率はいくつなのか
前に、円に内接する正n角形の n をどんどん増やしていくと円に近似していくという話をしました。実際にそれをやってみましょう。手で計算するのはとても大変なので、プログラムコードを書いてコンピュータに計算させましょう。
;; 半径 r の円に内接する正 n 角形の辺の長さと、円の直径との比
(define (n-gon-side-to-diameter-ratio r n)
(let* ((vertex-angle (/ 360 n))
(base-angle (- 180 90 (/ vertex-angle 2)))
(side-length (* 2 r (cos (degrees->radians base-angle)))))
(/ (* n side-length) (* 2 r))))
プログラミング言語の三角比関数は、度数法ではなく弧度法(ラジアン)を使いますので、degrees->radians 手続きでやむなく変換しています。「ラジアンってなんやねん!」と思うかも知れませんが今は気にしないでくださいw
まず、正n角形を構成するそれぞれ三角形は、必ず二辺が半径で等しい二等辺三角形です。
この二等辺三角形の底辺の長さを求めて、全部足せば良いわけです。
最初に頂角の半分の角度を求めます。二等辺三角形を半分にするので頂角から底辺に線を引くと 90° で交わります。底角の角度は、
底角 = 180 - 90 - \frac{頂角}{2}
で求められます。
底角がわかれば三角比 cos を使って、底辺の長さが求められますので、元の二等辺三角形の底辺の長さは二倍すれば求まります。
最後に底辺の長さをすべて合計すれば正n角形の辺の長さが求まります。
正六角形(n=6)の場合
単位円に内接する正六角形の外周の長さから、直径との比を求めてみます。
gosh> (n-gon-side-to-diameter-ratio 1 6)
3.000000000000001
ちょっと誤差がありますが、円周率は 3 と計算できました。
円周率に迫る
では円周率を求めていきます。
その前に
(define nil '())
(define (enumerate-interval low high)
(if (> low high)
nil
(cons low (enumerate-interval (+ low 1) high))))
整数リストを生成する手続きを用意しておきます。
さて、n を増やしていくと円周率はどうなるでしょうか?
gosh> (print (map (lambda (n) (n-gon-side-to-diameter-ratio 1 n)) (enumerate-interval 6 60)))
(3.000000000000001 3.0371861738229056 3.0614674589207187 3.0781812899310195 3.0901699437494745 3.0990581252557257 3.105828541230249 3.111103635738249 3.1152930753884025 3.1186753622663916 3.1214451522580533 3.1237418028816992 3.1256671980047477 3.127297215333946 3.1286893008046186 3.1298875896996634 3.1309264420122775 3.1318329292136715 3.1326286132812413 3.1333308391076065 3.133953686638398 3.1345086813812184 3.1350053308926213 3.135451534294314 3.1358538980296036 3.136217981610399 3.1365484905459375 3.1368494290380253 3.1371242217522686 3.137375811620174 3.137606738915693 3.137819205593841 3.138015127948631 3.1381961799523057 3.1383638291138 3.138519366296322 3.1386639306298245 3.138798530419022 3.1389240607662234 3.1390413184856354 3.1391510147748662 3.139253786020717 3.1393502030468663 3.139440779054935 3.139525976465665 3.13960621283109 3.1396818659588868 3.139753278366858 3.1398207611656863 3.1398845974522356 3.139945045282731 3.140002340284334 3.1400566979542086 3.140108315688543 3.140157374576638)
#<undef>
リストだと見辛いので、適宜改行を入れました。
3.000000000000001
3.0371861738229056
3.0614674589207187
3.0781812899310195
3.0901699437494745
3.0990581252557257
3.105828541230249
...(中略)...
3.1398207611656863
3.1398845974522356
3.139945045282731
3.140002340284334
3.1400566979542086
3.140108315688543
3.140157374576638
多少誤差はあるのですが、n=57 から 3.14 が現れます。
正57角形は手で図を描くのはかなり大変だと思いますが、人間の目にはほぼ円に見えることでしょう。
なお、n をもっと大きな値にすればするほど、比率は円周率(π)に限りなく近づいていきます。
まとめ
今回は、円に内接する正n角形を考え、円周率を近似する方法を示し、円周率が 3.14 であることを確かめました。他にも円周率を求めるいろいろな方法があり、今回紹介した方法よりもより正確に高速に求める方法がたくさんあります。いろいろ調べてみてプログラムを書いて試してみると面白いと思います。