我必须找到给定数字 N 的除数总数,其中可以大到 10^14 。我尝试计算最多 10^7 的素数,然后使用素数因子的指数找到除数。但是事实证明它太慢了,因为使用筛子找到素数需要 0.03 秒。如果可能的话,如何更快地计算除数总数而不计算素数?请伪代码/很好解释的算法将不胜感激。
使用阿特金筛法找出所有小于 10^7 的素数。 (其中有 664,579 个)
http://en.wikipedia.org/wiki/Sieve_of_Atkin http://en.wikipedia.org/wiki/Sieve_of_Atkin
理想情况下,这应该在编译时完成。
接下来计算素因数分解:
int x; // the number you want to factor
Map<int to int> primeFactor; // this is a map that will map each prime that appears in the prime factorization to the number of times it appears.
while(x > 1) {
for each prime p <= x {
if x % p == 0 {
x = x / p;
primeFactor(p) = primeFactor(p) +1;
}
}
}
最后,您将获得完整的素因数分解。由此,您可以通过迭代映射的值来计算除数总数:https://math.stackexchange.com/questions/66054/number-of-combinations-of-a-multiset-of-objects https://math.stackexchange.com/questions/66054/number-of-combinations-of-a-multiset-of-objects
int result = 1;
for each value v in primeFactors {
result*= (v+1);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)