2014-06-05 9 views
1

에서 환상 서브 그룹을 구성 :는 Z의 모듈 (12)에 첨가하여 생성

1 generates [0,1,2,3,4,5,6,7,8,9,10,11] 

(0에서 시작해서 반복 한 추가 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 

가 어떻게 특정 발전기 주어진 하위 그룹을 만들 수 있습니까?

+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 = gcd(g, n)에 대한

{ G * k for k in xrange((n - 1) // G + 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 때까지 순서의 다음 항목을 생성 계속됩니다

반복 .

+0

나는 OP가 무한 생성기라고 생각하지 않는다. 예제로 판단하면 –

+0

@ NiklasB이다. 아마. 그래도 그가 예제 목록을 끝내기로 결정한 방법을 알 수는 없었다. – dano

+0

그는 단지 첫 번째 재구성 값 (사이클이 완료되었을 때)에서 멈 췄습니다. –