zoukankan      html  css  js  c++  java
  • 【莫比乌斯反演】学习笔记

    莫比乌斯反演

    前言

    本来是一个返校后发困的上午,但是我新奇的点开了牛客去补题,结果发现【您中奖了!牛客抱枕++】,顿时心血来潮,困意一冲而散。哎,这该死的运气,(不!是这该死的实力)。然后感觉怎么看着数学题越看越有劲,于是来重新填一下这个大坑,现在看自己当时学了些啥呀!

    来源

    莫比乌斯函数: 他起源于欧拉函数的求解当中。

    欧拉函数和莫比乌斯函数有着千丝万缕的联系。

    人们都称莫比乌斯函数是一个容斥,确实是这样。

    容斥原理推欧拉函数

    对于 (phi) 函数的性质,当求解一个素因子 (phi(p^k)) ,我们有:(phi(p^k)=p^k-p^{k-1}=p^k(frac{p-1}{p}))

    证明如下:

    主体:容斥原理,与 (p^k) 不互素的数分别为 (p,2p,3p,4p...p^{k-1}p) ,这么看来一共有 (p^{k-1}) 个,所以我们容斥的得到答案:

    [phi(p^k)=p^k-p^{k-1} ]

    那么对于任意数的求解我们都可以拆成素因子相乘的形式,因此有了对任意数求解欧拉函数的公式,也叫算数基本定理。

    [phi(N)=N imes prod frac{p-1}{p_i} ]

    然而....上面的证明貌似不是容斥原理,只不过针对于素因子。

    接下来才是容斥原理推欧拉函数,写上面的目的是对欧拉函数有个初步的了解。

    首先亮出公式:

    [phi(n)=n-sum_{p_i}(frac{n}{p_i})+sum_{p_ip_j}(frac{n}{p_ip_j})-...sum_{p_1p_2...p_k}(-1)^k(frac{n}{p_1p_2...p_k}) ]

    以上 (p) 均表示素因子

    容斥的主体思路是我把所有和 (n) 有公因子的数都晒去,剩下的就是互素的数。那么我们知道,对于任何因子 (d) 来说,和 (n) 有着公因子 (d) 的,一共有 (frac{n}{d}) 个。对于素因子也是同理。我们按照容斥原理奇加偶减的原理去得到所有和 (n) 不互质的个数,由于我们求得是互质个数,所以就变成了奇减偶加。也就有了上面的柿子。不理解的话可以拿三个有交集的圆环做例子手画一下如何做才能把三个环覆盖的面积不重不漏的算出。

    对于上面的柿子,我们每一项的符号跟素因子组成个数 (k) 有关,然后就有人将这个东西换了个好听的名字叫莫比乌斯函数,当然这只是针对素因子这一部分,我们要对于任意数进行定义,我们虽然取了名字,但不能更改他的作用和性质即求欧拉函数。所以对于那些是某些素因子 (k) 次方的因子,(k>1) 都不会做贡献,等价于为 (0) ,所以我们设这一部分的莫比乌斯函数为 (0),对于特殊情况 (1) 他只有他自已一个因子,且不属于素因子,所以我们特别判断,显然的,他的莫比乌斯函数为 (1)

    所以用数学公式的说:

    [u(d) =egin{cases} 1\ (-1)^k\ 0\ end{cases} egin{aligned}& 1 \ & d 是 k 个不同素数的乘积\ & d 是某些素因子 k 次方的乘积end{aligned} ]

    实际上,莫比乌斯函数将求解欧拉函数的公式由只有素因子求解到任意因子求解的推广,使得他具有了普遍性。所以我们用 (mu) 函数将那个长长的公式写的如此简介,具体如下:

    [phi(n)=sum_{d|n}mu(d)frac{n}{d} ]

    曾经搜博客上来就是:“前端知识——狄利克雷卷积...” ,然后糊里糊涂的学完这个回头看莫比乌斯函数,依旧稀里糊涂。现在看来,多么通俗易懂!

    莫比乌斯函数的应用

    其实他并不是只功效于莫比乌斯反演,他的最大好处就是当我们分析题目性质后得知需要知道需要有关数的素因子类问题,我们大可不必去筛,直接用 (mu) 就可解决。

    例如这道题目 【北京信息科技大学第十三届程序设计竞赛】I. 数字染色

    莫比乌斯函数性质

    • 对于任意正整数 (n)(sum_{d|n}mu(d)=[n=1])这是常用且重要的性质
    • 对上面柿子关于欧拉函数的变形,(frac{phi(n)}{n}=sum_{d|n}frac{mu(d)}{d}) 这样看起了更简介
    • (n=sum_{d|n} phi(d)) 这玩意好像可以无限套娃。证明在笔记上

    我们令 (F(n)=n,f(n)=phi(n)) ,那么这个柿子化简成:

    [F(n)=sum_{d|n}f(d) ]

    先前我们把 (phi(n)=sum_{d|n}mu(d)frac{n}{d}) 换成函数为:

    [f(n)=sum_{d|n}mu(d)F(frac{n}{d}) ]

    观察后发现,这貌似 (F(x),f(x)) 可以相互求解。殊不知,这就是利用了莫比乌斯反演定理。

    莫比乌斯反演

    首先需要知道莫比乌斯反演定理

    • 定理:(F(n))(f(n)) 是定义在非负整数集合上的两个函数,并且满足条件:

      [F(n)=sum_{d|n}f(d) ]

      然后结论是:

      [f(n)=sum_{d|n}mu(d)F(frac{n}{d}) ]

    • 反演倍数形式:

      [g(n)=sum_{n|d}f(d) ]

      [ ]

    前端知识

    求解 (n) 的所有因子和,有如下几种等价形式:

    [sum_{d|n}a_d=sum_{d|n}a_{(n/d)} ]

    还有更一般的恒等式,更加直观:

    [sum_{d|n}a_d=sum_ksum_{d>0}a_d[n=kd] ]

    对因子求和的二重和式

    [sum_{m|n}sum_{d|m}a_{m,d}=sum_{k|m}sum_{l|(n/k)} a_{k,lk} ]

    这些东西方便我们简单的了解证明的具体过程,而非构造。

    反演约数形式证明

    证明:(f(n)=sum_{d|n}mu(d)g(frac{n}{d}))

    [egin{align} sum_{d|n}mu(d)g(frac{n}{d})&=sum_{d|n}mu(frac{n}{d})g(d)\ & = sum_{d|n}mu(frac{n}{d})sum_{k|d}f(k)\ & = sum_{k|n}f(k)sum_{l|(n/k)} mu(frac{n}{l imes k})\ & = sum_{k|n}f(k)sum_{l|(n/k)}mu(l)\ & = sum_{k|n}f(k)(sum_{l|(n/k)}mu(l))=[frac{n}{k}=1]\ & = f(n) end{align} ]

    经观察发现我们最终是一个双因子和式求和的样子,我们想办法使用二重和式达到化简得目的,可以使用二重和式的条件是二者的约数是顺次包含的,所以我们第一步由前端知识第一点可知,公式第一行是等价的,这样做的原因是我们构造出了二重和式
    之后第三行运用二重和式,第四行的后半个 (sum) 使用前端知识第一点,成功构造出 (sum mu(d)) 的形式,据 (sum_{d|n}mu(d)=[n=1]) 的性质可知,最终柿子化简为 (f(n))。主体思路就是利用当前我们知道的和式化简方法将 (sum_{d|n}mu(d)) 构造出来。

    反演倍数形式证明

    证明:(f(n)=sum_{dge 1}mu(d)g(frac{d}{n}))

    [egin{align} sum_{dge 1}mu(d)g(frac{d}{n}) &=sum_{dge 1} mu(d)sum_{kge 1}f(frac{kd}{n})\ & = sum_{mge 1} f(frac{m}{n})sum_{d|m}mu(d)\ & = sum_{mge 1} f(frac{m}{n}) sum_{d|m}mu(d)=[m==1]\ & = f(n) end{align} ]

    我们先来观察 (g(n)=sum_{dge 1} f(frac{d}{n})),这是一个倍数的形式,貌似我们没有用来化简倍数的和式公式。
    对于证明公式第一行中,不难发现 (d)(kd) 是倍数关系,反过来也就是约数关系,这是关键点,存在约数关系我们就能化简。
    我们来观察第一行的公式,发现他和我们二重和式不一样的是前面是后面的约数,而我们的二重和式化简得初始状态是前者是后者的倍数。在考虑二重和式后的结果是什么?前者是后者的约数。我们发现证明公式第一行好像是反的二重和式运算,那么我们将 (kd) 放在前面,(d) 放在后面,我们就构造出了约数的关系,进而使用约数优化和式就好了。

    所以第二行 (m) 就是 (kd),目的是构造出想要的约数形式。

    相关题目

    doing

  • 相关阅读:
    Session攻击(会话劫持+固定)与防御
    console调试命令
    javascript获取当前url
    搞不清FastCgi与PHP-fpm之间是个什么样的关系
    MySQL基本语句优化10个原则
    PHP获取类名及所有函数名
    js闭包
    字段、方法、属性
    python面向对象之类成员修饰符
    实现Python代码发送邮件
  • 原文地址:https://www.cnblogs.com/lToZvTe/p/15259360.html
Copyright © 2011-2022 走看看