はじめに
$n$が十分に大きいとき、$n!$を求めるのは計算機でも難しい。これは、$n!$が巨大数となることが原因である。そこで、スターリングの公式は、$n!$の近似値を与える式として有名である。そこで、今回は実際の$n!$とスターリングの公式を用いた近似値を両対数グラフを用いることで比較する。
結果、以下のグラフのように$n>>1$と十分に大きければ、スターリングの公式はかなり精度のよいものになるということが分かる。
導入
スターリングの公式は、以下の式のように$n$が十分に大きい場合について$n!$の近似値を与えるものである。
n!\risingdotseq \sqrt{2\pi n}(\frac{n}{e})^n
プログラム
nを100程度の大きな数にした場合について、横軸を実際の$n!$の値、縦軸を近似値として両対数グラフをとれば、実際の値と近似値を比較することができるはずである。(近似の精度が良ければ、まず、オーダーが等しくなり、$y=x$に漸近するはずである)
そこで、以下のようなプログラムを作成した。
($n!$は計算コストが大きくなると考えられるので、配列を用いて値を保存してある。)
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math
#全試行回数-1
n=100
#配列(階乗計算の一次保存先)
factorial_ary=[]
factorial=1
factorial_ary.append(factorial)
stirling_ary=[]
for i in range(n):
#階乗の計算
factorial=factorial_ary[-1]*(i+1)
factorial_ary.append(factorial)
#スターリングの公式の計算
stirling=math.sqrt(2*math.pi*i)*(i/math.e)**i
stirling_ary.append(stirling)
stirling=math.sqrt(2*math.pi*(n))*((n)/math.e)**(n)
stirling_ary.append(stirling)
#両対数グラフ
plt.xscale("log")
plt.yscale("log")
plt.title('n!とスターリングの近似(n='+str(n)+'まで)')
plt.plot(factorial_ary,stirling_ary)
plt.xlabel('n!')
plt.ylabel('n!のスターリングの近似')
plt.savefig('stirlings.png')
plt.show()
これを実行すると以下のようなグラフが出力される。
このグラフから、実際の値と近似値は、$n$が大きくなるにつれてオーダーが近しくなるということが分かる。したがって、スターリングの公式は有効であるといえる。
まとめ
今回は、階乗の近似値を算出するスターリングの公式の妥当性についてPythonを用いて検証した。公式の証明は難しいが、確率統計や統計力学のような膨大な数を扱う分野では度々出てくる重要な公式である。また、今回用いた、実際の値と近似値の比較方法(y=xに漸近するか確かめる方法)もよく使われる。したがって、それらの理論の確認に最適な題材だったといえる。
参考文献
スターリングの公式と証明について