前言

求·······的方案数
循环同构算一种
一脸懵逼
(于是我觉得系统的学一遍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}(1a1​​2a2​​3a3​​⋅⋅⋅⋅⋅⋅​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}(b1​ab1​​​b2​ab2​​​b3​ab3​​​⋅⋅⋅⋅⋅⋅​bn​abn​​​)
只要排列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}(12​23​31​46​55​64​)
一个数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}(a1​a1​​a2​a2​​a3​a3​​⋅⋅⋅⋅⋅⋅​an​an​​)
另外,若其元素中有置换
(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}(b1​ab1​​​b2​ab2​​​b3​ab3​​​⋅⋅⋅⋅⋅⋅​bn​abn​​​)
则其元素中也必有
(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}(ab1​​b1​​ab2​​b2​​ab3​​b3​​⋅⋅⋅⋅⋅⋅​abn​​bn​​)
以上就差不多是一些定义了
百度百科链接,群
良好并且完整的置换群课件,链接

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)={01​x不是不动点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∣1​ai​∈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∣1​ai​∈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定理学习笔记相关推荐

  1. 解题报告 (五) Burnside引理和Polya定理

    Burnside引理 笔者第一次看到Burnside引理那个公式的时候一头雾水,找了本组合数学的书一看,全是概念.后来慢慢从Polya定理开始,做了一些题总算理解了.本文将从最简单的例子出发,解释Bu ...

  2. Burnside引理和Polya定理详解(适合零基础)

    声明:本知识点为帮助大家更好地理解置换群论这一抽象的内容,一些定义中掺杂了撰写者自身的理解,和严格的数学定义有些出入,基本为数学定义的缩小解释和限制解释. 另外,统一一些符号的使用. 对集合A,|A| ...

  3. 群论(Burnside引理和Polya定理)

    群论 群指的是满足以下四个条件的一组元素的集合:(1)封闭性 (2)结合律成立 (3)单位元存在 (4)逆元存在.而在信息学中,我们主要用它来处理计数问题. Burnside引理 因为我们一般只会用P ...

  4. [学习笔记] 如果你愿意学那么你是可以看的懂的 —— 群论与 burnside 引理和 polya 定理

    群与子群 <G,op><G,op><G,op> 是一个群需要满足以下条件: opopop 是一个满足结合律的二元运算,如 *,+. GGG 是一个集合,存在单位元 ...

  5. 【组合数学】通俗解释 Burnside引理和Polya定理

    文章目录 前言 Burnside的数学定义: 用例子解释Burnside 用例子解释Polya定理 参考资料 前言 对于图形来说,如果通过旋转,图像能达到其他图像的效果,这叫做本质上一样. Burns ...

  6. 置换群和Burnside引理,Polya定理

    定义简化版: 置换,就是一个1~n的排列,是一个1~n排列对1~n的映射 置换群,所有的置换的集合. 经常会遇到求本质不同的构造,如旋转不同构,翻转交换不同构等. 不动点:一个置换中,置换后和置换前没 ...

  7. lucas定理 学习笔记

    lucas定理 学习笔记 文章目录 lucas定理 学习笔记 介绍 combination 题目描述 输入格式 输出格式 样例 输入样例1 输出样例2 分析 code 扩展lucas 介绍 lucas ...

  8. 群论:Burnside引理与Polya定理

    正题 在数学中,群表示一个拥有满足封闭性.满足结合律.有单位元.有逆元的二元运算的代数结构,包括阿贝尔群. 置换,简单来说就是对元素来进行一种重排列,即 [1,n][1,n][1,n] 映射到 [1, ...

  9. Polya计数 学习笔记

    置换 基本概念 置换是相对与群(当然我们讨论的是有限群= =)而言的一种操作. 通常我们这样来表示 (1a12a23a3⋯⋯nan)(123⋯na1a2a3⋯an) \left( \begin{mat ...

最新文章

  1. linux存储--linux内存分配图(九)
  2. Effective stl---笔记
  3. 用js控制选择CheckBoxList
  4. Oracle statspack 基本使用
  5. python编程加油_编程学习资料,中途加油站,c++/java/python/小程序/人工智能......等等等等...
  6. [转载]ext4的noatime
  7. 北京理工大学计算机学院赵曜,北理工学子参加第十届蓝桥杯全国软件和专业人才大赛取得佳绩...
  8. Python入门--创建类的对象
  9. 20200308——多项式回归预测工资
  10. 【work】输出日期为那一年的第几天
  11. 如何更改PS中的键盘快捷键
  12. uni-app uni-fab修改图标 浮窗位置 是否展开
  13. 免驱无线网卡插到电脑上突然驱动变成瑞昱网卡了无法正常联网
  14. 零基础学习PS——#photoshop# 的167个技能!
  15. python批量修改图片名
  16. 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析
  17. 删除服务残留注册表_强制卸载软件程序、清理注册表的好工具
  18. 炼钢行业皮带无人化管理的问题及解决
  19. 微信公众号自动回复功能
  20. 杭电2030java做法_杭电ACM2019java做法

热门文章

  1. Properties和IO流相结合的方法
  2. 新增房源服务实现之新增房源RESTful接口的开发
  3. spring配置详解-属性注入(p名称空间SPEL表达式)
  4. 学典教育计算机二级,层次化分类的离线中文签名真伪鉴别方法-计算机工程与应用.PDF...
  5. redis(9)--数据库
  6. linux将变量保存生成txt,linux-将输出命令保存在变量中并写入for循环
  7. python在工厂中的应用_Python工厂方法
  8. 计算机删除等级列在哪里,插入与删除Excel表格的单元格、行和列
  9. 多线程threading初识,线程等待
  10. 粘性控件,滑动停留StickLayout(导航栏滑动停留)