zoukankan      html  css  js  c++  java
  • 重新入门的Polya定理

    前言

    之前根据别人的博客学习(Polya)定理,不知道为什么总是一脸懵逼。

    今天在法老建议下,去翻了翻集训队论文《Pólya原理及其应用》,一点一点看下来突然就懂了?

    最基础的定义。

    对于一个集合(G)以及一个给定的二元运算(*),满足以下条件:

    • 封闭性: 对于(G)中所有(a,b)(a*b)都在集合中。
    • 结合律: 对于(G)中所有(a,b,c),满足((a*b)*c=a*(b*c))
    • 单位元:(G)中存在一个(e),满足对于(G)中所有的(a),都有(a*e=e*a=a)
    • 逆元: 对于(G)中所有的(a),都存在一个同在(G)中的(b),满足(a*b=e)

    于是就称集合(G)在运算(*)之下是一个群

    一个简单的公式

    [|E_k| imes |Z_k|=|G| ]

    此处(G)是一个(1sim n)的置换群(置换群的定义比较简单,相信大家都会),而(k)(1sim n)的某个元素。

    • (Z_k)(k)不动置换类): (G)中使(k)保持不变的所有置换记作(Z_k),简称(k)不动置换类。
    • (E_k)等价类):(k)(G)的作用下能够变化得到的所有元素记作(E_k)

    根据定义,其实很容易就能证明上面公式的正确性。

    (Burnside)引理

    首先介绍一个新的定义:

    • (D(a_j)):在置换(a_j)下不变的元素个数。

    由于(|Z_k|)表示的是使(k)不变的置换个数,(D(a_j))表示的是置换(a_j)下不变的元素个数,二者显然有一个等量关系:

    [sum_{k=1}^n|Z_k|=sum_{j=1}^sD(a_j) ]

    然后,我们假设共有(N={1,2,...,n})中共有(L)个等价类(注意,(L)就是一般情况下我们要求的东西),即设:

    [N=E_1+E_2+...+E_L ]

    我们重新考虑(sum_{k=1}^n|Z_k|),就可以发现:

    [sum_{k=1}^n|Z_k|=sum_{i=1}^Lsum_{kin E_i}|Z_k|=sum_{i=1}^L|E_i| imes|Z_i| ]

    根据最早的那个公式,(|E_k| imes |Z_k|=|G|),得到:

    [sum_{k=1}^n|Z_k|=L imes |G| ]

    单独保留(L),得到:

    [L=frac1{|G|}sum_{k=1}^n|Z_k|=frac1{|G|}sum_{j=1}^sD(a_j) ]

    (Polya)定理

    考虑到在(Burnside)引理中,(D(a_j))依旧不好算。

    我们定义一个置换(g_i)的循环个数为(c(g_i))

    容易发现,对于(g_i)同一循环节中的元素涂上相同颜色所得方案数(m^{c(g_i)}),就等于(a_i)作用下不变的图象数。

    也就是说:

    [L=frac1{|G|}sum_{i=1}^sm^{c(g_i)} ]

    这就是(Polya)定理的公式了。

    模板题

    可以看看这篇失败的博客:入门失败的Polya定理

  • 相关阅读:
    217MySQL读写分离mysqlproxy
    shell脚本自动化安装LAMP
    Mybatis的如何根据下划线_,百分号%模糊查询escape的作用
    springboot下MVC的MessageConverters和静态资源位置的配置
    全局性事务控制如何在springboot中配置
    最详细的@Transactional讲解
    常用网址
    truncate、drop、delete区别
    CommandLineRunner、ApplicationRunner 接口
    交叉编译,为什么需要交叉编译
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/Polya.html
Copyright © 2011-2022 走看看