Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def addperm(x,l):
- return [ l[0:i] + [x] + l[i:] for i in range(len(l)+1) ]
- def perm(l):
- if len(l) == 0:
- return [[]]
- return [x for y in perm(l[1:]) for x in addperm(l[0],y) ]
- cnt = 0
- all_perms = []
- got_perms = []
- def Inverse(A):
- NE = [0 for x in range(len(A))]
- for x in range(len(A)):
- NE[A[x]-1] = x+1
- return NE
- def Mult(A,B):
- NE = [0 for x in range(len(A))]
- for x in range(len(A)):
- NE[B[x]-1] = A[x]
- return NE
- def backtrack(at):
- global cnt
- if at >= len(all_perms):
- valid = True
- if len(got_perms) == 0:
- valid = False
- for x in range(len(got_perms)):
- if not valid:
- break
- for y in range(len(got_perms)):
- if not valid:
- break
- if x != y:
- if Mult(got_perms[x], got_perms[y]) not in got_perms:
- valid = False
- break
- for x in range(len(got_perms)):
- if not valid:
- break
- if Inverse(got_perms[x]) not in got_perms:
- valid = False
- if valid:
- cnt += 1
- return
- if at != 0:
- backtrack(at+1)
- can = True
- for x in range(len(got_perms)):
- A = Mult(got_perms[x], all_perms[at])
- if not can:
- break
- for y in range(at):
- if all_perms[y] == A:
- if A not in got_perms:
- can = False
- break
- for y in range(at):
- if Inverse(all_perms[at]) == all_perms[y]:
- if all_perms[y] not in got_perms:
- can = False
- break
- if can:
- got_perms.append(all_perms[at])
- backtrack(at+1)
- got_perms.pop()
- def number_of_subgroups(n):
- global all_perms
- all_perms = perm([ i for i in range(1,n+1)])
- backtrack(0)
- return cnt
- print(number_of_subgroups(4))
Add Comment
Please, Sign In to add comment