我能够用这种方式为素数写一个函数
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)
如果这是重复项,请告诉我,我会立即将其删除。
答案 0 :(得分:2)
最好通过示例说明。假设您想知道143是否为质数。您是否真的需要尝试除以142、141、140、139等?显然,这些分隔都没有143。他们太大了。
但请参阅:
显然,11除以143。不是素数。
现在让我们尝试145。145是素数吗?
显然,5除以145。不是素数。现在考虑,我们可以尝试过
之所以可行,是因为145 == 5 * 29,但没有必要尝试使用最大为29的因数。5足够了。
所以考虑一下。如果一个复合数n == a * b有两个因子a和b,则假定b> sqrt(n)。在那种情况下,一定是
您需要做的就是找到较小因子的值。较小的因子小于或最大等于平方根。如果没有发现小于或等于平方根的因子,则表明所研究的数字为质数。
答案 1 :(得分:2)
您只需要检查不超过数平方根的因数即可确定数字是否为质数-任何大于其平方根的因数都必须与小于其平方根的因数配对,并且您已经检查了他们。
这允许第二个实现更早地完成其循环 (例如,您只需测试2..31即可确定997是素数,而不是像第一个实现中的2..996一样)。