Burnside引理和Polya定理學習筆記

前言

求·······的方案數
循環同構算一種
一臉懵逼
(於是我覺得系統的學一遍Burnside引理和Polya定理)

正文

置換

置換的概念

對於一個排列aia_i
我們想成ii輸進去會出來一個aia_i
那麼我們如果輸入一個排列,將能得到一個排列
就比如我們輸入的排列是11nn有序的,那麼這個置換就是
(123na1a2a3an)\begin{pmatrix} 1&2&3&···&n \\ a_1&a_2&a_3&···&a_n \end{pmatrix}
當然我們如果隨便輸入一個排列bib_i,並且得到一個新的排列,那麼這個置換就是
(b1b2b3bnab1ab2ab3abn)\begin{pmatrix} b_1&b_2&b_3&···&b_n \\ a_{b_1}&a_{b_2}&a_{b_3}&···&a_{b_n} \end{pmatrix}
只要排列aia_i相同,無論輸入什麼排列bib_i生成的置換都是一樣的
即置換與橫向位置無關,只與縱向的對應關係有關
我們設A={a1,a2an}A=\{a_1,a_2···a_n\},即A=n|A|=n,我們稱上面的那些置換爲AA上的nn次置換
不難發現,本質不同的nn次置換一共有n!n!

置換的乘積形式

我們發現,對於一個置換,一個位置的數如果是ii,進行若干次置換後,這個位置的數會變回ii
比如一個置換
(123456231654)\begin{pmatrix} 1&2&3&4&5&6 \\ 2&3&1&6&5&4 \end{pmatrix}
一個數11其變化是12311\rightarrow2\rightarrow3\rightarrow1
那麼我們可以寫成(2,3,1)(2,3,1)
所有的循環的乘積就是這個置換的不相交循環的乘積寫法
比如剛剛這個置換就是(2,3,1)(6,4)(5)(2,3,1)(6,4)(5)
我們發現55這個位置無論進行幾次置換值都是55,對於這些位置我們稱其爲不動點

置換羣

是一種羣,裏面每個元素都是置換
然後滿足羣的一些性質
對於一個nn,在n!n!種本質不同的nn次置換中選xx個(x1x\ge1)置換作爲元素的羣被稱爲xxnn次置換羣,特殊的,當x=n!x=n!時,其被稱爲nn次對稱羣
對於一個nn次置換羣,我們發現其元素中必有置換
(a1a2a3ana1a2a3an)\begin{pmatrix} a_1&a_2&a_3&···&a_n \\ a_1&a_2&a_3&···&a_n \end{pmatrix}
另外,若其元素中有置換
(b1b2b3bnab1ab2ab3abn)\begin{pmatrix} b_1&b_2&b_3&···&b_n \\ a_{b_1}&a_{b_2}&a_{b_3}&···&a_{b_n} \end{pmatrix}
則其元素中也必有
(ab1ab2ab3abnb1b2b3bn)\begin{pmatrix} a_{b_1}&a_{b_2}&a_{b_3}&···&a_{b_n} \\ b_1&b_2&b_3&···&b_n \end{pmatrix}
以上就差不多是一些定義了
百度百科鏈接,
良好並且完整的置換羣課件,鏈接

Burnside引理

G={a1,a2,ag}G=\{a_1,a_2,…a_g\}aa是置換)是目標集[1,n][1,n]上的置換羣。每個置換都寫成不相交循環的乘積。c1(ak)c_1(a_k)是在置換aka_k的作用下不動點的個數,也就是長度爲11的循環的個數。通過上述置換的變換操作後可以相等的元素屬於同一個等價類。若GG[1,n][1,n]劃分成ll個等價類,則:
l=1G[c1(a1)+c1(a2)++c1(aG)]l=\frac{1}{|G|}[c_1(a_1)+c_1(a_2)+···+c_1(a_{|G|})]


證明:
對於一個置換aa,將其寫成不相交循環的乘積
我們設χa(x)={0x1x\chi_a(x)=\begin{cases}0&x不是不動點\\1&x是不動點\end{cases}
根據定義,我們展開
aiGc1(ai)=aiG1jnχai(j)=1jnaiGχ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)
我們設Z(x)\Zeta(x)爲滿足xx是不動點的置換集合,我們發現上式的後半部分可以直接套入
1jnaiGχai(j)=1jnZ(j)\sum_{1\le j\le n}\sum_{a_i\in G}\chi_{a_i}(j)=\sum_{1\le j\le n}|\Zeta(j)|
我們發現,對於同一個等價類裏的元素x1,x2x_1,x_2,一定滿足Z(x1)=Z(x2)Z(x_1)=Z(x_2),原因是Z(x)Z(x)集合是一個置換羣元素集合的子集
這樣我們設CC爲一個等價類元素集合,設c=xCc=\forall x\in C,那麼無論cc的取值,Z(c)Z(c)的值都是一樣的
那麼繼續上式
1jnZ(j)=CCZ(c)=GC1=GC=Gl\sum_{1\le j\le n}|\Zeta(j)|=\sum_{C}|C|*Z(c)=|G|\sum_{C}1=|G|·|C|=|G|l
對於第二個等號,可能你會感到疑惑
這裏用到了CZ(c)=G|C|*\Zeta(c)=|G|,即“軌道-穩定集定理”,這裏就不展開了,因爲這個的證明還需要拉格朗日定理等羣論基本知識,有興趣的可以看這篇博客,裏面有一些基本概念的介紹,另外,據說具體證明可以參照 《組合數學》(第5版)P181 定理4-11(暫未考證)
綜上l=1GaiGc1(ai)l=\frac{1}{|G|}\sum_{a_i\in G}c_1(a_i)


這篇博客裏有比較清楚的例子,我這裏就不舉例了
我們發現,在染色問題循環同構的題中,G|G|是旋轉方式數,A|A|是所有染色種類數,算法的複雜度是O(GA)\mathcal O(|G||A|)的,而後者很容易變得很大,這個時候就需要用到Polya定理
(也正因爲如此在OI中應用不多)

Polya定理

前提條件:如果將[1,n][1,n]kk種顏色進行染色
我們定義λ(ai)\lambda(a_i)爲置換aia_i的循環數量
Polya定理:
l=1GaiGkλ(ai)l=\frac{1}{|G|}\sum_{a_i\in G}k^{\lambda(a_i)}
Polya定理其實就是一種Burnside引理的具體化,就是把上面的c1(ai)c_1(a_i)算出來了

例題

[poj1286]Necklace of Beads
題目大意:現在有33種顏色的珠子,問有多少種長度爲nn的環,旋轉、軸對稱同構算一種
題解: 我們發現對於一個nn的置換隻有2n2*n種,直接套polya定理求環數量即可,複雜度O(n2)\mathcal O(n^2)

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章