日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

组合数学——群论学习总结

發(fā)布時(shí)間:2024/3/24 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 组合数学——群论学习总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這個(gè)算是組合數(shù)學(xué)里面比較難理解的,其實(shí)在競賽中用的不少,許多思想都很重要。

限于本人水平有限,下面很多的東西都是來自網(wǎng)上和其他的一些好的博客和視頻。

目錄

基礎(chǔ)概念

重要概念

重要定理

經(jīng)典習(xí)題



基礎(chǔ)概念

首先給出一些基本的群論方面的概念(重點(diǎn)不在這里,這里給出主要為了方便下面的學(xué)習(xí))。

在數(shù)學(xué)中,表示一個(gè)擁有滿足封閉性、滿足結(jié)合律、有單位元、有逆元的二元運(yùn)算的代數(shù)結(jié)構(gòu)(百度百科)

是不是很懵,我們先來看一個(gè)例子。

G = { 1 , -1 } 在普通乘法作用下是一個(gè)群(即(G,*)為一個(gè)群),為什么呢?下面一一驗(yàn)證。

首先它滿足封閉性:因?yàn)椴徽撨@兩個(gè)數(shù)怎么乘,最后的答案還在這個(gè)集合里面。

結(jié)合律: ?? 1 * (-1) * 1 * (-1)? = (-1) * ( 1 * 1 ) = -1。

單位元: 1。

逆元素: 1的逆元為1,-1的逆元為-1。

下面再來解釋一下這幾個(gè)性質(zhì)。

封閉性: 即該集合的任意兩個(gè)元素在該運(yùn)算符的作用下得到的結(jié)果還在這個(gè)集合里面。

結(jié)合律:

( . 即表示該運(yùn)算符)

單位元:

G中任意一個(gè)元素乘于該元素的結(jié)果都是本身。

逆元:G中的任意一個(gè)元素都有一個(gè)逆元

,則b稱為a的逆元,記做。

(結(jié)合上面的例子大家大概能理解這個(gè)東西吧!!!都是概念性的QWQ)

群元素的個(gè)數(shù)有限,稱為有限群,且其中元素的個(gè)數(shù)稱為階,記為|G|,群元素的個(gè)數(shù)無限,稱為無限群。

若對(duì)于群元素中的任意兩個(gè)元素a,b都有ab=ba那么稱G為交換群,簡稱Abel群。


重要概念

