我正在使用 GMP 来计算非常大的阶乘(例如 234234!)。有没有办法知道,在计算之前,结果将(或可能)有多少位数?
问问题
1418 次
6 回答
12
您可以使用简单的对数数学转换斯特林的近似公式以获得位数:
n! ~ sqr(2*pi*n) * (n/e)^n
log10(n!) ~ log10(2*pi*n)/2 + n*log10(n/e)
硬件浮点数学就足够了,这使它快如闪电。
于 2009-07-11T07:38:44.277 回答
7
阶乘的对数可用于计算阶乘数字的位数:
这可以很容易地转换为算法形式:
//Pseudo-code
function factorialDigits (n)
var result = 0;
for(i = 1; i<=n; i++)
result += log10(n);
return result;
于 2009-07-11T08:07:09.163 回答
3
斯特林近似给出了 n 大小的近似值!
有关推导,请参见Wikipedia页面。
于 2009-07-11T07:37:59.223 回答
2
这将是
nlog(n) - n + log(n(1 + 4n(1 + 2n)))/6 + log(pi)/2
请参阅主题“增长率”@ http://en.wikipedia.org/wiki/Factorial Srinivasa Ramanujan 方法
于 2009-07-11T07:59:29.537 回答
1
是的,请参见斯特林近似
它说n!~= sqrt(2*Pi n) (n/e)^n。要获得位数,请取 1+log(n!)/log(10)。
于 2009-07-11T07:37:50.657 回答
1
好吧,大约有四个人提到了斯特林,所以……另一个选择是存储前 N 个阶乘中每个阶乘的位数的 LUT。假设 4 个字节用于整数,4 个字节用于位数,您可以将前 1,000,000 个阶乘存储在大约 8MB 中。
于 2009-07-11T08:01:47.677 回答