莫比乌斯反演

分享:https://www.cnblogs.com/peng-ym/p/8647856.html

目录

一、莫比乌斯函数

1、定义

2、性质

3、代码实现

二、莫比乌斯反演


 

一、莫比乌斯函数

1、定义

1.莫比乌斯函数μ(d)的定义是:\mu (d)=\left\{\begin{matrix} 1,&d=1 \\ (-1)^{k},&d=p1*p2*...*pk \\ 0,&others \end{matrix}\right.

2.当d=1时,μ(d)=1;

3.当d=\prod_{i=1}^{k}pi且pi为互异素数时,\mu (d)=(-1)^{k},说直白点,就是d分解质因数后,没有幂次大于平方的质因子,此时函数值根据分解的个数决定。

4.只要当d含有任何质因子的幂次大于等于2,则函数值为0

这里列出莫比乌斯函数的一些值

μ

value

1

1

2=(2)-1
3=(3)-1
4=(2*2)0
5=(5)-1
6=(2*3)1
7=(7)-1
8=(2*2*2)0

 

2、性质

1.如果n>1且n为正整数,则有: \sum_{d|n}^{ }\mu(d)=0如果n=1,则该式为1。(这一条性质是莫比乌斯反演中最常用的 

2.对于任意正整数n均有:\sum_{d|n}^{ }\frac{\mu (d)}{d}=\frac{\phi (n)}{n} (将欧拉函数与莫比乌斯函数相结合)

3.μ(d)为积性函数,即满足gcd(a,b)=1,则μ(ab)=μ(a)*μ(b)。

 

3、代码实现

根据莫比乌斯函数的定义,用欧拉线性筛素数的方法。

void get_mu(int n)
{
    int cnt=0,prime[maxn],vis[maxn],mu[maxn];
    memset(vis,0,sizeof(vis));
    memset(prime,0,sizeof(prime));
    memset(mu,0,sizeof(mu));
    mu[1]=1;vis[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(!vis[i])
        {
            prime[++cnt]=i;
            mu[i]=-1;
        }
        for(int j=1;j<=cnt && 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];
        }
    }
    /*for(int i=1;i<51;i++)
        printf("mu[%d]=%d\n",i,mu[i]);*/
}

 

二、莫比乌斯反演

若定义在正整数集上的两个函数,f(n)和F(n)满足对任意n有:

形式一:F(n)=\sum_{d|n}^{ }f(d) \Rightarrow f(n)=\sum_{d|n}^{ }\mu (d)F(\frac{n}{d})

形式二:F(n)=\sum_{n|d}^{ }f(d)\Rightarrow f(n)=\sum_{n|d}^{ }\mu (\frac{d}{n})F(d)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值