我是Python的新手并处理一个素数生成器。我想使用的算法是Sieve of Atkin。
此时,我正在尝试按照算法的伪代码作为我的练习。但是,我遇到了一个问题,我找不到任何关于它的参考。 (也许我不擅长搜索......)。在伪代码中,for (x, y) in [1, √limit] × [1, √limit]:...
让我感到困惑。我知道这意味着什么,但不知道如何将此代码转换为Python代码。
很抱歉,如果我的问题不合适,感谢您的帮助。 :)
以下是我的代码的一部分。
itx = iter(range(1, int(limit**0.5)))
ity = iter(range(1, int(limit**0.5)))
for x, y in zip(itx, ity):
n = 4*(x**2)+(y**2)
if n <= limit and (n%12 == 1 or n%12 == 5):
sieve[n] = not sieve[n]
n = 3*(x**2)+(y**2)
if n <= limit and n%12 == 7:
sieve[n] = not sieve[n]
n = 3*(x**2)-(y**2)
if x > y and n <= limit and n%12 == 11:
sieve[n] = not sieve[n]
itx.next()
ity.next()
答案 0 :(得分:4)
for (x, y) in [1, √limit] × [1, √limit]
应转换为产品:
for x in itx:
for y in ity:
from itertools import product
for x, y in product(itx, ity):
请注意,不需要在迭代器上调用.next()
!删除itx.next()
和ity.next()
行,除非您表示以跳过生成的值。 for
构造为您推进了迭代器。
答案 1 :(得分:3)
而不是zip(itx, ity)
,您需要使用itertools.product(itx, ity)
。
zip
并行迭代两个迭代器(操作称为convolution),产生匹配项对,并在最短迭代器耗尽时结束迭代。 itertools.product
遍历两个迭代器中的Cartesian product,从一个集合中生成所有项目组合。后者是×
运算符所指的。
正如Martijn Pieters指出的那样,在迭代器上手动调用.next()
是不正确的,因为for
自己推进它们,并且自己动手,最终只处理迭代的每一秒项。此外,iter(range(...))
是不必要的 - 只需在Python 3中使用xrange
(或range
)。