【问题标题】:Determining Prime is too slow [duplicate]确定素数太慢[重复]
【发布时间】:2020-09-05 09:47:43
【问题描述】:

所以我解决了一个关于代码大战的问题,但它太慢而且效率低下。这是我写的代码:

def is_prime(number):
if number > 1:
    for i in range(2, number):
        if number % i == 0:
            return False
            break
    else:
        return True
else:
    return False

有什么方法可以加快速度?

【问题讨论】:

  • 把问题发到Code Review
  • 为什么不浏览这里关于检测素数的数千个其他问题?
  • 提示:当您只需要循环到平方根时,您正在循环到数字。另一条评论:您的break 声明无法到达。

标签: python performance


【解决方案1】:

有几个简单的加速方法:

a) 除 2 外,所有素数都是奇数,因此您可以以 2 为步长进行迭代。
b) 所有非素数必须至少有一个因子小于或等于 n 的平方根,因此您只需要检查不超过 n 的平方根的数字。

添加这些,如果速度不够快,还有许多其他加速可以检查。另请查看 Miller-Rabin 等概率素性检验。

对这篇文章的评论包括:

  • 所有大于 3 的素数都等于 1 或 5(模 6),因此您可以以 6 为步长进行迭代并一次检查两个数字。

【讨论】:

  • "up to n" 看起来像是一个错字(尤其是考虑到您刚才所说的平方根)
  • 你当然是完全正确的。我已经编辑了。
  • "小于平方根" —> "小于等于平方根"
  • 除了 2 和 3 之外,没有素数不是6n+/-1 的形式,所以可以从 5 开始,交替添加 2 和 4:5、7、11、13、17、 21、23 等。你仍然需要检查素数,但样本空间比 2n+3 小 - 你最终会检查少 1/3 的候选人
  • @paxdiablo 是的,或者如果更简单,以 6 步迭代,每次迭代检查两个因素。
【解决方案2】:

大多数现代计算机使用的内核不止一个,所以如果你让它利用所有内核并行运行,它应该会更快。

你可以只划分核心之间的范围,假设你有10个核心,那么每个核心可以检查核心编号的模块。

另外一种使速度翻倍的简单方法是忽略偶数。

【讨论】:

    【解决方案3】:

    此外,您只需要检查数字一半的范围,因为除以一半的数字会得到 2,除以 1 会导致数字本身,所以介于 1 和 2 之间的所有内容都必须是 1 和 2 之间的数字,你不需要'不需要检查素数

    【讨论】:

      猜你喜欢
      • 2016-01-31
      • 2021-01-22
      • 1970-01-01
      • 2019-02-14
      • 2021-12-30
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      相关资源
      最近更新 更多