Вы увеличиваете num
в цикле for
, но вы не можете просто сделать это, так как тогда i
равно , а не сбрасывается до 1
, и, следовательно,Вы пропускаете определенные проверки.
Таким образом, вы должны break
, а затем увеличить num
и позволить циклу проверить следующий номер.Таким образом, мы можем использовать for
- else
, чтобы получить число только в том случае, если цикл был успешным (т. Е. Не был достигнут оператор break
).
Другая проблема, которая сейчас возникнет, заключается в том, что нет число больше не является простым.Это потому, что ваш range(1, num+1)
включает num
, а число всегда делится само по себе.Таким образом, диапазон должен составлять от 1
(или лучше 2
) до num
(эксклюзив):
def next_prime():
num = 2
while True:
for i in range(2, num):
if num % i == 0:
break
else:
yield num
num += 1
Однако вышеприведенное не очень эффективно.Мы можем сделать это быстрее.Например, все четные числа, кроме двух, не являются простыми числами, поэтому мы можем переписать это следующим образом:
def next_prime():
<b>yield 2</b>
<b>num = 3</b>
while True:
for i in range(2, num):
if not num % i:
break
else:
yield num
num += <b>2</b>
Кроме того, нам нужно проверить только число √n для числа n
, так как если n
делится на число a
, причем a
больше квадратного корня из n
, тогда существует число b = n / a
, которое меньше квадратного корня:
from math import sqrt, ceil
def next_prime():
yield 2
num = 3
while True:
for i in range(<b>3</b>, <b>ceil(sqrt(num))+1</b>, 2):
if not num % i:
break
else:
yield num
num += 2