zoukankan      html  css  js  c++  java
  • 莫比乌斯反演---基础

    莫比乌斯反演---基础

    前置芝士:

    1.数论函数

    :指定义域为正整数陪域复数函数,每个算术函数都可视为复数的序列

    ​ ---来自百度百科

    2.积性函数:

    若f(x)为一个数论函数,且对于每一个互质的a,b满足

    [f(a*b)=f(a)*f(b) ]

    则f(x)为积性函数.

    --完全积性函数:若f(x)为一个数论函数,且对于每一对a,b满足

    [f(a*b)=f(a)*f(b) ]

    则f(x)为完全积性函数.

    例:积性函数有:

    [\sigma_{k}(n)(表示n的所有约数的k次幂的和) \ varphi(n)也为不超过n且与n互质的数的个数. \ mu(n) = egin{cases} 1&n=1 \ (-1)^k&n为k个不同质数的积\ 0&else end{cases} ]

    完全积性函数有:

    [幂函数 n^k\ 单位函数epsilon(n)=egin{cases} 1&n=1\ 0&n>1 end{cases} ]

    把积性函数与狄利克雷卷积(下面要学)联系起来,可以得到

    若f,g为积性函数,则f*g也为积性函数.

    [(f*g)(a imes b)=sumlimits_{d|ab}f(d)g(frac{ab}{d})\ 令d=d_1 imes d_2\ =sumlimits_{d_1d_2|ab}f(d_1d_2)g(frac{ab}{d_1d_2})\ =sumlimits_{d_1|a}f(d_1)g(frac{a}{d_1}) imes sumlimits_{d_2|d}f(d_2)g(frac{b}{d_2})\ =(f*g)(a) imes (f*g)(b) ]

    线性筛(实际上是利用线性筛求积性函数的值)

    唯一分解定理:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积

    那么有

    [mathbf{f}(n)=prodlimits_{i=1}^tmathbf{f}(p_i^{k_i}) ]

    于是我们就有另一种方法表示积性函数,即给出它在素数幂处的取值

    当我们在线性筛的时候可以求出每个数的最小质因数(p_1),它的次数(k_1),那么

    [mathbf{f}(n)=mathbf{f}(p_1^{k_1})mathbf{f}(frac{n}{p_1^{k_1}}) ]

    由上面的结论可知:

    [sigma_0(n)=prodlimits_{i=1}^t(k_i+1)\ phi(n)=prodlimits_{i=1}^tp_i^{k_i-1}(p_i-1)=nprodlimits_{i=1}^t(1-frac{1}{p_i}) ]

    (下面的那个是不是有点熟悉?就是课本上欧拉函数的求法)

    3.函数之间的加法和数乘

    [(f+g)(n)=f(n)+g(n) \加法\(x imes f)(n)=x imes f(n),xepsilon C\ (c为常数) 数乘 ]

    4.狄利克雷卷积(Dirichlet)

    Dirichlet是个人,而且是一个很有名的人,今天我们不讲这个人,我们讲讲他的狄利克雷卷积

    狄利克雷乘积(Dirichlet product)亦称狄利克雷卷积、卷积,是数论函数的重要运算之一。设f(n)、g(n)是两个数论函数,它们的Dirichlet(狄利克雷)乘积也是一个数论函数,简记为h(n)=f(n)*g(n)。---来自百度百科

    [(f*g)=sumlimits_{ij=n}f(i)g(j)\或\(f*g)=sumlimits_{d|n}f(d)f(frac{n}{d}) ]

    运算性质:满足交换律,结合律,分配律;

    交换律 即

    [(f*g)=(f*g)\ ]

    [--------------\ 证明:\(f*g)(n)=sumlimits_{ij=n}f(i)g(j)=sumlimits_{ji=n}f(j)g(i)=(g*f)(n) ]

    结合律:

    [(f*g)*h=f*(g*h) ]

    [证明:\ [((f*g)*h)](n)=sumlimits_{pq=n}[sumlimits_{ij=p}f(i)g(j)]h(q)\ =sumlimits_{i|n}f(i)(sumlimits_{jq=frac{n}{i}}g(j)h(q))\ =sumlimits_{i|n}f(i)(g*h)(frac{n}{i})\ =(f*(g*h))(n) ]

    分配律:

    [f*(g+h)=f*g+f*h ]

    [证明:\ f*(g+h)=[f*(g+h)](n)\ =sumlimits_{d|n}f(d) imes[g(frac{n}{d})+h(frac{n}{d})]\ =sumlimits_{d|n}[f(d)g(frac{n}{d})+f(d)h(frac{n}{d})]\ =f*g+f*h ]

    单位元

    在狄利克雷卷积中存在一种像单位矩阵一样的"数",任何一个函数*这个"数"都会是其本身,我们把这个"数"叫做单位元,即前文所提到的单位函数

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

    则有

    [(f*epsilon)(n)=sumlimits_{d|n,d eq n}f(d)epsilon(frac{n}{d})+f(n)epsilon(1)\ =sumlimits_{d|n,d eq n}f(d) imes0+1\] =f(n) ]

    所以任何一个数论函数与单位元的卷积为数论函数本身(后文有重要运用)

    逆元

    其实逆元的概念和倒数差不多,即:

    方程 axequiv 1(mod, : p) 的解称为 a 关于模 p 的逆,当 gcd(a,p)=1(即 ap 互质)时,方程有唯一解,否则无解。

    那么逆元可以用来干什么呢,比如说对于 (a/b), mod: p,并没有 ((a: mod: p)/(b: mod:p)), mod: p,但是直接除又会爆精度,这时我们就可以用到逆元,假设用 inv(b) 代表 imgb 的逆元,那么(a/b),mod:p=(a*inv(b)),mod:p。 ____引用自forever_dreams的博客

    上面的是数的逆元,狄利克雷卷积也有逆元:

    定义:

    [对每个mathbf{f}(1) eq 0的函数mathbf f ,都存在一个函数mathbf{g}使得mathbf{f}*mathbf{g}=epsilon ]

    则如何求一个函数的逆?

    定义

    [mathbf{g}(n)=frac{1}{mathbf{f}(1)}left([n=1]-sumlimits_{ij=n,i eq 1}mathbf{f}(i)mathbf{g}(j) ight) ]

    [mathbf{f}*mathbf{g}(n)\ =sumlimits_{ij=n}mathbf{f}(i)mathbf{g}(j)\ =mathbf{f}(1)mathbf{g}(n)+sumlimits_{ij=n,i eq 1}mathbf{f}(i)mathbf{g}(j)\=[n=1]=epsilon(i) ]

    把积性函数和逆元联系起来得到 积性函数的逆元一定也是积性函数.

    留与读者自证之/笑哭.(注,积性函数一定满足 f ( 1 ) = 1 )

    莫比乌斯反演

    [我们定义1的逆是 mu.\ 这样的话,如果g=f*1,就有f=f*1*mu=g*mu,\ 换句话说,如果 mathbf g(n)=sum_{dmid n}mathbf f(d) \就有 mathbf f(n)=sum_{dmid n}muleft(frac nd ight)mathbf g(d) ]

    [引理 \mu*1=epsilon\ 即 sumlimits_{d|n}mu(d)=epsilon(n)\其中的"1"是一个返回值为1的常数函数 ]

    证明:

    [设n有k个不同的质因子 \n=p_1 imes p_2 imes ... imes p_k\ 记一个函数q(s)为序列mathbf{s}中所有元素的乘积\ mathbf{s}={{x_1,x_2...x_k}};s序列长度为K \令一个mathbf{f}(s)的约数d=mathbf{f}(j) \jsubseteq s, j序列长度为J\ herefore sumlimits_{d|n}mu(d)=sumlimits_{mathbf{J}=0}^kmu(f(j)) imes (从K中取J个值(组合数))\ 令i=J,则原式=sumlimits_{i=0}^kmu(d)^i(k中取i的组合)\ 根据二项式定理,奇数项与偶数项和为0. 所以sumlimits_{d|n}mu(n) = egin{cases} 1&n=1 \ 0&n>1\ end{cases}=epsilon(n) ]

    求解μ

    [如何求mu ?由于1是积性的,所以1的逆mu也是积性的,则 ]

    [mu(p^k)egin{cases}1,&k=0\-1,&k=1\0,&k>1end{cases} ]

    [mu(x)=egin{cases} 1,&x=1\ (-1)^n, &x=prodlimits_{i=1}^np_i\ 0,&其余情况 end{cases} ]

    [求mu的函数 ]

    void get_mu(int n)
    {
        mu[1] = 1;
        for(int i = 2;i <= n; i++)
        {
            if(!vis[i])
    		{
    			pri[++cnt] = i;
    			mu[i] = -1;
    		}
            for(int j = 1; j <= cnt && pri[j] * i <= n; j++)
            {
                vis[pri[j] * i] = 1;
                if(i % pri[j] == 0) break;
                else mu[i * pri[j]] = -mu[i];
            }
        }
     }
    

    这样就证明了上述结论。

    当然还有另一个方向的莫比乌斯反演(这个大概更常用)

    [mathbf{g}(n)=sumlimits_{n|d}mathbf{f}(d)iff mathbf{f}(n)=sumlimits_{n|d}mu(frac{d}{n})mathbf{g}(d) ]

    [对此只需要定义 (mathbf foplusmathbf g)(x)=sum_{xmid y}mathbf f(y/x)mathbf g(y)=sumlimits_{x|Y}f(y/x)g(y) ,并容易证明 (mathbf fastmathbf g)oplusmathbf h=mathbf foplus(mathbf goplusmathbf h)。\于是 mathbf f=(muastmathbf1)oplusmathbf f=muoplus(mathbf1oplusmathbf f)=muoplusmathbf g ]

    莫比乌斯反演是一个很重要的数论知识,在做数论题的时候很有帮助,为了提高对于莫比乌斯反演的理解和掌握

    建议去看看以下几道题

    YY的GCD

    约数个数和

    如果你看完了一遍,对于知识点还是没有理解的话,建议重新看一遍,或者去以下的博客那里看一看,

    本人就是从那里学习的

    铃悬的小知识

  • 相关阅读:
    备库归档重新传命令
    DG 参数详解
    ACTIVATE STANDBY
    Matplotlib模块:绘图和可视化
    Django总结一
    Django之用户认证—auth模块
    最长上升子序列
    Pandas模块:表计算与数据分析
    Django ORM操作

  • 原文地址:https://www.cnblogs.com/--840-114/p/13304689.html
Copyright © 2011-2022 走看看