参考的资源:
oiwiki-置换群
置换群快速幂运算+研究与探讨-潘振浩
建议至少先把OIWIKI的基础内容看了
置换的概念
按照oiwiki的说法,置换是一种有限集合到自身的双射。如果不懂,可以粗略的理解为以是一种数组下标到下标的映射。
置换的表示
- p 1 , p 2 , p 3 . . . p n p_1,p_2,p_3...p_n p1,p2,p3...pn其中 p i p_i pi为下标,这种表示的意思是把原本第 i i i个位置的数换成原本的第 p i p_i pi位置的数
- f = ( a 1 , a 2 , . . . a n a p 1 , a p 2 . . . a p n ) f=\left( \begin{array}{c} {a_1,a_2,...a_n}\\ {a_{p_1},a_{p_2}...a_{p_n}} \end{array} \right) f=(a1,a2,...anap1,ap2...apn)这种表示更为直观,即把上面的集合映射成下面的集合
- ( k 1 , k 2 , k 3 . . . k n ) (k_1,k_2,k_3...k_n) (k1,k2,k3...kn)这种表示意味着左边元素所在的位置会被右边所替代,即构成了一个轮换,而一个置换可以由若干个轮换组成(下面解释轮换)。
轮换
举个例子:
这是一个第二个形式表示出的置换,现在需要找出他的轮换。
先从上方第一个元素,每次上方的元素把箭头指向下,然后下方的元素把箭头指向和自己相同的数字的上方的元素,一直到指回出发点,一个轮换就被找出来了,按照指的顺序依次写出不重复的数字: (1,3,2)那么第一个轮换就被找出来了。
右边的轮换也同样如此可以找出:(4,7,6,5)
那么这一个置换就被分解完了,由两个轮换 (1,3,2)和(4,7,6,5)组成,而每个轮换的元素数目可以叫做轮换的长度。
整数幂运算
对于一个置换
T
T
T,
T
2
T^2
T2即
T
T
T对自身置换一次,即
T
∗
T
T*T
T∗T,那么
T
k
T^k
Tk也同理(如果不懂就可以去看OIWIKI的置换乘法)
如果一个置换
T
T
T仅有单个长度为
L
L
L轮换构成,那么
T
L
=
e
T^L = e
TL=e(e是一种特殊的置换,即自身到自身的映射(也就是啥也不变))
整数幂运算的结论
- 设一个只有一个长度为 L L L轮换构成的置换 T T T,那么 T k T^k Tk一定会分裂成由 g c d ( k , L ) gcd(k,L) gcd(k,L)个轮换构成的置换,且每个轮换长度为 L / g c d ( k , L ) L / gcd(k,L) L/gcd(k,L),每个轮换分别由原本数组的下标模 g c d ( k , L ) gcd(k,L) gcd(k,L)的相同值元素构成。
- 特别的当
g
c
d
(
K
,
L
)
=
1
gcd(K,L) = 1
gcd(K,L)=1时,置换不会分裂
(具体的过程可以看潘振浩的论文)
幂和轮换长度互质时的结论
由于轮换长度并不会变即仍为L,所以 T k T^k Tk仍然在轮换的长度上等于之前的长度。设 T = a , T k = b T = a,T^k = b T=a,Tk=b 则有 b [ i ] = a [ i ∗ k % L ] ( 其 中 i 为 a 中 元 素 的 下 标 ) b[i] = a[i * k \% L](其中i为a中元素的下标) b[i]=a[i∗k%L](其中i为a中元素的下标)