C / C ++中所有大数字因素

时间:2012-09-03 16:26:24

标签: c++ c algorithm factors

我试图找出10 ^ 18数量级的所有数字因素......但是有时间限制会产生问题。 我做的是使用Sieve of Eratosthenes找到因子,然后存储因子,但它很慢.......

3 个答案:

答案 0 :(得分:4)

如果空间不是问题,您可以存储最多10 ^ 9的素数列表(列表可用于download)并使用它来分解任何数字,最多10 ^ 18。 您也可以使用分解算法(如pollard的rho或others)。

答案 1 :(得分:1)

我真的建议阅读有关此整数分解的Wiki文章:http://en.wikipedia.org/wiki/Integer_factorization

通用分解方法很慢。但是,可能会尝试使用一些特殊用途的方法。

答案 2 :(得分:0)

将素数列表p <= 10 ^ 9存储到因子数N <= 10 ^ 18的想法的问题是,对于任何特定的N,您仍然需要在质数上循环p&lt; = sqrt(N )并检查N%p == 0。这不是开展业务的最快方式。

从您的问题中不清楚您是否想要计算一组10 ^ 18的数字,或者如果您想要所有数字N&lt; = 10 ^ 18。第一种情况是可行的,取决于您想要考虑多少N以及它需要多快。第二种情况,将所有数字N&lt; = 10 ^ 18分解,是不可行的,因为这将需要超过10 ^ 18次操作(每个数据至少有一个被分解)。考虑到计算机每秒可以执行大约10 ^ 9次操作,并且一年中大约有10 ^ 7秒,你需要考虑很长时间。

如果你只是想在10 ^ 18的数量上计算一堆数字N,那么有很多方法可以做到这一点。 “最佳”方式取决于具体数字的属性。例如,大约10 ^ 18的随机整数比平均值要容易得多,因为整数是10 ^ 9阶的两个素数的乘积,因为在转向更复杂的算法之前,可以通过试分来消除小因子。这是一个计算数论问题,而不是编程问题。如果这是您的问题,我建议Factoring section of mersenneforum.org

如果你想要一个快速而肮脏的解决方案,而不是非常慢,那么不要重新发明轮子。尝试例如GMP-ECM或查看PARI / GP是否可以解决您的问题。