スターリングの公式

スターリングの公式とは、十分大きな自然数 $n$ に対して、$n$ の階乗 $n!$ の近似値を与える公式です。すなわち、$n$ が十分大きいとき、$n! \sim \sqrt{2\pi \vphantom{I} \,} \, n^{n + \frac{1}{2}} e^{-n}$ が成り立ちます。

ここでは、スターリングの公式の導き方や近似の精度を評価する方法を示します。スターリングの公式は、統計学だけでなく、統計力学や計算機科学などの応用においても重要な公式です。

スターリングの公式

まず、スターリングの公式の意味や導き方を示します。


定理 1.3(スターリングの公式)

自然数 $n$ が十分大きいとき、次が成り立つ。

$$ \begin{align*} \tag{1.1.15} n! \sim \sqrt{2\pi \vphantom{I} \,} \, n^{n + \frac{1}{2}} e^{-n} \quad (n \to +\infin) \end{align*} $$



解説

スターリングの公式とは:$n!$ の近似式

スターリングの公式($\text{Stirling’s}$ $\text{formula}$)は、自然数 $n$ の階乗 $n!$ の近似値を与える公式です。

すなわち、$n$ が十分大きいとき、$n$ の階乗は (1.1.15)式の値に漸近します。

$$ \begin{align*} \tag{1.1.15} n! \sim \sqrt{2\pi \vphantom{I} \,} \, n^{n + \frac{1}{2}} e^{-n} \quad (n \to +\infin) \end{align*} $$


スターリングの公式の導き方

スターリングの公式を導く際の、基本的な考え方を示します。より詳しい証明については [3], [9] などを参照してください。

階乗の対数($\ln n!$)

まず、$n!$ の値を評価するため、その対数 $\ln n!$ について考えます。対数を取ることで、下記のような和に分解でき、より扱いやすい形になるためです。

すなわち、対数の基本的な性質より、$\ln n!$ について、次が成り立ちます。

$$ \begin{align*} \ln n! &= \ln n + \ln \, (n-1) + \cdots + \ln 1 \end{align*} $$

$\ln x$ と $x$ 軸に挟まれる領域の面積

いま、閉区間 $[\, 1, n \,]$ において $y = \ln x$ と $x$ 軸に挟まれる領域の面積を $S$ として、これを $2$ 通りの方法で求めます。

($1$)長方形の面積の和(近似)
($2$)$\ln x$ の定積分

(1)長方形の面積の和(近似)

$S$ を、下図のような長方形の面積の和で近似します。

スターリングの公式の導出の考え方

このとき、次が成り立ちます。

$$ \begin{align*} S &= \ln 2 + \ln 3 + \cdots + \ln \, (n-1) + \frac{\, 1 \,}{\, 2 \,} \ln n + \delta_{n} \\ &= \ln \, (n-1)! + \frac{\, 1 \,}{\, 2 \,} \ln n + \delta_n \\ \end{align*} $$

  • $\ln 1 = 0$ であるため、右辺の和は $\ln 2$ からはじまります。
  • $\ln n$ に対応する長方形のみ、幅が $\displaystyle\frac{\, 1 \,}{\, 2 \,}$ となります。

ここで、$\delta_{n}$ は $S$ と長方形の面積の和の誤差を表します。$n \to + \infin$ のとき $\delta_{n}$ は収束します。このことは、$\ln x$ が上に凸であることから導けます( [3], [9] などを参照)。

(2)$\ln x$ の定積分

また、$S$ は、$\ln x$ の定積分により、次のように求められます。

$$ \begin{align*} S &= \int_{1}^{n} \ln x \, dx \\ &= \big[\, x \ln x \, \big]_{1}^{n} - \int_{1}^{n} \! dx \\ &= n \ln n - n + 1 \vphantom{\int} \\ \end{align*} $$

$n!$ の近似式

以上から、次が成り立ちます。

$$ \begin{alignat*} {2} && \ln \, (n-1)! &= (n - \frac{\, 1 \,}{\, 2 \,}) \ln n - n + 1 - \delta_{n} \\ & \Rightarrow & (n-1)! &= n^{n - \frac{1}{2}} \, e^{- n} \, e^{1 - \delta_{n}} \\ \end{alignat*} $$

両辺に $n$ を掛けることで、$n!$ に関する、次の近似式が得られます。

$$ \begin{align*} n! &= n^{n + \frac{1}{2}} \, e^{- n} \, e^{1 - \delta_{n}} \\ &= A \; n^{n + \frac{1}{2}} \, e^{- n} \tag{$\star$} \end{align*} $$

