円周率(えんしゅうりつ)とは、円の直径に対する円周の比である。直径1の円の周の長さに等しい。
無限小数では π = 3.141592... と表示される。円周率は超越数であることが知られており、(超越数は特に無理数なので)この無限小数は循環しない。
円周率に関する慣用表現
ゆとり教育の代名詞として、「円周率が3」と指導された世代と揶揄する人も多い。が、実際には「円周率が3」で指導ということ自体がガセネタでそのような事実はなく、都市伝説である。
当時の学習指導要領に「円周率を教える前の段階で、円周率を使う必要がある問題を解かせる場合に限り円周率を3と代用してもかまわない(要約)」と書かれていたのを、とある学習塾が「ゆとり教育では円周率が3と教えるようになります。だから塾に行きましょう(要約)」というデタラメな広告を掲載したのが最初で、これがよく確認されないまま広まってしまったとされる。
つまり、ゆとり教育世代でも普通に円周率は3.14で指導されているのである。知ったかぶって「お前は円周率が3と習っただろう」と発言すると、発言者こそがバカにされる結果となりかねないのでご注意を。詳細や出典などはWikipedia記事「円周率は3」を参照されたい。
そもそも、3だろうが3.14だろうが、等しく慣用表現であり正確な数値ではない[注]。
注:有効数字という概念から3.14を慣用する事と整数部が3であることを利用して3を用いることには何の違いもない。尚、工学や物理の分野では、実用的にも十分な精度を確保する為、5~6桁程度に拡張されて用いられている。
円周率として3を使った場合最大で33%程度の誤差が出るが、3.14を使った場合0.3%程度に、3.1415なら0.003%程度になる。日常使う範囲なら3.14で、高い精度が求められる場合でもせいぜい5桁程度あれば十分であるといえる。
また、観測可能な宇宙と同じサイズの円盤(半径約465億光年)の円周の長さを水素原子の半径(5.29×10-9m)以下の誤差に収めるするには40桁あればいいらしい。地球サイズならば15桁もあれば同程度の精度になる。
円周率を求める方法
測る
ラップの芯などの真円に近い筒に糸を巻きつけ、その長さを直径で割ってやればよい。そこそこそれっぽい値になる。
誤差は紐の伸びや歪み、筒の真円度や強度、ものさしの精度に依存する。
多角形の辺の長さで近似
正多角形で近似正24角形とかを見てもらえばなんとなくわかると思うが、正n角形のnをどんどん大きくすれば円を近似できる。下記のD言語版プグラムはこの原理に基づいて記述されている。「円周率およそ3」は円を内接正6角形と見做した場合に相当する。
a0=2√3, b0=3, an+1=2anbn/(an+bn), bn=√(an+1bn) としてやれば、anは直径1の円に外接する、bnは内接する正6×2n角形となる。従って、an<π<bn。nを増やしていけばより正確になる。n=4で3桁、n=10で7桁の精度で求まる。
初歩的なアルゴリズムであり図形的にも理解しやすいが、N桁求めるためにN×1.66回程度の平方根計算と乗算が必要であるため現在は使われていない。
また、東京大学の2003年度前期入試試験で「π>3.05を証明せよ」という問題が出たが、円に内接する正八角形以上の多角形で計算すれば証明することができる。
三角関数のテイラー展開
tan-1(x)をテイラー展開すると、tan-1(x)=x-x3/3+x5/5-x7/7+…
となる。このxに1を代入するとπ/4=tan-1(1)=1-1/3+1/5-1/7+…となる。しかし収束が極めて遅い。つまり、がんばって計算しても全然桁数が増えない。この方法でπを10桁の精度で求めるために100億回計算する必要がある。
この級数にオイラー変換と呼ばれる変換を施すと、t=x2/(1+x2)、an=2n!!/(2n+1)!!として、tan-1(x)=(1+Σ(antn))×t/xとなる。この改善した方法を使うと30回程度の計算で10桁の精度を得ることができる。
arctan公式
π/4=Σ(pntan-1(1/qn))の形式の物。タンジェントの加法定理を繰り返し適用することで導出する。各項の数値はtan-1(x)のテイラー展開による。
- π/4=4×tan-1(1/5)-tan-1(1/239)
- π/4=8×tan-1(1/10)-tan-1(1/239)-4×tan-1(1/515)
- π/4=12×tan-1(1/18)-8×tan-1(1/57)-5×tan-1(1/239)
- π/4=12×tan-1(1/49)-32×tan-1(1/57)-5×tan-1(1/239)-12×tan-1(1/110443)
などがある。
収束が速く、πの桁数≒テイラー展開の項数である。一番上の物でtan-1(1/5)、tan-1(1/239)をそれぞれ第2項までテイラー展開すれば3桁の精度で、10項まで展開すれば10桁程度の精度で円周率が求まる。
区分求積
∫01(1/(1+x2))dx=π/4 であることを用いる。
0から1をn等分に分割し、k番目の点xk=k/nをf(x)=1/(1+x2)に代入、π/4≒Σf(xk)/nとして求める。
1000項でおよそ3桁の精度なので収束は遅い。
モンテカルロ法
乱数を発生させて求める統計的方法。簡単にいえば、一辺2の正方形上に点をランダムに打った時、正方形に内接する半径1の円版上にプロットされる確率から求める。
具体的には-1から1までの乱数の組2つを発生させて平面上にプロットし、原点の距離が1以下の物とそれ以外に分ける。そうすると π≒4×(距離1以下の点)/(全点数)となる。だいたい1000点で2桁程度の精度。
また、長さ1cmの針を2cmの間隔で引かれた平行線上に落とし、線と重なる確率から求めるという方法もある。繰り返せば1/πに収束する。シャープペンの芯や鉛筆など十分に細長い棒があれば簡単に実験できる。
ラマヌジャンの公式
1/π=(2√2/9801)×Σ((4k)!×(1103+26390k)/((k!)4)×3964k)
というもの。めちゃくちゃな式に見えるがモジュラー関数がどうのこうので収束が非常に速いらしい。
さらに高度な方法
算術幾何平均、楕円積分法を用いたり、掛け算や割り算の計算量を圧縮するため高速フーリエ変換やニュートン法を用いたりする。また、通常のコンピュータではせいぜい十進数で19桁程度しか扱えないので桁数があっという間に足りなくなる。そのため高い桁数を計算するための専用ソフトを開発する必要がある。
アルゴリズムやソフトウェアの開発だけでなく、大規模計算ではスパコンを始めとした並列計算を用いるのが必須であり、半導体技術やエネルギー効率の改善、コンピュータの設計技術の発展も欠かせない。
道楽で円周率を求めるだけでもその背景には科学技術の凄まじい発展が垣間見えるのである。
桁数の記録
- 紀元前3世紀頃にアルキメデスが正96角形の辺の長さを評価をして、3+10/71<π<3+1/7 と求めている。
- ルドルフという酔狂な数学者が正461京1686兆0184億2738万7904角形(=262角形)の辺の長さを生涯をかけて計算し、35桁まで求めた。そのためドイツでは円周率のことを「ルドルフ数」と呼ぶことがある。
- 手計算で一番がんばったのはシャンクスという数学者で、707桁まで求めた。しかし、後に530桁目までしか正しくなかったことが判明している。
- 筑波大学は2009年8月17日に小数点以下2兆5769億8037万桁まで計算したと発表。検証のための計算も入れて73時間36分かかったそうだ。
- Google LLCのチームにより、2019年3月14日(円周率の日)に31兆4159億2653万5897桁(円周率の上14桁)まで計算され、新記録を更新した。計算時間は検算を含め121日。
暇だから俺も計算してみたい
簡単にでいいならCとかのプログラムの知識と、高校生程度の数学力があれば簡単にできる。
エクセルがあればコンパイルが通らないなどと悩まずもっと簡単にできる。
俺の書いたプログラム
D言語編 (多角形近似)
import std.cstream;
import std.math;
void main() {
int N = 10;
real[] a = new real[N], b = new real[N], t = new real[N], pi = new real[N];
a[0] = 1.0;
b[0] = 1.0 / sqrt(2.0);
t[0] = 1.0 / 4.0;
for(int i=0; i<N-1; i++) {
a[i+1] = (a[i] + b[i]) / 2.0;
b[i+1] = sqrt(a[i] * b[i]);
t[i+1] = t[i] - pow(2.0, cast(real)i) * pow(a[i] - a[i+1], 2.0);
}
for(int i=0; i<N; i++) {
dout.writefln("%40.37f", pow(a[i] + b[i], 2.0) / (4.0 * t[i]));
}
dout.writefln("%40.37f", real.epsilon);
}
→実行結果
OCaml編 (sin-1(x)のx=1/2におけるテイラー展開)
open Num;;
let pi length =
let min = Int 1 // Int 10 **/ Int length in
let rec sum n an x =
let n2 = (Int 2) */ n in
let n2_1 = n2 +/ (Int 1) in
let an' = (n2_1 */ n2_1) //
(Int 4 */ (n2 +/ Int 2) */ (n2 +/ Int 3)) */
an in
if an' </ min then x +/ an'
else sum (n +/ Int 1) an' (x +/ an') in
let a0 = Int 1 // Int 2 in
Int 6 */ sum (Int 0) a0 a0;;
print_string (approx_num_fix 100 (pi 100));;
宿題(来週までに65000桁覚えること)
豆知識
円周率は完全な乱数表という予想がある。これが正しければ、円周率には全ての数字、例えばあなたが適当に思い浮かべた数値でも、ニコニコ動画にログインするパスワードでも、はてはクレジットカードの暗号鍵も個人のDNA情報も全て載っていることになる。ただし、目的の桁数を指定する方が情報量が多くなるので情報の圧縮には使えない。
関連動画
関連コミュニティ
関連項目
- 数学 / 算数
- π
- 65000桁までの円周率
- 3.14159265358979323846264338327950288419716939937510582097494459
- 3.151673980
- 円(数学)
- 数の一覧
- 超越数 / 無理数
- 素数
- ラジアン(単位) / 弧度法
- ガウス=ルジャンドルのアルゴリズム / 算術幾何平均
- 積分 / 区分求積法
- 乱数 / モンテカルロ法
- テイラー展開
- τ(数学定数)
- π=4
- 43
- 0pt