【问题标题】:prime numbers algorithm efficiency素数算法效率
【发布时间】:2017-07-06 23:57:24
【问题描述】:

我有一个关于素数算法的问题。

为什么在下面的伪代码中 i 每次迭代都增加 6 而不是增加 2?

function is_prime(n)
if n ≤ 1
    return false
else if n ≤ 3
    return true
else if n mod 2 = 0 or n mod 3 = 0
    return false
let i ← 5
while i * i ≤ n
    if n mod i = 0 or n mod (i + 2) = 0
        return false
    i ← i + 6
return true

谢谢!

【问题讨论】:

    标签: primes pseudocode


    【解决方案1】:

    如果它增加 2,它将测试几乎所有东西两次,这没有任何意义。所以我假设你的意思是:不测试每个奇数怎么能逃脱?

    这是因为每个大于 3 的素数 p 都是 6n±1 的形式。证明: 考虑余数 r = p mod 6。显然 r 必须是奇数。还要注意 r 不能是 3,因为这样 p 可以被 3 整除,所以它不是素数。这只剩下可能性 1 和 5,它们分别对应于 p 的形式为 6n+1 或形式为 6n-1。

    效果是它避免了测试3的倍数。除以3的倍数是多余的,因为我们已经知道n不是3的倍数,所以它也不能是3的倍数.

    【讨论】:

      【解决方案2】:

      循环体中的赋值是i <- i + 6,而不是i <- i + 2。在if 语句中,表达式i + 2 只是变成了一个新值。该表达式中没有赋值运算符。

      【讨论】:

      • 这是 OP 提出的问题。为什么是i + 6?我在您的帖子中没有看到答案。
      • 啊,我回答的问题太直白了。
      【解决方案3】:

      该算法基于可以使用公式6k ± 1 预测素数这一事实,而这不适用于2 and 3

      例如

      (6 * 1) - 1 = 5

      (6 * 2) - 1 = 11

      (6 * 3) - 1 = 17

      名单还在继续。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-27
        相关资源
        最近更新 更多