使用平方根方法查找素数

时间:2019-02-05 22:21:22

标签: python python-3.x

我能够用这种方式为素数写一个函数

def isprime(num):
    if num > 1:
        for i in range(2, num):
            if num % i == 0:
                return False
        return True

%timeit [i for i in range(1000) if isprime(i)]
7.94 ms ± 273 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

然后,我发现有一种甚至更快的方法来使用平方根来编写代码,但是我不明白它的工作原理。 任何人都可以用更简单的方式解释此代码以及它为什么起作用吗?

def isprime(num):
    if num > 1:
        for i in range(2, int(num ** 0.5) + 1):
            if num % i == 0:
                return False
        return True

%timeit [i for i in range(1000) if isprime(i)]    
1.94 ms ± 54.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

如果这是重复项,请告诉我,我会立即将其删除。

2 个答案:

答案 0 :(得分:2)

最好通过示例说明。假设您想知道143是否为质数。您是否真的需要尝试除以142、141、140、139等?显然,这些分隔都没有143。他们太大了。

但请参阅:

  • 143%2 == 1
  • 143%3 == 2
  • 143%5 == 3
  • 143%7 == 3
  • 143%11 == 0

显然,11除以143。不是素数。

现在让我们尝试145。145是素数吗?

  • 145%2 == 1
  • 145%3 == 1
  • 145%5 == 0

显然,5除以145。不是素数。现在考虑,我们可以尝试过

  • 145%29 == 0

之所以可行,是因为145 == 5 * 29,但没有必要尝试使用最大为29的因数。5足够了。

所以考虑一下。如果一个复合数n == a * b有两个因子a和b,则假定b> sqrt(n)。在那种情况下,一定是 ,这意味着a * b不是n的适当因式分解。

您需要做的就是找到较小因子的值。较小的因子小于或最大等于平方根。如果没有发现小于或等于平方根的因子,则表明所研究的数字为质数。

答案 1 :(得分:2)

您只需要检查不超过数平方根的因数即可确定数字是否为质数-任何大于其平方根的因数都必须与小于其平方根的因数配对,并且您已经检查了他们。

这允许第二个实现更早地完成其循环 (例如,您只需测试2..31即可确定997是素数,而不是像第一个实现中的2..996一样)。