Burnside 引理与 Pólya 定理
群
群的定义
在数学中,群是由一种集合以及一个二元运算所组成的,符合“群公理”的代数结构。
一个群是一个集合 \(G\) 加上对 \(G\) 的二元运算。二元运算用 \(\cdot\) 表示,它结合了任意两个元素 \(a\) 和 \(b\) 形成了一个属于 \(G\) 的元素,记为 \(a\cdot b\)。
群的公理化定义
群公理包含下述四个性质(有时略去封闭性,只有三个性质)。若非空集合 \(G\) 和 \(G\) 上的运算 \(\cdot\) 构成的代数结构 \((G,\cdot\ )\) 满足以下性质:
-
封闭性: 对于所有 \(G\) 中 \(a,b\),运算 \(a\cdot b\) 的结果也在 \(G\) 中。
-
结合律: 对于 \(G\) 中所有的 \(a,b,c\) ,等式 \((a\cdot b)\cdot c=a\cdot (b\cdot c)\) 成立。
-
单位元: \(G\) 中存在一个元素 \(e\),使得对于 \(G\) 中的每一个 \(a\),都有一个 \(e\cdot a=a\cdot e=a\) 成立。这样的元素是独一无二的。它被称为群的标识元素。
-
逆元: 对于每个 \(G\) 中的 \(a\) ,总存在 \(G\) 中的一个元素 \(b\) 使 \(a\cdot b=b\cdot a=e\),此处 \(e\) 为单位元,称 \(b\) 为 \(a\) 的逆元,记为 \(a^{-1}\)。
则称 \((G,\cdot\ )\) 为一个 群。例如,整数集和整数间的加法 \((Z,+)\) 构成一个群,单位元是 \(0\),一个整数的逆元是它的相反数。
置换
置换的定义
有限集合到自身的双射(即一一对应)称为置换。集合 \(S=\{a_1,a_2,...,a_n\}\) 上的置换可以表示为
意为将 \(a_i\) 映射为 \(a_{p_i}\) ,其中 \(p_1,p_2,...,p_n\) 是 \(1,2,...,n\) 的一个排列。显然 \(S\) 上所有置换的数量为 \(n!\)。
置换的乘法
对于两个置换 \( f=\begin{pmatrix} a_1,a_2,...,a_n\\ a_{p_1},a_{p_2},...,a_{p_n} \end{pmatrix} \) 和 \( g=\begin{pmatrix} a_{p_1},a_{p_2},...,a_{p_n}\\ a_{q_1},a_{q_2},...,a_{q_n} \end{pmatrix} \),\(f\) 和 \(g\) 的乘积记为 \(f\circ g\) ,其值为:
简单来说就是先后经过 \(f\) 的映射,再经过 \(g\) 的映射。
置换群
易证,集合 \(G\) 上的所有置换关于置换的乘法满足封闭性、结合律、有单位元(恒等置换,即每个元素映射成它自己)、有逆元(交换置换表示中的上下两行),因此构成一个群。这个群的任意一个 子群 即称为 置换群。
置换群通常用来解决一些涉及“本质不同”的计数问题,例如用 3 种颜色给一个立方体染色,求本质不同的方案数(经过翻转后相同的两种方案视为同一种)。
循环置换
循环置换是一类特殊的置换,可表示为
若两个循环置换不含有相同的元素,则称它们是 不相交 的。有如下定理:
任意一个置换都可以分解为若干不相交的循环置换的乘积,例如:
该定理的证明也非常简单。如果把元素视为图的节点,映射关系视为有向边,则每个节点的入度和出度都为 1,因此形成的图形必定是若干个环的集合,而一个环即可用一个循环置换表示。
Burnside 引理
证明
考虑一个等价类,有
其中,\(x\) 为 \(X\) 的一个等价类,\(|g_x|\) 为使它不发生改变的置换个数,
\(G\) 为总置换个数,\(X/G\) 为 \(X\) 在 \(G\) 置换群下的等价类的集合。
可以感性认知,对于一个等价类,有 \(|g_x|\) 种使它不发生改变的置换,
因为对于等价类 \(x\),本质不同的置换可以其中一个元素变为其他任意元素,所以有 \(|x|\) 种。
考虑枚举每一个等价类,有
每一个等价类对右式的贡献为 \(|G|\),共 \(|X/G|\) 个。
考虑交换枚举顺序,有
其中 \(x\) 指 \(X\) 的一个元素,\(|g_x|\) 为使它不发生改变的置换个数,
此处的 \(|g_x|\) 与上面相同,因为同一个等价类 \(|g_x|\) 一定相同。
等式右半部分 \(g\) 为 \(G\) 中的一个置换,\(|x^g|\) 为在该置换下不发生改变的元素个数。
由于 \(∑_{x∈X/G}|x|\) 可以等价于枚举完所有的元素,有
Pólya 定理
即:
由 \(\text{Burnside}\) 引理显然可得。
例题
给定一个 \(n\) 个点,\(n\) 条边的环,有 \(n\) 种颜色,给每个顶点染色,问有多少种本质不同的染色方案 ?
考虑枚举所有置换,可以将环顺时针旋转 \(1\) ~ \(n\) 个珠子的位置,共 \(n\) 种置换。
其中长度为 \(i\) 的置换会将整个环分成 \(gcd(n,i)\) 个部分,每部分颜色相同。
因此答案为:
此时复杂度为 \(O(n)\) ,考虑枚举 \(gcd(i,n)\):
即可在 \(O(\sqrt n)\) 时间复杂度内解决该问题。
【模板】Pólya 定理
#include<bits/stdc++.h>
using namespace std;
int T;
const long long md=1e9+7;
inline long long phi(long long x){
long long res=x;
for(int i=2;1ll*i*i<=x;i++){
if(x%i==0){
res-=res/i;
while(x%i==0)x/=i;
}
}
if(x^1)res-=res/x;
return res%md;
}
inline long long pwr(long long x,long long y){
long long res=1;
while(y){
if(y&1)res=res*x%md;
x=x*x%md;y>>=1;
}return res;
}
inline void solve(){
long long n;scanf("%lld",&n);
long long res=0;
for(int i=1;1ll*i*i<=n;i++){
if(n%i==0){
res=(res+pwr(n,n/i)*phi(i))%md;
if(i*i!=n)res=(res+pwr(n,i)*phi(n/i))%md;
}
}
printf("%lld\n",res*pwr(n,md-2)%md);
}
int main(){
scanf("%d",&T);
while(T--)solve();
return 0;
}