找到大数的组合

时间:2011-01-23 16:53:16

标签: algorithm math combinations largenumber

什么是一种有效的方法来查找从N个礼物中选择礼物的数量,其中N可以非常大(N~10 ^ 18)。那就是我们必须计算N(C)K或N选择K.K也可以是N的数量级。

4 个答案:

答案 0 :(得分:5)

我想没有快速计算如此大数字的方法。您可以使用Stirling's formula

来估算它

答案 1 :(得分:3)

C(n, k)的值可能接近2^n。 (好,数量级更小,但这里并不重要)。

存储号码2^(10^18)的重要性是什么,您需要10^18位或~ 10^17字节。
您可能希望调整问题定义,因为没有类似的计算机。

其他人已经指出了近似公式,你可以将结果存储为浮点数,因此不会花费超过必要的内存。

答案 2 :(得分:3)

只有当您有k ~ n / 3k ~ log n等进一步的渐近信息时,斯特林的公式才有用。由于没有关于您的具体问题的进一步信息,您不会得到斯特林公式的任何信息。

对于你所说的问题,当k和n很大时(即使它们不大)计算C(n,k)的最直接方法是使用

log C(n, k) = log (n!) - (log (k!) + log ((n - k)!))

n! = gamma(n + 1).

事实是,实现log gamma非常容易,然后你有

C(n, k) = exp (f(n + 1) - f(k + 1) - f(n - k + 1))

其中f = log gamma

您可以在 Numerical Recipes 中找到用于计算日志伽玛的数值算法,旧版本可用there,您将在第6章找到示例实现。

答案 3 :(得分:3)

由于多样性是生活的调味品,另一种方法如下。价值 (N选择K)/ 2 ^ N接近具有平均N / 2和标准偏差Sqrt [N] / 2的正态分布,并且它非常快速地完成。因此,我们可以近似(N选择K) 2 ^ N * Normdist(x,0,1)/ std其中x =(k - N / 2)/ std和std是Sqrt [N] / 2.
Normdist(x,0,1)= Exp(-x ^ 2/2)* 1 /(Sqrt(2 * Pi))

就误差而言,数量越大越好,使用N作为113(?)的快速检查显示最大误差为最大系数的百分比小于0.3%。

没有声称它比使用斯特林公式更好,但认为它可能会避免一些n ^ n计算并计算出这些系数的对数是一个非常简单的计算。