在Julia中列出固定n的对称群S(n)共轭类的技术实现:如何以循环表示法输出置换
要在Julia里生成对称群S(n)的所有共轭类,关键要记住对称群的共轭类和n的整数分拆是一一对应的——每个共轭类对应一种循环类型,而循环类型就是n的一个整数分拆(把n拆成若干正整数之和,对应循环的长度)。我们只需要为每种分拆生成一个对应循环类型的置换代表,再转换成你要的循环表示法就行。下面是具体实现:
1. 准备依赖包
首先需要用到Combinatorics包来生成整数分拆,先安装并导入:
using Pkg; Pkg.add("Combinatorics") using Combinatorics
2. 实现循环表示法转换函数
Julia默认生成的置换是数组形式(比如[2,3,1]对应(1→2→3→1)),我们需要写一个函数把这种数组转换成你要的循环表示字符串:
function cycle_notation(perm::Vector{Int}) visited = falses(length(perm)) cycles = [] for i in 1:length(perm) if !visited[i] cycle = Int[] j = i while !visited[j] visited[j] = true push!(cycle, j) j = perm[j] end push!(cycles, cycle) end end # 格式化每个循环:长度为1的循环保留(1)格式,多个循环用空格分隔 join([length(c) == 1 ? "($(c[1]))" : "($(join(c, ",")))" for c in cycles], " ") end
3. 根据分拆构造对应循环类型的置换
每个整数分拆对应一种循环类型,我们构造一个具有该循环类型的置换代表:
function perm_from_partition(partition::Vector{Int}) perm = zeros(Int, sum(partition)) current = 1 for len in partition # 构造长度为len的循环:current → current+1 → ... → current+len-1 → current for i in 0:len-2 perm[current + i] = current + i + 1 end perm[current + len - 1] = current current += len end perm end
4. 生成所有共轭类代表
把上面的函数结合起来,就能生成S(n)的所有共轭类代表列表:
function symmetric_group_conjugacy_classes(n::Int) # 生成n的所有整数分拆(降序排列) all_partitions = collect(partitions(n)) # 为每个分拆生成置换并转成循环表示 [cycle_notation(perm_from_partition(p)) for p in all_partitions] end
测试示例
比如n=3时,调用函数:
symmetric_group_conjugacy_classes(3)
会输出:
3-element Vector{String}: "(1,2,3)" "(1,2) (3)" "(1) (2) (3)"
完全符合你想要的格式!
补充说明
- 共轭类的本质:对称群里两个元素共轭当且仅当它们有相同的循环类型,所以每个分拆对应唯一的共轭类,我们生成的每个字符串就是对应共轭类的一个代表元。
- 如果需要列出共轭类的所有元素(而不只是代表),可以基于每个循环类型生成所有同类型的置换,但通常共轭类只需要代表元就能区分,这也是你问题里要求的。
内容的提问来源于stack exchange,提问作者Tio Miserias
相关产品推荐
相关产品推荐

