Burnside 引理 & Pólya 定理
Burnside 引理 & Pólya 定理
Burnside 引理 & Pólya 定理能够用来解求本质不同的方案数这类问题。
考虑到定理的证明依赖于群论,而萌新可能对群论比较陌生,因此从群论相关知识讲起。
群论知识参考了许多资料(见本文引用资料),把本人认为简洁易于理解的讲解保留了下来,而对于一些理论。证明使用了自己的讲述方法/证法,如果发现不严谨或者笔误指出请指出 orz
。
写这份博客的时候电脑曾经停电丢失了数据,写到一半的进度没了,我厄厄。
群论相关知识
半群
-
集合 和 上满足结合律的二元运算 所形成的代数结构叫做半群,记为 或者简记为 ,运算 常记为 。对于 ,有 (即运算 在 上满足封闭性)
运算同时满足交换律的半群称为交换半群。
-
若 均有 ,称 为 的幺元。
幺元是唯一的:若 也是幺元,有 。
具有幺元的半群称为含幺半群。
-
对于含幺半群 ,元素 叫做元素 的逆元,是指 。
逆元是唯一的:若 也是逆元,有 。把这个唯一的逆元记作 。
群
对于每个元素均有逆元的含幺半群 称为群。
若运算又满足交换律,称 为交换群或阿贝尔(Abel)群。
群 的元素数 称为群的阶。
个人认为,把群看成是具有一定约束并且支持运算 的集合会比较容易理解相关内容。
群的性质总结
由上文所述,群满足性质:
- 封闭性
- (运算满足)结合律
- 存在幺元
- 每个元素均有逆元
当然,如果 在 下满足上述四个性质,那么称 为一个群。
例子
上面给了半群与群的定义,现举个例子:
对于自然数集 , 为含幺交换半群,幺元为 ,不是的群的原因是 中非 的数均不存在逆元。
而整数集 对于加法是交换群,因为对于 , 为对应的逆元,事实上,它被称为整数加法群。
子群
若 且在 为群,称 为 的子群,记为 。
验证子集 为 的子群只需验证以下三点:
- ,
陪集
陪集是由任意固定的 与 子群 生成的集合,
其中左陪集为:
右陪集为:
陪集的性质:
- 陪集元素个数等于子群的阶,因为:(以左陪集为例:)
- 若 ,由封闭性易知,陪集为 本身。
陪集定理
对于 两个左(右)陪集,要么相等,要么交集为 。
证明:
如果陪集 存在交集,假设交集的一个元素为 (),
显然有 ,因为 ,因此
利用陪集定理,我们有分拆:,叫做 对子群 的左陪集分解。
其中左陪集的个数记为 ,称为子群 对于 的指数。
进而,我们显然有:设 为有限群,,则 。(拉格朗日(J.Lagrange) 定理)
置换
集合 到自身每个一一对应 叫做 上的一个置换。若 为有限集,此置换可表示为:
的逆可以表示为:
两个置换 的乘积定义为 映射的合成:,其中 。
例如,
轮换(循环置换)是一类特殊的置换,表示为
每个置换均可写成一些轮换的乘积(轮换的次序可随意写),使不同轮换中没有公共元素,长为 的置换往往略去不写,如:
置换群
上面已说明置换的乘积仍为置换,且存在逆元。而对于置换的幺元显然是恒等置换(简单来说就是 )。
因此我们可以定义一个 表示 上全体置换构成的集合,这是一个 元群,叫做集合 上的对称群。
而它的每个子群都叫集合 上的置换群。
Burnside 引理 & Pólya 定理
给定集合 和置换群 。
如果感觉到十分抽象的话,不妨代入下面的情境(意义)对下文的内容进行理解:
表示待染色物品集合。
表示支持染的颜色的集合。
表示染色方案集合。
表示支持的变换。
表示本质不同的染色方案集合。
表示经过一个变换 后保持不变的染色方案对应的集合。
比如说:给你一串共 个珠子,支持旋转变换 (可以看作是置换的一种)(这意味着如果两种染色方案在旋转后一样视为本质相同),每个珠子可以被染成 种颜色(也就是说方案集 的大小为 ),求本质不同的染色方案数(也就是 )
轨道-稳定子定理
轨道
, 称 为 的轨道。
稳定子
,称 为 的稳定子。
先证明 是 的子群:
- 封闭性:对于 的元素 ,有 ,故
- 结合律:由置换乘法易知成立。
- 存在幺元:也就是恒等置换 ,显然在 中。
- 每个元素均有逆元:,同时 ,故 。
由拉格朗日定理,
故下面只需证 ,也就是左陪集的个数等于 轨道的个数。
证明:
考虑证明存在 到 左陪集的一一映射:
注意到对于每个 ,有 的元素均相同,这意味着每个左陪集 能够对应一个 的元素 ;而对于不同的左陪集 ,因为 ,因此必然满足相应的 。
因此有 到 左陪集的一一映射关系。
Burnside 引理
下面结合实际意义进行推导:
对于本质相同的一组(染色方案),它们的轨道数都是 ,因此有:
故我们有 Burnside 引理:
这意味着,对于实际的计数问题,在给出变换的种类数 后,我们只需要求出染色方案在各种变换下保持不动的数量的和(即 ),那么我们就可以求出本质不同的染色方案数了。
Pólya 定理
考虑到 Burnside 引理需要求的 在实际统计中时间复杂度较高,而很多问题都是求解 所有可能的映射(也就是比较特殊的 )所对应的染色方案(共 种)中本质不同的数量。
那么,在这样的问题中,可以使用 Pólya 定理:
表示置换 能拆分出的循环置换数。
证明:
注意到对于置换 ,对于其拆分出的每个循环置换中的颜色必须相同,根据乘法原理,可知共有 种
这意味着满足在 作用下保持不变的方案 数量 等于 。
也就是 ,证毕。
例题
https://www.luogu.com.cn/problem/P4980
解答
考虑使用 Pólya 定理:
只需统计对于每个置换 的 值即可。
而对于本题,置换的形式就是 的循环移位,例如 :
那么上例的 值就是 。
现在的问题就是:给定 ,求相应的 值。
其实就是求给定大小为 的环,能拆分成多少个步长为 的环,比如上面的例子就是能拆成两个环:。
所以考虑求每个环的大小 (容易发现每个环大小相等),那么 。
而 是满足 的最小的 ,所以 。
现在,由上述推理以及 Pólya 定理,题目所求的答案 就是:
当然因为直接枚举的复杂度为 ,会超时。
考虑根据 的值对上述和式进行分块,可以从枚举 的因子 入手:
复杂度为 ,可以通过。
代码实现
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
int fpow(int x, int p){
int res=1;
for(; p; p>>=1, x=x*x%mod) if(p&1) res=res*x%mod;
return res;
}
int gcd(int a, int b){
return b? gcd(b, a%b): a;
}
int inv(int x){
return fpow(x, mod-2);
}
int phi(int x){
int res=x;
for(int i=2;i<=x/i;i++)
if(x%i==0){
res=res/i*(i-1);
while(x%i==0) x/=i;
}
if(x>1) res=res/x*(x-1);
return res;
}
signed main(){
int T; cin>>T;
while(T--){
int n; cin>>n;
int res=0;
for(int i=1; i<=n/i; i++){
if(n%i==0){
res=(res+fpow(n, i)*phi(n/i)%mod)%mod;
if(n/i!=i) res=(res+fpow(n, n/i)*phi(i)%mod)%mod;
}
}
cout<<res*inv(n)%mod<<endl;
}
return 0;
}
引用资料
https://cp-algorithms.com/combinatorics/burnside.html
https://zhuanlan.zhihu.com/p/294221308
https://oiwiki.com/math/permutation-group/
冯克勤,李尚志,章璞.近世代数引论[M].合肥:中国科学技术大学出版社,2018
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2021-06-18 AtCoder Beginner Contest 153 题解