算法学习-莫比乌斯反演

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21110267/article/details/45397595

写在前面

  • 必须把更多的精力放在文化课上了, 所以这段时间的学习和数学相关的比较多, 希望可以对文化课有帮助.

莫比乌斯反演公式

  • g(n)=d|nf(d)f(n)=d|nμ(d)g(nd)

基础知识

  • μ 函数
    f(n)=1,(1)k,0,n=1n=p1p2...pkn=others
  • μ 函数是积性函数, 因为当 n 是质数时 μ(n)=(1)1=1 , 所以可以通过筛法求出 μ 函数.
mu[1] = 1;
for(i = 2; i <= n; i++) {
    if(!vis[i]) {
        prime[++c] = i;
        mu[i] = -1;
    }
    for(j = 1; prime[j] * i <= n; j++) {
        vis[prime[j] * i] = 1;
        if(i % prime[j] == 0) {
            mu[prime[j] * i] = 0;
            break;
        }
        mu[prime[j] * i] = -mu[i];
    }
}

莫比乌斯反演的证明

  • 可以从后向前证明.
  • 已知 g(n)=d|nf(d)
  • 求证 f(n)=d|nμ(d)g(nd)
  • 证明
    f(n)=d|nμ(d)g(nd)=d|nμ(d)k|ndf(k)=d|nk|ndf(k)μ(d)

    然后的一步让我很头疼, 要把 f(k) 提出来, 统计 f(k) 所乘的 μ(d) 的和.
    仔细观察, k 的取值范围就是 n 的所有因子. 如果 f(k) 要和 μ(d) 相乘, 那么满足的关系是 k|nd , 也就是 km=nd , 变换一下形式就得到 dm=nk , 即 d|nk . 也就是 f(k) 要和所有 d|nk d 相乘.
    用这个结论继续化简刚才的式子, 得到下面
    f(n)=d|nk|ndf(k)μ(d)=k|nf(k)d|nkμ(d)

    μ 函数有很多奇怪的性质, 比如下面这条
    d|nμ(d)={1,0,n=1n>1

    n=1 时比较显然
    n>1 时将 n 分解为 p1a1p2a2...pkak , 而 n 的所有因子中, μ 不为0的只有质因子次数都为1的因子, 其中质因数个数为 r 个的有 Crk 个. 可以得到下面的式子
    d|nμ(d)=i=0kCik(1)i=(1+(1))k=0

    这是数学上的二项式展开. 用这个结论用到刚才推了一半的 f(n)

    f(n)=k|nf(k)d|nkμ(d)

    发现除非 n=k 这时 d|nkμ(d)=1 , 否则为0.
    最后就得到 f(n)=f(n) 说明命题是正确的.

后记

  • 准备做几道题应用应用.

猜你喜欢

转载自blog.csdn.net/qq_21110267/article/details/45397595