简介
本文先从狄利克雷卷积讲起,然后会简要介绍一种基于这一理论的有趣数论函数前缀和筛法(江湖人称 “杜教筛”)。
狄利克雷卷积
前面的博文中我们从初等数论的角度初步领略了莫比乌斯反演,是不是感觉推导有一些小复杂…… 但是,如果我们从抽象代数的角度来对其进行研究,就会发现反演这一公式自然而又优雅。
定义
我们研究的对象是诸如欧拉函数 φ
、莫比乌斯函数 μ
等等的数论函数 (arithmetic function)。在此我们不妨把数论函数定义为 Z+⟼C
的函数(正整数集合映射至复数集)。
定义: 对于数论函数 f,g
,定义其 狄利克雷卷积 (Dirichlet convolution):
(f⋅g)(n)=d∣n∑f(d)g(dn)
注:后文常把 (f⋅g)(n)
简写为 f⋅g
。
构造一个环
定理:记 F
为全体数论函数构成的集合,则 ⟨F,+,⋅⟩
构成可交换环。其中 +
就是正常的加法,⋅
则为刚刚提到的卷积(后文中可能会将其称作“乘法”)。
证明:
首先我们可以列一个证明清单:
- 运算的封闭性;
- +
:交换律、结合律;存在零元(零函数 0(n)=0
,简记为 0
)、负元;
- ⋅
:交换律,结合律;存在单位元(元函数 ϵ(n)=n
,简记为 ϵ
);
- +
和 ⋅
间满足分配律。
第 1,2
点中的内容较为显然,这里就略去证明了。下面对 3,4
进行简要证明:
乘法交换律:
f⋅g=d∣n∑f(d)g(dn)let k=dn, ∴d=kn=k∣n∑f(kn)g(k)=g⋅f
乘法结合律:
(f⋅g)⋅h=t∣n∑d∣t∑f(d)g(dt)h(tn)=t∣n∑d∣t∑f(d)g(dt)h(tn)
f⋅(g⋅h)=d∣n∑f(d)t∣dn∑g(t)h(dtn)let T=dt=d∣n∑f(d)T∣n∑g(dT)h(Tn)=T∣n∑d∣T∑f(d)g(dT)h(Tn)
∴(f⋅g)⋅h=f⋅(g⋅h)
加法和乘法间的分配律(由于已经证明交换律,因此只证左分配律):
f⋅(g+h)=d∣n∑f(d)[g(dn)+h(dn)]=d∣n∑f(d)g(dn)+f(d)h(dn)=f⋅g+f⋅h
Voilà! 于是我们便得到了一个可交换环。我们来看看用它能够发现哪些有趣的事情~
有趣的性质
定义:若数论函数 f
满足 f(1)=1
,且 ∀a,b s.t. a⊥b
(若 a,b
互质)满足 f(ab)=f(a)f(b)
,则称 f
为 积性函数 (multiplicative function)。
定理:若 f,g
为积性函数,则 f⋅g
也为积性函数。
证明:
∀a,b∈Z+, s.t. a⊥b
,有:
{f(ab)g(ab)=f(a)f(b)=g(a)g(b)
(f⋅g)(a)(f⋅g)(b)=t1∣a∑f(t1)g(t1a)t2∣b∑f(t2)g(t2b)=t1∣a∑t2∣b∑f(t1)f(t2)g(t1a)g(t2b)∵a⊥b, ∴t1⊥t2, t1a⊥t2b=t1∣a∑t2∣b∑f(t1t2)g(t1t2ab)let d=t1t2=d∣ab∑f(d)g(dab)=(f⋅g)(ab)
对最后一步进行一个补充说明,本质上是 t1∣a∑t2∣b∑1=t∣ab∑1
。不妨令 t1
的质因子集合为 S1
,t2
的质因子集合为 S2
,则 ∵t1⊥t2, ∴S1∩S2=Φ
。因此,∀t∣ab
,一定存在唯一的 t1,t2
满足 t=t1t2
且 t1⊥t2
(可用反证法容易得证)。
再谈莫比乌斯反演?
我们再回过头来看看 μ
的一个重要性质:
d∣n∑μ(d)={10n=1otherwise
如果我们定义一个数论函数 1(n)=1
,并且简记为 1
,那么我们可以将这一性质借助狄利克雷卷积表示为(其中 ϵ
为我们之前定义的单位元):
μ⋅1=ϵ
那么,如果有 f(n)=d∣n∑g(d)
,即:
f=g⋅1⇒f⋅μ=g⋅1⋅μ⇒f⋅μ=g⋅(1⋅μ)⇒f⋅μ=g⋅(μ⋅1)⇒f⋅μ=g⋅ϵ⇒f⋅μ=g
于是我们得到了莫比乌斯反演:
g(n)=d∣n∑g(d)μ(dn)
在引入了数论函数和卷积构成的代数结构后,这一证明看起来无比简单明了、清新自然~
既然提到了莫比乌斯函数 μ
,我们也不能忘了跟他一样经常出现的好基友欧拉函数 φ
。我们知道欧拉函数有一个性质:
d∣n∑φ(d)=n
我们定义一个数论函数 N(n)=n
,并试着将上式表示成狄利克雷卷积?
φ⋅1=N
我们试着对其操作一下:
φ⋅1=N⇒φ⋅1⋅μ=N⋅μ⇒φ=N⋅μ
于是我们再次发现了两者之间非同一般的关系:
d∣n∑dμ(d)=nφ(n)
另外,除数函数也可以用狄利克雷卷积表示:
d(n)=d∣n∑1σ(n)=d∣n∑d⇒d=1⋅1⇒σ=N⋅1
杜教筛
杜教筛之所以有趣,并不是因为其具有怎样的普适性,而是其本身就在于 “构造”。只要能构造出来,我们就可以对特定的积性函数 f
求出其前缀和 S(n)=i=1∑nf(i)
。
构造?
构造两个积性函数 g,h s.t. h=f⋅g
:
i=1∑nh(i)=i=1∑nd∣i∑f(d)g(di)=d=1∑ng(d)d∣i∑f(di)=d=1∑ng(d)i=1∑⌊dn⌋f(i)=d=1∑ng(d)S(⌊dn⌋)
整理一下可得:
g(1)S(n)=i=1∑nh(i)−d=2∑ng(d)S(⌊dn⌋)
这就是杜教筛的本体。换句话说,只要我们构造出的 i=1∑nh(i)
是可以 O(1)
求得的,那么结合适当的预处理和记忆化(预处理规模 O(n32)
),我们可以用 O(n32)
的复杂度计算出 S(n)
。
更具体地说,即我们应当先用线性筛预处理出前 O(n32)
左右的前缀和,然后对于大于这一阈值的前缀和递归求解。同时,每当求出一个值我们将其记忆化在哈希表里以加速未来的运算。
对于这一筛法复杂度的详细证明大家可以参考这篇博文:杜教筛时间复杂度证明 - _Ark
应用
下面我们来看几点应用,感受一下杜教筛的魅力所在~
f(i)=φ(i), S(n)=i=1∑nφ(i)
:
由 φ⋅1=N
(对应 f⋅g=h
):
S(n)=i=1∑ni−d=2∑nS(⌊dn⌋)
f(i)=μ(i), S(n)=i=1∑nμ(i)
:
由 μ⋅1=ϵ
(对应 f⋅g=h
):
S(n)=1−d=2∑nS(⌊dn⌋)
f(i)=iφ(i), S(n)=i=1∑niφ(i)
:
h=f⋅g=d∣n∑f(d)g(dn)=d∣n∑dφ(d)g(dn)let g=N=nd∣n∑φ(d)=n2
S(n)=i=1∑ni2−d=2∑ndS(⌊dn⌋)
f(i)=i2φ(i), S(n)=i=1∑ni2φ(i)
:
h=f⋅g=d∣n∑f(d)g(dn)=d∣n∑d2φ(d)g(dn)let g=N2=n2d∣n∑φ(d)=n3
S(n)=i=1∑ni3−d=2∑nd2S(⌊dn⌋)
至于具体的代码,大家可以去试试 洛谷 P4213: 杜教筛 (Sum),顺便提供 我的代码 供参考。
完结撒花~
%%%