置换和轮换(续:对其幂的讨论)

参考论文:置换群快速幂运算的研究与探讨

之前我们介绍过置换和轮换的基本知识以及Burnside引理
Burnside引理:等价类数目为所有置换不动点的平均值
置换的不动点: 颜 色 数 轮 换 个 数

这里我们要深入研究一下把轮换的运算

例子引出一般结论

我们先给出一个置换群中的结论:

e e 为单位置换(长度为1的置换), T为一轮换(或称循环)
Tk=e T k = e ,那么k的最小整数解就是 T T 的长度

为什么会这样呢?
我们先来看几个例子:

这里写图片描述

此例子中T的长度为6,k=2,结果就分裂成了两个长度相等的轮换

那我们看一下k=3的情况:

这里写图片描述

这样T就分裂成了3个轮换

k=4呢?

这里写图片描述

嗯?为什么得到的答案和k=2时一样呢?

继续:k=5

这里写图片描述

这次并没有发生分裂

这有什么规律呢?—>gcd(LT,k)

从中我们可以得到三个结论:

结论一

一个长度为 L L 的轮换T L L k的倍数,则 Tk T k k k 个轮换的乘积,每个轮换分别是循环T中下标 i(mod)k=0,1,2 i ( m o d ) k = 0 , 1 , 2 … 的元素按顺序的连接

结论二

一个长度为 L L 的轮换T gcd(L,k)=1 g c d ( L , k ) = 1 ,则 Tk T k 是一个轮换,与轮换 T T 不一定相同

结论三

一个长度为L的轮换 T T Tk就是 gcd(L,k) g c d ( L , k ) 个轮换的乘积,每个轮换分别是轮换 T T 中下标i(mod)gcd(L,k)=0,1,2的元素的连接

回到最初我们给出的结论:

Tk=e T k = e ,那么k的最小整数解就是 T T 的长度

这个就非常好理解了:gcd(LT,LT)=LT

当L与k互质时

之前我们得到了一些长度与k之间的结论
其中,当 gcd(L,k)!=1 g c d ( L , k ) ! = 1 时,我们是可以直接构造出结果轮换
下面我们就讨论一下 L L k互质时的结果轮换

举个例子:
这里写图片描述

继续:

这里写图片描述

我们可以发现,把 (mod)k=1,2,...,k1,0 ( m o d ) k = 1 , 2 , . . . , k − 1 , 0 的项提出来,连接起来则是所求新轮换

定理

a=T,a=Tk a = T , a ′ = T k ,且 gcd(LT,k)=1 g c d ( L T , k ) = 1 ,则 a[i]=a[(k+1)i(mod)LT] a ′ [ i ] = a [ ( k + 1 ) ∗ i ( m o d ) L T ]

我们用图直观理解一下:
L=10,k=3 L = 10 , k = 3

这里写图片描述

这是一个很有用的结论,我们把ta转化成code:

for 原置换中的每一个轮换
    for 环中每一个未标记元素
    {
         做标记
         放入结果数组
         前进k步
         until 回到此元素
         将结果数组中的元素取出,得到的环就是目标置换包含的一个轮换
    }

这个算法总结了上述三个结论和一个定理

置换的分数幂(开方)

之前我们讨论了轮换的乘方运算
下面我们就讨论开方运算:

轮换长度与指数互质:

有之前的定理可以得到,开方运算是乘方的逆:
由目标轮换构造原轮换:每次原函数指针后移 k k 位,目标函数指针依次后移

轮换长度与指数不互质:

这种情况是无法开方的:

  • 结果置换只包含一个轮换:
    假设我们由一个初始轮换T,开k次方,得到一个目标轮换 t t
    由一开始得到结论可知:tk=T,gcd(Lt,k)!=1
    按理说得到的 T T ′ 应该包含 gcd(Lt,k) g c d ( L t , k ) 个轮换,与题设不符
    因此不可开方

    • 结果置换包含若干轮换
      结果置换的 k k 次幂只有可能把自己包含的轮换分裂,不可能合并成一个大轮换

    因此,轮换长度与指数不互质时,单个轮换不能看房

    多个轮换的分数幂

    当轮换的长度与指数不互质时,会分裂成gcd(L,k)个轮换
    那么如果我们可以把这些轮换合并起来就可以得到初始轮换了

    k=2 k = 2
    这里写图片描述

    上图体现了两种开方方式:
    上图是把两个轮换交错结合
    下图是:结果轮换 Tk T k 的指针 i i 依次后移,而需要构造的轮换的指针j依次后移 k k 位,T[j]=Tk[i]

    那么我们要开 k k 次方,需要将k个长度相等的轮换合并吗
    实际上并不需要:
    如果我们选择m个轮换进行合并,得到的大轮换长度为 Lm L ∗ m
    如果 gcd(Lm,k)=m g c d ( L ∗ m , k ) = m ,就可以保证次方法正确
    显然,m是k的一个约数,并且 gcd(L,k/m)=1 g c d ( L , k / m ) = 1
    这个式子的充要条件是: m m gcd(L,k)的倍数
    因此: min(m)=gcd(L,k) m i n ( m ) = g c d ( L , k )

    我们可以将上面两种情况并在一起:

    • m=gcd(L,k) m = g c d ( L , k )
    • 选择n*m份长度为1的轮换交错合并,n为整数,且 gcd(nm,k/m)=1 g c d ( n ∗ m , k / m ) = 1
    • 将大轮换开 k/m k / m 次方
    将原置换中的轮换按照size排序
    for 每一个轮换
        m=gcd(l,k)
        if 有m个相同长度的轮换
            将m个轮换交错的输出到目标数组,保存为一个轮换
            将得到的大轮换开k/m次方
        else 无解
  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值