Skip to content

Commit

Permalink
PUSH NOTE : Polya计数.md
Browse files Browse the repository at this point in the history
  • Loading branch information
hyj0824 committed Dec 15, 2024
1 parent a116f04 commit 0fa0187
Showing 1 changed file with 190 additions and 0 deletions.
190 changes: 190 additions & 0 deletions docs/数学/组合数学/Polya计数.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
---
tags:
- 置换
date: 2024-07-21
publish: true
---

无限制环染色问题:例如计算不同颜色的珠子串成的项链有多少种不同的排列方式,考虑到项链旋转对称性,这个问题就可以用置换群计数理论来解决。

## 基础知识

建议回顾一下映射,看一下ref。
### 置换

一个有限集合 $S$ 到自身的双射(一一对应,唯一性)称为 $S$ 的一个置换。集合 $S=\{a_1,a_2,\dots,a_n\}$ 上的置换可以表示为

$$
f=\begin{pmatrix}a_1,a_2,\dots,a_n\\
a_{p_1},a_{p_2},\dots,a_{p_n}
\end{pmatrix}
$$

意为将 $a_i$ 变为 $a_{p_i}$,其中 $p_1,p_2,\dots,p_n$ 是 $1,2,\dots,n$ 的一个排列。显然 $S$ 上所有置换的数量为 $n!$。连续的两次置换可以 **复合** 成一个置换。

### 置换群

置换的集合与置换复合运算构成的群。集合 $S$ 上的 **所有置换** 关于其复合运算满足封闭性、结合律(类似矩阵乘法)、有单位元(恒等置换,即每个元素映射成它自己)、有逆元(交换置换表示中的上下两行),因此构成一个群。所有置换构成的群,其任意一个 **子群** 都是 **置换群**

### 循环置换

也叫轮换。循环置换是一类特殊的置换,可表示为

$$
(a_1,a_2,\dots,a_m)=\begin{pmatrix}a_1,a_2,\dots,a_{m-1},a_m\\
a_2,a_3,\dots,a_m,a_1\end{pmatrix}
$$

若两个循环置换不含有相同的元素,则称它们是 **不相交** 的。有如下定理:

任意一个置换都可以分解为若干不相交的循环置换的乘积,例如

$$
\begin{pmatrix}a_1,a_2,a_3,a_4,a_5\\
a_3,a_1,a_2,a_5,a_4\end{pmatrix}=(a_1,a_3,a_2)\circ(a_4,a_5)
$$

该定理的证明也非常简单。如果把元素视为图的节点,映射关系视为有向边,则每个节点的入度和出度都为 1,因此形成的图形必定是若干个环的集合,而一个环即可用一个循环置换表示。

置换的循环节数:循环置换乘积表示中循环的个数,上例中为 2。

## Burnside 引理

建议先跳过定义,先跟着例子套一遍公式。

### 定义

设 $A$ 和 $B$ 为有限集合,$X$ 为 **一些** 从 $A$ 到 $B$ 的映射组成的集合。
$G$ 是 $A$ 上的置换群,且 $X$ 中的映射在 $G$ 中的置换作用下封闭。
$X/G$ 表示 $G$ 作用在 $X$ 上产生的所有等价类的集合
(若 $X$ 中的两个映射经过 $G$ 中的置换作用后相等,则它们在同一等价类中),则

$$
|X/G|=\frac{1}{|G|}\sum_{g\in G}|X^g|
$$

其中 $|S|$ 表示集合 $S$ 中元素的个数,且

$$
X^g=\{x|x\in X,g(x)=x\}
$$

