原文迁自 B 站 · 首次发布于 2023-07-01。正文与配图按原文保留。迁移时修复了原页面一处公式的字符转义显示问题。

自行整理,如有错误,欢迎指出,不胜感激。
斯特林公式(Stirling's approximation)是一条用来取n的阶乘的近似值的数学公式。一般来说,阶乘的计算复杂度为线性。当要为某些极大大的n求阶乘时,常见的方法复杂度不可接受。斯特林公式能够将求解阶乘的复杂度降低到对数级。而且,即使在n很小的时候,斯特林公式的取值已经十分准确。
斯特林公式如下:
n!=2πn⋅(en)n⋅e12nθ(0<θ<1) 我们已经知道ln(1+x)与ln(1-x)的泰勒展开:
ln(1+x)=x−2x2+3x3−⋯+(−1)n−1nxn+⋯(−1<x≤1)将x替换为−x:
ln(1−x)=−x−2x2−3x3−⋯−nxn−⋯(−1<x<1)两者相减去得到:
ln1−x1+x=2x(1+3x2+5x4+⋯+2m+1x2m+⋯)(−1<x<1) 设x=1/(2n+1) ,n=1,2,3,···,得:
1−x1+x=1−2n+111+2n+11=2n2n+2=nn+1 所以上式子就变为了: lnnn+1=2n+12[1+31⋅(2n+1)21+51⋅(2n+1)41+⋯]
(n+21)ln(1+n1)=[1+31⋅(2n+1)21+51⋅(2n+1)41+⋯] 而右边的式子< 1+31((2n+1)21+(2n+1)41+…) =1+311(2n+1)21(2n+1)21=1+31⋅4n2+4n1=1+12n(n+1)1
因为左式显然>1,所以有 1<(n+21)ln(1+n1)<1+12ln(n+1)1
取一下指数: e<(1+n1)n+21<e1+2n(n+1)1⇔1<e(1+n1)n+21<e2n(n+1)11}
设一下: an=nn+21n!en 那么 an+1an=nn+21(n+1)!en+1n!en(n+1)n+1+21=e(1+n1)n+21
由上面的不等式知道: an+1an>1 所以该数列其实是单调递减的,且显然一定有下界0
那么该数列的极限一定存在,不妨设为a
an+1an=e(1+n1)n+21<e12n(n+1)1=e121(n1−n+11)=e12(n+1)1e12n1 最终得到: ane−12n1<an+1e−12(n+1)1 我们能看出来左右两个数列 ane−12n1 是单调递增的。
而 limn→∞ane−12n1=a ,所以 ane−12n1<a<an
又 −1<−θ<0⇒−12n1<−12nθ<0
两边取下指数: e−12n1<e−12nθ<1⇒ane12n1<ane−12nθ<an
那么游戏就进行到了一半,现在可以得出结论: a=ane−12nθ,θ∈(0,1)
把前面的an带进去: n!=enae12nθnn+21=an⋅(en)n⋅e12nθ,0<θ<1
Wallis圆周率无穷乘积公式: 2π=limn→∞2n+11[(2n−1)!!2n!!]2
而 (2n−1)!!2n!!=2n!!(2n−1)!!(2n!!)2=2n!(2n!!)2=2n!(2n×n!)2=2n!22n(n!)2
将前面的结论n变成2n: (2n)!=a2n⋅(e2n)2n⋅e24nθ′,0<θ′<1
故
=2n!22n(n!)2=a2n⋅(e2n)2n⋅e24nθ′22n[an⋅(en)n⋅e12nθ]2=a2ne24n4θ−θ′带回到极限中: 2π=limn→∞2n+11[a2ne24n4θ−θ′]2=limn→∞2n+11⋅a2⋅2n⋅e12n4θ−θ′=4a2
所以 a=2π
大功告成,代回我们之前的结论: n!=2πn⋅(en)n⋅e12nθ(0<θ<1) 即斯特林公式。
n很大的时候: limn→+∞2πn(en)nn!=1
所以 n!≈2πn(en)n
斯特林公式在理论和应用上都具有重要的价值,对于概率论的发展也有着重大的意义。在数学分析中,大多都是利用Г函数、级数和含参变量的积分等知识进行证明或推导,很为繁琐冗长。近年来,一些国内外学者利用概率论中的指数分布、泊松分布、χ²分布证之。
以下是一个计算斯特林公式的近似值的代码。(使用Python语言):
import math
def stirling_approximation(n):
return math.sqrt(2 * math.pi * n) * ((n / math.e) ** n)
# 示例使用
n = 5
approximation = stirling_approximation(n)
print(f"Stirling's approximation for {n}! is approximately {approximation}")
请注意,斯特林公式是一个近似公式,对于较大的n,它的近似值更加准确。