fortran66のブログ

fortran について書きます。

【メモ帳】Stirling の公式

ガンマ関数

Stirling の公式  n! = \sqrt{2\pi n}({n\over e})^n をまた考えてみます。 \Gamma(n+1)=n! で、また \Gamma(x)=\int_0^\infty x^{n-1}\exp(-x) dx であるので、  n! =\int_0^\infty x^{n}\exp(-x) dx を考えることにします。

この積分被積分関数x が大きくなると増大する x^n とそれを減衰させて抑え込む \exp(-x) の積になっていて、x の増加につれてまず増えた後に尻すぼみに減る山のような形をしています。山の頂上が来るのは微係数が 0 になる点なので  n x^{n-1}\exp(-x)-x^n\exp(-x)=0 より  x=n の所と分かります。これより山の頂上の高さは n^n\exp(-n) と求まります。これの対数を取ると  n! \simeq n\log(n)-n となり、この時点で階乗の対数の近似によく使われる近似が得られています。

ここで山の形を Gaussian で近似することを考えます。山の高さは分かっているので、山の幅を決めればいいことになります。なぜ Gaussian なのか、Lorentzian じゃダメなのか!と言いたくなるでしょうが、図を書いてみると裾がストンと落ちているので、Gaussian かなという気もします。しかしそれよりも、Stirling の公式の  \sqrt(2\pi n) という形が Gaussian の積分を思わせます。もう少し真面目に考えると、被積分関数を鞍点法のノリで  \exp の形にまとめた後 \exp の中身を x=n で Taylor 展開してみると、定数項は山の高さに、1回微分は山頂だから 0 で消えて、二次の項が残って Gaussian の形になるので、この項で切ればいい気がします。

jupyter wolfram script にて

式の形からして、左右対称な釣り鐘型にはならんだろ Gaussian じゃダメなんでは?という猜疑心の深い方のために、3次の項まで Taylor 展開して左右対称からの崩れも見てみることにします。

f[x_] := x^n Exp[-x]
g[x_] := Log[f[x]]
Series[g[x], {x, n, 3}]

Exp[Normal[%]]

n = 50
g2[x_]:= -n -(x-n)^2 / (2 n)
Plot[{x^n * Exp[-x], n^n * Exp[ g2[x] ]}, {x, 0, 2 * n}]

g3[x_]:= -n -(x-n)^2 / (2 n) + (x-n)^3 / (3 n^2)
Plot[{x^n * Exp[-x], n^n * Exp[ g3[x] ]}, {x, 0, 2 * n}]

青が被積分関数、橙が近似によるもの。

以上の結果から、山の形を Gaussian で近似して面積を求めたのが Stirling の公式ということが分かります。Gaussian の幅は \sigma^2=2n となります。また 3次の項までとるとGaussian の左右対称からのズレがおおよそ修正されることも分かります。