说明
学抽象代数的时候写的小程序
目的在于单纯地利用轮换的形式来计算置换相乘
计算的方式是我自己发明的简明书写方法-v-
(1 2 3)(2 3 4)可以画出如下的表示图:
右轮换 左轮换
1 <-- 2
2 <-- 3 <-- 1
3 <-- 4
4 <-- 2 <-- 3
最后得到
1<--2
2<--1
3<--4
4<--3
也就是(1 2)(3 4)
程序可以解决任意个数的轮换相乘问题,代码如下:
代码
#将轮换字符串转换为字典
def parse(a):
al = a.split(' ');
d1 = dict();
for i in xrange(len(al)):
d1[al[i]]=al[(i+1)%len(al)];
return d1
#计算两个轮换的乘积
def Mul_arrange(d1,d2):
d3 = dict();
for i,ip in d2.items():
if ip in d1:
d3[i] = d1[ip];
else:
d3[i] = ip;
for i,ip in d1.items():
if i not in d2:
d3[i] = ip;
return d3;
#计算轮换序列
def solveMA(alist):
l = len(alist);
if l<1: print 'input error!'; return;
if l==1:
print alist;
else:
d2=parse(alist[l-1]);
for x in xrange(l-2,-1,-1):
d1=parse(alist[x])
d3=Mul_arrange(d1,d2)
d2=d3
get_arrange(d3)
#输出计算结果的轮换分解
def get_arrange(d3):
visited = dict()
for i,ip in d3.items():
if i in visited: continue;
arr=[i,ip]
visited[i]=1;
while ip in d3:
visited[ip]=1
if d3[ip] == arr[0]:
break;
visited[ip]=1;
arr.append(d3[ip]);
ip = d3[ip]
print arr
alist = ['2 3','3 4'];
alist2 = ['1 2','3 4','1 4','2 3'];
solveMA(alist);