Python 用平方根法求素数

Python 用平方根法求素数,python,python-3.x,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.

我可以用这种方法为素数写一个函数

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)

如果这是一个副本,请让我知道我会立即删除它。

这是最好的例子解释。假设你想知道143是否是素数。你真的需要尝试除以142、141、140、139等等吗?很明显,这些都没有区别;它们太大了

但请看:

  • 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。不是最好的。现在考虑一下,我们可以尝试< /P>
  • 145%29==0
这是可行的,因为145==5*29,但没有必要尝试29这样大的因子。这5个就够了

所以想想这个。如果一个复合数n==a*b有两个因子a和b,假设b>sqrt(n)。在这种情况下,一定是a
你需要做的就是找到较小因子的值。较小的因子小于或至多等于平方根。如果没有发现小于或等于平方根的因子,那么调查中的数字就是素数。

你只需要检查一个数字的平方根的因子就可以确定这个数字是否是素数——任何大于其平方根的因子都必须与小于其平方根的因子配对,你已经检查过了


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

如果从3开始,只对范围(3,int(num**0.5)+1,2)中的i执行奇数
,则速度更快:…
您永远不必测试任何大于该数字平方根的因子,因为如果该数字可被大于该值的数整除,您会发现该数字不是素数(因为在这种情况下,另一个因子将小于平方根)。因为如果
x*y==num
x
y
中至少有一个小于或等于
num
的平方根。如果这是Python3,则无关紧要,但在Python2.x中,
range
创建一个列表并对其进行迭代,
xrange
创建一个生成器,因此使用xrange会更快。这是一个非常确定的问题。没有复制品那么多。我比较喜欢这里接受的答案。你问的问题也比那里的人好。