如何估算阶乘的大小?
How Big Are Factorials?

前几天我在想 52! 到底有多大,这促使我思考如何在不依赖计算器或电脑的情况下估算阶乘。其实,估算阶乘位数(即数字大小)背后有一些非常有趣的数学原理。文章首先给出了估算方法,随后深入探讨了 Gamma 函数和 Stirling 公式的推导过程。通过 Laplace 方法,我们可以从 Gamma 函数积分中推导出 Stirling 近似公式,进而利用对数计算阶乘的位数。以 52! 为例,估算结果与实际值 68 位惊人地接近。在处理这种天文数字时,误差几个位数通常无关紧要,但这套数学工具却能让我们快速把握数量级。
在像这样处理巨大数字的估算中,误差几个位数通常不是什么大问题。
HN 评论区
42- svobodamartin
我最喜欢的一个例子是 52! 秒:
启动一个计时器,从 52! 秒倒数到 0。
然后,每过十亿年走一步,绕着地球赤道走一圈。
接着,当你走完赤道一圈(每十亿年一步)后,从太平洋里取出一滴水。
然后,重复绕赤道行走的过程,每走完一圈,就再取出一滴水。
等海洋被完全抽干后,把海洋重新注满,并在你脚下垫一张纸。
现在,再次重复行走、抽水、垫纸的过程。
等到你垫的纸堆高到太阳时,再重复整个过程 1000 次。
做完这一切,计时器才刚刚走完大约三分之一。
- ninju
作者在文章开头随口提到的 52!,让我想起了多年前看到的一个旧网页:
https://czep.net/weblog/52cards.html
有人知道怎么判断这个页面的年龄吗(它肯定至少有 20 年历史了)
- andrewla
这让我想起了 Bender & Orszag 书中的分析;他们通过差分方程(这在形式数学中已是一门失传的艺术,很有 19 世纪的味道)来处理这个问题,而不是用积分。
他们没有引入伽马函数,而是从观察 log(F_n) - log(F_n-1) = log(n) 出发,将这种差分视为类似于积分,从而得出 F_n 的主项渐近行为约为 nlogn + n。这一点仅通过代入和代数运算就能看清,无需微积分(尽管“预先知道答案”会有帮助)。
从那里出发,你可以将误差项处理为 F_n = n^n * e^n * E_n,并将其代入相同的递推关系(F_n = n * F_n-1),推导出该误差项的渐近形式,最终得到与 OP 中积分方法相同的结果。
- movpasd
斯特林近似在统计力学中也用得很多,因为你经常需要计算状态空间大小的对数,这意味着大量的组合数学,也就是大量的阶乘。此外,它是连续的,所以可以进行微积分运算。
- Sharlin
估算 n! 位数的一个粗略方法是 n lg n,它通过不等式
1 * 2 * … * n ≤ n * … * n
从上方近似 n!。
(这种近似对很多学过算法课程的人来说应该很熟悉。)
若要更紧的界,可使用 n lg n - n/2,或者如果你愿意,用 ln 10 的更好近似值来替换 1/2。这源于斯特林近似,它指出:
ln n! = n ln n - n + O(ln n)。