Stirling 公式


Stirling公式

  • 1.阶乘

    n!=n(n−1)(n−2)⋯×3×2×1(n≥1)n! = n(n-1)(n-2)\cdots\times3\times2\times1\quad(n\geq1)n!=n(n−1)(n−2)⋯×3×2×1(n≥1)0!=10!= 10!=1

  • Stirling公式

    n!≈2πn(ne)nn! \approx \sqrt{2\pi n}(\frac{n}{e})^n n!≈2πn​(en​)n

    当n足够大的时候,n!的计算量很大,Stirling公式这个时候就很好用,公式也可以变形为

    lim⁡n+∞n!2πn(ne)n=1\lim_{n \ +\infty} \frac{n!}{\sqrt{2\pi n}(\frac{n}{e})^n}=1n +∞lim​2πn​(en​)nn!​=1

    或者也等价于

    lim⁡n+∞enn!nnn=2π\lim_{n \ +\infty}\frac{e^nn!}{n^n\sqrt{n}}=\sqrt{2\pi}n +∞lim​nnn​enn!​=2π​

    在Wikipedia上看到,Stirling公式是由 Abrr′mahamdeMoivre{\rm Abrr'maham de Moivre}Abrr′mahamdeMoivre发现的,不过没有那么精确

    n!=cnn+12e−nn! = cn^{n+\frac{1}{2}}e^{-n} n!=cnn+21​e−n 其中c为常数,后来Stirling证明了c=2πnc=\sqrt{2\pi n}c=2πn​,约为2.506628274631.更加精确的形式是由雅克·比内发现的。

推导

这个公式的误差的估计,可以推导如下。首先不直接估计n!n!n!,而是考虑它的自然对数:

ln(n!)=ln1+ln2+ln3+⋯+lnn.\mathsf {ln}(n!) = \mathsf {ln}1+\mathsf {ln}2+\mathsf {ln}3+\cdots+\mathsf {ln}n.ln(n!)=ln1+ln2+ln3+⋯+lnn.

即:

ln(n!)−12lnn=ln1+ln2+⋯+lnn−12lnnln\mathsf {ln}(n!)-\frac{1}{2}\mathsf {ln}n=\mathsf {ln}1+\mathsf {ln}2+\cdots+lnn-\frac{1}{2}\mathsf {ln}n \mathsf {ln} ln(n!)−21​lnn=ln1+ln2+⋯+lnn−21​lnnln

这个方程的右边是积分∫1nln(x)dx=nlnn−n+1\int_1^n\mathsf {ln}(x)dx=n\mathsf {ln}n-n+1∫1n​ln(x)dx=nlnn−n+1的近似值(利用梯形法则),而他的误差由欧拉-麦克劳林公式给出:

ln(n!)−lnn2=ln1+ln2+ln3⋯+ln(n−1)+lnn2=nlnn−n+1+∑k=2mBk(−1)kk(k−1)(1nk−1−1)+Rm,n\mathsf {ln}(n!)-\frac{\mathsf {ln}n}{2}=\mathsf {ln}1+\mathsf {ln}2+\mathsf {ln}3\cdots+\mathsf {ln}(n-1)+\frac{\mathsf {ln}n}{2}=n\mathsf {ln}n-n+1+\sum_{k=2}^m\frac{B_k(-1)^k}{k(k-1)}(\frac{1}{n^{k-1}}-1)+R_{m,n} ln(n!)−2lnn​=ln1+ln2+ln3⋯+ln(n−1)+2lnn​=nlnn−n+1+k=2∑m​k(k−1)Bk​(−1)k​(nk−11​−1)+Rm,n​

其中BkB_kBk​是伯努利数,Rm,nR_{m,n}Rm,n​是欧拉麦克劳林中的余项。取极限,可得:

lim⁡n→∞(lnn!−nlnn+n−lnn2)=1−∑k=2mBk(−1)kk(k−1)+lim⁡n→∞Rm,n.\lim_{n\to\infty} (\mathsf {ln}n!-n\mathsf {ln}n+n-\frac{\mathsf {ln}n}{2})=1-\sum_{k=2}^m\frac{B_k(-1)^k}{k(k-1)}+\lim_{n\to \infty} R_{m,n}.n→∞lim​(lnn!−nlnn+n−2lnn​)=1−k=2∑m​k(k−1)Bk​(−1)k​+n→∞lim​Rm,n​.

把这个极限记为 y\mathsf yy .由于欧拉-麦克劳林公式中的余项Rm,nR_{m,n}Rm,n​满足:

Rm,n=lim⁡n→∞+O(1n2m−1)R_{m,n} = \lim_{n\to \infty}+\Omicron(\frac{1}{n^{2m-1}}) Rm,n​=n→∞lim​+O(n2m−11​)

其中用到了大 O\OmicronO符号,与以上的方程结合,便得出对数形式的近似公式:

lnn!=nln(ne)+lnn2+y+∑k=2mBk(−1)kk(k−1)nk−1+O(1n2m−1)\mathsf {ln}n! = n\mathsf {ln}(\frac{n}{e})+\frac{\mathsf {ln}n}{2}+y+\sum_{k=2}^m\frac{B_k(-1)^k}{k(k-1)n^{k-1}}+\Omicron(\frac{1}{n^{2m-1}}) lnn!=nln(en​)+2lnn​+y+k=2∑m​k(k−1)nk−1Bk​(−1)k​+O(n2m−11​)

两边取质数,并选择任何正整数mmm,便得到了一个含有未知数eye^yey的公式。当m=1m=1m=1时,公式为:

n!=eyn(ne)n[1+O(1n)]n!=e^y\sqrt n(\frac{n}{e})^n[1+\Omicron(\frac1n)] n!=eyn​(en​)n[1+O(n1​)]

这个上述表达式带入沃利斯乘积公式,并令nnn趋于无穷,便可以得出

ey(ey=2π)e ^y(e^y=\sqrt {2\pi})ey(ey=2π​)

因此,我们便得出斯特林公式:

n!=2πn(ne)n[1+O(1n)]n!=\sqrt {2\pi n}(\frac ne)^n[1+\Omicron(\frac 1n)] n!=2πn​(en​)n[1+O(n1​)]

这个公式也可以反复使用分部积分法来得出,首相可以通过最速下降法得到。把以下的和:

ln(n!)=∑j=1nlnj\mathsf {ln}(n!)=\sum_{j=1}^n\mathsf {ln}j ln(n!)=j=1∑n​lnj

用积分近似代替,可以得出不含2πn\sqrt {2\pi n}2πn​的因子的Stirling公式(这个因子通常在实际应用中无关):

∑j=1nlnj≈∫1nlnxdx=nlnn−n+1\sum_{j=1}^n\mathsf {ln}j\approx \int_1^n\mathsf {ln}xdx=n\mathsf {ln}n-n+1 j=1∑n​lnj≈∫1n​lnxdx=nlnn−n+1

收敛速率和误差分析

更加精确的近似公式为:

n!=2πn(ne)neλnn!=\sqrt{2\pi n}(\frac ne)^ne^{\lambda_n}n!=2πn​(en​)neλn​

其中:

112n+1&lt;λn&lt;112n\frac1{12n+1}&lt;\lambda_n&lt;\frac 1{12n} 12n+11​<λn​<12n1​

Stirling公式实际上是一下级数(现在成为Stirling级数)的第一个近似值:

n!=2πn(ne)n(1+1288n2−13951840n3−5172488320n4+⋯&ThinSpace;)n!=\sqrt{2\pi n}(\frac ne)^n(1+\frac 1{288n^2}-\frac {139}{51840n^3}-\frac{517}{2488320n^4}+\cdots) n!=2πn​(en​)n(1+288n21​−51840n3139​−2488320n4517​+⋯)

当n→∞n \to \inftyn→∞时,截断级数的误差等于第一个省略掉的项。这是渐进展开式的一个例子。他不是一个收敛级数,对于任何特殊值n,级数的准确性只在取有限个项时达到最大,如果取更多的项,则准确性将变得越来越差。
阶乘的对数的渐近展开式也称为Stirling级数:

lnn!=nlnn−n+12ln(2πn)+112n−1360n3+11260n5−11680n7+⋯\mathsf {ln}n!=n\mathsf {ln}n-n+\frac 12 \mathsf {ln}(2\pi n)+\frac 1{12n}-\frac 1{360n^3}+\frac 1{1260n^5}-\frac 1{1680n^7}+\cdotslnn!=nlnn−n+21​ln(2πn)+12n1​−360n31​+1260n51​−1680n71​+⋯

这种情况下,级数的误差总是与第一个省略掉的异号,且最多同大小。

Gamma函数的Stirling公式

对于所有正整数,有:

n!=Π(n)=Γ(n+1).n!= \Pi (n)=\Gamma(n+1).n!=Π(n)=Γ(n+1).

然而,Gamma函数与阶乘不一样,他对于所有复数都有定义。尽管如此,Stirling公式仍然适用。如果R(z)&gt;0R(z)&gt;0R(z)>0,那么:

lnΓ(z)=(z−12)lnz−z+ln2π2+2∫o∞arctant2e2πt−1dt\mathsf {ln}\Gamma(z)=(z-\frac 12)\mathsf {ln}z-z+\frac{\mathsf {ln}2\pi}2+2\int_o^\infty\frac{arctan\frac t2}{e^{2\pi t}-1}dtlnΓ(z)=(z−21​)lnz−z+2ln2π​+2∫o∞​e2πt−1arctan2t​​dt

反复使用分部积分法,可得一下渐近展开式:

lnΓ(z)=(z−12)lnz−z+ln2π2+∑n=1∞(−1)n−1Bn2n(2n−1)z2n−1\mathsf {ln}\Gamma (z)=(z-\frac 12)\mathsf {ln}z-z+\frac {\mathsf {ln} 2\pi}2 +\sum_{n=1}^\infty\frac{(-1)^{n-1}B_n}{2n(2n-1)z^{2n-1}}lnΓ(z)=(z−21​)lnz−z+2ln2π​+n=1∑∞​2n(2n−1)z2n−1(−1)n−1Bn​​

其中BnB_nBn​是第n个伯努利数。当∣argz∣&lt;π−ϵ|arg z|&lt;\pi-\epsilon∣argz∣<π−ϵ,其中 ϵ\epsilonϵ 是正数时,这个公式对于绝对值足够大的zzz是适用的,当使用了最初mmm个项时,误差为O(z−m−12)\Omicron(z^{-m-\frac 12})O(z−m−21​)。对应的近似值可以写为:

Γ(z)=2πz(ze)z[1+O(1z)]\Gamma (z)=\sqrt{\frac {2\pi}{z}}(\frac ze)^z[1+\Omicron(\frac 1z)]Γ(z)=z2π​​(ez​)z[1+O(z1​)]

Stirling公式的收敛公式

欲得出Stirling公式的一个收敛形式,我们必须计算:

∫0∞2arctant2e2πt−1dt=lnΓ(z)−(z−12)lnz+z−12ln(2π)\int_0^\infty \frac {2arctan\frac t2 }{e^{2\pi t}-1}dt=\mathsf {ln}\Gamma(z)-(z-\frac 12)\mathsf {ln}z+z-\frac 12 \mathsf {ln}(2\pi)∫0∞​e2πt−12arctan2t​​dt=lnΓ(z)−(z−21​)lnz+z−21​ln(2π)

一种方法是利用含有上升阶乘幂的级数。如果

zn‾=z(z+1)⋯(z+n−1)z^{\overline n}=z(z+1)\cdots(z+n-1)zn=z(z+1)⋯(z+n−1)

那么:

∫0∞2arctant2e2πt−1dt=∑n=1∞cn(z+1)n‾\int_0^\infty \frac {2arctan\frac t2 }{e^{2\pi t}-1}dt=\sum_{n=1}^\infty \frac {c_n}{(z+1)^{\overline n}}∫0∞​e2πt−12arctan2t​​dt=n=1∑∞​(z+1)ncn​​

其中:

cn=1n∫01xn‾(x−12)dxc_n=\frac 1n\int_0^1x^{\overline n}(x-\frac 12)dxcn​=n1​∫01​xn(x−21​)dx

从中可以得出Stirling级数的一个收敛形式:

lnΓ(z)=(z−12)lnz−z+ln2π2+112(z+1)+112(z+1)(z+2)+59360(z+1)(z+2)(z+3)+2960(z+1)(z+2)(z+3)(z+4)+⋯\mathsf {ln}\Gamma(z)=(z-\frac 12)\mathsf {ln}z-z+\frac {\mathsf {ln}2\pi}{2}+\frac 1{12(z+1)}+\frac 1{12(z+1)(z+2)}+\frac{59}{360(z+1)(z+2)(z+3)}+\frac {29}{60(z+1)(z+2)(z+3)(z+4)}+\cdots lnΓ(z)=(z−21​)lnz−z+2ln2π​+12(z+1)1​+12(z+1)(z+2)1​+360(z+1)(z+2)(z+3)59​+60(z+1)(z+2)(z+3)(z+4)29​+⋯
他在R(z)>0时收敛

适用于计算器的形式

以下的近似值

Γ≈2πz(zezsinh1z+1810z6)z\Gamma\approx\sqrt{\frac{2\pi}{z}}(\frac ze\sqrt{zsinh\frac1z+\frac 1{810z^6}})^zΓ≈z2π​​(ez​zsinhz1​+810z61​​)z

或:

2lnΓ(z)≈ln(2π)−lnz+z[2lnz+ln(zsinh1z+1810z6)−2]2\mathsf {ln}\Gamma(z)\approx\mathsf {ln}(2\pi)-\mathsf {ln}z+z[2\mathsf {ln}z+\mathsf {ln}(zsinh\frac 1z+\frac 1{810z^6})-2]2lnΓ(z)≈ln(2π)−lnz+z[2lnz+ln(zsinhz1​+810z61​)−2]

可以通过把Stirling公式整理,并注意到它的幂级数与双曲正弦函数的泰勒级数展开式的相似性来得出。当zzz的实数部分大于8时,这个近似值精确到小数点后8位。2002年,Robert H. Windschitl建议计算Γ(z)\Gamma(z)Γ(z)函数Gergo Nemes在2007年提出了一个近似公式,它的精确度与Windschitl的公式相等,但更加简单:

Γ(z)≈2πz[1e(z+112z−110z)]z\Gamma (z)\approx \sqrt{\frac {2\pi}{z}}[\frac 1e(z+\frac 1{12z-\frac 1{10z}})]^zΓ(z)≈z2π​​[e1​(z+12z−10z1​1​)]z

或:

lnΓ(z)≈12[ln(2π)−lnz]+z[ln(z++112z−110z)−1]\mathsf {ln}\Gamma (z)\approx\frac 12 [\mathsf {ln}(2\pi)-\mathsf {ln}z]+z[\mathsf {ln}(z++\frac 1{12z-\frac 1{10z}})-1]lnΓ(z)≈21​[ln(2π)−lnz]+z[ln(z++12z−10z1​1​)−1]

这个到后面全部都是Wikipedia上抄的了,因为不知道怎么总结了,就选择直接把他手打了一份,就当练习Markdown编辑器了,立个flag,把这里面的一些 名词都手打一遍,看一遍。今天就这样了吧,有点醉orβ\betaβ

Stirling公式相关推荐

  1. [BZOJ3000] Big Number (Stirling公式)

    Description 给你两个整数N和K,要求你输出N!的K进制的位数. Input 有多组输入数据,每组输入数据各一行,每行两个数--N,K Output 每行一个数为输出结果. Sample I ...

  2. Stirling公式的应用

    Stirling公式也叫做斯特林公式,是用来取N! 的近似值. 在编程中,也用到了Stirling数的思想来解决以下问题. 第一类Stirling公式 题目 把n个物体排成k个非空循环的方法数目. S ...

  3. Stirling公式(pku1423)

    Stirling 公式 即: Stirling公式的意义在于:当n足够大时,n!计算起来十分困难,虽然有很多关于n!的等式,但并不能很好地对阶乘结果进行估计,尤其是n很大之后,误差将会非常大.但利用S ...

  4. Wallis公式Stirling公式Gamma函数

    Wallis公式 (!!是双阶乘,不超过这个整数且具有相同奇偶的正整数相乘,比如5!!=1×3×5, 6!!=2×4×6) 利用Wallis公式推导Stirling公式 斯特林公式是一条用来取n阶乘近 ...

  5. 【数论】斯特林公式 ——Stirling公式(取N阶乘近似值)

    斯特灵公式是一条用来取n阶乘近似值的数学公式.一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特灵公式十分好用.从图中可以看出,即使在n很小的时候,斯特灵公式的取值已经十分准确. 公式为:    ...

  6. Stirling公式 求n! 的位数

    Stirling 公式 即: Stirling公式的意义在于:当n足够大时,n!计算起来十分困难,虽然有很多关于n!的等式,但并不能很好地对阶乘结果进行估计,尤其是n很大之后,误差将会非常大.但利用S ...

  7. 用Stirling公式的应用

    /* 求m!的位数,1<=m<=10^7.时间1s. 使用Stirling公式进行求解  n!~~~~~~(n/e)^n(2*pi*n)^(1/2) */ #include<iost ...

  8. hdu1018 Big Number stirling公式

    Stirling公式:n!与sqrt(2πn) * n^n * e^(-n)的值十分接近 所以log10(n!) = log(n!) / log(10) = ( n*log(n) - n + 0.5* ...

  9. 斯特林公式 ——Stirling公式(取N阶乘近似值)(转)

    斯特灵公式是一条用来取n阶乘近似值的数学公式.一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特灵公式十分好用.从图中可以看出,即使在n很小的时候,斯特灵公式的取值已经十分准确. 公式为:    ...

最新文章

  1. java robot类自动截屏
  2. Java基础知识回顾-6
  3. SP4062电路接口芯片保护IC
  4. 镜像的分层结构 - 每天5分钟玩转容器技术(11)
  5. Maven(6)--archetype
  6. 查看Chome浏览器中已保存的密码
  7. Spring Cloud 微服务实战系列-Ribbon整合RestTemplate实现负载均衡
  8. Gartner2017年数据科学领域最酷供应商出炉,实至名归
  9. 关于crossvalind函数(转)
  10. fork: retry: Resource temporarily unavailable 解决方案
  11. 2018达内web全套视频
  12. 集体智慧编程源代码(免费)
  13. 20201130-C语言-重新认识ASCII码表
  14. 《Java语言程序设计与数据结构》编程练习答案(第三章)(三)
  15. Python实现奇数阶幻方(不用numpy)
  16. python统计英文文本词频和提取文本关键词
  17. mysql优化面试整理-吊打面试官
  18. oracle分区备份,oracle分区表备份,只还原1个分区
  19. bzoj1645 / P2061 [USACO07OPEN]城市的地平线City Horizon(扫描线)
  20. Activity详解2

热门文章

  1. arm麒麟V10手动编译安装qt --华为擎云900l ARM处理器
  2. Java趣味编程10----自守数
  3. 中小学成绩统计分析系统 太平洋软件
  4. scratch猫捉老鼠 少儿编程 电子学会图形化编程scratch编程等级考试二级真题和答案解析2023年3月
  5. 赵何娟:嗨,欢迎来到区块链新世界!
  6. css设置1.5倍行高,用css样式设置行高:
  7. 年近30岁的你还一直是个loser,要靠什么继续活下去?
  8. 图像处理的常用空间滤波算法
  9. 下列选项中表示mysql逻辑非运算的有_MySQL逻辑运算符
  10. MX-Linux大杀器——用U盘把系统和工作都随身带走