【问题标题】:Fast Algorithm to find number of primes between two numbers快速算法找到两个数字之间的素数
【发布时间】:2012-02-14 17:33:43
【问题描述】:

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

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

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

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

【问题讨论】:

  • 不确定是否有帮助,但请查看Prime Counting Function。但这并不容易评估。
  • 发布一些代码——或者至少是一些你尝试过的方法的伪代码。
  • 给定的数字是否介于 1 和 10^5 之间?或者它们可以更大吗?间隔的长度可能高达10^5
  • 给定的数字介于 1 和 N 之间,其中 N 约为 1000!。
  • 如果您选择的 N 足够小,使得所有质数

标签: algorithm math primes


【解决方案1】:

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

【讨论】:

  • 啊,原来如此。我从来没有听说过筛法。为什么会太慢?
  • 在 100 上执行的任何操作!太慢了。
  • “使用欧几里得算法”用什么计算给定数的GCD? sqrt(1000!)== 79.26*367.88**500 = 5.6469*10^1284 或其他)以下的所有数字?
【解决方案2】:

您可以在此处调查您的选择: 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。我现在很好奇。

【讨论】:

  • 其实,81! = 5.8 * 10^120。原始数字 1000! 是 4 * 10^2567。假设黎曼假设,目前已知的最大素数计数函数值为 PrimePi(10^24) = 18435599767349200867866。
  • 你是对的;试图记住我是如何得出我的错误计算的——但昨晚是模糊的
【解决方案3】:

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

Prime Counting Function 仅针对不超过10^24 的少数几个值进行了精确评估。所以你不可能打到1000!


但由于您提到的可能不是近似值,您可以使用Logarithmic Integral 作为素数计数函数的近似值。

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

【讨论】:

    【解决方案4】:

    有一个fast, simple approximation 表示低于给定界限的素数数。如果您不需要精确的值,那么此公式的两次评估的差异将使您接近。

    【讨论】:

      【解决方案5】:

      由 Lagarias 和其他人开发的素数计数算法,被其他人引用,在 O (n^(2/3)) 中非常粗略地运行。由于从 k1 到 k2 的素数筛分大约需要 O (max (sqrt (k2), k2 - k1),因此您需要检查下限和上限之间的距离,然后进行筛分或使用素数计数算法,以更快的为准。

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

      对于 n 大约 1000!,没有机会。如果 n 没有小的(ish)因子,您甚至无法计算 [n, n] 中的素数数量以获得该大小的值。

      【讨论】:

        猜你喜欢
        • 2013-10-12
        • 1970-01-01
        • 2021-08-23
        • 1970-01-01
        • 2013-02-25
        • 2013-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多