我的问题减少到找到两个给定数字之间的素数。我的范围可能大到1 to (1000)!
,因此我需要一些数学优化。
答案 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]中素数的数量。