轮换相乘的小程序

说明

学抽象代数的时候写的小程序
目的在于单纯地利用轮换的形式来计算置换相乘
计算的方式是我自己发明的简明书写方法-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);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值