所以我能够通过互联网的一些帮助解决这个问题,这就是我得到的:
def isPrime(n):
for i in range(2,int(n**0.5)+1):
if n%i==0:
return False
return True
但我的问题确实是如何去做,但是为什么。我知道 1 不被认为是“素数”数字,即使它是,而且我知道如果它除以范围内的任何东西,它自动不是素数,因此 return False 语句。但我的问题是 平方根“n”在这里扮演什么角色?
ps 本人很新手,一个月前才接触编程。
原文由 Giancarlo Manuel Guerra Salvá 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 Internet 上流传的许多素数测试中,请考虑以下 Python 函数:
由于所有 > 3 的素数 都是 6n ± 1 的形式,一旦我们消除
n
就是:n%2
)和n%3
)那么我们可以每 6 个 n ± 1 测试一次。考虑质数 5003:
印刷:
该行
r = int(n**0.5)
评估为 70(5003 的平方根为 70.7318881411 和int()
截断该值)考虑下一个奇数(因为除 2 以外的所有偶数都不是质数)5005,同样的输出:
极限是平方根,因为
x*y == y*x
该函数只需执行 1 次循环即可发现 5005 可被 5 整除,因此不是素数。由于5 X 1001 == 1001 X 5
(并且都是 5005),我们不需要在循环中一直走到 1001 就可以知道我们在 5 处知道了什么!现在,让我们看看您拥有的算法:
有两个问题:
n
是否小于2,且没有小于2的素数;所以:
好的——这将它的速度提高了大约 30%(我对它进行了基准测试……)
我使用的算法
is_prime
仍然快了大约 2 倍,因为只有每 6 个整数在循环中循环。 (再一次,我对它进行了基准测试。)旁注:x**0.5 是平方根:
旁注 2: 素数测试 是计算机科学中一个有趣的问题。