狄利克雷卷积
第一部分:狄利克雷卷积(Dirichlet Convolution)
它是数论函数空间上的二元运算,定义为: 对于两个数论函数f(n)和g(n),它们的卷积(f∗g)(n)为:
(f∗g)(n)=d∣n∑f(d)⋅g(dn)
(其中d∣n表示d取遍n的所有正因子。)
1. 三大核心性质
- 交换律:f∗g=g∗f
- 结合律:(f∗g)∗h=f∗(g∗h)
- 分配律:f∗(g+h)=f∗g+f∗h
2. 至关重要的“单位元”(恒等函数)
定义函数ϵ(n)(或写作e(n)):
ϵ(n)={10(n=1)(n>1)
显然,对于任意函数f,都有:f∗ϵ=ϵ∗f=f。
3. 必须熟记的“四大基础积性函数”及其卷积关系
- 1(n):常函数,恒等于1。
- Id(n):恒等函数,Id(n)=n。
- φ(n):欧拉函数(1到n中与n互质的个数)。
- μ(n):莫比乌斯函数(下面会细讲)。
极重要的恒等式(一定要背下):
1.φ∗1=Id 即:∑d∣nφ(d)=n
2.μ∗1=ϵ 即:∑d∣nμ(d)=[n=1]=e(这是莫比乌斯反演的根源)
第二部分:莫比乌斯函数(μ)与反演
1. 莫比乌斯函数的定义
若n = p_1^{a_1} p_2^{a_2} \dots p_k^{a_k}(质因数分解):
\mu(n) = \begin{cases} 1 & (n = 1) \\ (-1)^k & (a_1 = a_2 = \dots = a_k = 1,\text{即无平方因子数}) \\ 0 & (\text{存在某个 } a_i \ge 2,\text{即含有平方因子}) \end{cases}
2. 核心引理(反演的数学基础)
d∣n∑μ(d)={10(n=1)(n>1)
用卷积语言写就是:μ∗1=ϵ。
这意味着,μ 是常函数1在狄利克雷卷积下的逆元。
第三部分:莫比乌斯反演公式(两种形式)
形式一(约数形式,最常用)
如果数论函数F(n)和f(n)满足:
F(n)=d∣n∑f(d)
即F=f∗1,那么:
f(n)=d∣n∑μ(d)⋅F(dn)
即:f=F∗μ。
形式二(倍数形式,常用于求和变换)
如果:
F(n)=n∣d∑f(d)
(这里d是n的倍数,通常用在有限上界N中),那么:
f(n)=n∣d∑μ(nd)⋅F(d)
快速记忆口诀
已知“和函数”F求“原函数”f,就把F卷上μ,把除数换成商。
第四部分:经典应用案例(数论竞赛必会)
例题:求∑i=1n∑j=1n[gcd(i,j)=1](即n×n网格中互质点对数量)。
解法思路(利用反演把“等于1”换成“求和”):
- 利用性质[gcd(i,j)=1]=∑d∣gcd(i,j)μ(d)。
- 交换求和次序:
i=1∑nj=1∑nd∣i,d∣j∑μ(d)=d=1∑nμ(d)⌊dn⌋2
- 配合整除分块(数论分块)即可在O(√n)时间内算出。
第五部分:高级技巧 —— 杜教筛(快速求前缀和)
莫比乌斯反演结合狄利克雷卷积,可以构造出亚线性时间的数论函数前缀和算法(杜教筛)。
原理:设要求S(n)=∑i=1nf(i)。
若能找到另一个函数g,使得f∗g=h,且h的前缀和很好算,g的前缀和也很好算,则:
g(1)S(n)=i=1∑n(f∗g)(i)−i=2∑ng(i)⋅S(⌊in⌋)
利用这个递归式,可以快速求出S(n)。
例如:求∑i=1nμ(i)。
取f=μ,g=1,则h=μ∗1=ϵ。前缀和∑ϵ=1很好算,直接代入即可。
总结对照表(速查)
| 概念 | 表达式 | 备注 |
|---|
| 卷积定义 | (f∗g)(n)=∑d∣nf(d)g(n/d) | 遍历因子 |
| 单位元 | ϵ(n)=[n=1] | 卷积中的“1” |
| 莫比乌斯逆元 | μ∗1=ϵ | 最重要公式 |
| 欧拉恒等式 | φ∗1=Id | 推出φ=Id∗μ |
| 反演(约数) | F = f *\mathbf{1} \iff f = F* \mu | 互推灵魂 |
| 常见套路 | [gcd(i,j)=1]=∑d∣gcd(i,j)μ(d) | 将条件转换成求和 |
如果你正在准备竞赛或刷题,这三个易错点请额外注意:
- 下标起始:卷积中的d是正因子,必须从 1 到n。
- 积性函数的卷积:两个积性函数的卷积仍是积性函数,利用这一点可以在线性筛(欧拉筛)中O(n)预处理μ,φ等函数。
- 边界条件:μ(1)=1,计算反演时千万不要把n=1的情况漏掉。
如果你需要,我可以手写推演一遍杜教筛的完整步骤,或者给你三道难度递增的卷积练习题。你告诉我接下来想看哪个?
欧拉函数φ
φ(n)=∑i=1n[gcd(i,n)=1]
方法一:组合计数法(最美妙的视角)
我们考虑 n个分数:
n1,n2,n3,⋯,nn
显然,这串分数一共有 n 个。
接下来,我们把这n个分数全部约分到最简形式。设约分后的分母为d,那么d一定是n的约数(因为分母是分子分母除以最大公约数得来的)。
关键来了:对于每一个固定的分母d∣n,有多少个分数约分后恰好等于d?(分子与d互质)呢?
- 分母为d的最简真分数(或等于1的分数)形式为da,其中必须满足gcd(a,d)=1。
- 同时,因为原分数的分母是n,分子是从1到n,所以a的取值范围恰好是1≤a≤d。
而1到d中与d互质的整数个数,正是欧拉函数的定义:φ(d)。
总结计数:
- 左边(按分母分类):∑d∣nφ(d)
- 右边(分数的总个数):n
因此:
d∣n∑φ(d)=n
用卷积语言写,就是φ∗1=Id。
方法二:积性函数证明(最严谨的代数法)
如果你对“积性函数”敏感,这个证明极其干脆:
先证明F(n)=∑d∣nφ(d)是积性函数。
因为φ是积性函数,而“约数和”运算(即卷上1)保持积性,所以F(n)也是积性函数。
只需考察n的单一质因数幂pk的情况:
F(pk)=d∣pk∑φ(d)=φ(1)+φ(p)+φ(p2)+⋯+φ(pk)
代入欧拉函数在质数幂处的取值(φ(pi)=pi−pi−1):
F(pk)=1+(p−1)+(p2−p)+(p3−p2)+⋯+(pk−pk−1)
这是一个望远镜求和(裂项相消),中间项全部抵消,只剩下:
F(pk)=pk
- 推广到一般n:
若n=∏piki,由于积性:
F(n)=∏F(piki)=∏piki=n
证毕。
结合你刚学的莫比乌斯反演来反推验证
既然你刚学了莫比乌斯反演,我们可以用这个恒等式反推出欧拉函数的另一个表达式。
由φ∗1=Id,两边同时卷上μ(因为1的逆是μ):
φ∗1∗μ=Id∗μ
左边:φ∗(1∗μ)=φ∗ϵ=φ 右边:Id∗μ
于是得到著名的欧拉反演公式:
φ(n)=d∣n∑μ(d)⋅dn=nd∣n∑dμ(d)
(例如:φ(6)=6×(1−21−31+61)=2,完全正确。)
记忆小窍门(几何直观)
你可以把这个等式想象成:把n个格子按“周期”分组。分母d是n的周期,φ(d)是在该周期下“新出现”的不可约位置,所有周期的不可约位置加起来,正好铺满n个整数点。这就是为什么∑d∣nφ(d)=n。
如果你对这个“分数约分”的证明还有疑问,或者想看我把它用在具体的竞赛题(比如求∑i=1ngcd(i,n))中,随时告诉我!
针对你这个二维求和 ∑i=1m∑j=1n[gcd(i,j)=1],直接套用莫比乌斯反演的核心套路,可以一步写出化简公式。
这个式子的几何意义是:在 m×n 的矩形网格点阵中,从原点 (0,0) 出发能直接“看到”(即视线不被遮挡)的整点个数。
1. 反演化简(标准推导)
利用我们刚学的恒等式:[gcd(i,j)=1]=∑d∣gcd(i,j)μ(d)。
代入原式并交换求和次序(d 必须同时整除 i 和 j):
i=1∑mj=1∑n[gcd(i,j)=1]=i=1∑mj=1∑nd∣i, d∣j∑μ(d)=d=1∑min(m,n)μ(d)i=1,d∣i∑mj=1,d∣j∑n1
在 1 到 m 中,能被 d 整除的数的个数为 ⌊dm⌋,同理 j 有 ⌊dn⌋ 个。
最终公式:
\boxed{\sum_{i=1}^m \sum_{j=1}^n [\gcd(i, j)=1] = \sum_{d=1}^{\min(m, n)} \mu(d) \left\lfloor \frac{m}{d} \right\rfloor \left\lfloor \frac{n}{d} \right\rfloor}
2. 特殊情况:当 m=n(正方形网格)
如果 m=n=N,公式退化为:
d=1∑Nμ(d)⌊dN⌋2
这个结果还有一个极其优美的欧拉函数等价形式(利用我们刚证的 ∑d∣kφ(d)=k):
i=1∑Nj=1∑N[gcd(i,j)=1]=1+2i=1∑Nφ(i)
(其中的 +1 是因为坐标 (1,1) 在对角线交点处被重复计算,或者理解为只算一次原点视线)。
3. 如何快速计算?(数论分块 / 整除分块)
如果你需要编程计算(比如 m,n≤1012),不能直接枚举 d,必须使用整除分块。
核心观察:随着 d 增大,⌊dm⌋ 和 ⌊dn⌋ 都会分段保持不变。我们可以将 d 分成若干个区间 [l,r],在同一个区间内这两个值不变。
计算步骤:
- 预处理莫比乌斯函数的前缀和 M(x)=∑i=1xμ(i)(用线性筛)。
- 设 N=min(m,n)。
- 令 l=1,当 l≤N 时:
- 计算当前块的值:vm=⌊m/l⌋,vn=⌊n/l⌋
- 计算块的右端点:r=min(⌊vmm⌋, ⌊vnn⌋, N)
- 这个区间 [l,r] 的贡献为:(M(r)−M(l−1))×vm×vn
- 令 l=r+1 继续下一块。
复杂度:O(√m+√n),极快。
4. 举个具体例子(手算验证)
求 m=4,n=6 时的值。
先列 μ(d):μ(1)=1,μ(2)=−1,μ(3)=−1,μ(4)=0。
代入公式:
d=1: 1×4×6=24
d=2: (−1)×2×3=−6
d=3: (−1)×1×2=−2
d=4: 0×1×1=0
总和:24−6−2=16。
意义:在 4×6 的网格中,有 16 个点与原点连线不经过其他格点。
5. 与狄利克雷卷积的深层联系(拔高)
如果你把这个问题看成矩阵 Ai,j=[gcd(i,j)=1],那么这个二维求和本质上是在对积性函数的二维前缀和做处理。
我们可以用狄利克雷卷积的语言重新包装: 设 F(n,m)=∑i=1m∑j=1n[gcd(i,j)=1]。 其实这就是把恒等函数 1 在二维格点上的卷积逆(即 μ)做了个加权平均。这为以后学习多维莫比乌斯反演(如 gcd 矩阵的行列式)打下了基础。
如果你需要,我可以直接给你一份C++ 整除分块的完整可运行代码,或者继续推导 三维情况 ∑i=1a∑j=1b∑k=1c[gcd(i,j,k)=1] 的公式(套路完全一样,只是多乘一个下取整)。你告诉我下一步想看哪个?
数论分块/整除分块
TODO
FWT & 高位前缀和
TODO