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

在Python中,从生成器构造循环子组,python,algorithm,cyclic,Python,Algorithm,Cyclic,使用Z模12中的加法(又称为模12的整数,又称为0到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,4,6,8,10] 3生成[03 6 9] 9生成[0,9,6,3]我假设你是指加法子群Z*g,其中Z是整数集。如果需要精确的顺序,只需计算: def

使用Z模12中的加法(又称为模12的整数,又称为0到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,4,6,8,10]
3生成[03 6 9]

9生成[0,9,6,3]我假设你是指加法子群
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

Define'subgroup'。你到底想要什么?我不认为OP want是一个无限的发电机,从examples@NiklasB. 也许不是。不过,我无法理解他是如何决定结束他的示例列表的。他只是在第一个重复出现的值处停止(当循环完成时)
>>> list(subgroup(9))
[0, 9, 6, 3]
>>> list(subgroup(3))
[0, 3, 6, 9]
>>> list(subgroup(2))
[0, 2, 4, 6, 8, 10]