置换怎么表示成轮换_用Python解置换群问题

本文介绍了如何用Python解决置换群问题,特别是如何将置换表示为轮换。通过一个具体的字符串变换题目,展示了如何利用程序暴力求解置换问题,并解释了置换和轮换的概念。
摘要由CSDN通过智能技术生成

04db762881259f80b58b04283f0fb7e2.png

室友问我题目,把我难住了。想不出解法,遂写了个程序暴力求解。

题目如下:

559c2e5a95f9aef92dabaa033436dc1c.png
A permutation is applied to the string SUPERBGOLDHAT. The same permutation is applied to the output from this operation. The second output is OGTHLEPDSUARB. What was the first output? (Note: as an example, the permutation(1 3 4) applied to WOLF gives FOWL. Write your answer in capital letters inside quotation marks, e.g. "BEARDPLUGHOST".)

上面这段文字说的是,一个变换规则作用于字符串SUPERBGOLDHAT, 生成一个新字符串。再次将相同的变换规则作用于这个新字符串,得到一个经过两次变换的字符串OGTHLEPDSUARB. 求第一次变换后的字符串。

背景知识

首先简单说明一下什么是置换。

首先给定一个序列

然后给定一个置换

那么,置换

的作用就是,把序列
中的1变成3,2变成5,3变成2,4变成6

以此类推

第一次: 3 5 2 6 4 1

第二次: 2 4 5 1 6 3

第三次: 5 6 4 3 1 2

上面表示置换的方法叫两行式,此外,我们还可以用轮换来表示一个置换

举个例子,如下是一个两行式表示的置换

它表示成是轮换是

以上的

都属于 k-循环置换

如果一个变换将 i<sub>1</sub> $rightarrow$ i<sub>2</sub>, i<sub>2</sub> $rightarrow$ i<sub>3</sub>, $ldots $ i<sub>k</sub> $rightarrow $ i<sub>1</sub>, 而其他各元不变,那么该置换称为k-循环置换(k-cycle),写作 ( i<sub>1</sub>,i<sub>2</sub>,i<sub>3</sub> $ldots $ i<sub>k</sub> ).

除了k-循环置换之外,还有一种置换叫做非循环置换

一个k-循环置换, 总是可以表示为一个轮换

一个非循环置换,则总是可以表示成几个轮换的积

例如,非循环置换

就可以表示成

(以上参考自: 置换群题目汇总, 《近世代数》杨子胥)

代码

下面这段Python代码通过遍历,暴力求解了文章开始我们给出的那道置换题目。

import numpy as np
import itertools


# a is something like index
# b is the second output you want
# C (capital) is the first output we guess
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13])
a = a-1
b = np.array([8, 7, 13, 11, 9, 4, 3, 10, 1, 2, 12, 5, 6])
b = b-1
c = np.zeros([a.size])

# traverse all permutations of a
for C in itertools.permutations(a, a.size):
    print(C)
    for num in C:
		# c (lower case) is the second output in this iteration
        c[num] = C[C[num]] 
    if (b == c).all():
        C = [x+1 for x in C]
        print('The answer is ', C)
        break

这段代码中,最精髓的一句是

之前为了实现相同功能写了十几行代码。是在我看了CSDN那篇博文之后,找到了规律,才改写成这种形式。如果问题改为:根据 third output, 求 first output也很简单。只需要把
加多一层就可以了,写成
如果题目改了不同的数字,只要a和b改一下就好,so easy.

这个程序跑了一天,终于跑出来了(巨汗),给大家展示一下

f2c454ee194e92069e1e13efd36b519f.png
运行结果

最终的输出为

它的含义是, 序列a

表示原始输入 SUPERBGOLDHAT 对应的index,即1代表S,2代表U,以此类推。而输出序列
代表first output的序列。到这里就解出来了,按index逐字翻译输出序列,可知答案为 BALDPORETHUGS. Over!

但计算机真的算得太慢了,补上我新学的人脑解法 ^ _ ^

fb3a4ecf0496539211a28ab8e3bb7b85.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值