在计算阶乘之前可以知道阶乘有多大吗?
我正在使用 GMP 来计算非常大的阶乘(例如 234234!)。 在进行计算之前,有什么方法可以知道结果将(或可能)有多少位数字?
I'm using GMP to calculate very large factorials (e.g. 234234!). Is there any way of knowing, before one does the calculation, how many digits long the result will (or might) be?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
您可以使用简单的对数数学转换斯特林近似公式来获得位数:
硬件浮点数学足以满足这一点,这使得它快如闪电。
You can transform Stirling's approximation formula using simple logarithmic math to get you the number of digits:
Hardware float math is sufficient for this, which makes it lightning fast.
阶乘的对数可用于计算阶乘数所需的位数:
这可以很容易地转换为算法形式:
The logarithm of the factorial can be used to calculate the number of digits that the factorial number will take:
This can be easily translated to an algorithmic form:
斯特林近似给出了 n 大小的近似值!
请参阅 维基百科 推导页面。
Stirling's Approximation gives an approximation of of the size of n!
See the Wikipedia page for the derivation.
它将
看到主题“增长率”@ http://en.wikipedia.org/wiki/Factorial
斯里尼瓦萨·拉马努金方法
it would be
see topic "rate of growth" @ http://en.wikipedia.org/wiki/Factorial
Srinivasa Ramanujan method
是的,请参阅斯特林近似
它说n! ~= sqrt(2*Pin)(n/e)^n。 要获得位数,请取 1+log(n!)/log(10)。
Yes, see Stirling approximation
It says n! ~= sqrt(2*Pin)(n/e)^n. To get the number of digits, take 1+log(n!)/log(10).
大约有四个人提到过斯特林,所以...另一种选择是使用 LUT 存储前 N 个阶乘中每个阶乘的位数。 假设整数有 4 个字节,位数有 4 个字节,则可以将前 1,000,000 个阶乘存储在大约 8MB 中。
Well about four people have mentioned Stirling so... another option is a LUT storing the number of digits for each of the first N factorials. Assuming 4 bytes for the integer and 4 bytes for the number of digits, you could store the first 1,000,000 factorials in around 8MB.