(Sage)
def right_involutory_plonka(n):
G = Integers(n)
Perm = SymmetricGroup(list(G))
M = [sigma for sigma in Perm if sigma == ~sigma]
def is_compatible(r):
return all([ r[i]*r[j] == r[j]*r[i] and r[r[i](j)] == r[j] for i in range(len(r)) for j in range(len(r)) if ZZ(r[i](j)) < len(r) ])
def possible_extensions(r):
R = []
for m in M:
r_new = r+[m]
if is_compatible(r_new):
R += [r_new]
return R
def extend(R):
R_new = []
for r in R:
R_new += possible_extensions(r)
return R_new
i = 0
R = [[]]
while i < n:
R = extend(R)
i += 1
act = lambda sigma, r: [(~sigma)*r[(~sigma)(i)]*sigma for i in range(len(r))] # In Sage, the composition of permutations is reversed.
orbits = []
while R:
r = R.pop()
orb = []
for sigma in Perm:
orb += [tuple(act(sigma, r))]
try: R.remove(act(sigma, r))
except: pass
orbits += [set(orb)]
return len(orbits)
(Sage)
def right_involutory_plonka(n):
N = range(n)
Perm = SymmetricGroup(N)
M = [sigma for sigma in Perm if sigma == ~sigma]
def is_compatible(r, r_new):
length = len(r)
inds = range(length)
for i in inds:
if not r[i]*r_new == r_new*r[i]:
return [false]
for i in inds:
rni = r_new(i)
if i < rni < length:
if not r[rni] == r[i]:
return [false]
if rni == length:
if not r_new == r[i]:
return [false]
for i in inds:
for j in inds:
if r[i](j) == length:
if not r_new == r[j]:
return [false]
return true, r+[r_new]
def possible_extensions(r):
R = []
for m in M:
r_potential = is_compatible(r, m)
if r_potential[0]:
R += [r_potential[1]]
return R
def extend(R):
R_new = []
for r in R:
R_new += possible_extensions(r)
return R_new
R = [[]]
for i in N:
R = extend(R)
act = lambda sigma, r: [(~sigma)*r[(~sigma)(i)]*sigma for i in range(n)] # In Sage, the composition of permutations is reversed.
orbits = []
while R:
r = R.pop()
orb = []
for sigma in Perm:
r_iso = act(sigma, r)
orb += [tuple(r_iso)]
try: R.remove(r_iso)
except: pass
orbits += [set(orb)]
return len(orbits)
|