做一个非常大的计算

时间:2017-02-07 12:19:58

标签: algorithm module numbers

我想计算值

X = n!/ 2 ^ r

where n<10^6 and r<10^6
and it's guarantee that value of X is between O to 10 

如何计算X,因为我不能简单地除去阶乘和幂项,因为它们会溢出长整数。

我的方法
在Modulus的帮助下做。设大于10的素数,比如说101

 X=  [(Factorial N%101)*inverse Modulo of(2^r)]%101;

请注意,可以很容易地计算逆模数,也可以计算2 ^ r%101。

问题:
它不能保证 X始终是整数它也可以浮动。 当X是整数时,我的方法工作正常吗?当X是浮点数时如何处理

4 个答案:

答案 0 :(得分:1)

如果近似结果正常并且您可以访问具有基数2指数(C中为exp2)的数学库,则自然对数伽玛(C中为lgamma)和自然对数({{在C)中,你可以做

log

答案 1 :(得分:0)

2中找出n!出现的权力。这是:

P = n / 2 + n / 2^2 + n / 2^3 + ...

使用整数除法,直到达到0结果。

如果P >= r,那么你有一个整数结果。您可以通过计算阶乘来找到此结果,以便忽略r 2次幂。类似的东西:

factorial = 1
for i = 2 to n:

    factor = i
    while factor % 2 == 0 and r != 0:
        factor /= 2
        r -= 1

    factorial *= factor

如果P < r设置为r = P,请应用相同的算法,最后将结果除以2^(initial_r - P)

答案 2 :(得分:0)

除极少数情况(小n和r)外,X不是整数 - 如果n> = 11则11除以n!但是并没有除以2的任何幂,所以如果X是积分的,则必须至少为11。

一种方法是:将X初始化为1;然后循环:如果X> 10除以2而不是;如果X&lt; 10乘以下一个因素,直到它没有;直到你用完2的因素和力量。

答案 3 :(得分:0)

可以调整精度/性能的方法如下:

将factorial存储在具有固定位数的整数中。如果数字太大,我们可以删除最后几位数字,因为它们不会对整体结果产生太大影响。通过将此整数缩放得更大/更小,算法可以针对性能或精度进行调整。

每当整数因乘法而溢出时,将其向右移几个位置并从r中减去该值。最后,应该有一个小数字r和一个整数v,其中包含最高有效位的因子。此v现在可以解释为带有r小数位的定点数。

根据所需的精确度,这种方法甚至可以与long一起使用,但我还没有时间测试这种方法,只是尝试了一下计算器。