近似式の定数

上記の近似式において、$A = e^{1 - \delta_{n}}$ としています。誤差 $\delta_n$ が収束することから、十分大きな $n$ に対して、$A$ も一定値に収束するといえます。

実際に、ウォリスの公式($\text{Wallis’}$ $\text{formula}$)などを用いることで、$n \to +\infin$ のとき、$A$ が $\sqrt{2\pi \vphantom{I} \,}$ に収束することが導けます( [3], [9] などを参照)。

$$ \begin{align*} A \sim \sqrt{2\pi \vphantom{I} \,} \quad (n \to +\infin) \end{align*} $$

以上から、スターリングの公式を(簡易的に)導くことができました。

$$ \begin{align*} \tag{1.1.15} n! \sim \sqrt{2\pi \vphantom{I} \,} \, n^{n + \frac{1}{2}} e^{-n} \quad (n \to +\infin) \end{align*} $$

より詳しい証明については [3], [9] などを参照してください。


歴史的な経緯

スターリングの公式は、はじめ、ド・モアブルによって次のような形で発見されました($1730$ 年)。

$$ \begin{align*} n! \sim C \, n^{n + \frac{1}{2}} \, e^{- n} \end{align*} $$

同年、スターリングは上式の定数 $C$ が $\sqrt{2\pi \vphantom{I} \,}$ に収束することを示し、ド・モアブルに伝えました。ド・モアブルは、スターリングによる指摘を反映して公式を証明し、その功績をスターリングに帰しました( [8] を参照)。

このような経緯から、この近似式をスターリングの公式と呼ぶというわけです。


解析学におけるスターリングの公式

解析学において、スターリングの公式はガンマ($\varGamma \,$)関数の漸近近似として導出されます。

$$ \begin{align*} \tag{1.1.16} \varGamma \, (x) \sim \sqrt{2\pi \vphantom{I} \,} \, x^{x - \frac{1}{2}} e^{-x} \quad (x \to +\infin) \end{align*} $$

これは、自然数 $n$ の階乗 $n!$ の近似式( (1.1.15)式)の拡張ともいえる公式です。

ガンマ関数とは

ガンマ関数とは、次のような広義積分により定義される関数です。

$$ \begin{align*} \tag{1.1.17} \varGamma \, (x) = \int_{0}^{+ \infin} \! \! e^{-t} \, t^{x-1} \, dt \end{align*} $$

ガンマ関数は、自然数 $n$ に対して定義される階乗 $n!$ を連続変数 $x$ に対して拡張したものです。

ガンマ関数は数学の様々な問題に登場する特殊関数であり、統計学においては、指数分布を一般化したガンマ($\varGamma \,$)分布や、カイ $2$ 乗($\chi^2$)分布の確率密度関数の定義などに現れます。

ガンマ関数の基本的性質

ガンマ関数の基本的な性質として、次のような関係式が成り立ちます。

$$ \begin{alignat*} {2} & (1) &\qquad \varGamma \, (x+1) &= x \varGamma \, (x) \\ & (2) &\qquad \varGamma \, (1) &= 1 \\ & (3) &\qquad \varGamma \, (n+1) &= n! \\ \end{alignat*} $$

($1$)が成り立つことは、部分積分法により確かめられます。

$$ \begin{align*} \varGamma \, (x+1) &= \int_{0}^{+ \infin} \! \! e^{-t} \, t^{x} \, dt \\ &= \big[ - e^{-t} \, t^{x} \, \big]_{0}^{+ \infin} + x \int_{0}^{+ \infin} \! \! e^{-t} \, t^{x-1} \, dt \\ &= (\, 0 - 0 \,) + x \varGamma \, (x) \vphantom{\Big(\Big)} \\ &= x \varGamma \, (x) \vphantom{\Big(\Big)} \\ \end{align*} $$

($2$)は、 ガンマ関数の定義より明らかといえます。

$$ \begin{align*} \varGamma \, (1) &= \int_{0}^{+ \infin} \! \! e^{-t} \, dt \\ &= \big[ - e^{-t} \, \big]_{0}^{+ \infin} \\ &= (\, 0 + 1 \,) \vphantom{\Big(\Big)} \\ &= 1 \\ \end{align*} $$

($3$)が成り立つことは、($1$)と($2$)から導かれます。

$$ \begin{align*} \varGamma \, (n+1) &= n \, \varGamma \, (n) \\ &= n \, (n-1) \cdots 1 \cdot \varGamma \, (1) \\ &= n! \\ \end{align*} $$

