1

Z modulo 12 で加算を使用する (別名 mod 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

特定のジェネレーターを指定してサブグループを作成するにはどうすればよいですか?

4

2 に答える 2

2

Z * gZ が整数の集合である加法的部分群を意味していると仮定しています。正確な順序が必要な場合は、計算するだけです。

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)

于 2014-06-05T14:58:08.243 に答える
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が繰り返されるまで、シーケンス内の次のアイテムを生成し続けます。

于 2014-06-05T14:58:45.980 に答える