zoukankan      html  css  js  c++  java
  • 【学习笔记】Polya定理

    笔者经多番周折终于看懂了( ext{Burnside})定理和( ext{Polya})定理,特来写一篇学习笔记来记录一下。


    群定义

    定义:群((G,·))是一个集合与一个运算·所定义的群。它所需要满足的性质是:

    • 结合律:对于任意(a,b,cin G,a·b·c=a·(b·c).)

    • 封闭性:对于任意(a,bin G,a·bin G.)

    • 单位元:存在(ein G,a·e=a.)

    • 逆元:(forall ain G,exists a'in G,a·a'=a'·a=e.)

    举一个例子:对于正方形旋转组成的群(旋转度数分别为(0,90,180,270)),旋转操作就是群中的元素,单位元就是旋转度数为(0)的操作。结合律显然满足,我们看剩下两个条件:

    • 封闭性:先旋转(90')再旋转(270')就相当于旋转(360')即旋转(0'in G.)容易证明对于每一种操作都存在这种封闭性。

    • 逆元:对于旋转(90')的操作我们可以再旋转(270')将它转换为单位元(0'.)对其它所有元素均存在逆元。

    所以这个由旋转操作构成的集合(操作是连续旋转)可以被证明是一个群。

    子群:即一个群(Hin G.)

    注意,群中的元素不一定满足交换律,所以才有了左陪集和右陪集的区别:

    • 左陪集 对于一个子群(Hin G,)一个元素(gin G,gH)称之为(H)的一个左陪集。(gH=forall hin H,g·h.)

    • 右陪集 对于一个子群(Hin G,)一个元素(gin G,Hg)称之为(H)的一个右陪集。(Hg=forall hin H,h·g.)

    陪集的一些性质(只讨论右陪集,左陪集同理)

    [forall gin G,|H|=|Hg| ]

    证明:

    (forall h_1in H,h_2in H,h_1·g ot =h_2·g)故得证。

    [forall gin G,gin Hg ]

    证明:

    由于(H)是群,所以包含单位元使得(gin H.)

    [Hg=HLongleftrightarrow gin H ]

    证明:

    (H)具有封闭性。

    [Ha=HbLongleftrightarrow a·b^{-1}in H ]

    证明:

    (Ha=Hb o Ha·b^{-1}=H o a·b^{-1}in H)

    (a·b^{-1}in H o Ha·b^{-1}=H o Ha=Hb)

    [Hacap Hb ot =oslash o Ha=Hb ]

    证明:

    这条性质意味着(H)的陪集要么不相交要么相等。

    (cin Ha,cin Hb o exists h_1,h_2in H,h_1·a=h_2·b=c o a·b^{-1}=h_2·h_1^{-1}in H o Ha=Hb.)


    群作用

    我们说一个群(G)作用于集合(X),当且仅当:

    给定一个函数(varphi(v,x))(其中,(vin G,xin X))有:

    [varphi(e,x)=x,varphi(a,varphi(b,x))=varphi(a·b,x) ]

    有上述函数时才有群(G)作用于(X.)


    置换

    用双行表示法来表示一个置换:

    [ ho= binom{1,2,3,4,5}{2,1,3,4,5} ]

    表示一个由序列(1,2,3,4,5)变为(2,1,3,4,5)的一个置换。大体就是用第一个元素代替第二个元素...以此类推。

    一个长度为(n)的不同置换数为(n!.)

    关于运算:( ho(a)=(a_{ ho_1},a_{ ho_2}...))

    可以证明,这些置换组成了群。


    轨道-稳定子定理

    定义:

    轨道(G(x))(x)通过(G)中所有元素作用可以达到的所有元素的集合。(gin G,g(x))(x)通过(g)这个元素作用可以达到的所有元素。

    稳定子(G^x=left { g|gin G,g(x)=x ight }) 即群(G)中所有 (g(x)=x)(g) 的集合。

    定理:(|G^x|*|G(x)|=|G|)

    可以得到,每一个状态(x)一定只属于一个轨道。我们把(g(x)=x)的点看做一个轨道的结尾,这个定理就很好证明了。


    Burnside 引理

    定义(G)是一个置换群且作用于集合(X,)(exists x,yin X,exists fin G,f(x)=y,)(x,y)属于一个等价类。

    注意!这里(f(x))不是一个函数,而是元素(x)(f)作用下得到的元素。

    则不同等价类的数量为:

    [Ans=frac{1}{|G|}sum_{gin G}X^g ]

    (X^g=|G^x|.)

    文字描述:(X) 在群 (G) 作用下的等价类总数等于每一个 (g) 作用于 (X) 的不动点的算数平均值。

    证明待补。

    关于这道题:群中元素就是(left { TurnZeroPlace,TurnOnePlace,TurnTwoPlace...Turn(N-1)Place ight },X)是所有置换所形成的环。

    对于旋转(k)个而言,其不动点等价于存在一个长度为(a)的循环节使得(a|k.)又因为必然(a|n)(转(n)格必然回到原始状态),所以改写判断条件为存在一个长度为(gcd(k,n))的循环节。而前(gcd(k,n))个元素可以任意填(染色,不是排列),所以答案就是(frac{1}{n}sum_{k=1}^n n^{gcd(k,n)})

    枚举(gcd)莫比乌斯反演得到(Ans=sum_{d|n} n^{d-1}varphi(n/d))可以(O(sqrt{n}))计算。

    模板题链接

    #include<bits/stdc++.h>
    using namespace std;
    const int mod=1e9+7;
    inline int add(int x,int y){return (x+y)%mod;}
    inline int mul(int x,int y){return 1ll*x*y%mod;}
    inline int qpow(int a,int b){
    	int res=1;
    	while(b){
    		if(b&1)res=mul(res,a);
    		a=mul(a,a);b>>=1;
    	}
    	return res;
    }
    int calc(int x){
    	int ans=x;
    	for(int i=2;i*i<=x;++i){
    		if(x%i)continue;
    		ans-=ans/i;
    		while(x%i==0)x/=i;
    	}
    	if(x!=1)ans-=ans/x;
    	return  ans;
    }
    int T,n;
    int main(){
    	scanf("%d",&T);
    	while(T--){
    		scanf("%d",&n);
    		int ans=0;
    		for(int i=1;i*i<=n;++i){
    			if(n%i)continue;
    			ans=add(ans,mul(qpow(n,i-1),calc(n/i)));
    			if(i*i==n)continue;
    			ans=add(ans,mul(qpow(n,n/i-1),calc(i)));
    		}
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    团队冲刺第一天
    leetcode整理
    eclipse 中JSP环境搭建
    java期末小结
    桌面宠物online------------------面对对象程序综合设计2020年
    java
    4.3 jmu-Java-03面向对象-06-继承覆盖综合练习-Person、Student、Employee、Company (20分)
    选择
    算法---分支限定0/1背包--蚁群算法
    博客园特效
  • 原文地址:https://www.cnblogs.com/h-lka/p/13663717.html
Copyright © 2011-2022 走看看