[学习笔记] 如果你愿意学那么你是可以看的懂的 —— 群论与 burnside 引理和 polya 定理
群與子群
<G,op><G,op><G,op> 是一個群需要滿足以下條件:
- opopop 是一個滿足結合律的二元運算,如 *,+。
- GGG 是一個集合,存在單位元 eee。
- GGG 中所有元素都有逆元。
- 即 GGG 對 opopop 運算封閉,封閉簡單理解就是元素的逆元也在里面,有單位元,任意兩個數二元運算結果也在里面。
這里的單位元,逆元,結合律按照一般的意思來理解即可。
雖然沒有要求滿足交換律,但還是定義逆元是 xx?1=x?1x=exx^{-1}=x^{-1}x=exx?1=x?1x=e。
如果還滿足交換律就叫做交換群。
群內元素只有“乘法”這一種運算規則,這個“乘法”指的就是 opopop 運算。
例如,op='+',那么 xy=x+y,xx?1=x+x?1=exy=x+y,xx^{-1}=x+x^{-1}=exy=x+y,xx?1=x+x?1=e。
<H,op><H,op><H,op> 是 <G,op><G,op><G,op> 的子群,滿足兩個條件:
- HHH 是 GGG 的子集。
- <H,op><H,op><H,op> 是個群。
階
群元素個數有窮時,階就等于元素個數。
置換群
映射:兩個集合之間元素的對應關系,可能一對多,多對一,一對一等。
置換:有限集合到自身的雙射,即一一對應。
設 S={a1,a2,...,an}S=\{a_1,a_2,...,a_n\}S={a1?,a2?,...,an?} 的一個置換 f=(a1a2…anap1ap2…apn)f=\begin{pmatrix}a_1\quad a_2\quad\dots\quad a_n\\a_{p_1}\quad a_{p_2}\quad\dots\quad a_{p_n}\end{pmatrix}f=(a1?a2?…an?ap1??ap2??…apn???)。
表示:將 aia_iai? 映射成 apia_{p_i}api??,即 ai=apia_i=a_{p_i}ai?=api??。其中 p1,...,pnp_1,...,p_np1?,...,pn? 是一個 nnn 元排列。
顯然 SSS 上所有的置換個數為 n!n!n!。
置換的乘法:即函數的合成。
對于兩個置換 f=(a1a2…anap1ap2…apn),g=(ap1ap2…apnaq1aq2…aqn)f=\begin{pmatrix}a_1\quad a_2\quad\dots\quad a_n\\a_{p_1}\quad a_{p_2}\quad\dots\quad a_{p_n}\end{pmatrix},g=\begin{pmatrix}a_{p_1}\quad a_{p_2}\quad\dots\quad a_{p_n}\\a_{q_1}\quad a_{q_2}\quad\dots\quad a_{q_n}\\\end{pmatrix}f=(a1?a2?…an?ap1??ap2??…apn???),g=(ap1??ap2??…apn??aq1??aq2??…aqn???),fff 和 ggg 的乘積記為 f°g=(a1a2…anaq1aq2…aqn)f\circ g=\begin{pmatrix}a_1\quad a_2\quad\dots\quad a_n\\a_{q_1}\quad a_{q_2}\quad\dots\quad a_{q_n}\\\end{pmatrix}f°g=(a1?a2?…an?aq1??aq2??…aqn???)。
即先做 fff 的映射再做 ggg 的映射。
定義 Sn={S_n=\{Sn?={ 所有的 nnn 元排列 }\}}。裝備了乘法opopop的 SnS_nSn? 的子群叫做 nnn 元置換群。
循環置換
循環置換是一類特殊的置換,表示為 (a1,a2,...,am)=(a1,a2,...,am?1,ama2,a3,...,am,a1)(a_1,a_2,...,a_m)=\begin{pmatrix}a_1,a_2,...,a_{m-1},a_m\\a_2,a_3,...,a_m,a_1\end{pmatrix}(a1?,a2?,...,am?)=(a1?,a2?,...,am?1?,am?a2?,a3?,...,am?,a1??)。
若兩個置換不含有相同的元素,則稱它們是不相交的。
舉個例子 A=(a1,a2a2,a1),B=(a4,a5,a6a5,a4,a6)A=\begin{pmatrix}a_1,a_2\\a_2,a_1\end{pmatrix},B=\begin{pmatrix}a_4,a_5,a_6\\a_5,a_4,a_6\end{pmatrix}A=(a1?,a2?a2?,a1??),B=(a4?,a5?,a6?a5?,a4?,a6??),則 A,BA,BA,B 就是不相交的,所含元素集合的交為空。
任何一個置換都可以分解成若干個(≥1\ge 1≥1)不相交的循環置換的乘積。
舉個例子,(a1,a2,a3,a4,a5,a6a2,a1,a3,a6,a4,a5)=(a1,a2)°(a3)°(a5,a6,a4)\begin{pmatrix}a_1,a_2,a_3,a_4,a_5,a_6\\a_2,a_1,a_3,a_6,a_4,a_5\end{pmatrix}=(a_1,a_2)\circ(a_3)\circ(a_5,a_6,a_4)(a1?,a2?,a3?,a4?,a5?,a6?a2?,a1?,a3?,a6?,a4?,a5??)=(a1?,a2?)°(a3?)°(a5?,a6?,a4?)。
證明:很簡單,將元素看作點,映射關系當成邊,則每個節點的入度和出度都為 111。形成的圖形必然是若干個環集合,而一個環就代表一個循環置換。
群的陪集分解
設 GGG 是群,HHH 是 GGG 的子群,a∈Ga\in Ga∈G。
定義 Ha={h∣ha∈H}Ha=\{h\mid ha\in H\}Ha={h∣ha∈H}。(這里的 hahaha 做乘法,是群的運算符號,即 h(op)ah(op)ah(op)a。
稱 HaHaHa 是子群 HHH 的在 GGG 中的一個右陪集。
顯然 He=H,a∈HaH_e=H,a\in HaHe?=H,a∈Ha。
?a∈G\forall a\in G?a∈G 有 H,HaH,HaH,Ha 等勢。(集合大小相同)
證明:構造從 H→HaH\rightarrow HaH→Ha 的雙射,只需讓 f(h)=haf(h)=haf(h)=ha 即可。
這說明在有限集的情況,HHH 與 HaHaHa 的階相同。
?a,b∈G,a∈Hb\forall a,b\in G,a\in Hb?a,b∈G,a∈Hb 等價于 ab?1∈Hab^{-1}\in Hab?1∈H 等價于 Ha=HbHa=HbHa=Hb 。
證明:a∈Hb?ab?1∈H?Hab?1∈Ha\in Hb\Rightarrow ab^{-1}\in H\Rightarrow Hab^{-1}\in Ha∈Hb?ab?1∈H?Hab?1∈H(HHH 是群,對內部元素是封閉的)?Ha∈Hb\Rightarrow Ha\in Hb?Ha∈Hb。
基于此,我們可以定義等價類關系并進行等價類分解。
定義等價類關系,?a,b∈G,ab?1∈H\forall a,b\in G,ab^{-1}\in H?a,b∈G,ab?1∈H,則將 a,ba,ba,b 劃分在同一個等價類里面。(以 HHH 為判定條件劃分 GGG 這個群空間)
同時得到 lagrange定理。
拉格朗日定理:設 GGG 是有限群,HHH 是 GGG 的子群,則 GGG 的階一定是 HHH 階的倍數,具體是多少倍看能分出多少個等價類來。
將 GGG 劃分成 Ha,Hb,...,HHa,Hb,...,HHa,Hb,...,H,任意兩個 ab?1∈?Hab^{-1}\not\in Hab?1?∈H,而上面又證明了 ∣Ha∣=∣H∣=∣Hb∣=...|Ha|=|H|=|Hb|=...∣Ha∣=∣H∣=∣Hb∣=...
每個等價類的大小是一樣的。
左陪集 aHaHaH 與右陪集完全一樣,不再贅述。
軌道-穩定子集定理
設 GGG 是集合 Ω\OmegaΩ 上的有窮置換群。a∈Ωa\in \Omegaa∈Ω。
定義 Ga={g∣g∈G∧g(a)=a}G^a=\{g\mid g\in G\wedge g(a)=a\}Ga={g∣g∈G∧g(a)=a},稱 GaG^aGa 為 aaa 的穩定子群。
解釋:aaa 是一個數,ggg 是一個置換,GaG^aGa 是所有置換 ggg 滿足 ggg 作用于 aaa 后仍是 aaa 不變的集合。
舉個例子,一個置換 g=(1234553241)g=\begin{pmatrix}1\ 2\ 3\ 4\ 5\\5\ 3\ 2\ 4\ 1\end{pmatrix}g=(1?2?3?4?55?3?2?4?1?),那么 G4G^4G4 就會含有這個 ggg。
定義 G(a)={g(a)∣g∈G}G(a)=\{g(a)\mid g\in G\}G(a)={g(a)∣g∈G},稱 G(a)G(a)G(a) 為 aaa 的軌道。
解釋:aaa 是一個數,ggg 是一個置換,g(a)g(a)g(a) 是 ggg 作用于 aaa 后的值,G(a)G(a)G(a) 是這些值的集合。
即 GGG 中所有置換作用于 aaa 后可能的值的集合。
舉個例子,一個置換 g∈G,g=(1234553241)g\in G,g=\begin{pmatrix}1\ 2\ 3\ 4\ 5\\5\ 3\ 2\ 4\ 1\end{pmatrix}g∈G,g=(1?2?3?4?55?3?2?4?1?),那么 G(1)G(1)G(1) 就會含有 555,G(2)G(2)G(2) 就會含有 333。
軌道-穩定子集定理:∣G∣=∣G(a)∣∣Ga∣\big|G\big|=\big|G(a)\big|\big|G^a\big|∣∣?G∣∣?=∣∣?G(a)∣∣?∣∣?Ga∣∣?。
證明:
首先顯然 GaG^aGa 是 GGG 的子群,GaG^aGa 對置換作用在置換上的這個二元運算封閉。
考慮陪集分解,任取兩個置換 x,y∈G,x(a)=y(a)?x?1(x(a))=a=x?1(y(a))?x?1y∈Ga?xGa=yGax,y\in G,x(a)=y(a)\Leftrightarrow x^{-1}(x(a))=a=x^{-1}(y(a))\Leftrightarrow x^{-1}y\in G^a\Leftrightarrow xG^a=yG^ax,y∈G,x(a)=y(a)?x?1(x(a))=a=x?1(y(a))?x?1y∈Ga?xGa=yGa。
這說明 xxx 和 yyy 在 GGG 關于 GaG^aGa 的陪集分解的同一個等價類中,當且僅當 x(a)=y(a)x(a)=y(a)x(a)=y(a)。
也就是說 ∣G(a)∣|G(a)|∣G(a)∣是 GGG 關于 GaG^aGa 的陪集分解的等價類的個數。
由拉格朗日定理知,等價類的個數也就是 GGG 的階是 GaG^aGa 的階的倍數。
得證。
burnside 引理
設 A,BA,BA,B 為有限集合。
GGG :AAA 上的置換群;ggg :∈G\in G∈G 的一個置換。
X:X:X: 一些從 AAA 到 BBB 的映射集合,且 XXX 在 GGG 下封閉。
X/G:GX/G:GX/G:G 作用在 XXX 上產生的所有等價類集合。
(若 XXX 的兩個映射經過 GGG 的置換作用后相同,則在同一個等價類中)
C(g)C(g)C(g) :ggg 作用在元素后不變的元素集合大小,即 C(g)=∣Xg∣,Xg={a∣g(a)=a}C(g)=|X^g|,X^g=\{a\mid g(a)=a\}C(g)=∣Xg∣,Xg={a∣g(a)=a}。
∣X/G∣=1∣G∣∑g∈GC(g)=∑a∈A1∣G(a)∣|X/G|=\frac{1}{|G|}\sum_{g\in G}C(g)=\sum_{a\in A}\frac 1{|G(a)|} ∣X/G∣=∣G∣1?g∈G∑?C(g)=a∈A∑?∣G(a)∣1?
證明:
∑g∈GC(g)=∑a∈A∣Ga∣=∑a∈A∣G∣∣G(a)∣=∣G∣∑a∈A1∣G(a)∣?1∣G∣∑g∈GC(g)=∑a∈A1∣G(a)∣=∣X/G∣\sum_{g\in G}C(g)=\sum_{a\in A} |G^a|=\sum_{a\in A}\frac{|G|}{|G(a)|}=|G|\sum_{a\in A}\frac{1}{|G(a)|}\Rightarrow \frac{1}{|G|}\sum_{g\in G}C(g)=\sum_{a\in A}\frac{1}{|G(a)|}=|X/G| g∈G∑?C(g)=a∈A∑?∣Ga∣=a∈A∑?∣G(a)∣∣G∣?=∣G∣a∈A∑?∣G(a)∣1??∣G∣1?g∈G∑?C(g)=a∈A∑?∣G(a)∣1?=∣X/G∣
∑g∈GC(g):\sum_{g\in G}C(g):∑g∈G?C(g): 枚舉置換,然后累和每個置換中不動點的個數。
∑a∣Ga∣:\sum_a|G^a|:∑a?∣Ga∣: 枚舉數,然后累和滿足 aaa 為不動點的置換個數。
二者只是枚舉出發方向不同,但結果是相同的。
∑a1∣G(a)∣:\sum_a\frac 1{|G(a)|}:∑a?∣G(a)∣1?: 由軌道-穩定子集定理,我們知道以 aaa 為分解參照, G(a)G(a)G(a) 內的所有元素構成一個等價類。
由陪集分解知,GGG 是一個群,無論 aaa 是什么,所有等價類都是大小一樣的。
那么假設 ∣G(a)∣=x|G(a)|=x∣G(a)∣=x,即所有等價類的大小均為 xxx,每個數都會貢獻 1x\frac{1}{x}x1?,∣G∣?1x|G|*\frac{1}{x}∣G∣?x1? 得到的就是等價類的個數,即 ∣X/G∣|X/G|∣X/G∣。
polya 定理
定義加強 X:X:X: 所有 AAA 到 BBB 的映射;定義 c(g):c(g):c(g): 置換 ggg 能拆分成的不相交的循環置換的個數。即環的個數。
∣X/G∣=1∣G∣∑g∈G∣B∣c(g)|X/G|=\frac{1}{|G|}\sum_{g\in G}|B|^{c(g)} ∣X/G∣=∣G∣1?g∈G∑?∣B∣c(g)
例如:對于有 nnn 個點形成的環 mmm 種顏色的染色問題,A={1,2,...,n},B={1,2,...,m}A=\{1,2,...,n\},B=\{1,2,...,m\}A={1,2,...,n},B={1,2,...,m},∣Xg∣=mc(g)|X^g|=m^{c(g)}∣Xg∣=mc(g)。
將置換看作圖上的一條有向邊,若置換后 u→vu\rightarrow vu→v,就連一條有向邊。那么就形成若干個環,環中元素的顏色一定相同。
在 OIOIOI 中一般求本質不同的方案數,本質不同就是不再同一個等價類,換言之一般考察的問題答案就是等價類個數 ∣X/G∣|X/G|∣X/G∣。
經典例題:poj2154
∣X/G∣=1∣G∣∑g∈Gmc(g)?ans=1n∑i=1nn(n,i)|X/G|=\frac{1}{|G|}\sum_{g\in G}m^{c(g)}\Rightarrow ans=\frac{1}{n}\sum_{i=1}^nn^{(n,i)}∣X/G∣=∣G∣1?∑g∈G?mc(g)?ans=n1?∑i=1n?n(n,i)。
第 iii 種置換的循環節個數為 gcd?(n,i)\gcd(n,i)gcd(n,i)。
這個環只能順時針/逆時針轉動,不妨考慮順時針,那么轉 0~n?10\sim n-10~n?1 個元素就對應不同的置換,共 nnn 種。
假設當前環的開頭為 xxx,在第 iii 種置換下有 x→x+i→x+2i→?→xx\rightarrow x+i\rightarrow x+2i\rightarrow\dots\rightarrow xx→x+i→x+2i→?→x。
假設在 x+kix+kix+ki 回到開頭,則 x≡x+ki(modn)?ki≡0(modn)?k=ngcd?(n,i)x\equiv x+ki\pmod n\Rightarrow ki\equiv 0\pmod n\Rightarrow k=\frac{n}{\gcd(n,i)}x≡x+ki(modn)?ki≡0(modn)?k=gcd(n,i)n?
這個 kkk 恰好就是環長度,所以個數為 n/k=gcd?(i,n)n/k=\gcd(i,n)n/k=gcd(i,n)
1n∑i=1nn(n,i)=1n∑d=1n∑i=1nnd[(n,i)=d]=∑d∣n∑i=1nnd?1φ(nd)\frac{1}{n}\sum_{i=1}^nn^{(n,i)}=\frac{1}{n}\sum_{d=1}^n\sum_{i=1}^nn^ozvdkddzhkzd[(n,i)=d]=\sum_{d\mid n}\sum_{i=1}^nn^{d-1}\varphi(\frac nd) n1?i=1∑n?n(n,i)=n1?d=1∑n?i=1∑n?nd[(n,i)=d]=d∣n∑?i=1∑n?nd?1φ(dn?)
可以在 O(n)O(\sqrt n)O(n?) 時間內枚舉所有因數 ddd。
預處理 1e61e61e6 以內的 φ\varphiφ,后面的就 n\sqrt{n}n? 暴力算。
#include <cstdio> #define maxn 1000005 int mod, cnt; bool vis[maxn]; int prime[maxn], phi[maxn];void sieve( int n = 1e6 ) {phi[1] = 1;for( int i = 2;i <= n;i ++ ) {if( ! vis[i] ) prime[++ cnt] = i, phi[i] = ( i - 1 );for( int j = 1;j <= cnt and 1ll * i * prime[j] <= n;j ++ ) {vis[i * prime[j]] = 1;if( i % prime[j] == 0 ) {phi[i * prime[j]] = phi[i] * prime[j];break;}else phi[i * prime[j]] = phi[i] * phi[prime[j]];}} }int qkpow( int x, int y ) {x %= mod;int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans; }int PHI( int x ) {if( x <= 1e6 ) return phi[x] % mod;int ans = x;for( int i = 2;i * i <= x;i ++ )if( x % i == 0 ) {ans = ans / i * ( i - 1 );while( x % i == 0 ) x /= i;}if( x ^ 1 ) ans = ans / x * ( x - 1 );return ans % mod; }int main() {sieve();int T, n;scanf( "%d", &T );while( T -- ) {scanf( "%d %d", &n, &mod );long long ans = 0;for( int i = 1;i * i <= n;i ++ ) {if( n % i ) continue;if( i * i == n ) (ans += qkpow(n, i - 1) * PHI(n / i) % mod) %= mod;else(ans += qkpow(n, i - 1) * PHI(n / i) % mod + qkpow(n, n / i - 1) * PHI(i) % mod) %= mod;}printf( "%lld\n", ans );}return 0; }總結
以上是生活随笔為你收集整理的[学习笔记] 如果你愿意学那么你是可以看的懂的 —— 群论与 burnside 引理和 polya 定理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3个路由器怎么组网多个路由器如何组网
- 下一篇: 求和(莫比乌斯反演)