我正在使用GMP来计算非常大的因子(例如234234!)。在进行计算之前,有没有什么方法可以知道结果将会(或可能)长多少位?
答案 0 :(得分:12)
您可以使用简单的对数数学转换Stirling's approximation公式,以获得数字位数:
n! ~ sqr(2*pi*n) * (n/e)^n
log10(n!) ~ log10(2*pi*n)/2 + n*log10(n/e)
硬件浮点数学就足够了,这使它快速闪电。
答案 1 :(得分:7)
阶乘的对数可用于计算阶乘数将采用的位数:
这可以很容易地转换为算法形式:
//Pseudo-code
function factorialDigits (n)
var result = 0;
for(i = 1; i<=n; i++)
result += log10(n);
return result;
答案 2 :(得分:3)
答案 3 :(得分:2)
它将是
nlog(n) - n + log(n(1 + 4n(1 + 2n)))/6 + log(pi)/2
请参阅“增长率”主题@ http://en.wikipedia.org/wiki/Factorial Srinivasa Ramanujan方法
答案 4 :(得分:1)
是的,请参阅Stirling approximation
它说n! 〜= sqrt(2 * Pi n)(n / e)^ n。要获得位数,请取1 + log(n!)/ log(10)。
答案 5 :(得分:1)
大约有四个人提到斯特林所以...另一种选择是LUT存储前N个阶乘的每个因子的位数。假设整数为4个字节,数字为4个字节,则可以将前1,000,000个阶乘存储在8MB左右。