狄利克雷卷积和积性函数

数论函数#

数论函数指定义域为正整数,值域是一个数集且满足 f(1)0 的函数。我们可以将数论函数看作一个数列。

设有 f(n),g(n) 两个数论函数,有几种常见运算:

  • 加法:(f+g)(n)=f(n)+g(n)
  • 数乘:(af)(n)=af(n)
  • 乘法:(fg)(n)=f(n)g(n)
  • 复合:f(g)(n)=f(g(n))

此外,加法、数乘和乘法运算满足交换律、结合律、分配律和消去律。


狄利克雷卷积(Dirichlet)#

定义#

对于两个数论函数 f,g,他们的狄利克雷卷积也是一个数论函数,我们记为 h,则 h=fg

h 定义为:

h(n)=(fg)(n)=dnf(d)g(nd)

狄利克雷卷积符合交换律、结合律和分配律:

  • 交换律

(fg)(n)=dnf(d)g(nd)=dnf(nd)g(d)=(gf)(n)

  • 结合律

( (fg)h )(n)=ijk=n( f(i)g(j) )h(k)=ijk=nf(i)( g(j)h(k) )=( f(gh) )(n)

  • 分配律

( (f+g)h )(n)=dn( f(d)+g(d) )h(nd)=dnf(d)h(nd)+dng(d)h(nd)=(fh+gh)(n)

单位元:单位函数 ϵ 是狄利克雷卷积运算中的单位元,即对于任何数论函数 f,都有 fϵ=f

逆元:对于任何一个满足 f(x)0 的数论函数,如果有另一个数论函数 g(n) 满足 fg=ϵ,则称 g(n)f(n) 的逆元,逆元是唯一的。


重要结论#

两个积性函数的狄利克雷卷积也是积性函数#

证明: 设两个积性函数为 f(x)g(x),再记 h=fg

gcd(a,b)=1,则:

h(a)=d1af(d1)g(ad1),h(b)=d2bf(d2)g(bd2),

所以:

h(a)h(b)=d1af(d1)g(ad1)d2bf(d2)g(bd2)=d1ad2bf(d1)g(ad1)f(d2)g(bd2)=d1ad2bf(d1)f(d2)g(ad1)g(bd2)=d1ad2bf(d1d2)g(abd1d2)=dabf(d)g(abd)=h(ab)

证毕。

积性函数的逆元也是积性函数#

几个常见数论函数的例子:

ε=μ1ε(n)=dnμ(d)d=11d(n)=dn1σ=id1σ(n)=dndφ=μidφ(n)=dndμ(nd)


积性函数#

定义#

若函数 f(n) 满足 f(1)=1x,yN+,gcd(x,y)=1 都有 f(xy)=f(x)f(y),则 f(n) 为积性函数。

若函数 f(n) 满足 f(1)=1x,yN+ 都有 f(xy)=f(x)f(y),则 f(n) 为完全积性函数。

性质#

f(x)g(x) 均为积性函数,则有:

  • h(x)=f(xp)
  • h(x)=fp(x)
  • h(x)=f(x)g(x)
  • h(x)=dxf(d)g(xd)

均为积性函数。

f(x) 为积性函数,则有 f(x)=f(piki);若 f(x) 为完全积性函数,则有 f(x)=f(pi)ki

