我想计算值
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是浮点数时如何处理
答案 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
一起使用,但我还没有时间测试这种方法,只是尝试了一下计算器。