Представьте себе, что произойдет, если число последний в 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
не является простым. Вы можете использовать это и в Python and
и all
(которые оцениваются лениво, то есть не продолжайте проверять один раз находя 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
(хотя это may or may not be more efficient).
На каждой итерации цикла 'for' вы игнорируете то, что говорили предыдущие итерации, устанавливая' prime = False' или 'prime = True', не учитывая, что раньше было' prime'. – user2357112