置换群的快速幂运算
最近看了潘震皓的《置换群快速幂运算 研究与探讨》,总结一下。具体推导过程参见原文。
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
------------------------------------------------------------------
现在的你,在干什么呢?
你是不是还记得,你说你想成为岩哥那样的人。
现在的你,在干什么呢?
你是不是还记得,你说你想成为岩哥那样的人。