置换群的快速幂运算

最近看了潘震皓的《置换群快速幂运算 研究与探讨》,总结一下。具体推导过程参见原文。

1、置换群的乘方:求T^k(k为正整数)

对于置换T,用数组a[i][]表示置换T的循环,约定a[i][0]为该循环内最小的数,且l[i]表示对应循环的长度,记。:

对每个循环,若l[i]是k的倍数,则乘方之后分裂为k个循环,并且每个循环分别是循环a[i]中下标j mod k = 0, 1, 2....的元素按顺序连接。

对每个循环,若gcd(l[i], k) = 1,则乘方之后仍然是一个循环,设原循环为数组a[i],长度为l[i],乘方之后为a[i]',则a[i]'[j] = a[i][k*j mod l[i]]。

对每个循环,若不为上面两种情况,则乘方之后为gcd(l[i], k)个循环的乘积,每个循环分别是原循环a[i]中下标j mod gcd(l[i], k) = 0, 1, 2...的元素的连接。

  

2、置换群的开方:求T^(1/k)(k为正整数)

a.若置换为单循环置换,且循环长度与指数k互质,则由上面第二种情况的公式可以逆推得到。

b.若置换为单循环置换,但循环长度与指数k不互质,则由上面的结论可以知道,这是不能开方的。

c.若置换不为单循环置换,则对l[i]中任意一个有执行以下操作:1.令m = gcd(i[i], k);2.选择n*m份长度均为l[i]的循环进行合并,其中n为整数且n*m为k的约数;3.将形成的大循环开k/m次方。

 

该类型的题:

1、POJ 1721 CARDS,题解http://www.cnblogs.com/plumrain/p/permutation.html

 

 

 

转载于:https://www.cnblogs.com/plumrain/p/permutation_group.html

你可能感兴趣的:(置换群的快速幂运算)