我有一个定点的bignumber库,并且想要实现快速析因而不损失精度。
在纸上一些数学技巧之后,我得到了这个公式:
(4N)!=((2N)!).((2N)!).{ (2N+1).(2N+3).(2N+5)...(4N-1) }.(2^N)/(N!)
这已经相当快了,并且通过一些编程技巧,复杂度也接近了~ O(log(n))。
现在我的问题是:
有没有一种快速的方法来获得 N!从本学期: T1 = { (2N+1).(2N+3).(2N+5)...(4N-1) }?
已经回答。
为了清楚起见,我需要提取这个未知术语:
T2 = (4N)! / (((2N)!).((2N)!))
所以:
(4N)! = (((2N)!).((2N)!)).T2
这将有很大帮助,因为这样就不需要.../(N!)进行阶乘计算。
该T1术语始终是整数可分解的:
T1 = T2 * N!
最后,它击中了我:)我做了一个小程序,用于分解阶乘的素数,然后突然一切变得更加清晰:
4! = 2!.2!.(2^1).(3^1) = 24
8! = 4!.4!.(2^1).(5^1).(7^1) = 40320
12! = 6!.6!.(2^2).(3^1).(7^1).(11^1) = 479001600
16! = 8!.8!.(2^1).(3^2).(5^1).(11^1).(13^1) = 20922789888000
20! = 10!.10!.(2^2).(11^1).(13^1).(17^1).(19^1) = 2432902008176640000
24! = 12!.12!.(2^2).(7^1).(13^1).(17^1).(19^1).(23^1) = 620448401733239439360000
28! = 14!.14!.(2^3).(3^3).(5^2).(17^1).(19^1).(23^1) = 304888344611713860501504000000
32! = 16!.16!.(2^1).(3^2).(5^1).(17^1).(19^1).(23^1).(29^1).(31^1) = 263130836933693530167218012160000000
36! = 18!.18!.(2^2).(3^1).(5^2).(7^1).(11^1).(19^1).(23^1).(29^1).(31^1) = 371993326789901217467999448150835200000000
40! = 20!.20!.(2^2).(3^2).(5^1).(7^1).(11^1).(13^1).(23^1).(29^1).(31^1).(37^1) = 815915283247897734345611269596115894272000000000
在分析了该项的质数指数T2(半阶乘因数^ 2之后的其余数)之后,我得出了它们的公式:
T2(4N) = multiplication(i=2,3,5,7,11,13,17,...) of ( i ^ sum(j=1,2,3,4,5,...) of (4N/(i^j))-(2N/(i^j)) )
乘法在所有地方 primes <= 4N
求和直到 i^j <= 4N
问题是除法4N/(i^j)和2N/(i^j) 必须在整数数学中完成,因此不能轻易简化它们。
所以我还有一个问题:
我该如何计算:exponent(i) = sum(j=1,2,3,4,5,...) of (N/(i^j))有效?
i在哪里是素数i<=N。应该很容易。
现在,我计算出的指数e为主要i内T2(N)像这个词(但这是太复杂,我的口味):
for (e=0,a=N/i,b=(N>>1)/i;(a)||(b);e+=a-b-b,a/=i,b/=i);
......我会努力实现T2到fact(x)和比较的速度...
BIG阳
慕标5832272
相关分类