快速算法查找两个数字之间的素数

时间:2012-01-20 03:55:19

标签: algorithm math primes

我的问题减少到找到两个给定数字之间的素数。我的范围可能大到1 to (1000)!,因此我需要一些数学优化。

显然,筛分方法在这种情况下会太慢。是否有任何可以应用的数学优化 - 例如,占用这个大空间的较小子集并推断其余数字。

P.S:看起来我可能已经走到了死胡同 - 但我正在寻找的是一些可能有助于解决这个问题的优化。而且,我只是在寻找单线程方法。

编辑:我一直在思考并且可以解决许多与素数相关的大问题的方法 - 是某人维护全局素数表并使其可用于查找。 PrimeGrid项目的人们可以为此做出有益的贡献。

5 个答案:

答案 0 :(得分:9)

因为你想要高达1000!(阶乘)。使用当前已知的当前技术方法,您将无法获得准确的结果。

Prime Counting Function仅针对少数10^24的值进行了精确评估。所以你无法点击1000!


但是既然你提到的近似可能没什么问题,你可以使用Logarithmic Integral作为Prime计数函数的近似值。

这是基于Prime Number Theorem,它表示 Prime计数函数是对数积分的渐近

答案 1 :(得分:2)

给定范围下的素数有fast, simple approximation。如果您不需要精确值,那么此公式的两次评估的差异将使您接近。

答案 2 :(得分:1)

我知道最快的方法是尽可能快地消除所有已知的非素数(偶数,所有数字,其中除法器的数量低于范围内的起始数等),然后迭代休息并使用像Euclidean algorithm之类的东西来确定这个数字是否为素数。

答案 3 :(得分:1)

您可以在此处调查您的选项: http://en.wikipedia.org/wiki/Prime_counting_function

这看起来也很有帮助: http://mathworld.wolfram.com/PrimeCountingFunction.html

我可以询问为什么你需要它到1000! ?看起来之前没有人曾经数过那么多。 1-10 ^ 23有1,925,320,391,606,803,968,923个素数。 1000! = 10 ^ 120。我现在很好奇。

答案 4 :(得分:1)

由其他人引用的由Lagarias和其他人开发的素数计算算法在O(n ^(2/3))中非常粗略地运行。由于从k1到k2的素数的筛子大致为O(max(sqrt(k2),k2-k1),你需要检查你的下界和上界之间的距离,并使用筛子或使用素数计算算法,哪个会更快。

顺便说一句。对于各种值n,可以调整素数计数算法以计算从1到n的素数,它们比单独计算它们更快地合理地靠近在一起。 (基本上,它选择一个数字N,创建一个大小为n / N的筛子,并在该筛子中查找N ^ 2个值.O(n ^(2/3))来自N = n ^的事实(1/3)两个操作都需要N ^(2/3)步。这个筛可以重复用于不同的n,但是需要查找不同的值。因此对于k个不同的n值,你会使N变小一些,增加筛子的成本(仅一次)但降低查找成本(k次))。

对于1000左右的n!,没有机会。如果n没有小(ish)因子,你甚至不能计算[n,n]中素数的数量。