在Python中,从生成器构造循环子组

时间:2014-06-05 14:48:52

标签: python algorithm cyclic

在Z modulo 12中使用加法,(a.k.a整数mod 12,a.k.a 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

如何在给定特定生成器的情况下创建子组?

2 个答案:

答案 0 :(得分:2)

我假设您的意思是加法子组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)

答案 1 :(得分:1)

您可以创建一个能够满足您要求的生成器:

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