より詳しいガンマ関数の性質については、解析学の教科書( [9] など)を参照してください。

$n!$ の近似式との対応

連続変数 $x$ に関するスターリングの公式( (1.1.16)式)において、$x=n$ と限定することで、次の式が得られます。

$$ \begin{align*} \varGamma \, (n) \sim \sqrt{2\pi \vphantom{I} \,} \, n^{n - \frac{1}{2}} e^{-n} \quad (n \to +\infin) \end{align*} $$

ガンマ関数の基本的性質より $n! = \varGamma \, (n+1) = n \, \varGamma \, (n)$ であることから、上式の両辺に $n$ を掛けると、次のようになります。

$$ \begin{align*} n! \sim \sqrt{2\pi \vphantom{I} \,} \, n^{n + \frac{1}{2}} e^{-n} \quad (n \to +\infin) \end{align*} $$

これは、自然数 $n$ に関するスターリングの公式( 定理 1.3(スターリングの公式)(1.1.15)式)に他なりません。


スターリングの公式の別形

スターリングの公式は、$n$ の階乗の対数($\ln n!$)の近似式の形で示されることもあります。

(1.1.15)式の両辺の対数を取ることで、次の式が得られます。

$$ \begin{align*} \ln n! \sim n \ln n - n + \frac{\, 1 \,}{\, 2 \,} \ln \, (2\pi n) \end{align*} $$

十分大きな $n$ において、右辺の第 $3$ 項は他の項に比べて小さいため、これを無視すると、次のようになります。

$$ \begin{align*} \tag{1.1.18} \ln n! \sim n \ln n - n \end{align*} $$

(1.1.18)式(1.1.15)式に比べて精度が落ちるものの扱いやすく、統計力学や計算機科学などの応用において便利です( 例 2($\ln n!$ の近似式)を参照)。



Pythonによる実装例

スターリングの公式を用いた近似値の計算は、Pythonで簡単に実装できます。

ここでは、スターリングの公式による $2$ つの近似式について、その精度を確かめてみます。


例 1($n!$ の近似式)

スターリングの公式( (1.1.15)式)による $n!$ の近似値と真値を比較し、相対誤差を計算します。

$n!$ の近似値と真値を比較するコード

stirling.py
# 必要なライブラリをインポート
import math

# スターリングの公式による近似値を返す関数を定義
def stirling_approx(n):
    return math.sqrt(2 * math.pi) * n **(n + 1/2) * (math.e) ** (-n)

# 比較する値のデータセットを設定
values = [1, 5, 10, 20, 50, 100]

# 比較結果の出力(表形式)
print(f"{'n':>5} | {'n! (exact)':>20} | {'Stirling approx':>20} | {'Relative error':>15}")
print("-" * 70)
for n in values:
    exact = math.factorial(n)
    approx = stirling_approx(n)
    rel_error = abs((exact - approx) / exact)
    print(f"{n:5d} | {exact:20.5e} | {approx:20.5e} | {rel_error:15.5e}")

コードの解説

  • $n$ の階乗は、math.factorial(n) により計算できます。math はPythonの標準ライブラリです。
  • stirling_approx(n) はスターリングの公式( (1.1.15)式)をそのまま実装したものです。
  • 相対誤差は、次の式により計算します。
    $$ \footnotesize{\text{相対誤差}} = \Big\lvert \, \frac{\, \footnotesize{\text{真値}} - \footnotesize{\text{近似値}} \vphantom{\big(\big)} \,}{\footnotesize{\text{真値}} \vphantom{\big(\big)}} \, \Big\rvert \\ $$

実行結果(比較表)

stirling.py の実行結果
    n |           n! (exact) |      Stirling approx |  Relative error
----------------------------------------------------------------------
    1 |          1.00000e+00 |          9.22137e-01 |     7.78630e-02
    5 |          1.20000e+02 |          1.18019e+02 |     1.65069e-02
   10 |          3.62880e+06 |          3.59870e+06 |     8.29596e-03
   20 |          2.43290e+18 |          2.42279e+18 |     4.15765e-03
   50 |          3.04141e+64 |          3.03634e+64 |     1.66526e-03
  100 |         9.33262e+157 |         9.32485e+157 |     8.32983e-04

結果の考察

  • $n=1$ のときは誤差が大きいですが、それでも $8$ %程度です。
  • $n$ が大きくなるにつれて精度が上がっていき、$n=100$ で誤差は $0.1$ %未満になります。
  • これらのことから、$n$ が十分大きい場合、スターリングの公式( (1.1.15)式)が $n!$ の近似式として有効であることがわかります。