[证明 - OI Wiki](https://oi-wiki.org/math/permutation-group/#%E8%AF%81%E6%98%8E)

### 例子

我们以给立方体染色RGB为例子,令立方体第 1~6 个面依次为前、后、上、下、左、右,一种染色方案对应一种映射(=函数)关系,例如:

$$
(a_1,a_2,a_3,a_4,a_5,a_6)=(R,R,R,R,G,B)
$$

把翻转用置换表示,比如,以左右两个面中心连线为轴,向上 $90^\circ$ 旋转的翻转操作:

$$
\begin{pmatrix}a_1,a_2,a_3,a_4,a_5,a_6\\
a_4,a_3,a_1,a_2,a_5,a_6
\end{pmatrix}
=
(a_1,a_4,a_2,a_3)(a_5)(a_6)
$$

这时把公式中一些符号的解释如下:

- $A$:映射定义域,立方体 6 个面的集合 $\{a_1,\cdots,a_6\}$
- $B$:包含映射值域的父集,本题中 $B$ 恰好就是值域,即 3 种颜色的集合 $\{R,G,B\}$
- $|X/G|$:答案,本质不同的染色方案数,本质相同的算作一个 **等价类**
- $|X|$:不考虑等价,所有的染色方案数,$3^6$
- $G$:所有合法的置换,这里是旋转、翻转。
- $|X^g|$:对于某一步置换 $g$,所有染色方案中,经过 $g$ 这种置换后染色仍然不变的方案数

例如上面的例子,则必须要满足上、下、前、后 4 个面的颜色一样,才能使旋转后不变,因此它对应的染色方案 $|X^g|=3^3$。本题中,底数恰是总颜色数,指数是置换的循环节数,这是巧合吗?(见:[[Polya计数#Pólya 定理|Polya计数 > Pólya 定理]]

进一步的,也是最核心的,我们对所有置换进行分析,**请有条理地考虑所有的一步置换!置换操作不能分步,而是一步到位,然后考虑变换前后不动的颜色**

- 不动:即恒等变换,因为所有直接染色方案经过恒等变换都不变,因此它对应的 $|X^g|=3^6$
- 以两个相对面的中心连线为轴的 $90^\circ$ 旋转:我们选取正反 $90^\circ$ 旋转、选取左右、上下、前后为轴,不变的染色方案数 $|X^g|=3^3$ 相同,故可以统一计算,共 $2\times3=6$ 种。
- 以两个相对面的中心连线为轴的 $180^\circ$ 旋转:相对面有 3 种选择,旋转方向的选择对置换不再有影响,因此这类共有 3 个置换。假设选择了前、后两个面中心的连线为轴,则必须要满足上、下两个面的颜色一样,左、右两个面的颜色一样,才能使旋转后不变,因此它对应的 $|X^g|=3^4$
- 以两条相对棱的中点连线为轴的 $180^\circ$ 旋转:相对棱有 6 种选择,旋转方向对置换依然没有影响,因此这类共有 6 个置换。假设选择了前、上两个面的边界和下、后两个面的边界作为相对棱,则必须要满足前、上两个面的颜色一样,下、后两个面的颜色一样,左、右两个面的颜色一样,才能使旋转后不变,因此它对应的 $|X^g|=3^3$
- 以两个相对顶点的连线为轴的 $120^\circ$ 旋转:相对顶点有 4 种选择,旋转的方向有两种选择,因此这类共有 8 个置换。假设选择了前面的右上角和后面的左下角作为相对顶点,则必须满足前、上、右三个面的颜色一样,后、下、左三个面的颜色一样,才能使旋转后不变,因此它对应的 $|X^g|=3^2$

会不会有置换没有考虑全呢?确实可能。但是我们可以通过最基本的几个置换的复合,得出完整的置换群来检验一下:

```cpp
#include <bits/stdc++.h>

using LL = long long;
using ull = unsigned long long;
using std::cin;
using std::cout;

std::vector<int> operator*(const std::vector<int>& a,
const std::vector<int>& b) {
std::vector<int> ans(a.size(), 0);
for (int i = 1; i < ans.size(); i++) { ans[i] = b[a[i]]; }
return ans;
}

struct Perm_Counter {
std::vector<std::vector<int>> perms;
std::set<std::vector<int>> s;
Perm_Counter(std::initializer_list<std::vector<int>> lst) : perms(lst) {}
void count() {
std::vector<int> id(1, 0);
for (int i = 1; i < perms[0].size(); i++) id.push_back(i);
_count(0, id);
cout << s.size() << std::endl;
}
void _count(int siz, std::vector<int> perm) {
if (siz == perms.size()) {
s.insert(perm);
return;
}
auto x = perms[siz];
for (int i = 1; i < perm.size(); i++) {
_count(siz + 1, perm * x);
x = x * perms[siz];
}
}
};

int main() {
Perm_Counter s{
{0, 4, 3, 1, 2, 5, 6}, {0, 5, 6, 3, 4, 2, 1}, {0, 1, 2, 6, 5, 3, 4}};
s.count();
return 0;
}
```
套公式,所有本质不同的方案数为
$$
\frac{1}{1+6+3+6+8}(1\times3^6+6\times3^3+3\times3^4+6\times3^3+8\times3^2)=57
$$
## Pólya 定理
### 定义
特殊的 Burnside 引理。若 $X$ 为 **所有** 从 $A$ 到 $B$ 的映射,公式可变形为
$$
|X/G|=\frac{1}{|G|}\sum_{g\in G}|B|^{c(g)}
$$
其中 $c(g)$ 表示置换 $g$ 能拆分成的不相交的循环置换(循环节数)的数量。
由于每个面涂颜色没有任何限制,也就说 $A$ 到 $B$ 的所有映射(所有染色方案)都可以合法,故每个循环节涂同一种颜色即可,每个置换对应的涂色方案 $|X^g|=|B|^{c(g)}$。
> [!question] 手环计数
> 6个珠子的手环涂3种颜色,有多少种本质不同的结构?
## References
[置换和轮换(新姿势,摘自黑书)-CSDN博客](https://blog.csdn.net/wu_tongtong/article/details/78136028)
[【组合数学】Pólya 计数理论\_polya计数-CSDN博客](https://blog.csdn.net/cold_code486/article/details/135114849)
高中数学必修一告诉我们,映射=函数。集合 $A,B$ 的元素个数为 $m,n$,那么,所有 $f:A\rightarrow B$ 的个数为 $n^m$,这里面包含了不满的映射。

0 comments on commit 0fa0187

Please sign in to comment.