(鼠尾草)
def right_involution_plonka(n):
G=整数(n)
Perm=对称组(列表(G))
M=[sigma==~ sigma时,Perm中sigma的sigma
定义兼容(r):
如果ZZ(r[i](j))<len(r)],则返回all([r[i]*r[j]==r[j]*r[i]和r[r[i](j)]==r[j](对于范围内的i(len(r)),对于范围内的j(len(r)))
定义可能的扩展(r):
R=[]
对于m中的m:
r_new=r+[m]
如果兼容(r_new):
R+=[R_new]
返回R
定义扩展(R):
新建=[]
对于r中的r:
R_new+=可能的扩展(R)
返回新建(_N)
i=0
R=【】
当i<n时:
R=延伸(R)
i+=1
act=lambda sigma,r:[(~sigma)*r[(~sigma)(i)]*范围内i的sigma(len(r))]#在Sage中,排列的组成是相反的。
轨道=[]
而R:
r=r.pop()
orb=[]
对于Perm中的sigma:
orb+=[元组(act(sigma,r))]
尝试:R.remove(act(sigma,R))
除外:通过
轨道+=[集(orb)]
返回透镜(轨道)
(鼠尾草)
def right_involution_plonka(n):
N=范围(N)
Perm=对称组(N)
M=[sigma==~ sigma时,Perm中sigma的sigma
def is_compatible(r,r_new):
长度=长度(r)
inds=范围(长度)
对于inds中的i:
如果不是r[i]*r_new==r_new*r[i]:
返回[false]
对于inds中的i:
rni=r_new(i)
如果i<rni<长度:
如果不是r[rni]==r[i]:
返回[false]
如果rni==长度:
如果不是r_new==r[i]:
返回[false]
对于inds中的i:
对于inds中的j:
如果r[i](j)==长度:
如果不是r_new==r[j]:
返回[false]
返回true,r+[r_new]
定义可能的扩展(r):
R=[]
对于m中的m:
r_电位=兼容(r,m)
如果r电位[0]:
R+=[R_电位[1]]
返回R
定义扩展(R):
新建=[]
对于r中的r:
R_new+=可能的扩展(R)
返回新建(_N)
R=【】
对于N中的i:
R=延伸(R)
act=lambda sigma,r:[(~sigma)*r[(~sigma)(i)]*范围(n)中i的sigma]#在Sage中,排列的组成是相反的。
轨道=[]
而R:
r=r.pop()
orb=[]
对于Perm中的sigma:
r_iso=动作(σ,r)
orb+=[元组(r_iso)]
尝试:R.remove(R_iso)
除外:通过
轨道+=[集(orb)]
返回len(轨道)
|