Реализую эти два способа.
Способ 1
Перебираем все цифры (N), которые оканчиваются на 1, 3, 7 или 9 (всё, что кончается на 0 или 5, явно не простое число ), и делим их на все числа от 3 до корня от N включительно. Цифры 2, 3 и 5, простые числа, заносятся в массив вручную перед началом работы цикла поиска.
Способ 2
Перебираем все цифры (N), которые оканчиваются на 1, 3, 7 или 9 (всё, что кончается на 0 или 5, явно не простое число ), и делим их на все найденные до этого времени простые числа, от 3 до корня от N включительно. Цифры 2, 3 и 5, простые числа, заносятся в массив вручную перед началом работы цикла поиска.
Соответственно реализация:
def primitive1(th):
a = [1,2,3,5]
count = 3
cur = 6
while count < th:
if str(cur)[-1] in '024568':
cur += 1
continue
prim = True
for i in xrange(3,int(math.sqrt(cur))+1):
if not cur%i:
prim = False
break
if prim:
a.append(cur)
count += 1
cur += 1
return a
def primitive2(th):
a = [1,2,3,5]
count = 3
cur = 6
while count < th:
if str(cur)[-1] in '024568':
cur += 1
continue
prim = True
edge = int(math.sqrt(cur))
for i in (x for x in a[2:] if x <= edge):
#print i
if not cur%i:
prim = False
break
if prim:
a.append(cur)
count += 1
cur += 1
return a
p = 200
t1 = Timer("primitive1(%d)" % p,"from __main__ import primitive1")
t2 = Timer("primitive2(%d)" % p,"from __main__ import primitive2")
print "Primitive 1 -", t1.timeit(number=100)
print "Primitive 2 -", t2.timeit(number=100)
Primitive 1 - 0.263126850128
Primitive 2 - 0.511752128601
Заранее благодарен и приму любую конструктивную критику и исправления.