下面就是最關(guān)鍵的置換群,也是用的最多的(轉(zhuǎn)自https://blog.csdn.net/xuzengqiang/article/details/7476671)。

置換:簡單來說就是對(duì)元素進(jìn)行重排列,如下圖所示。置換是[1,n]到[1,n]的一一映射。
例:設(shè)X={1,2,3,4....n},設(shè)π是X的一個(gè)變換,滿足π:1->a1,2->a2,......n->an,其中a1,a2...an是X的一個(gè)排列,則稱π是X上的一個(gè)置換。
可將π記為

同一置換用這樣的表示法有n!種,但其對(duì)應(yīng)的關(guān)系不變。
假設(shè)循環(huán)π只這樣一個(gè)置換,滿足π:a1->a2,a2->a3,.............ak->a1,但是對(duì)于其他元素保持不變,即:a->a,
可將π記為

?
稱為k階循環(huán),k為循環(huán)長度。
每個(gè)置換都可以寫成若干個(gè)互不相交的循環(huán)的乘積,且表示是唯一的.

?

? ? 則可以表示為(124)(35)(6),置換的循環(huán)節(jié)數(shù)是上面的循環(huán)個(gè)數(shù),上面的例題的循環(huán)節(jié)數(shù)為3.
=============================================================================================
定義:設(shè)G是有限集X上的置換群,點(diǎn)a,b∈X稱為"等價(jià)"的,當(dāng)且僅當(dāng),存在π∈G使得π(a)=b,記為a~b,這種等價(jià)條件下,X的元素形成的等價(jià)類稱為G的軌道,它是集X的一個(gè)子集,G的任意兩個(gè)不同的軌道之交是空集,所以置換群G的軌道全體是集合X的一個(gè)劃分,構(gòu)成若干個(gè)等價(jià)類,等價(jià)類的個(gè)數(shù)記為L。
Zk (K不動(dòng)置換類):設(shè)G是1…n的置換群。若K是1…n中某個(gè)元素,G中使K保持不變的置換的全體,記以Zk,叫做G中使K保持不動(dòng)的置換類,簡稱K不動(dòng)置換類。
Ek(等價(jià)類):設(shè)G是1…n的置換群。若K是1…n中某個(gè)元素,K在G作用下的軌跡,記作Ek。即K在G的作用下所能變化成的所有元素的集合。.
這個(gè)時(shí)候有:|Ek|*|Zk|=|G|成立(k=1,2,.....n)
C(π):對(duì)于一個(gè)置換π∈G,及a∈X,若π(a)=a,則稱a為π的不動(dòng)點(diǎn)。π的不動(dòng)點(diǎn)的全體記為C(π)。例如π=(123)(3)(45)(6)(7),X={1,2,3,4,5,6,7};那么C(π)={3,6,7}共3個(gè)元素。


重要定理

下面講到了用的最多的polya定理和burnside定理。
Burnside引理:L=1/|G|*(Z1+Z2+Z3+Z4+......Zk)=1/|G|*(C(π1)+C(π2)+C(π3)+.....+C(πn))(其中k∈X,π∈G)

簡單點(diǎn)而言就是

對(duì)于一個(gè)置換f,若一個(gè)染色方案s經(jīng)過置換后不變,稱s為f的不動(dòng)點(diǎn)。將f的不動(dòng)點(diǎn)數(shù)目記為C(f),則可以證明等價(jià)類數(shù)目為所有C(f)的平均值.

舉個(gè)例子說明一下。(來自https://blog.csdn.net/liangzhaoyang1/article/details/72639208)

一正方形分成4格,2著色,有多少種方案?其中,經(jīng)過轉(zhuǎn)動(dòng)相同的圖象算同一方案。?

對(duì)于每種格子我們都有兩種選擇,所以會(huì)有一下16種方案: (百度百科)?
?
但是對(duì)于這16種方案可以歸一下類: ?
Θ不動(dòng):a1=(1)(2)…(16) ?
Θ逆時(shí)針轉(zhuǎn)90度 :a2=(1)(2)(3 4 5 6)(7 8 9 10) (11 12)(13 14 15 16) ?
Θ順時(shí)針轉(zhuǎn)90度 :a3=(1)(2)(6 5 4 3)(10 9 8 7)(11 12)(16 15 14 13) ?
Θ轉(zhuǎn)180度:a4=(1)(2)(3 5)(4 6)(7 9)(8 10)(11)(12) (13 15)(14 16) ?
(a,b,c)表示a,b,c可以通過旋轉(zhuǎn)得到。?
由Burnside引理,共有(16+2+2+4)/4=6(種方案).?
burnside是一種計(jì)數(shù)方法,用來計(jì)算含有不等價(jià)類的數(shù)量 ?
burnside算法的關(guān)鍵是找好“置換群”。?

利用Burnside引理要首先列出所有nm種可能的染色方案,然后找出在每個(gè)置換下保持不變的方案數(shù)。顯然當(dāng)m或nn很大的時(shí)候,這個(gè)方法會(huì)非常繁瑣。 這時(shí)就需要用到polya定理.


Polya定理:設(shè)G={π1,π2,π3........πn}是X={a1,a2,a3.......an}上一個(gè)置換群,用m中顏色對(duì)X中的元素進(jìn)行涂色,那么不同的涂色方案數(shù)為:1/|G|*(mC(π1)+mC(π2)+mC(π3)+...+mC(πk)). 其中C(πk)為置換πk的循環(huán)節(jié)的個(gè)數(shù)。

假設(shè)一個(gè)置換有k個(gè)循環(huán),易知每個(gè)循環(huán)對(duì)應(yīng)的所有位置顏色需一致,而任意兩個(gè)循環(huán)之間選什么顏色互不影響。因此,如果有m種可選顏色,則該置換對(duì)應(yīng)的不動(dòng)點(diǎn)個(gè)數(shù)為。用其替換burnside引理中的C(f),即。得到等價(jià)類數(shù)目為:

?

其中|F|表示置換的數(shù)目,ki表示第i個(gè)置換包含的循環(huán)個(gè)數(shù)。

?
還是這個(gè)例子吧。

Θ不動(dòng):a1=(1)(2)(3)(4) ?
Θ旋轉(zhuǎn)90度 :a2=(1 2 3 4) ?
Θ旋轉(zhuǎn)180度 :a3=(1 3)(2 4) ?
Θ旋轉(zhuǎn)270度:a4=(1 4 3 2) ?
比如,“逆時(shí)針旋轉(zhuǎn)180度”,這個(gè)置換寫成循環(huán)的乘積就是(1,3)(2,4),即1和3互變,2和4互變,不難發(fā)現(xiàn),1和3的顏色必須相同,2和4的顏色也必須相同,而1-3和2-4的顏色互不相干。?
由Polya定理得,共有種方案).?
可以看Burnside引理和Polya定理是一樣的,Polya定理是Burnside引理的優(yōu)化。
?


經(jīng)典習(xí)題

終于把概念說完了,花了將近一節(jié)實(shí)驗(yàn)!

下面給出一些經(jīng)典和好的習(xí)題

發(fā)一個(gè)我自己在vjudge上拉的群論專題訓(xùn)練:https://vjudge.net/contest/332708

其實(shí)主要分了三個(gè)部分:置換(循環(huán)節(jié)),burnside定理和polya定理(其實(shí)還有一道原根的題,就是懶省事)。

再發(fā)一個(gè)答案詳解的鏈接:https://blog.csdn.net/WhereIsHeroFrom/article/details/79631703

我自己拉的專題里面有一些題目是來自這個(gè)博客,不過里面有一些錯(cuò)誤,估計(jì)也是作者的筆誤,我還是建議不會(huì)的話對(duì)單獨(dú)的一個(gè)題百度搜索,找到一個(gè)自己喜歡的講解詳細(xì)的代碼進(jìn)行理解。

下面拋幾道我覺得很不錯(cuò)的題:

詳解請參考上面發(fā)的博客鏈接。

poj2888

一道綜合知識(shí)運(yùn)用的好題,需要用到的知識(shí):矩陣快速冪,burnside定理,快速冪,逆元,質(zhì)數(shù)線性篩,求歐拉函數(shù)值以及對(duì)公式的化簡。

這個(gè)題還有一個(gè)升級(jí)版本,需要利用矩陣來求出遞推式(hdu2865)

下面拋代碼(其實(shí)我是為了補(bǔ)之前寫的題的博客QAQ)

#include <iostream> #include <algorithm> #include <cmath> #include <cstring> #include <cstdio> #include <cstdlib> #include <vector> #include <map> #include <set> #include <stack> #include <queue> #define rp(i, s, t) for (i = (s); i <= (t); i++) #define RP(i, s, t) for (i = (t); i >= (s); i--) #define ll long long #define ull unsigned long long using namespace std; inline int read() {int a = 0, b = 1;char c = getchar();while (c < '0' || c > '9'){if (c == '-')b = -1;c = getchar();}while (c >= '0' && c <= '9'){a = (a << 3) + (a << 1) + c - '0';c = getchar();}return a * b; } inline void write(int n) {if (n < 0){putchar('-');n = -n;}if (n >= 10)write(n / 10);putchar(n % 10 + '0'); } struct Matrix {int mat[12][12]; } G;//矩陣 const int p = 9973; int n, m, k; const int N = 1e5 + 7; int visited[N], prime[N]; int tot; void init() //預(yù)處理求出一部分的質(zhì)數(shù)(線性篩) {memset(visited, 0, sizeof visited);tot = 0;int i;rp(i, 2, N - 1){if (!visited[i]){prime[tot++] = i;for (int j = i + i; j < N; j += i)visited[j] = 1;}} } ll phi(ll n) //求n得歐拉函數(shù)的值 {ll res = n;for (int i = 0; prime[i] * prime[i] <= n; i++){if (n % prime[i] == 0){res = res - res / prime[i];while (n % prime[i] == 0)n /= prime[i];}}if (n > 1)res = res - res / n;return res % p; } ll quick_mod(ll a, ll b) //快速冪 {ll res = 1;while (b){if (b & 1)res = (res * a) % p;a = (a * a) % p;b >>= 1;}return res % p; } Matrix mult(Matrix a,Matrix b){Matrix c;memset(c.mat,0,sizeof c.mat);int i,j,k;rp(i,0,m-1){rp(k,0,m-1){if(a.mat[i][k]){rp(j,0,m-1){c.mat[i][j]=(c.mat[i][j]+a.mat[i][k]*b.mat[k][j])%p;}}}}return c; } Matrix mat_pow(Matrix a,int b){int i;Matrix res;memset(res.mat,0,sizeof res.mat);rp(i,0,m-1) res.mat[i][i]=1;while(b){if(b&1) res=mult(res,a);a=mult(a,a);b>>=1;}return res; } ll solve(int len) {ll res = 0;int i;Matrix matrix = mat_pow(G, len);rp(i, 0, m - 1)res += matrix.mat[i][i];return res % p; } void burnside() {ll ans = 0;for (int i = 1; i * i <= n; i++){if (n % i == 0){if (i * i == n)ans = (ans + solve(i) * phi(i)) % p;elseans = (ans + solve(n / i) * phi(i) + solve(i) * phi(n / i)) % p;}}ans = (ans * quick_mod(n, p - 2)) % p;//乘上n的逆元write(ans);printf("\n"); } int main() {int T = read(), i, j;init();while (T--){n = read(), m = read(), k = read();rp(i, 0, m - 1)rp(j, 0, m - 1)G.mat[i][j] = 1;while (k--){int u = read(), v = read();G.mat[u - 1][v - 1] = G.mat[v - 1][u - 1] = 0;}burnside();}return 0; }

還有一道burnside定理+多重集排列的綜合題,也是很不錯(cuò)的題,思想很好(UVA11255)。

就不解釋題目和答案了,看代碼理解是每一個(gè)acm的必經(jīng)之路。。。。。

#include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<cstdio> #include<cstdlib> #include<vector> #include<map> #include<set> #include<stack> #include<queue> #define rp(i,s,t) for (i = (s); i <= (t); i++) #define RP(i,s,t) for (i = (t); i >= (s); i--) #define ll long long #define ull unsigned long long using namespace std; inline int read() {int a=0,b=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')b=-1;c=getchar();}while(c>='0'&&c<='9'){a=(a<<3)+(a<<1)+c-'0';c=getchar();}return a*b; } inline void write(int n) {if(n<0){putchar('-');n=-n;}if(n>=10)write(n/10);putchar(n%10+'0'); } int a[3],sum; ll C[105][105]; ll gcd(ll a,ll b){return b==0?a:gcd(b,a%b); } void init() {memset(C,0,sizeof(C));int i,j;C[1][1]=C[0][0]=1;rp(i,1,104) C[i][0]=1;rp(i,2,104)rp(j,1,i)C[i][j]=C[i-1][j]+C[i-1][j-1]; } ll solve(int k) {int b[3],s=0,i;rp(i,0,2){if(a[i]%k!=0) return 0;s+=a[i]/k;b[i]=a[i]/k;}ll ans=1;rp(i,0,2){ans*=C[s][b[i]];s-=b[i];}return ans; } void burnside() {sum=a[0]+a[1]+a[2];ll ans=0;int i,j;rp(i,1,sum) ans+=solve(sum/gcd(sum,i));if(sum&1){rp(i,0,2){if(a[i]<1) continue;a[i]-=1;ans+=sum*solve(2);a[i]+=1;}}else{rp(i,0,2){if(a[i]<1) continue;a[i]-=1;rp(j,0,2){if(a[j]<1) continue;a[j]-=1;ans+=(sum/2)*solve(2);a[j]+=1;}a[i]+=1;}ans+=(sum/2)*solve(2);}printf("%lld\n",ans/(2*sum)); } int main(){int T=read(),i;init();while(T--){rp(i,0,2) a[i]=read();burnside();}return 0; }

?

?

?

?

?

?

?

?

?

總結(jié)

以上是生活随笔為你收集整理的组合数学——群论学习总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。