例 2($\ln n!$ の近似式)

対数形式のスターリングの公式( (1.1.18)式)による $\ln n!$ の近似値と真値を比較し、相対誤差を計算します。

$\ln n!$ の近似値と真値を比較するコード

stirling_ln.py
# 必要なライブラリをインポート
import math

# スターリングの公式(対数形式)による近似値を返す関数を定義
def stirling_log_approx(n):
    return n * math.log(n) - n

# 比較する値のデータセットを設定
values = [2, 5, 10, 20, 50, 100]

# 比較結果の出力(表形式)
print(f"{'n':>5} | {'ln(n!) exact':>20} | {'Stirling log approx':>20} | {'Relative error':>15}")
print("-" * 70)
for n in values:
    exact_log = math.lgamma(n+1)  # ガンマ関数を利用して ln(n!)  を計算
    approx_log = stirling_log_approx(n)
    rel_error = abs((exact_log - approx_log) / exact_log)
    print(f"{n:5d} | {exact_log:20.5f} | {approx_log:20.5f} | {rel_error:15.5e}")

コードの解説

  • $n!$ の自然対数の値は、ガンマ関数の自然対数を返す math.lgamma 関数を利用して実装します。 ガンマ関数の基本的性質より、$n! = \varGamma \, (n+1)$ であることに注意します。

  • stirling_log_approx(n) はスターリングの公式( (1.1.18)式)をそのまま実装したものです。

  • 相対誤差は、次の式により計算します。

    $$ \footnotesize{\text{相対誤差}} = \Big\lvert \, \frac{\, \footnotesize{\text{真値}} - \footnotesize{\text{近似値}} \vphantom{\big(\big)} \,}{\footnotesize{\text{真値}} \vphantom{\big(\big)}} \, \Big\rvert \\ $$

  • $n=1$ のとき、真値が $0$ となるため、相対誤差が計算できません。したがって、値の比較は $n=2$ からはじめます。

実行結果(比較表)

stirling_ln.py の実行結果
    n |         ln(n!) exact |  Stirling log approx |  Relative error
----------------------------------------------------------------------
    2 |              0.69315 |             -0.61371 |     1.88539e+00
    5 |              4.78749 |              3.04719 |     3.63510e-01
   10 |             15.10441 |             13.02585 |     1.37613e-01
   20 |             42.33562 |             39.91465 |     5.71852e-02
   50 |            148.47777 |            145.60115 |     1.93741e-02
  100 |            363.73938 |            360.51702 |     8.85897e-03

結果の考察

  • $n=10$ でも $10$ %以上の誤差があります。
  • $n$ が大きくなるにつれて精度が上がっていき、$n=100$ で誤差は $1$ %未満になります。
  • 対数形式のスターリングの公式( (1.1.18)式)は、計算しやすい分、通常の公式( (1.1.15)式)と比べて相対誤差が大きくなります。
  • しかしながら、統計力学や計算機科学などではもっと大きな $n$ を扱うことが多く、対数形式のスターリングの公式( (1.1.18)式)で事足りる場合が多いです。

以上から、スターリングの公式は、十分大きな自然数 $n$ の階乗(または、階乗の自然対数)の近似式として強力なツールであることがわかります。

実際の計算においては、理論的な背景を踏まえつつ、誤差を考慮した上で公式を利用することが重要です。



参考文献

[1] 舟木直久. 確率論. 朝倉書店. 2004.
[2] 縄田和満. 確率・統計 $\text{I}$. 丸善出版. 2013.
[3] 小針晛宏. 確率・統計入門. 岩波書店. 1973.
[4] 真貝寿明. 徹底攻略 確率統計. 共立出版. 2012.
[5] 東京大学教養学部統計学教室 編. 統計学入門. 東京大学出版会. 1991.
[6] W. Feller. An Introduction to Probability Theory and Its Applications. John Wiley & Sons, Inc.. 1968.
[7] Robert B. Ash. Basic Probability Theory. Dover Publications, Inc.. 2008.
[8] G. Andrews. Special Functions. Cambridge University Press. 1999.
[9] 杉浦光夫. 解析入門 $\text{I}$. 東京大学出版会. 1980.
[10] 吉田伸生. [新装版] ルベーグ積分入門. 日本評論社. 2021.


初版:2025-08-13   |   改訂:2025-08-15