在计算它之前,可以知道一个因子有多大吗?

时间:2009-07-11 07:35:09

标签: language-agnostic gmp factorial

我正在使用GMP来计算非常大的因子(例如234234!)。在进行计算之前,有没有什么方法可以知道结果将会(或可能)长多少位?

6 个答案:

答案 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)

阶乘的对数可用于计算阶乘数将采用的位数:

logn!

这可以很容易地转换为算法形式:

//Pseudo-code
function factorialDigits (n) 
  var result = 0;

  for(i = 1; i<=n; i++)
    result += log10(n);

  return result;

答案 2 :(得分:3)

斯特林的近似给出了n!

大小的近似值

alt text

请参阅Wikipedia页面了解推导。

答案 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左右。