定义
若函数 (f(n)) 满足 (f(1)=1) 且 (forall x,y in {Bbb{N}}_{+},{ m{gcd}}(x,y)=1) 都有 (f(xy)=f(x)f(y)) ,则 (f) 为积性函数。
若函数 (f(n)) 满足 (f(1)=1) 且 (forall x,y in {Bbb{N}}_{+}) 都有 (f(xy)=f(x)f(y)) ,则 (f) 为完全积性函数。
性质
比较重要的有:若 (f,g) 为积性函数,则满足
的函数 (h) 也为积性函数。
函数 (h) 称作 (f,g) 的Dirichlet卷积,记作 (f*g) 。
例子
单位函数
有:
这个式子尤其常用。
任何函数卷 (epsilon) 都为其本身。
恒等函数
一般用 ({ m{id}}) 表示 ({ m{id}}_1) 。
常数函数
在杜教筛中有用到。
除数函数
一般 (sigma_0) 记作 ({ m{d}}) ,(sigma_1) 记作 (sigma) 。
对于 (sigma) ,有:
线性筛 ({ m{d}})
设 (n=prod_{i=1}^mp_i^{c_i}) ,则根据乘法原理有:
- 对于质数 (p) ,有 ({ m{d}}(p)=2) 。
- 对于 (a,b) 满足 (aot b) ,有 ({ m{d}}(ab)={ m{d}}(a){ m{d}}(b)) 。
- 对于质数 (p) 与合数 (a) 满足 (p|a) ,设 (c) 为 (p) 在 (pa) 中的次数,有 ({ m{d}}(pa)={ m{d}}(a)frac{c+1}{c}) 。
于是就可以线性筛了:
(num_i) 记录 (i) 的最小质因子的次数。
inline void sieve()
{
d[1]=1;
for(int i=2;i<=N;++i)
{
if(!flag[i]) prime[++cnt]=i,d[i]=2,num[i]=1;
for(int j=1;j<=cnt&&i*prime[j]<=N;++j)
{
flag[i*prime[j]]=true;
if(i%prime[j])
{
num[i*prime[j]]=1;
d[i*prime[j]]=d[i]*2;
}
else
{
num[i*prime[j]]=num[i]+1;
d[i*prime[j]]=d[i]/num[i*prime[j]]*(num[i*prime[j]]+1);
break;
}
}
}
}
线性筛 (sigma)
由乘法原理得:
令 (f) 记录约数和,(g) 记录最小质因子 (p) 的 (sum_{i=0}^{c}p^i) 。则有:
- 对于质数 (p) ,有 (f(p)=1+p,g(n)=1+p) 。
- 对于 (a,b) 满足 (a ot b) ,且 (ab) 的最小质因子为 (p) ,有 (f(ab)=f(a)f(b),g(ab)=sum_{i=0}^{c}p^i) 。
- 对于质数 (p) 和合数 (a) 且 (p) 是 (a) 的最小质因子,有 (g(pa)=g(a) imes p+1,f(pa)=f(a)frac{g(pa)}{g(a)})
inline void sieve()
{
f[1]=g[1]=1;
for(int i=2;i<=N;++i)
{
if(!flag[i]) prime[++cnt]=i,f[i]=g[i]=1+i;
for(int j=1;j<=cnt&&i*prime[j]<=N;++j)
{
flag[i*prime[j]]=true;
if(i%prime[j])
{
f[i*prime[j]]=f[i]*f[prime[j]];
g[i*prime[j]]=1+prime[j];
}
else
{
g[i*prime[j]]=g[i]*prime[j]+1;
f[i*prime[j]]=f[i]/g[i]*g[i*prime[j]];
break;
}
}
}
}
欧拉函数
设 (n=prod_{i=1}^mp_i^{c_i}) ,则有通式:
有:
证明:
因为 (varphi) 是积性函数,所以只需要证明 (n=p^c) 的情况,即证明:
因为 (n=p^c) 所以 (d=1,p,p^2,p^3 cdots,p^c) ,将上式改为枚举 (p) 的次数:
上面用到了欧拉函数的性质: (varphi(p^c)=p^{c-1}(p-1)) 。
(varphi*{ m{I}}={ m{id}}) 得证。
线性筛 (varphi)
- 对于质数 (p) ,有 (varphi(p)=p-1) 。
- 对于 (a,b) 满足 (aot b) ,有 (varphi(ab)=varphi(a)varphi(b)) 。
- 对于质数 (p) 和数 (a) 满足 (p|a) ,有 (varphi(pa)=varphi(a) imes p) 。
对于第三种情况,证明如下:
因为 (p|a) ,所以 (a) 包含了所有 (pa) 的质因子,则有:
证毕。
inline void sieve()
{
phi[1]=1;
for(int i=2;i<=N;i++)
{
if(!flag[i]) prime[++cnt]=i,phi[i]=i-1;
for(int j=1;j<=cnt&&prime[j]*i<=N;j++)
{
flag[prime[j]*i]=true;
if(i%prime[j]==0)
{
phi[prime[j]*i]=phi[i]*prime[j];
break;
}
else phi[prime[j]*i]=phi[i]*(prime[j]-1);
}
}
}
莫比乌斯函数
其中 (omega(n)) 表示 (n) 不同质因子个数。
有:
证明:
令 (n=prod_{i=1}^mp_i^{c_i},n'=prod_{i=1}^mp_i) ,则:
这同时也证明了 (epsilon=mu*{ m{I}}) 。
证毕。
与欧拉函数结合,有:
证明:
上面用到了 (mu*{ m{I}}=epsilon) 的结论。
证毕。
反演结论
线性筛 (mu)
- 对于质数 (p) ,有 (mu(p)=-1) 。
- 对于 (a,b) 满足 (aot b) ,有 (mu(ab)=mu(a)mu(b)) 。
- 对于质数 (p) 和整数 (a) 满足 (p|a) ,有 (mu(pa)=0) 。
inline void sieve()
{
mu[1]=1;
for(int i=2;i<=N;++i)
{
if(!flag[i]) prime[++cnt]=i,mu[i]=-1;
for(int j=1;j<=cnt&&i*prime[j]<=N;++j)
{
flag[i*prime[j]]=true;
if(!(i%prime[j])) break;
mu[i*prime[j]]=-mu[i];
}
}
}
参考资料: