Python群论:置换和置换群
简介
所谓置换,简单地说就是交换两个元素的位置。例如,给定一组元素 a 0 , a 1 , a 2 a_0, a_1, a_2 a0?,a1?,a2?,那么通过置换之后,这组元素可以变成 a 0 , a 2 , a 1 a_0, a_2, a_1 a0?,a2?,a1?,即 a 1 a_1 a1?和 a 2 a_2 a2?的位置发生了变化,此即置换。
置换也可以有另一种理解方式,即集合内元素的一一映射,那么这个置换过程可表述为
a 0 → a 0 a 1 → a 2 a 2 → a 1 a_0\to a_0\\ a_1\to a_2\\ a_2\to a_1\\ a0?→a0?a1?→a2?a2?→a1?
从下表的角度出发,将 [ 0 , 1 , 2 ] [0,1,2] [0,1,2]变成了 [ 0 , 2 , 1 ] [0,2,1] [0,2,1],从而 [ 0 , 2 , 1 ] [0,2,1] [0,2,1]即可作为一种表述置换的方法。sympy中的置换类Permutation,采用的就是这种方法,示例如下
from sympy.combinatorics import Permutation
p = Permutation([0, 2, 1])
[i^p for i in range(p.size)]
# [0, 2, 1]
Permutation重载了运算符^,表示作用在某个元素上,上面的代码的含义就是,将置换p分别作用到0,1,2上,得到结果0,2,1。
置换还有另外一种创建方式,就是列举出不同元素的一一映射,以 p p p为例,其并未更改0的位置,而只是对 1 , 2 1,2 1,2进行了置换操作,从而其创建方式如下
p1 = Permutation(1,2)
p1 == p # True
置换的复合
置换作为一种操作,显然可以重复作用在某个元素上,如果把关注点放在置换这种运算上,那么相当于多次置换可以复合成一个新的置换。Permutation重载了运算符*
即可实现此功能
q = Permutation([2, 1, 0])
[i^p^q for i in range(3)]
# [2, 0, 1]
p*q
# Permutation(0, 2, 1),注意0,2,1没有方括号
如上述代码所示,p*q复合的结果是 0 , 2 , 1 0, 2, 1 0,2,1,其置换逻辑是 0 → 2 , 2 → 1 0\to2, 2\to1 0→2,2→1,剩下的 1 → 0 1\to0 1→0则省略掉了,这与上面的计算结果是相符的。
一般来说,置换操作是不可交换的,即p*q
和q*p
并不相等
q*p
# Permutation(0, 1, 2)
置换操作在创建时,也可以将这种符合方式考虑进去
Permutation(1,2)(0,2)
# Permutation(0, 2, 1)
置换群
群是一种定义了二元运算的简单的代数系统,当这个二元运算是置换时,就是置换群。考虑到群中二元运算的封闭性,所以当对所有元素进行这种置换之后,群中的元素只有位置发生了变化,而不会出现增减。故而也可将这种置换理解为集合 Ω \Omega Ω到其自身的映射。
在Sympy中,提供了PermutationGroup类,用于构造一个置换群。下面以p和q作为生成元,来构造一个置换群,可得到群的阶数为6。
from sympy.combinatorics import PermutationGroup
G = PermutationGroup(p, q)
G.order()
# 6
置换群的一个很常见的应用,就是描述几何图形的对称性,在sympy的组合学工具中,也提供了多面体类。多面体类可为置换群添加顶点,然后通过rotate来进行置换。
from sympy.combinatorics import Polyhedron
P = Polyhedron(list('ABC'), pgroup=G)
P.corners
# (A, B, C)
P.rotate(0)
# P.corners
(A, C, B)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!