benni515

Untitled

Feb 25th, 2018
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.02 KB | None | 0 0
  1. def addperm(x,l):
  2.     return [ l[0:i] + [x] + l[i:]  for i in range(len(l)+1) ]
  3.  
  4. def perm(l):
  5.     if len(l) == 0:
  6.         return [[]]
  7.     return [x for y in perm(l[1:]) for x in addperm(l[0],y) ]
  8.  
  9.  
  10. cnt = 0
  11. all_perms = []
  12. got_perms = []
  13.  
  14. def Inverse(A):
  15.     NE = [0 for x in range(len(A))]
  16.     for x in range(len(A)):
  17.         NE[A[x]-1] = x+1
  18.     return NE
  19.  
  20. def Mult(A,B):
  21.     NE = [0 for x in range(len(A))]
  22.     for x in range(len(A)):
  23.         NE[B[x]-1] = A[x]
  24.     return NE
  25.  
  26. def backtrack(at):
  27.     global cnt
  28.     if at >= len(all_perms):
  29.         valid = True
  30.  
  31.         if len(got_perms) == 0:
  32.             valid = False
  33.  
  34.         for x in range(len(got_perms)):
  35.             if not valid:
  36.                 break
  37.             for y in range(len(got_perms)):
  38.                 if not valid:
  39.                     break
  40.                 if x != y:
  41.                     if Mult(got_perms[x], got_perms[y]) not in got_perms:
  42.                         valid = False
  43.                         break
  44.  
  45.         for x in range(len(got_perms)):
  46.             if not valid:
  47.                 break
  48.             if Inverse(got_perms[x]) not in got_perms:
  49.                 valid = False
  50.  
  51.         if valid:
  52.             cnt += 1
  53.         return
  54.  
  55.     if at != 0:
  56.         backtrack(at+1)
  57.  
  58.  
  59.     can = True
  60.     for x in range(len(got_perms)):
  61.         A = Mult(got_perms[x], all_perms[at])
  62.         if not can:
  63.             break
  64.         for y in range(at):
  65.             if all_perms[y] == A:
  66.                 if A not in got_perms:
  67.                     can = False
  68.                     break
  69.     for y in range(at):
  70.         if Inverse(all_perms[at]) == all_perms[y]:
  71.             if all_perms[y] not in got_perms:  
  72.                 can = False
  73.                 break
  74.  
  75.     if can:
  76.         got_perms.append(all_perms[at])
  77.         backtrack(at+1)
  78.         got_perms.pop()
  79.    
  80. def number_of_subgroups(n):
  81.     global all_perms
  82.     all_perms = perm([ i for i in range(1,n+1)])
  83.     backtrack(0)
  84.     return cnt
  85.  
  86. print(number_of_subgroups(4))
Add Comment
Please, Sign In to add comment