zoukankan      html  css  js  c++  java
  • 学习burnside、polya小结

    前言

    我好蔡啊
    之前597问我群论是什么,我一脸懵逼。
    心中暗自安慰自己——这玩意对现在的我用处不大。
    没想到第二天比赛就出了这么一道题。
    由于临近中考,中考压力过大,没有细学。
    硬着头皮,好歹也算是学会了。

    简介

    群论是法国数学家伽罗瓦(Galois)的发明。伽罗瓦是一个极具传奇性的人物,年仅21岁就英年早逝于一场近乎自杀的决斗中。他用该理论,具体来说是伽罗瓦群,解决了五次方程问题。在此之前柯西(Augustin-Louis Cauchy),阿贝尔(Niels Henrik Abel)等人也对群论作出了贡献。
    ——来自百度百科

    管他什么自杀的决斗呢,如果想知道为什么,去看看历史说不定知道。
    这不是重点。

    群论有很多很多的分支,但其中信息学主要利用的是其中的burnside与polya。

    群的定义

    首先,这个不重要。(其实是我懒得打一些奇奇怪怪的符号)
    贴一下百度百科的,了解一下即可
    在这里插入图片描述

    置换

    首先,置换这个玩意儿有点难以理解。
    在这里插入图片描述
    上面一排表示1被1到n中某个数a1a_1取代,2被1到n中某个数a2a_2代替,……,一直到n。
    并且a1,a2,a3,,ana_1,a_2,a_3,……,a_n互不相同。

    置换群

    其实这个就是一个置换的连接。
    它也满足群的4个条件:
    在这里插入图片描述
    百度百科写的真好。

    Burnside引理

    Burnside引理是一个结论,用来计算组合数中的等价类计算。是用于Polya的
    D(aj)D(a_j)表示在置换aja_j下不变的元素的个数,也可称作不定点。
    用L表示本质不同的方案数。

    结论就是:
    L=1Gj=1sD(aj)L=frac{1}{|G|}sum_{j=1}^sD(a_j)
    证明看这里 https://baike.baidu.com/item/burnside引理/1505996?fr=aladdin

    我们用一道题目来理解这个玩意:
    SGU294 He’s Circles
    大意就是给你一个有n颗珠子的项链,上面写着“X”和“E”,问本质不同的环有多少种。
    (本质不同的环指循环重构后相同,例如XEX与XXE是同一种情况)

    从这个题下手,当N=4时,一共有4种置换:(用s表示)
    在这里插入图片描述
    我们发现,所有的方案在置换a1a_1下都不变,则D(a1)=16D(a_1)=16
    XXXX、EEEE在置换a2a_2下不变,则D(a2)=2D(a_2)=2
    XXXX、EEEE、XEXE、EXEX在置换a3a_3下不变,则D(a3)=4D(a_3)=4
    XXXX、EEEE在置换a4a_4下不变,则D(a4)=2D(a_4)=2
    根据引理计算,可以得到:L=6L=6

    这个玩意儿很好用,可是其中的D很不好求,怎么办呢?

    Polya定理

    如果我们利用爆搜来搞其中的D,可以发现时间复杂度及其的BIG。
    接下来就要运用到polya定理了。

    首先,我们要明白循环节是什么东东。
    a1a2an=(a2a3a1a1a2an)(a1a2……an)=(^{a1a2……an}_{a2a3……a1})
    举个例子:
    在这里插入图片描述
    我们发现,其中(132)就是前面3个数字旋转。(45)这是后面2个数字旋转。
    由此可知,每个置换都可以写成若干个互不相交的循环。
    如上面(132)与(45)就互不相交。
    那么,循环节则表示一个置换中的循环个数。上述的循环节个数为2.

    实在无法理解可以看看这个:
    https://wenku.baidu.com/view/8ae2981033d4b14e84246829.html

    正题:
    Polya定理:设G为一个置换群,如上面一题,用m种颜料涂染n个珠子,则方案为:
    L=1G(mc(g1)+mc(g2)++mc(gs))L=frac1{|G|}(m^{c(g_1)}+m^{c(g_2)}+……+m^{c(g_s)})
    其中:c(gi)c(g_i)表示gig_i置换的循环节数,G=(g1,g2,,gs)G=(g_1,g_2,……,g_s)

    继续举个例子:
    同上题:
    g1g_1为(2,3,4,1)则g1=(4321),c(g1)=1g_1=(4321),c(g_1)=1
    g2g_2为(3,4,1,2)则g2=(13)(24),c(g2)=2g_2=(13)(24),c(g_2)=2
    g3g_3为(4,1,2,3)则g3=(1234),c(g3)=1g_3=(1234),c(g_3)=1
    g4g_4为(1,2,3,4)则g4=(1)(2)(3)(4),c(g4)=4g_4=(1)(2)(3)(4),c(g_4)=4
    因为m=2m=2则算出来可得L=6L=6

    接下来分析时间复杂度:
    通常情况下:
    求出一个置换的循环节点数:O(n)O(n)
    求出每个置换:O(s)O(s)
    结合起来就是:O(sn)O(sn)
    非常优秀。

    在上面的这道题,我们发现,c(gi)=n/gcd(n,i)c(g_i)=n/gcd(n,i)
    感性理解理解。
    所以就更加优秀了。

    例题

    jzoj4800. 【GDOI2017模拟9.24】周末晚会

    参考资料

    本人版权意识薄
    https://blog.csdn.net/liangzhaoyang1/article/details/72639208
    https://wenku.baidu.com/view/8ae2981033d4b14e84246829.html
    https://blog.csdn.net/gmh77/article/details/90731621
    百度百科

  • 相关阅读:
    day04
    day02
    day01
    if语句用户交互字符串
    python安装和pycharm安装教程
    day1预习
    博客园的使用
    python day 3
    从cbv到fbv:用函数写视图与用类写视图的区别(drf与restful)
    resful规范: 进行数据交换时的代码潜规则
  • 原文地址:https://www.cnblogs.com/RainbowCrown/p/11148356.html
Copyright © 2011-2022 走看看