想象一下如果最后一个数字range(3, int(n**0.5), 2)
不是 的整数除数会发生什么n
:
if n % x ==0:
prime = False # not this
else:
prime = True # this
因此,即使所有先前的检查都已评估False
,您也可以称其n
为素数。解决此问题的代码的最小更改是:
prime = prime and True # or 'prime &= True'
因此,如果prime
已经存在 False
,它仍然存在False
。
但是,请记住,对于素数,如果这些检查中的任何False
n
一个不是素数。您可以使用 this 和 Python 的and
and all
(懒惰地评估,即一旦找到 a 就不要继续检查False
)来更有效地实现:
def rand_prime():
while True:
p = randint(10000, 100000)
if (r % 2 != 0 and
all(p % n != 0 for n in range(3, int(((p ** 0.5) + 1), 2))):
return p
为了获得更好的性能,请注意它randrange
包含一个step
参数,就像range
,所以您可以跳过所有偶数(绝对不是素数!):
def rand_prime():
while True:
p = randrange(10001, 100000, 2)
if all(p % n != 0 for n in range(3, int((p ** 0.5) + 1), 2)):
return p
注意:在我看来, sqrt(n)
(来自math
)对于其他技术含量较低的读者来说比n ** 0.5
(尽管它可能更有效也可能不是更有效)更清楚一些。