zoukankan      html  css  js  c++  java
  • 莫比乌斯函数|莫比乌斯反演

    莫比乌斯函数|莫比乌斯反演

    (不要问我为什么没有导言了……)

    (当然不仅会讲莫比乌斯函数,也会讲一些其他的)

    一些准备

    • 一定的数论基础(起码你知道一些基础的数论)

    • 一定的代码实现能力(因为数论题代码不会很长因此能写代码就好)

    • 大量的脑细胞并秃头的准备(大雾

    • 一定的智商和理解能力(数学不好的先去补文化课)

    • 当然还有计算能力(数论题不动手算那怎么行)

    • 更重要的是你基础算法都会了

    接下来我主要会按照特定的顺序讲,以便读者观看流畅(顺滑到底

    请耐心的一章一章看下去,否则你会看不懂(当然巨佬会了下面的知识就可以跳过往后看)

    整除分块(数论分块)

    先咕着吧……(要不这么简单你们自行百度就好了)

    积性函数与线性筛

    首先你要会线性筛质数(不会度娘吧)

    什么是积性函数

    其实积性函数的定义很简单,积性肯定根积有关,它是定义在正整数域上的,满足:

    [f(x×y)=f(x)×f(y),(x,y)=1 ]

    (其中 ((x,y)) 表示 (x,y) 的最大公约数)

    这样的函数 (f(x)) 即为积性函数。

    当然有的时候不需要 ((x,y)=1) 即可满足 (f(x×y)=f(x)×f(y)),那么这个函数就是完全积性函数。

    也即 (forall {x,y})(f(x×y)=f(x)×f(y)) 成立的函数为完全积性函数。

    积性函数举例

    下面当然不会列举出全部的积性函数,我们只讲接下来会用到的函数。

    1、 (phi(n)),即欧拉函数,定义为小于等于 (n) 的正整数与 (n) 互质的数个数。且 (phi(1)=1)

    2、 (mu(n)),即莫比乌斯函数,对 (n) 进行唯一分解,即 (n=p_1^{c_1}p_2^{c_2}…p_m^{c_m}),则:

    [mu(n)=egin{cases}0 & exists i∈[1,m],c_i>1 \ 1 & mequiv 0 pmod{2}, forall i ∈[1,m],c_i=1 \ -1 & mequiv 1 pmod{2}, forall i ∈[1,m],c_i=1end{cases} ]

    3、 (epsilon(n)),这个函数的定义是这样的:

    [epsilon(n)= egin{cases} 1 & & n=1 \ 0 & & n>1 end{cases} n∈N^*]

    如果你不认识它,那么说起它的另一个名字你可能更熟悉:狄利克雷卷积的乘法单位。

    4、 ( ext{1}(n)),即常数函数,有 ( ext{1}(n)=1)

    *欧拉函数性质相关

    首先规定一个正整数 (N) 的唯一分解:(N=displaystyleprod^{m}_{i=1}p_{i}^{c_i}, p∈primes)

    ( ext{Lemma 1:}) (phi(N)=N×displaystyleprod^{m}_{i=1}(1-frac{1}{p_i}))

    证明:(数学归纳法)
      当 (N) 只有一个质因子时显然成立。
      接下来考虑 (N) 只有两个质因子的情况:
      设 (p)(N) 的一个质因子,而 (q) 也是 (N) 的一个质因子。那么在 (1~N)(p) 的倍数有 ({p,2p,3p,…,(N/p)*p})(N/p) 个(除法下取整);同理,(q) 的倍数也有 (N/q) (下取整)个。显然这些数都是不满足条件的数(即不满足 (gcd(n,i)=1(1<i<N))),我们考虑去掉这 (N/p+N/q) 个数,但是 (p×q) 的倍数就被排除了两次,因此还要加回来(运用容斥的思想),所以最终 (phi(N)) 可以表示成下面这个式子:

    [N-frac{N}{p}-frac{N}{q}+frac{N}{pq}=N(1-frac{1}{p}-frac{1}{q}+frac{1}{pq})=N(1-frac{1}{p})(1-frac{1}{q}) ]

      已经符合上面那个式子。
      同理通过数学归纳法这可以推广到 (N) 为任意正整数的情况。
    (Q.E.D.)

    有了这个式子我们可以乱搞一些事情了。

    ( ext{Lemma 2:}) (phi(n×m)=phi(n)×phi(m), (n,m)=1)

    (也即欧拉函数是积性函数)

    证明:
      因为 ((n,m)=1),即 (n,m) 互质,没有公因子,根据 ( ext{Lemma 1}) 可以得到:

    [phi(n)=n×prod^{k_n}_{i=1}(1-frac{1}{p_i}),phi(m)=m×prod^{k_n+k_m}_{i=k_n+1}(1-frac{1}{p_i}) ]

    所以:

    [phi(n)×phi(m)=n×prod^{k_n}_{i=1}(1-frac{1}{p_i})×m×prod^{k_n+k_m}_{i=k_n+1}(1-frac{1}{p_i})=n×m×prod_{i=1}^{k_n+k_m}(1-frac{1}{p_i})=phi(n×m) ]

      因此欧拉函数是积性函数。
    (Q.E.D.)

    当然还有一个显而易见的引理:

    ( ext{Lemma 3:})(n=p^k),其中 (p) 为质数,那么 (phi(n)=(p-1)*p^{k-1})

    证明:
      由 ( ext{Lemma 1}) 可以得到,若 (n=p^k)(p) 为质数,那么 (phi(n)=n*(1-frac{1}{p})=n-frac{n}{p}),将 (n=p^k) 带入即可得到。
    (Q.E.D.)

    当然还有更重要的东西:

    ( ext{Lemma 4:}) (displaystylesum_{dmid n}phi(d)=n)

    证明:
      不妨令 (F(n)=displaystylesum_{dmid n}phi(d))。首先证明 (F) 函数的积性。若 ((n,m)=1),则:

    [F(n)×F(m)=sum_{dmid n}phi(d)×sum_{d|m}phi(d) ]

    因为 ((n,m)=1),所以得到 (phi(n)*phi(m)=phi(n×m)),那么:

    [F(n)×F(m)=sum_{imid n}sum_{jmid m}phi(i×j)=F(n×m) ]

      (上述两层和式包含了 (n×m) 的所有因子)
      因此 (F) 函数是一个积性函数。所以我们可以只考虑 (n) 的一个质因子,令 (n'=p^c),则:

    [F(p^c)=sum_{i=0}^{c}phi(p^i)=1+sum_{i=1}^{c}(p^k×(p-1))=1+sum_{i=1}^{c}(p^k-p^{k-1})=p ]

      因此拓展到 (n)(F(n)=n) 即:

    [sum_{dmid n}phi(d)=n ]

    成立,命题得证。
    (Q.E.D.)

    欧拉函数简单提到这里,主要是做一个补充讲解,但是务必记住上面几个引理,接下来会有用到。

    Dirichlet 卷积

    叫它狄利克雷卷积就好(如果英文不好的话)

    定义

    狄利克雷卷积定义在两个积性函数上。两个积性函数 (f,g) 的狄利克雷卷积为:

    [(f*g)(n)=sum_{dmid n,d>0}f(d)g(frac{n}{d}) ]

    当然 (f*g) 当做个函数名就好, 你可以把 ((f*g)(n)) 理解成一个新的函数 (h(n))。(本来就是新的函数

    亦可以写作:

    [(f*g)(n)=sum_{i×j=n}f(i)g(j) (i,j>0) ]

    当然下面这种形式更好看就是了。

    一些性质

    显然狄利克雷卷积满足结合律和交换律(证明自行尝试吧)

    举例

    1、 根据上面的定义,以及积性函数中对狄利克雷卷积单位元((epsilon))的介绍,可以得到:

    [epsilon=mu * 1iff epsilon(n)=sum_{dmid n}mu(d) ]

    这是狄利克雷卷积单位元的定义,至于其值为何,稍后再讨论。

    2、 一个很重要的东西:莫比乌斯函数和欧拉函数的关系:

    [phi=mu * ext{ID}iff phi(n)=sum_{dmid n}d×mu(frac{n}{d}) ]

    ( ext{ID})(f(x)=x),后文会给出相关证明。

    那么狄利克雷卷积也暂告一段落,但是请务必记住,这个东西非常重要。

    莫比乌斯函数

    一些性质

    1、莫比乌斯函数是积性函数(上面已经说了)

    2、回顾一下莫比乌斯函数的通式:

    [mu(n)=egin{cases}1 & n = 1 \ 0 & n ext{ 含有平方因子} \ (-1)^k & k ext{ 为 } n ext{ 本质不同的质因子个数}end{cases} ]

    这个通式和上面的描述会有所不同,但结果是一样的。

    一些引理和证明

    首先对于 (epsilon) 上面给出了莫比乌斯函数和它的关系以及它的通式:

    ( ext{Lemma 1:}) (epsilon(n)=displaystylesum_{dmid n}mu(n)=egin{cases}1 & n=1 \ 0 & n>1end{cases})

    证明:
      上文就已经提到,对于 (epsilon) 的定义是这样的:(epsilon(n)=displaystylesum_{dmid n}mu(d))(epsilon =mu * 1))。因为莫比乌斯函数是积性函数,所以若 (n=displaystyleprod^{k}_{i=1}p_i^{c_i}),不妨令 (n'=displaystyleprod^{k}_{i=1}p_i),那么有:

    [sum_{dmid n}mu(d)=sum_{dmid n'}mu(d)=sum^{k}_{i=0}inom{k}{i} ext{·}(-1)^k ]

      根据二项式定理:((A+B)^k=displaystylesum_{i=0}^{k}inom{n}{i}A^{i} ext{·}B^{k-i}),将 (A=1,B=-1) 带入上式即可得到:

    [sum_{i=0}^{k}inom{k}{i}(-1)^k=egin{cases}1&k=0 \ 0 & k >0end{cases} ]

      当 (k=0)(n=1),其他情况下 (n>1),因此命题得证。
    (Q.E.D.)

    当然这个结论可以简单记为 (displaystylesum_{dmid n}mu(d)=[n=1])

    ( ext{Lemma 2:}) ([(i,j)=1]iff displaystylesum_{dmid (i,j)}mu(d))

    证明:
      利用 (epsilon) 可以得到,([(i,j)=1]iff epsilonBig((i,j)Big)),展开 (epsilon)

    [epsilonBig((i,j)Big)=sum_{dmid (i,j)}mu(d) ]

      命题得证。
    (Q.E.D.)

    其实这是一个反演的小结论,放在这里也无妨。

    接下来的引理是重点,展示了欧拉函数和莫比乌斯函数的联系(上文有提到):

    ( ext{Lemma 3:}) (phi * ext{1}= ext{ID}(ID:f(x)=x))

    证明:
      根据欧拉函数的 ( ext{Lemma 4})(displaystylesum_{dmid n}phi(d)=n),有:

    [phi * ext{1}=sum_{dmid n}phi(n)=n= ext{ID} ]

      所以原命题成立。
    (Q.E.D)

    我们可以把上面这个式子两边同时卷 (mu),即:

    ( ext{Lemma 4:}) (phi(n)=displaystylesum_{dmid n}d×mu(frac{n}{d}))

    证明在这里便不再赘述了,读者自行把狄利克雷卷积套进去即可得到。

    线性筛法

    因为莫比函数是积性函数,因此可以线性筛。根据质数线性筛即可得到代码:

    void getMu() {
    	mu[1] = 1, v[1] = 1;
    	for (int i = 2; i <= n; ++i) {
    		if (!v[i]) p[++tot] = i, mu[i] = -1;
    		for (int j = 1; j <= tot && p[j] <= n / i; ++j) {
    			v[i * p[j]] = 1;
    			if (i % p[j] == 0) {
    				mu[i * p[j]] = 0;
    				break;
    			}
    			mu[i * p[j]] = -mu[i];
    		}
    	}
    }
    

    莫比乌斯反演

    终于到了本篇文章的重头戏!(感谢你看完了我写的那么多废话

    公式及证明

    (f,g) 是两个积性函数,若:

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

    那么:

    [g(n)=sum_{dmid n}mu(d)×f(frac{n}{d}) ]

    是不是觉得这个式子和上面莫比乌斯和欧拉函数关系的式子很像啊?其实那个就是莫比乌斯反演了,只不过这里进行了拓展。

    证明:
    法一:暴力求解

    [sum_{dmid n}mu(d)f(frac{n}{d})=sum_{dmid n}Big(mu(d)sum_{kmid frac{n}{d}}g(k)Big)=sum_{kmid n}Big(g(k)sum_{dmid frac{n}{k}}mu(d)Big)=g(n) ]

      一个比较好的解释就是,用 (displaystylesum_{dmid n}) 替换掉 (displaystyle f(frac{n}{d})),然后变换求和顺序。最后一步可以根据 (displaystylesum_{dmid n}mu(d)=[n=1]),在 (displaystylefrac{n}{k}=1) 时第二个和式值为 (1)。此时有 (n=k),故可等价为 (displaystylesum_{kmid n}[n=k] ext{·}g(k)=g(n))
    法二:运用狄利克雷卷积
      考虑转化模型。即已知 (f=g* ext{1}),求证:(g=f*mu)
      显然我们可以得到:(f*u=g* ext{1}*uimplies f*u=g)( ext{1}*mu=epsilon)

    是不是很简单啊

    如果对第一种方法不明白,三条路给你选择:(1) 手算一遍 (2) 看看这篇博客:Here (3) 重复第一种

    例题 1:[HAOI2011]Problem b

    Description

    (多组数据)求:

    [sum_{i=x}^{n}sum_{j=y}^{m}[gcd(i,j)=k] (1≤T,x,y,n,m,k≤10^5) ]

    看到这里的 (x,y) 不舒服,所以考虑像前缀和那样分开,每一块分成下面的这种形式:

    [sum_{i=1}^{n}sum_{j=1}^{m}[gcd(i,j)=1] ]

    这个式子还是很麻烦……怎么化开呢(我要化了……)

    ( ext{Lemma 1:}) (gcd(i,j)=kimplies displaystyle gcdBig(frac{i}{k},frac{j}{k}Big)=1)

    证明:(反证法)
      令 (d=(i,j),i'=i/d,j'=j/d),那么假设 ((i',j')≠1),也就是 (i',j') 还有公因数,那么必然有 ((i,j)≠d),与条件不符,假设不成立,所以原命题成立。
    (Q.E.D.)

    因此,我们可以转化问题:

    [sum_{i=1}^{n}sum_{j=1}^{m}[gcd(i,j)=k]implies sum_{i=1}^{iglfloorfrac{n}{k}ig floor}sum_{j=1}^{iglfloorfrac{m}{k}ig floor}[gcd(i,j)=1] ]

    感觉看到了 (Hope) !(然后呢……)

    你是不是忘了什么啊:我们上面刚讲过了狄利克雷单位元,它的值是什么?

    [epsilon(n)=egin{cases}1 & n=1 \ 0 & n>1end{cases} ]

    因为 (gcd(i,j)=1)(epsilon)(1),其余的时候均为 (0),因此上面的式子可以化成:

    [sum_{i=1}^{iglfloorfrac{n}{k}ig floor}sum_{j=1}^{iglfloorfrac{m}{k}ig floor}epsilonBig(gcd(i,j)Big)implies sum_{i=1}^{iglfloorfrac{n}{k}ig floor}sum_{j=1}^{iglfloorfrac{m}{k}ig floor}sum_{dmid gcd(i,j)}mu(d) ]

    然后可以变换求和的顺序,尽量把 (mu) 弄到前面去,所以先枚举 (dmid gcd(i,j))

    [sum_{d=1}^{iglfloorfrac{n}{k}ig floor}mu(d)sum_{i=1}^{iglfloorfrac{n}{k}ig floor}dmid isum_{j=1}^{iglfloorfrac{m}{k}ig floor}dmid j ]

    显然看到后面这个 (dmid i,dmid j) 就会想到整除分块了。(1-iglfloorfrac{n}{k}ig floor)(d) 的倍数有 (iglfloorfrac{n}{k×d}ig floor) 个,所以:

    [sum_{d=1}^{iglfloorfrac{n}{k}ig floor}mu(d)iglfloorfrac{n}{kd}ig flooriglfloorfrac{m}{kd}ig floor ]

    整除分块更加显然了。上述均需保证 (n≤m),运用容斥即可求解原式,时间复杂度 (O(N+Tsqrt{N}))

    (代码先咕着)

  • 相关阅读:
    Ubuntu 下配置ftp服务端
    mysql的sql文件的备份与还原
    Virtualbox后台管理之VBoxManage
    主从库延迟对项目质量的影响
    jenkins / ant / jmeter 持续集成接口自动化
    infer 检验IOS项目
    pmd静态代码分析
    利用线上数据验证系统 Gor
    python flask (一)
    python SQLAlchemy
  • 原文地址:https://www.cnblogs.com/Ning-H/p/12036233.html
Copyright © 2011-2022 走看看