NCGE Python Code
From Drorbn
Jump to navigationJump to search
class Perm(object):
def __init__(self, L):
if set(range(1,len(L) + 1)) == set(L):
self.n = len(L)
self.mapping = {}
pivot_called = False
for i in range(self.n):
if not pivot_called:
if L[i] != i+1:
self.pivot = i+1
pivot_called = True
if not pivot_called:
self.pivot = self.n
self.mapping[i+1] = L[i]
def __nonzero__(self):
return self.pivot != self.n
def __mul__(self,other):
if self.n == other.n:
L = []
for i in range(1,self.n+1):
L += [self.mapping[other.mapping[i]]]
return Perm(L)
def inv(self):
L = []
inverted = {}
for i in range(1,self.n + 1):
inverted[self.mapping[i]] = i
for j in range(1,self.n + 1):
L += [inverted[j]]
return Perm(L)
def e(n):
return Perm(range(1,n+1))
def gen_subgroup_order(L):
homogenous_n = True
perm1 = L[0]
for perm in L:
if perm.n != perm1.n:
homogenous_n = False
break
if homogenous_n:
X = L[:]
n = perm1.n
occupied = {}
for k in range(1,n+1):
occupied[(k,k)] = e(n)
def feed(perm,Y,table):
if bool(perm):
i = perm.pivot
j = perm.mapping[perm.pivot]
if (i,j) not in occupied.keys():
table[(i,j)] = perm
else:
sigma = table[(i,j)]
Y += [(sigma.inv())*perm]
for perm in X:
feed(perm,X,occupied)
old = 0
new = len(occupied.keys())
while old != new:
X = []
perms = occupied.values()
for p1 in perms:
for p2 in perms:
if bool(p1) and bool(p2):
X += [p1*p2]
for perm in X:
feed(perm,X,occupied)
old, new = new, len(occupied.keys())
order = 1
for i in range(1,n+1):
order *= len([pair for pair in occupied.keys() if pair[0] == i])
return order
g1 = Perm([1,2,3,4,12,22,7,8,6,11,21,28,13,14,15,16,17,18,5,10,20,27,23,24,25,26,9,19,29,30,31,32])
g2 = Perm([1,2,13,23,5,6,7,4,9,10,11,12,30,14,15,16,17,3,19,20,21,22,29,24,25,26,27,28,8,18,31,32])
g3 = Perm([14,24,3,4,5,6,2,8,9,10,11,12,13,32,16,26,1,18,19,20,21,22,23,31,15,25,27,28,29,30,7,17])
g4 = Perm([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,22,23,24,25,26,17,18,19,20,21,32,31,30,29,28,27])
print gen_subgroup_order([g1,g2,g3,g4])