Burnside引理和Polya定理

157 篇文章 0 订阅
31 篇文章 0 订阅

引理是为证明某个定理或解某个问题所要用到的命题。
引理和定理没有严格的区分,如果论证某个命题时,还没有直接根据,需要某些还没有被证明的结论,把它提出来加以证明,就是所谓的构造引理。
–百度百科
大佬博客
Burnside引理看起来神奇,虚不着地,是因为一般我们都会漏掉一个重要的条件:
我们的 G G G需要是一个置换群。
何谓群?
不止是一个集合。
我们需要满足:封闭性,结合律,有单位元,有逆元素。
这句话的意思是?
如果我们可以让两个集合里的置换相乘得到一个原来的集合里面没有的置换,那么这个集合就不是群。
那么就相当于:如果一个元素经历了两次置换群里的置换,那么我可以用这个置换群里的一个置换来代替这两个。

所以这个置换群并不是你想怎么写就怎么写的。
于是乎我们才可以推式子。
∑ ∣ Z i ∣ = ∑ c ( a i ) \sum |Z_i| = \sum c(a_i) Zi=c(ai)
(每个元素,不能使其变化的置换数)的和
等于
(每个置换,不能被其变换的元素数)的和。
然后
∑ ∣ Z i ∣ = ∑ i = 1 L ∑ k ∈ E i ∣ Z k ∣ \sum |Z_i| = \sum_{i=1}^L\sum_{k \in E_i} |Z_k| Zi=i=1LkEiZk
等价类间没有交集,等价类的并集等于全集。
∑ i = 1 L ∑ k ∈ E i ∣ Z k ∣ = ∑ i = 1 L ∣ E i ∣ ∣ Z k ∈ E i ∣ \sum_{i=1}^L\sum_{k \in E_i} |Z_k| = \sum_{i=1}^L|E_i||Z_{k \in E_i}| i=1LkEiZk=i=1LEiZkEi
同一等价类中(每个元素,不能使其变化的置换都一样)
我不会证。。。。。。
UPD:
这个用这样的一个式子来证明:
对于任意的元素 k k k , ∣ E k ∣ ∣ Z k ∣ = ∣ G ∣ |E_k||Z_k| = |G| EkZk=G
这个可以看作是对于元素 k k k,它的等价类内任意一个元素 p p p
k k k乘上一个置换 A p A_p Ap得到 p p p,那么 A p A_p Ap各不相同,有 ∣ E k ∣ |E_k| Ek个,除了 A k A_k Ak A k A_k Ak指定为恒等变换),
其他的 A A A之外的置换都不能改变 k k k
那么对于置换群 G G G内任意一个置换,它都可以唯一分解成 A p A_p Ap中的一个与一个使 k k k不动的置换 Z Z Z的乘积。
那么我们就证明了 ∣ E k ∣ ∣ Z k ∣ = ∣ G ∣ |E_k||Z_k| = |G| EkZk=G
那么对于同一个等价类的元素, ∣ E k ∣ |E_k| Ek相同, ∣ G ∣ |G| G不变,那么 ∣ Z k ∣ |Z_k| Zk都相同。。。。
∑ i = 1 L ∣ E i ∣ ∣ Z k ∈ E i ∣ = ∑ i = 1 L ∣ G ∣ = L ∣ G ∣ \sum_{i=1}^L|E_i||Z_{k\in E_i}|=\sum_{i=1}^L|G|=L|G| i=1LEiZkEi=i=1LG=LG
因为是置换群,每一个等价类中的元素象征着一个置换,再乘上所有令i不变化的置换的个数等于置换的总数,这是由群的性质得来的。

带权形式 b u r n s i d e \mathrm {burnside} burnside引理( E x b u r n s i d e \mathrm {Exburnside} Exburnside):
这个带权可不简单,不是像矩阵树定理那样简单的带个权。
上面我们计算的是等价类数也就是轨道数,
我们可以给每个等价类一个权值,求等价类的权值和
那么这个拓展很简单,我们只需要算每个置换其不动点所在的等价类的权值和即可。
我们还可以给每个稳定化子一个权值,稳定化子就是对于每个不动点,群内使其不动的置换,之前讲过每个等价类内稳定化子相同,标准形式的 b u r n s i d e \mathrm burnside burnside引理是默认稳定化子带权为 1 1 1,我们设一个置换 f f f的权值为 w ( f ) w(f) w(f),那么这个形式的 b u r n s i d e \rm burnside burnside就应该是这样的:
∑ f w ( f ) = 1 L ∑ ∣ E i ∣ ∑ f ∈ Z E i w ( f ) \sum_{f} w(f) = \frac 1{L}\sum |E_i|\sum_{f\in{Z_{E_i}}}w(f) fw(f)=L1EifZEiw(f)
然后就可以变魔术了。

Polya定理就是Burnside引理的套上置换循环理论的实用化。

模板题:
LG P4980 【模板】Polya定理
给定一个 n n n个点, n n n条边的环,有 n n n种颜色,给每个顶点染色,问有多少种本质不同的染色方案,答案对 1 0 9 + 7 10^9+7 109+7取模
注意本题的本质不同,定义为:只需要不能通过旋转与别的染色方案相同。
n < = 1 0 9 , 数 据 组 数 T < = 1 0 3 n<=10^9,数据组数T<=10^3 n<=109,T<=103

a n s = ∑ i = 0 n − 1 n g c d ( i , n ) n = ∑ i ∣ n φ ( n i ) n i n ans = \frac {\sum_{i=0}^{n-1}n^{gcd(i,n)}}n=\frac {\sum_{i|n}\varphi(\frac ni)n^i}n ans=ni=0n1ngcd(i,n)=ninφ(in)ni
可以分解质因数后做到 O ( n ) O(\sqrt n) O(n )

AC Code:

#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;

#define maxn 32
int pr[maxn],num[maxn],cnt;
int ans = 0,n,N;
int Pow(int base,int k){
	int ret = 1;
	for(;k;k>>=1,base=1ll*base*base%mod)
		if(k&1)
			ret=1ll*ret*base%mod;
	return ret;
}
void dfs(int now,int m,int p){
	if(now == cnt+1){
		ans = (ans + Pow(N,m) * 1ll * p) % mod;
		return;
	}
	for(int i=0;i<=num[now];i++){
		dfs(now+1,m,p);
		m*=pr[now],p/=(i==num[now]-1?pr[now]-1:pr[now]);
	}
}

int main(){
	int T , p;
	for(scanf("%d",&T);T--;){
		cnt=ans=0,p=1;
		scanf("%d",&n);N = n;
		for(int i=2;i*i<=n;i++) 
			if(n%i == 0){
				n /= i;
				pr[++cnt]=i,num[cnt]=1,p*=i-1;
				for(;n%i==0;)
					n/=i,num[cnt]++,p*=i;
			}
		if(n>1) pr[++cnt]=n,num[cnt]=1,p*=n-1;
		dfs(1,1,p);
		printf("%lld\n",((1ll*ans*Pow(N,mod-2)%mod)+mod)%mod);
	}
}

Polya型生成函数:
讲的很详细的一篇文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值