Burnside引理和Polya定理学习笔记
前言
求·······的方案数
循环同构算一种
一脸懵逼
(于是我觉得系统的学一遍Burnside引理和Polya定理)
正文
置换
置换的概念
对于一个排列aia_iai
我们想成iii输进去会出来一个aia_iai
那么我们如果输入一个排列,将能得到一个排列
就比如我们输入的排列是111到nnn有序的,那么这个置换就是
(123⋅⋅⋅na1a2a3⋅⋅⋅an)\begin{pmatrix} 1&2&3&···&n \\ a_1&a_2&a_3&···&a_n \end{pmatrix}(1a12a23a3⋅⋅⋅⋅⋅⋅nan)
当然我们如果随便输入一个排列bib_ibi,并且得到一个新的排列,那么这个置换就是
(b1b2b3⋅⋅⋅bnab1ab2ab3⋅⋅⋅abn)\begin{pmatrix} b_1&b_2&b_3&···&b_n \\ a_{b_1}&a_{b_2}&a_{b_3}&···&a_{b_n} \end{pmatrix}(b1ab1b2ab2b3ab3⋅⋅⋅⋅⋅⋅bnabn)
只要排列aia_iai相同,无论输入什么排列bib_ibi生成的置换都是一样的
即置换与横向位置无关,只与纵向的对应关系有关
我们设A={a1,a2⋅⋅⋅an}A=\{a_1,a_2···a_n\}A={a1,a2⋅⋅⋅an},即∣A∣=n|A|=n∣A∣=n,我们称上面的那些置换为AAA上的nnn次置换
不难发现,本质不同的nnn次置换一共有n!n!n!种
置换的乘积形式
我们发现,对于一个置换,一个位置的数如果是iii,进行若干次置换后,这个位置的数会变回iii
比如一个置换
(123456231654)\begin{pmatrix} 1&2&3&4&5&6 \\ 2&3&1&6&5&4 \end{pmatrix}(122331465564)
一个数111其变化是1→2→3→11\rightarrow2\rightarrow3\rightarrow11→2→3→1
那么我们可以写成(2,3,1)(2,3,1)(2,3,1)
所有的循环的乘积就是这个置换的不相交循环的乘积写法
比如刚刚这个置换就是(2,3,1)(6,4)(5)(2,3,1)(6,4)(5)(2,3,1)(6,4)(5)
我们发现555这个位置无论进行几次置换值都是555,对于这些位置我们称其为不动点
置换群
是一种群,里面每个元素都是置换
然后满足群的一些性质
对于一个nnn,在n!n!n!种本质不同的nnn次置换中选xxx个(x≥1x\ge1x≥1)置换作为元素的群被称为xxx阶nnn次置换群,特殊的,当x=n!x=n!x=n!时,其被称为nnn次对称群
对于一个nnn次置换群,我们发现其元素中必有置换
(a1a2a3⋅⋅⋅ana1a2a3⋅⋅⋅an)\begin{pmatrix} a_1&a_2&a_3&···&a_n \\ a_1&a_2&a_3&···&a_n \end{pmatrix}(a1a1a2a2a3a3⋅⋅⋅⋅⋅⋅anan)
另外,若其元素中有置换
(b1b2b3⋅⋅⋅bnab1ab2ab3⋅⋅⋅abn)\begin{pmatrix} b_1&b_2&b_3&···&b_n \\ a_{b_1}&a_{b_2}&a_{b_3}&···&a_{b_n} \end{pmatrix}(b1ab1b2ab2b3ab3⋅⋅⋅⋅⋅⋅bnabn)
则其元素中也必有
(ab1ab2ab3⋅⋅⋅abnb1b2b3⋅⋅⋅bn)\begin{pmatrix} a_{b_1}&a_{b_2}&a_{b_3}&···&a_{b_n} \\ b_1&b_2&b_3&···&b_n \end{pmatrix}(ab1b1ab2b2ab3b3⋅⋅⋅⋅⋅⋅abnbn)
以上就差不多是一些定义了
百度百科链接,群
良好并且完整的置换群课件,链接
Burnside引理
设G={a1,a2,…ag}G=\{a_1,a_2,…a_g\}G={a1,a2,…ag}(aaa是置换)是目标集[1,n][1,n][1,n]上的置换群。每个置换都写成不相交循环的乘积。c1(ak)c_1(a_k)c1(ak)是在置换aka_kak的作用下不动点的个数,也就是长度为111的循环的个数。通过上述置换的变换操作后可以相等的元素属于同一个等价类。若GGG将[1,n][1,n][1,n]划分成lll个等价类,则:
l=1∣G∣[c1(a1)+c1(a2)+⋅⋅⋅+c1(a∣G∣)]l=\frac{1}{|G|}[c_1(a_1)+c_1(a_2)+···+c_1(a_{|G|})]l=∣G∣1[c1(a1)+c1(a2)+⋅⋅⋅+c1(a∣G∣)]
证明:
对于一个置换aaa,将其写成不相交循环的乘积
我们设χa(x)={0x不是不动点1x是不动点\chi_a(x)=\begin{cases}0&x不是不动点\\1&x是不动点\end{cases}χa(x)={01x不是不动点x是不动点
根据定义,我们展开
∑ai∈Gc1(ai)=∑ai∈G∑1≤j≤nχai(j)=∑1≤j≤n∑ai∈Gχai(j)\sum_{a_i\in G}c_1(a_i)=\sum_{a_i\in G}\sum_{1\le j\le n}\chi_{a_i}(j)=\sum_{1\le j\le n}\sum_{a_i\in G}\chi_{a_i}(j)ai∈G∑c1(ai)=ai∈G∑1≤j≤n∑χai(j)=1≤j≤n∑ai∈G∑χai(j)
我们设Z(x)\Zeta(x)Z(x)为满足xxx是不动点的置换集合,我们发现上式的后半部分可以直接套入
∑1≤j≤n∑ai∈Gχai(j)=∑1≤j≤n∣Z(j)∣\sum_{1\le j\le n}\sum_{a_i\in G}\chi_{a_i}(j)=\sum_{1\le j\le n}|\Zeta(j)|1≤j≤n∑ai∈G∑χai(j)=1≤j≤n∑∣Z(j)∣
我们发现,对于同一个等价类里的元素x1,x2x_1,x_2x1,x2,一定满足Z(x1)=Z(x2)Z(x_1)=Z(x_2)Z(x1)=Z(x2),原因是Z(x)Z(x)Z(x)集合是一个置换群元素集合的子集
这样我们设CCC为一个等价类元素集合,设c=∀x∈Cc=\forall x\in Cc=∀x∈C,那么无论ccc的取值,Z(c)Z(c)Z(c)的值都是一样的
那么继续上式
∑1≤j≤n∣Z(j)∣=∑C∣C∣∗Z(c)=∣G∣∑C1=∣G∣⋅∣C∣=∣G∣l\sum_{1\le j\le n}|\Zeta(j)|=\sum_{C}|C|*Z(c)=|G|\sum_{C}1=|G|·|C|=|G|l1≤j≤n∑∣Z(j)∣=C∑∣C∣∗Z(c)=∣G∣C∑1=∣G∣⋅∣C∣=∣G∣l
对于第二个等号,可能你会感到疑惑
这里用到了∣C∣∗Z(c)=∣G∣|C|*\Zeta(c)=|G|∣C∣∗Z(c)=∣G∣,即“轨道-稳定集定理”,这里就不展开了,因为这个的证明还需要拉格朗日定理等群论基本知识,有兴趣的可以看这篇博客,里面有一些基本概念的介绍,另外,据说具体证明可以参照 《组合数学》(第5版)P181 定理4-11(暂未考证)
综上l=1∣G∣∑ai∈Gc1(ai)l=\frac{1}{|G|}\sum_{a_i\in G}c_1(a_i)l=∣G∣1ai∈G∑c1(ai)
这篇博客里有比较清楚的例子,我这里就不举例了
我们发现,在染色问题循环同构的题中,∣G∣|G|∣G∣是旋转方式数,∣A∣|A|∣A∣是所有染色种类数,算法的复杂度是O(∣G∣∣A∣)\mathcal O(|G||A|)O(∣G∣∣A∣)的,而后者很容易变得很大,这个时候就需要用到Polya定理
(也正因为如此在OI中应用不多)
Polya定理
前提条件:如果将[1,n][1,n][1,n]用kkk种颜色进行染色
我们定义λ(ai)\lambda(a_i)λ(ai)为置换aia_iai的循环数量
Polya定理:
l=1∣G∣∑ai∈Gkλ(ai)l=\frac{1}{|G|}\sum_{a_i\in G}k^{\lambda(a_i)}l=∣G∣1ai∈G∑kλ(ai)
Polya定理其实就是一种Burnside引理的具体化,就是把上面的c1(ai)c_1(a_i)c1(ai)算出来了
例题
[poj1286]Necklace of Beads
题目大意:现在有333种颜色的珠子,问有多少种长度为nnn的环,旋转、轴对称同构算一种
题解: 我们发现对于一个nnn的置换只有2∗n2*n2∗n种,直接套polya定理求环数量即可,复杂度O(n2)\mathcal O(n^2)O(n2)
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
typedef long long ll;
#define rg register
template <typename T> inline void read(T&x){char cu=getchar();x=0;bool fla=0;while(!isdigit(cu)){if(cu=='-')fla=1;cu=getchar();}while(isdigit(cu))x=x*10+cu-'0',cu=getchar();if(fla)x=-x;}
template <typename T> inline void printe(const T x){if(x>=10)printe(x/10);putchar(x%10+'0');}
template <typename T> inline void print(const T x){if(x<0)putchar('-'),printe(-x);else printe(x);}
ll n,ans[24];
int a[24];
bool vis[24];
ll pow(ll x,ll y)
{ll res=1;for(;y;y>>=1,x=x*x)if(y&1)res*=x;return res;
}
void dfs(const int x)
{if(vis[x])return;vis[x]=1;dfs(a[x]);
}
void calc()
{memset(vis,0,sizeof(vis));int k=0;for(rg int i=0;i<n;i++)if(!vis[i])dfs(i),k++;ans[n]+=pow(3,k);
}
int main()
{for(n=1;n<24;n++){for(rg int i=0;i<n;i++){for(rg int j=0;j<n;j++)a[j]=(i+j)%n;calc();for(rg int j=0;j<n-j-1;j++)std::swap(a[j],a[n-j-1]);calc();}ans[n]/=2*n;}while(1){read(n);if(n==-1)break;print(ans[n]),putchar('\n');}return 0;
}
Burnside引理和Polya定理学习笔记相关推荐
- 解题报告 (五) Burnside引理和Polya定理
Burnside引理 笔者第一次看到Burnside引理那个公式的时候一头雾水,找了本组合数学的书一看,全是概念.后来慢慢从Polya定理开始,做了一些题总算理解了.本文将从最简单的例子出发,解释Bu ...
- Burnside引理和Polya定理详解(适合零基础)
声明:本知识点为帮助大家更好地理解置换群论这一抽象的内容,一些定义中掺杂了撰写者自身的理解,和严格的数学定义有些出入,基本为数学定义的缩小解释和限制解释. 另外,统一一些符号的使用. 对集合A,|A| ...
- 群论(Burnside引理和Polya定理)
群论 群指的是满足以下四个条件的一组元素的集合:(1)封闭性 (2)结合律成立 (3)单位元存在 (4)逆元存在.而在信息学中,我们主要用它来处理计数问题. Burnside引理 因为我们一般只会用P ...
- [学习笔记] 如果你愿意学那么你是可以看的懂的 —— 群论与 burnside 引理和 polya 定理
群与子群 <G,op><G,op><G,op> 是一个群需要满足以下条件: opopop 是一个满足结合律的二元运算,如 *,+. GGG 是一个集合,存在单位元 ...
- 【组合数学】通俗解释 Burnside引理和Polya定理
文章目录 前言 Burnside的数学定义: 用例子解释Burnside 用例子解释Polya定理 参考资料 前言 对于图形来说,如果通过旋转,图像能达到其他图像的效果,这叫做本质上一样. Burns ...
- 置换群和Burnside引理,Polya定理
定义简化版: 置换,就是一个1~n的排列,是一个1~n排列对1~n的映射 置换群,所有的置换的集合. 经常会遇到求本质不同的构造,如旋转不同构,翻转交换不同构等. 不动点:一个置换中,置换后和置换前没 ...
- lucas定理 学习笔记
lucas定理 学习笔记 文章目录 lucas定理 学习笔记 介绍 combination 题目描述 输入格式 输出格式 样例 输入样例1 输出样例2 分析 code 扩展lucas 介绍 lucas ...
- 群论:Burnside引理与Polya定理
正题 在数学中,群表示一个拥有满足封闭性.满足结合律.有单位元.有逆元的二元运算的代数结构,包括阿贝尔群. 置换,简单来说就是对元素来进行一种重排列,即 [1,n][1,n][1,n] 映射到 [1, ...
- Polya计数 学习笔记
置换 基本概念 置换是相对与群(当然我们讨论的是有限群= =)而言的一种操作. 通常我们这样来表示 (1a12a23a3⋯⋯nan)(123⋯na1a2a3⋯an) \left( \begin{mat ...
最新文章
- linux存储--linux内存分配图(九)
- Effective stl---笔记
- 用js控制选择CheckBoxList
- Oracle statspack 基本使用
- python编程加油_编程学习资料,中途加油站,c++/java/python/小程序/人工智能......等等等等...
- [转载]ext4的noatime
- 北京理工大学计算机学院赵曜,北理工学子参加第十届蓝桥杯全国软件和专业人才大赛取得佳绩...
- Python入门--创建类的对象
- 20200308——多项式回归预测工资
- 【work】输出日期为那一年的第几天
- 如何更改PS中的键盘快捷键
- uni-app uni-fab修改图标 浮窗位置 是否展开
- 免驱无线网卡插到电脑上突然驱动变成瑞昱网卡了无法正常联网
- 零基础学习PS——#photoshop# 的167个技能!
- python批量修改图片名
- 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析
- 删除服务残留注册表_强制卸载软件程序、清理注册表的好工具
- 炼钢行业皮带无人化管理的问题及解决
- 微信公众号自动回复功能
- 杭电2030java做法_杭电ACM2019java做法
热门文章
- Properties和IO流相结合的方法
- 新增房源服务实现之新增房源RESTful接口的开发
- spring配置详解-属性注入(p名称空间SPEL表达式)
- 学典教育计算机二级,层次化分类的离线中文签名真伪鉴别方法-计算机工程与应用.PDF...
- redis(9)--数据库
- linux将变量保存生成txt,linux-将输出命令保存在变量中并写入for循环
- python在工厂中的应用_Python工厂方法
- 计算机删除等级列在哪里,插入与删除Excel表格的单元格、行和列
- 多线程threading初识,线程等待
- 粘性控件,滑动停留StickLayout(导航栏滑动停留)