前言
好菜啊,学这些东西快学傻了。我想整理一下会舒服点。
积性函数的定义
- 若 f(x) 为定义域为正整数域,值域为复数域的函数,我们就称之为数论函数。
- 对于在 a,b 互质的条件下,满足 f(ab)=f(a)f(b) 的数论函数,我们称之为积性函数。
- 若对于任意一对 a,b 都满足,则称之为完全积性函数。
常见的积性函数与其性质
- 除数函数 σk(n)=∑d|ndk ,即n的每个约数的k次方的和,注意不是 σk(n) 。
- 元函数,即下面要讲的狄利克雷卷积的单位元, ϵ(n)=[n=1] ,完全积性。
- 恒等函数 1(n) ,一般写在卷积中写为 1 ,有时候不会写出来,肯定也是完全积性的。
- 幂函数
idk(n)=nk ,完全积性。 - 莫比乌斯函数
μ(n)
,
μ(1)=1
,设
n=∏li=1pkii
,则当l=1时
μ(n)=(−1)k
,l>1时为0。
值得注意的是 ∑d|nμ(d)=[n=1] ,证明的思路是考虑每个d的 ki=0/1 用组合数表示前面的式子,再用二项式定理证明。
二项式定理: (a−b)k=∑ki=0Cikaibk−i 。
这样我们可以得到, μ∗1=ϵ ,可以对着每一项看一看是不是。 - 欧拉函数,
φ(n)=∑ni=1[(i,n)=1]⋅1
。
欧拉函数相关:
设 n=∏li=1pkii
- φ(n)=n⋅∏li=1(1−1pi) 。
- 若l=1,则 φ(n)=pk−pk−1
- ∑ni=1[(i,n)=1]⋅i=n⋅φ(n)2 。我们知道若 (i,n)=1 ,根据辗转相除,可知 (n−i,n)=1 ,那么可以把这些数对配对起来凑成n。需要注意的是,如果n=1,要加一个1。
- 对于正整数n>2, φ(n) 为偶数。
注意到上面欧拉函数的通项公式可以写成 φ(n)=∏li=1φ(pkii) 这个可以推广到所有积性函数。而如果是完全积性函数函数,更可以把 ki 写在外面。
狄利克雷卷积和莫比乌斯反演
- 数论函数
f
和
g 的卷积定义为, (f∗g)(n)=∑d|nf(d)g(nd) 。它满足交换律,结合律,加法满足分配律(没什么用),另外, f∗ϵ=f ,若 f 和g 为积性函数,则 f∗g 为积性函数,即具有传递性。
而根据这一点,我们可以写出 (f∗g)(n)=∏(f∗g)(pkii) - 卷积在算法竞赛总常用的优化时间复杂度的方法是,给原来的式子一个
1
,就是把
f 写成 f∗1 ,这样子可以转化式子,例如 n=∏li=1pkii , g(n)=∑d|nf(n) ,变为 g(n)=∑d|nf(n)1(nd) ,得到g(n)为积性函数,那么我们现在相当于
g(n)=∏li=1g(pkii)=∏li=1(f∗1)(pkii)=∏li=1∑kij=0f(pji)⋅1(pki−ji) ,就是这样了。 - 再举个例子欧拉函数,就是
∑d|nφ(d)=n
,这个仍然是上面的方法,左边卷积上
1
,很容易发现
∑kij=0φ(pji)=pkii ,然后 ∏ 起来就是n了。 - 来讲讲莫比乌斯反演吧,若 g(n)=∑d|if(d) ,即 g=f∗1 ,两边乘 μ ,根据莫比乌斯函数性质,可得 g∗μ=f∗ϵ ,即 f(n)∗ϵ(1)=∑d|ng(d)μ(nd) ,因为元函数只有第一位是1,所以其他都省掉。在过程中,我们发现并不需要f为积性函数。类似的可以把 ∑i|n 换成 ∑n|i ,即i为n的倍数。
- 一个演绎:
φ∗1=id
,两边乘
μ
,则
φ∗ϵ=id∗μ
,那么可见,
φ(n)=∑d|nμ(d)nd
。
可见,化为卷积来进行宏观的转化,再写为多项式,就能弄出很优美的东西。
杜教筛
利用狄利克雷卷积构造,我们可以快速算出一类积性函数的前缀和。
设
f(n)
为积性函数,我们现在要算
s(n)=∑ni=1f(i)
根据函数f的性质,我们要构造一个
s(n)
关于
s(⌊ni⌋)
的递推式,那么我们需要找一个合适的函数
g(n)
,使得
∑ni=1∑d|if(d)g(id)=∑ni=1g(i)∑⌊ni⌋d=1f(d)=∑ni=1g(i)s(⌊ni⌋)
由于我们要求
s(n)
,则把带
s(n)
的提出来,得到
g(1)s(n)=∑ni=1(f∗g)(i)−∑ni=2g(i)s(⌊ni⌋)
。
这样的话,我们后面用根号n的时间递归解决。而前一项是一个卷积。那么我们可以发现杜教筛的局限:卷积必须要能够快速算出来,才可以用这种算法。在一般的杜教筛题目中,这个一般是手算的。
例子就不写了,而杜教筛直接上时间复杂度是
O(n34)
的,具体分析可见论文。如果配合线筛,筛出出前
n23
的预处理,则时间复杂度可达
O(n23)
。十分的优秀。
参考资料
浅谈一类积性函数的前缀和——唐老师
2016国家集训队论文中《积性函数求和的几种方法》——绍兴一中,任之洲