常见积性函数#

  • 单位函数(元函数):ϵ(n)=[n=1]
  • 欧拉函数:φ(n),表示小于 n 的正整数中与 n 互质的数的个数。
  • 幂函数:idk(n)=xk,特别的,1(x)=1id(x)=x
  • 除数函数:σk(x)=dxdk,特别的,σ(x)=dxd
  • 莫比乌斯函数:μ(n)={1n=10d>1,d2n(1)ω(n)otherwise,其中 ω(n) 表示 n 的本质不同的质因子个数。ω(n) 是一个加性函数。这里指数论中的加性函数,对于 gcd(a,b)=1,有 f(ab)=f(a)+f(b)

筛法求积性函数#

容易发现,这些积性函数的自变量取值为质数时,都可以简单地 O(1) 求出,那我们可以利用积性函数的性质求出函数值。

欧拉函数#

首先我们知道,当 p 为质数时,显然有

φ(p)=p1

欧拉函数有一种计算方法

φ(n)=n×i=1spi1pi

  1. 考虑 pn,那么 n 就已经包含了 n 的所有质因子。

φ(n)=n×i=1spi1pi=p×n×i=1spi1pi=p×φ(n)

  1. 考虑 pn,此时 np 是互质的,有“

φ(n)=φ(p)×φ(n)

void Eular()// 线性筛求欧拉函数  
{
	for(int i = 1;i <= MAXN; i++)
		isprime[i] = 1;
	
	isprime[1] = 0;
	phi[1] = 1;
	
	for(int i = 2;i <= MAXN; i++) {
		if(isprime[i]) {
			prime[++cnt] = i;
			phi[i] = i - 1;
		}
		
		for(int j = 1;j <= cnt and i * prime[j] <= MAXN; j++) {
			isprime[i * prime[j]] = 0;
			if(i % prime[j] != 0)
				phi[i * prime[j]] = phi[i] * phi[prime[j]];
			else {
				phi[i * prime[j]] = phi[i] * prime[j];
				break;
			}
		}
	}
}

莫比乌斯函数#

x 为质数时,它只有 x 一个质因数,所以 μ(x)=1

x 为合数时:

  1. px,那么 p×i 一定含有不只一个 p,所以 μ(i×p)=0
  2. px,那么 p 就是 p×i 的新质因数,本质不同的质因数数量增加,所以 μ(p×i)=μ(i)
void GetMu() {
    p[1] = 1;
    mu[1] = 1;

    for(int i = 2;i < N; i++) {
        if(p[i] == 0) {
            pri[++cnt] = i;
            mu[i] = -1;
        }

        for(int j = 1;j <= cnt && i * pri[j] < N; j++) {
            p[i * pri[j]] = 1;

            if(i % pri[j] == 0)
                break;
            
            mu[i * pri[j]] = -mu[i];
        }
    }
    return ;
}

约数个数(σ0#

dii 的约数个数,numii 的最小质因子出现的次数。

约数个数定理#

n=i=1mpici,则有 di=i=1m(ci+1)

我们知道 pici 的约数有 pi0,pi1,,picici+1 个,根据乘法原理,n 的约数个数为 i=1m(ci+1)

实现#

若当前数为质数,

di=2,numi=1

primeji#

此时 i×primej 中已经存在 primej 这个质因子,且 primej 也一定是 i×primej 的最小质因子,所以

di×primej=(1+c1+1)××(ck+1)

那么如何从 di 转移呢?

di×primej=di×(numi+2)numi+1

num 也需要转移

numi×primej=numi+1

primeji#

那么 i×primej 原本一定不包含 primej 这个质因数,所以约数个数要加上 primej 产生的贡献。

di×primej=di×dprimej

primej 一定是 i×primej 的最小质因子,所以有

numi×primej=1

void Seive(int M) {
    d[1] = 1;
    for(int i = 2;i <= M; i++) {
        if(!p[i]) {
            cnt ++;
            prime[cnt] = i;
            d[i] = 2;
            num[i] = 1;
        }

        for(int j = 1;j <= cnt && i * prime[j] <= M; j++) {
            p[i * prime[j]] = 1;

            if(i % prime[j] == 0) {
                num[i * prime[j]] = num[i] + 1;
                d[i * prime[j]] = d[i] / num[i * prime[j]] * (num[i * prime[j]] + 1);
                break;
            }

            num[i * prime[j]] = 1;
            d[i * prime[j]] = d[i] * 2;
        }
    }
    return ;
}

约数和(σ1#

sigman 表示 n 的约数和。

由算数基本定理可得

约数和定理:

sigman=(p10+p11++p1c1)(p20+p21++p2c2)(pk0+pk1++pkck)

p1c1 的约数有 c1+1 个,

一般积性函数#

对于一般积性函数 f,我们考虑如何筛。

  1. 考虑素数部分;
  2. pxpx 两种分类求出非素数部分。

我们知道 primej 一定是 i×primej 的最小质因子,又因为对于 i 有算术基本定理可以得到 i=p1k1p2k2pnkn

有以下两种情况(即上面写的两种讨论分类):

  1. primej=p1,即 i % prime[j] == 0
  2. primej<p1,即 i % prime[j] != 0

对于第一种情况,i×primej 的质因子与 i 的质因子相同,最小质因子的指数比 i1,即 p1(i×primej)=p1(i)+1

对于第二种情况,因为 primej<p1,所以 primeji 一定互质。则有 f(i×primej)=f(i)f(primej)

(以上只是大概的模板总结,实际情况具体分析)

参考资料#

  1. OI Wiki
  2. 积性加性函数的运算到迪利克雷卷积
  3. 常见迪利克雷卷积及其证明
  4. 【数学】各种积性函数的线性筛法

END

作者:白简

出处:https://www.cnblogs.com/baijian0212/p/17641981.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   -白简-  阅读(130)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu