在 Z 模 12 中使用加法(也就是整数模 12,也就是 0 到 11):
1 generates [0,1,2,3,4,5,6,7,8,9,10,11]
(从 0 开始反复加 1;11+1 带我们回到 0)
以同样的方式:
2 generates [0,2,4,6,8,10]
3 generates [0 3 6 9]
9 generates [0,9,6,3] <-- notice order is important
如何在给定特定生成器的情况下创建子组?
我假设您的意思是加法子组Z * g
,其中 Z 是整数集。如果您想要精确的顺序,只需计算它:
def subgroup(n, g):
x = 0
while True:
yield x
x = (x + g) % n
if x == 0:
break
当然,如果顺序不重要,则由 诱导的子群g
是
{ G * k for k in xrange((n - 1) // G + 1) }
为G = gcd(g, n)
.
您可以创建一个生成器来执行您的要求,如下所示:
from itertools import imap, count
def subgroup(step, start=0, modulo=12):
yield start
for z in imap(lambda x: x%modulo, count(start+step, step)):
if z == start:
return
else:
yield z
输出:
>>> list(subgroup(9))
[0, 9, 6, 3]
>>> list(subgroup(3))
[0, 3, 6, 9]
>>> list(subgroup(2))
[0, 2, 4, 6, 8, 10]
它将继续生成序列中的下一个项目,直到start
重复。