Advertisement
benni515

Untitled

Feb 25th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 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))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement