【问题标题】:Check Prime Number, in python. logic confusion在 python 中检查素数。逻辑混乱
【发布时间】:2021-08-20 19:51:54
【问题描述】:

我在一个检查素数的网站上找到了这个代码

def isPrime(number):
    if (number <= 1):
        return False
    elif (number <= 3):
        return True
    elif (number % 2 == 0 or number % 3 == 0):
        return False
    
    i = 5
    while(i * i <= number):
        if (number % i == 0 or number % (i + 2) == 0):
            return False

        i += 6

    return True

但是我看不懂while循环下if语句的逻辑,即if (number % i == 0 or number % (i + 2) == 0) 为什么需要i+2???当i 是偶数时,i+2 也是偶数和奇数,而i 是奇数。那么,为什么需要检查i+2???

【问题讨论】:

  • 简短回答,因为 while 循环将 i 递增 6
  • 我们检查 5,7 然后 11,13,然后 17,19,然后 23,25(不检查 25,因为已经检查 5)然后 29,31 等等
  • 这是对素数的朴素算法的加速,基于如果 p 是素数,则 p % 6 必须是 1 或 5,因此只需要检查每 6 个数字中的 2 个.
  • 非常感谢你,兄弟,你得到了我并给了我一个简单的解释。

标签: python python-3.x primes


【解决方案1】:

i 从 5 开始,所以加 2 意味着只计算偶数。 它使检查更快。

【讨论】:

  • s/even/odd(对于我们这些记得 Unix 中的 ed 和 vi 的人)。
【解决方案2】:

除了 2 和 3,所有素数都是 6n±1 的形式。此代码显式检查 2 和 3,然后成对检查更大的数字:6n-1、6n+1,从 5 开始。所以它检查 5、7,然后是 11,然后是 13,然后是 17、19,依此类推。它在对之间执行 6 步,在每对中执行 2 步。这样做可以避免检查 2 或 3 的倍数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 2019-04-14
    • 1970-01-01
    相关资源
    最近更新 更多