Burnside 引理 & Pólya 定理

Burnside 引理 & Pólya 定理

Burnside 引理 & Pólya 定理能够用来解求本质不同的方案数这类问题。

考虑到定理的证明依赖于群论,而萌新可能对群论比较陌生,因此从群论相关知识讲起。

群论知识参考了许多资料(见本文引用资料),把本人认为简洁易于理解的讲解保留了下来,而对于一些理论。证明使用了自己的讲述方法/证法,如果发现不严谨或者笔误指出请指出 orz

写这份博客的时候电脑曾经停电丢失了数据,写到一半的进度没了,我厄厄。

群论相关知识

半群

  • 集合 SS 上满足结合律的二元运算 所形成的代数结构叫做半群,记为 (S,) 或者简记为 S,运算 xy 常记为 xy。对于 x,yS,有 xyS(即运算 S 上满足封闭性

    运算同时满足交换律的半群称为交换半群

  • xS 均有 ex=xe=x,称 ex 的幺元。

    幺元是唯一的:若 e 也是幺元,有 e=ee=e

    具有幺元的半群称为含幺半群

  • 对于含幺半群 S,元素 yS 叫做元素 xS逆元,是指 xy=yx=1

    逆元是唯一的:若 y 也是逆元,有 y=y1=yxy=1y=y。把这个唯一的逆元记作 x1

对于每个元素均有逆元含幺半群 G 称为

若运算又满足交换律,称 G 为交换群或阿贝尔(Abel)群。

G 的元素数 |G| 称为群的

个人认为,把群看成是具有一定约束并且支持运算 集合会比较容易理解相关内容。

群的性质总结

由上文所述,群满足性质:

  • 封闭性
  • (运算满足)结合律
  • 存在幺元
  • 每个元素均有逆元

当然,如果 G 下满足上述四个性质,那么称 (G,) 为一个群。

例子

上面给了半群与群的定义,现举个例子:

对于自然数集 N(N,+) 为含幺交换半群,幺元为 0,不是的群的原因是 N 中非 0 的数均不存在逆元。

而整数集 Z 对于加法是交换群,因为对于 xZx 为对应的逆元,事实上,它被称为整数加法群

子群

HG 且在 (H,) 为群,称 HG子群,记为 HG

验证子集 HG 的子群只需验证以下三点:

  • 1GH
  • hHh1H
  • a,bHabH

陪集

陪集是由任意固定的 gGG 子群 H 生成的集合,

其中左陪集为:gH={gh|hH}

右陪集为:Hg={hg|hH}

陪集的性质:

  • 陪集元素个数等于子群的阶,因为:(以左陪集为例:ghghhh
  • gH,由封闭性易知,陪集为 H 本身。

陪集定理

对于 H 两个左(右)陪集,要么相等,要么交集为

证明:

如果陪集 gH,gH 存在交集,假设交集的一个元素为 gh=ghh,hH),

显然有 ghH=ghH,因为 hH=hH=H,因此 gH=gH

利用陪集定理,我们有分拆:G=giH,叫做 G 对子群 H左陪集分解

其中左陪集的个数记为 [G:H],称为子群 H 对于 G指数

进而,我们显然有:设 G 为有限群,HG,则 |G|=|H|[G:H]。(拉格朗日(J.Lagrange) 定理

置换

集合 Σ 到自身每个一一对应 σ 叫做 Σ 上的一个置换。若 Σ 为有限集,此置换可表示为:

σ=(a1a2anσ(a1)σ(a2)σ(an))

σ 的逆可以表示为:

σ1=(σ(a1)σ(a2)σ(an)a1a2an)

两个置换 σ,τ 的乘积定义为 ΣΣ 映射的合成:(στ)(ai)=σ(τ(ai)),其中 i[1,n]

例如,

(12342431)(12343142)=(12341243)

轮换(循环置换)是一类特殊的置换,表示为

(a1a2an1ana2a3ana1)

每个置换均可写成一些轮换的乘积(轮换的次序可随意写),使不同轮换中没有公共元素,长为 1 的置换往往略去不写,如:

(123456312546)=(1,3,2)(4,5)=(4,5)(1,3,2)

置换群

上面已说明置换的乘积仍为置换,且存在逆元。而对于置换的幺元显然是恒等置换(简单来说就是 aiai)。

因此我们可以定义一个 S(Σ) 表示 Σ 上全体置换构成的集合,这是一个 n! 元群,叫做集合 Σ 上的对称群。

而它的每个子群都叫集合 Σ 上的置换群

Burnside 引理 & Pólya 定理

给定集合 X置换群 G

如果感觉到十分抽象的话,不妨代入下面的情境(意义)对下文的内容进行理解:

A 表示待染色物品集合

B 表示支持染的颜色的集合

X 表示染色方案集合

G 表示支持的变换。

X/G 表示本质不同的染色方案集合

Xg 表示经过一个变换 g 后保持不变的染色方案对应的集合

比如说:给你一串共 n 个珠子,支持旋转变换 G(可以看作是置换的一种)(这意味着如果两种染色方案在旋转后一样视为本质相同),每个珠子可以被染成 m 种颜色(也就是说方案集 X 的大小为 mn),求本质不同的染色方案数(也就是 |X/G|

轨道-稳定子定理

轨道

xX, 称 G(x)={g(x)|gG}x轨道

稳定子

xX,称 Gx={g|g(x)=x,gG}x稳定子

|G|=|Gx||G(x)|

先证明 GxG子群

  • 封闭性:对于 Gx 的元素 g,g,有 (gg)(x)=x,故 ggGx
  • 结合律:由置换乘法易知成立。
  • 存在幺元:也就是恒等置换 I,显然在 Gx 中。
  • 每个元素均有逆元:g1(g(x))=I(x)=x,同时 g1(g(x))=g1(x),故 g1Gx

拉格朗日定理,|G|=|Gx|[G:Gx]

故下面只需证 [G:Gx]=|G(x)|,也就是左陪集的个数等于 x 轨道的个数。

证明:

考虑证明存在 G(x)Gx 左陪集的一一映射

注意到对于每个 gGx,有 gGx(x) 的元素均相同,这意味着每个左陪集 gGx 能够对应一个 G(x) 的元素 g(x);而对于不同的左陪集 gGx,gGx,因为 gg,因此必然满足相应的 g(x)g(x)

因此有 G(x)Gx 左陪集的一一映射关系。

Burnside 引理

gG|Xg|=|{(g,x)|(g,x)G×X,g(x)=x}|=xX|Gx|g(x)=x(x,g)=xX|G||G(x)|

下面结合实际意义进行推导:

对于本质相同的一组(染色方案)x,它们的轨道数都是 G(x),因此有:

xX1|G(x)|=|X/G|

故我们有 Burnside 引理

|X/G|=1|G|gG|Xg|

这意味着,对于实际的计数问题,在给出变换的种类数 |G| 后,我们只需要求出染色方案在各种变换下保持不动的数量的和(即 gG|Xg|),那么我们就可以求出本质不同的染色方案数了。

Pólya 定理

考虑到 Burnside 引理需要求的 gG|Xg| 在实际统计中时间复杂度较高,而很多问题都是求解 AB 所有可能的映射(也就是比较特殊的 X)所对应的染色方案(共 |B||A| 种)中本质不同的数量。

那么,在这样的问题中,可以使用 Pólya 定理

|X/G|=1|G|gG|B|c(g)

c(g) 表示置换 g 能拆分出的循环置换数。

证明:

注意到对于置换 g,对于其拆分出的每个循环置换中的颜色必须相同,根据乘法原理,可知共有 |B|c(g)

这意味着满足在 g 作用下保持不变的方案 x 数量 |Xg| 等于 |B|c(g)

也就是 |B|c(g)=|Xg|,证毕。

例题

https://www.luogu.com.cn/problem/P4980

解答

考虑使用 Pólya 定理

只需统计对于每个置换 gc(g) 值即可。

而对于本题,置换的形式就是 k[0,n1]循环移位,例如 n=4,k=2

g=(12343412)

那么上例的 c(g) 值就是 2

现在的问题就是:给定 n,k,求相应的 c(g) 值。

其实就是求给定大小为 n 的环,能拆分成多少个步长为 k 的环,比如上面的例子就是能拆成两个环:(1,3),(2,4)

所以考虑求每个环的大小 size(容易发现每个环大小相等),那么 c(g)=nsize

size 是满足 n|tk 的最小的 t,所以 size=ngcd(n,k)

现在,由上述推理以及 Pólya 定理,题目所求的答案 Ans 就是:

Ans=1|n|k=0n1|n|gcd(n,k)

当然因为直接枚举的复杂度为 O(TN),会超时。

考虑根据 gcd 的值对上述和式进行分块,可以从枚举 n 的因子 d 入手:

Ans=1|n|d|n|n|dφ(nd)

复杂度为 O(TNlogN),可以通过。

代码实现

#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

posted @   HinanawiTenshi  阅读(93)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
历史上的今天:
2021-06-18 AtCoder Beginner Contest 153 题解
点击右上角即可分享
微信分享提示