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

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

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

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

例子引出一般结论

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

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

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

置换和轮换(续:对其幂的讨论)_第1张图片

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

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

置换和轮换(续:对其幂的讨论)_第2张图片

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

k=4呢?

置换和轮换(续:对其幂的讨论)_第3张图片

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

继续:k=5

置换和轮换(续:对其幂的讨论)_第4张图片

这次并没有发生分裂

这有什么规律呢?—> gcd(LT,k) g c d ( L T , k )

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

结论一

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

结论二

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

结论三

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

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

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

这个就非常好理解了: gcd(LT,LT)=LT g c d ( L T , L T ) = L T

当L与k互质时

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

举个例子:
置换和轮换(续:对其幂的讨论)_第5张图片

继续:

置换和轮换(续:对其幂的讨论)_第6张图片

我们可以发现,把 (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

置换和轮换(续:对其幂的讨论)_第7张图片

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

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

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

置换的分数幂(开方)

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

轮换长度与指数互质:

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

轮换长度与指数不互质:

这种情况是无法开方的:

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

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

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

多个轮换的分数幂

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

k=2 k = 2
置换和轮换(续:对其幂的讨论)_第8张图片

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

那么我们要开 k k 次方,需要将k个长度相等的轮换合并吗
实际上并不需要:
如果我们选择 m 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) g c d ( 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 无解

你可能感兴趣的:(知识储备,群论_置换_轮换)