[组合数学] 圆排列和欧拉函数为啥有关系:都是polya定理的锅

本文是一个笨比学习组合数学的学习笔记,因为是笨比,所以写的应该算是很通俗易懂了。

首先,我们考虑这么一个问题:你有无穷多的p种颜色的珠子,现在你想要的把他们中的n个以圆形的形状等间距的黏在一个可以旋转的圆盘上,求方案数。

然后,该问题的答案是 1nΣd|nϕ(nd)pd ,之中ϕ()表示欧拉函数,下面解释一下为什么会出现这样一个公式。

首先,我们来复习一下polya定理:设一个序列上定义了一置换群|G|,则对该序列做p种颜色的染色,方案数为1|G|Σi=1|G|pci,之中,|G|表示置换群大小(元素个数),ci表示G中第i个置换的循环节数目。

那么在上述圆排列问题中,置换群也就是旋转变换的群了,注意这里不考虑翻转变换(这也是为什么题目里说要黏在可旋转的圆盘上的原因,这样就和翻转变换无关了)。那么显然,一个有n个珠子的圆环,一共对应了n种旋转变换,分别是从转1个单位到转n个单位(也就是不转,或者说转0个单位)的n种。因此,置换群大小|G|=n

|G|=n代入polya的公式里,得到ans=1nΣi=1npci,那么对比真正的答案,接下来要说明的就是,为什么Σi=1npci=Σd|nϕ(nd)pd

答案其实简单的有些弱智:合并同类项

Σi=1npci这一式子里,其实有n项,那么很自然的一个想法就是:pci是不是有不少重复的呢?事实上,是的,甚至只有n种不同的pci

下面随便假设有个指数d,那我想知道Σi=1npci,有几个pd出现,也就是有几个ci=d。回忆一下,这里ci指的是第i个置换循环节的数量,这个要怎么求呢?这里需要一个简单但nb的小知识:

定理:对于n个珠子组成的圆的旋转变换来说,旋转了x个单位的变换对应的循环节数量有gcd(n,x)个。

不是证明的证明:考虑一个青蛙跳石头的问题,也就是有n块石头圆形排列,编号从0n1,青蛙初始在pos的位置,每次青蛙会跳x步,那么青蛙跳一步就相当于pos=(pos+x),现在,请问青蛙一直跳下去,能踩到多少块石头。例如,n=6,x=4,pos=2时,青蛙就只能跳到编号为0,2,4的三块儿石头上。该问题的答案是ngcd(n,x),这个证明略了,这是个比较好理解但不太好表述的数论结论。

那么,如果我们把旋转x个单位的置换群理解成每步跳x格的青蛙的话,就有循环节长度 = 青蛙能跳到的石头个数 = ngcd(n,x) 。又因为从青蛙的例子里可以看出,该长度和青蛙初始的pos无关,所以所有的循环节长度都是ngcd(n,x)
进而,由于 n=循环节长度*循环节数量,就可以解得循环节数量为gcd(n,x),这就是旋转x对应置换的循环节数量。

书归正传,我们现在想知道的是,给定一个整数d,有几个pd出现在Σi=1npci中,或者说多少个ci=dci的含义是循环节数量,也就是对于x[1,n],有多少个x对应的循环节数量是d。废话不多说,按刚才的结论,这也就是问有多少个x满足gcd(n,x)=d

有多少个x满足gcd(n,x)=d:这又是个数论问题,首先,变换成gcd(nd,xd)=1,这个变换是科学的,因为gcd(n,x)=dnx一定是d的倍数。那么,有多少个x满足gcd(nd,xd)=1呢?由于满足gcd(nd,)=1的狗有ϕ(n/d)个(根据欧拉函数的定义),而狗和x显然是一一对应的,所以这样的x就也有ϕ(n/d)个。

所以,ans=1nΣi=1npci=1nΣd|nϕ(nd)pd,这里d|n是因为根据上面推导,循环节数量d显然一定是n的因子。

posted @   炸鸡块君  阅读(588)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示