本文介绍 Dirichlet 卷积和 Dirichlet 生成函数.
Dirichlet 卷积
数论函数 f ( n ) f(n) f ( n ) 和 g ( n ) g(n) g ( n ) 的 Dirichlet 卷积 (Dirichlet convolution),记作 f ∗ g f \ast g f ∗ g ,定义为数论函数
( f ∗ g ) ( n ) = ∑ k ∣ n f ( k ) g ( n k ) = ∑ k ℓ = n f ( k ) g ( ℓ ) . (f \ast g)(n) = \sum_{k\mid n}f(k)g\left(\dfrac{n}{k}\right) = \sum_{k\ell=n}f(k)g(\ell). ( f ∗ g ) ( n ) = k ∣ n ∑ f ( k ) g ( k n ) = k ℓ = n ∑ f ( k ) g ( ℓ ) .
Dirichlet 卷积是数论函数的重要运算.数论函数的许多性质都是通过这个运算挖掘出来的.
例子
单位函数 ε \varepsilon ε 是莫比乌斯函数 μ \mu μ 和常数函数 1 1 1 的 Dirichlet 卷积:
ε = μ ∗ 1 ⟺ ε ( n ) = ∑ d ∣ n μ ( d ) . \varepsilon=\mu \ast 1 \iff\varepsilon(n)=\sum_{d\mid n}\mu(d). ε = μ ∗ 1 ⟺ ε ( n ) = d ∣ n ∑ μ ( d ) .
除数个数函数 τ \tau τ 是常数函数 1 1 1 和它自身的 Dirichlet 卷积:
τ = 1 ∗ 1 ⟺ τ ( n ) = ∑ d ∣ n 1. \tau=1 \ast 1 \iff \tau(n)=\sum_{d\mid n}1. τ = 1 ∗ 1 ⟺ τ ( n ) = d ∣ n ∑ 1.
除数和函数 σ \sigma σ 是恒等函数 i d \mathrm{id} id 和常数函数 1 1 1 的 Dirichlet 卷积:
σ = i d ∗ 1 ⟺ σ ( n ) = ∑ d ∣ n d . \sigma=\mathrm{id} \ast 1 \iff\sigma(n)=\sum_{d\mid n}d. σ = id ∗ 1 ⟺ σ ( n ) = d ∣ n ∑ d .
欧拉函数 φ \varphi φ 是恒等函数 i d \mathrm{id} id 和莫比乌斯函数 μ \mu μ 的 Dirichlet 卷积:
φ = i d ∗ μ ⟺ φ ( n ) = ∑ d ∣ n d ⋅ μ ( n d ) . \varphi=\mathrm{id}\ast \mu \iff\varphi(n)=\sum_{d\mid n}d\cdot\mu\left(\frac{n}{d}\right). φ = id ∗ μ ⟺ φ ( n ) = d ∣ n ∑ d ⋅ μ ( d n ) .
莫比乌斯反演 就是利用 ε = μ ∗ 1 \varepsilon=\mu \ast 1 ε = μ ∗ 1 对数论函数恒等式进行变形.
性质
Dirichlet 卷积具有一系列代数性质.
定理
设 f , g , h f,g,h f , g , h 都是数论函数.那么,有:
交换律 :f ∗ g = g ∗ f f\ast g=g\ast f f ∗ g = g ∗ f .
结合律 :( f ∗ g ) ∗ h = f ∗ ( g ∗ h ) (f\ast g)\ast h=f\ast(g\ast h) ( f ∗ g ) ∗ h = f ∗ ( g ∗ h ) .
分配律 :( f + g ) ∗ h = f ∗ h + g ∗ h (f+g)\ast h = f\ast h + g\ast h ( f + g ) ∗ h = f ∗ h + g ∗ h .
单位元 :f ∗ ε = ε ∗ f = f f\ast\varepsilon = \varepsilon \ast f = f f ∗ ε = ε ∗ f = f ,其中,ε ( n ) = [ n = 1 ] \varepsilon(n) = [n=1] ε ( n ) = [ n = 1 ] 是卷积单位元,[ ⋅ ] [\cdot] [ ⋅ ] 是 Iverson 括号.
逆元 :当且仅当 f ( 1 ) ≠ 0 f(1)\neq 0 f ( 1 ) = 0 时,存在 g g g 使得 f ∗ g = g ∗ f = ε f\ast g=g\ast f=\varepsilon f ∗ g = g ∗ f = ε ,且 g g g 称为 f f f 的 Dirichlet 逆元 (Dirichlet inverse),可以记作 f − 1 f^{-1} f − 1 .而且,逆元 g g g 满足递推公式
g ( n ) = ε ( n ) − ∑ k ℓ = n , k ≠ 1 f ( k ) g ( ℓ ) f ( 1 ) . g(n) = \dfrac{\varepsilon(n) - \sum_{k\ell = n,~k\neq 1}f(k)g(\ell)}{f(1)}. g ( n ) = f ( 1 ) ε ( n ) − ∑ k ℓ = n , k = 1 f ( k ) g ( ℓ ) .
证明
为验证交换律,直接计算可知
( f ∗ g ) ( n ) = ∑ k ℓ = n f ( k ) g ( ℓ ) = ( g ∗ f ) ( n ) . (f\ast g)(n) = \sum_{k\ell=n}f(k)g(\ell) = (g\ast f)(n). ( f ∗ g ) ( n ) = k ℓ = n ∑ f ( k ) g ( ℓ ) = ( g ∗ f ) ( n ) .
为验证结合律,直接计算可知
( ( f ∗ g ) ∗ h ) ( n ) = ∑ k ℓ m = n f ( k ) g ( ℓ ) h ( m ) = ( f ∗ ( g ∗ h ) ) ( n ) . ((f\ast g)\ast h)(n) = \sum_{k\ell m = n}f(k)g(\ell)h(m) = (f\ast (g\ast h))(n). (( f ∗ g ) ∗ h ) ( n ) = k ℓ m = n ∑ f ( k ) g ( ℓ ) h ( m ) = ( f ∗ ( g ∗ h )) ( n ) .
为验证分配律,直接计算可知
( ( f + g ) ∗ h ) ( n ) = ∑ k ℓ = n ( f ( k ) + g ( k ) ) h ( ℓ ) = ∑ k ℓ = n f ( k ) h ( ℓ ) + ∑ k ℓ = n g ( k ) h ( ℓ ) = ( f ∗ h + g ∗ h ) ( n ) . \begin{aligned}
((f+g)\ast h)(n) &= \sum_{k\ell = n}(f(k) + g(k))h(\ell) \\
&= \sum_{k\ell=n}f(k)h(\ell) + \sum_{k\ell=n}g(k)h(\ell) = (f\ast h+g\ast h)(n).
\end{aligned} (( f + g ) ∗ h ) ( n ) = k ℓ = n ∑ ( f ( k ) + g ( k )) h ( ℓ ) = k ℓ = n ∑ f ( k ) h ( ℓ ) + k ℓ = n ∑ g ( k ) h ( ℓ ) = ( f ∗ h + g ∗ h ) ( n ) .
为验证 ε ( n ) \varepsilon(n) ε ( n ) 是单位元,直接计算可知
( f ∗ ε ) ( n ) = ∑ k ℓ = n f ( k ) ε ( ℓ ) = f ( n ) . (f\ast\varepsilon)(n) = \sum_{k\ell = n}f(k)\varepsilon(\ell) = f(n). ( f ∗ ε ) ( n ) = k ℓ = n ∑ f ( k ) ε ( ℓ ) = f ( n ) .
第二个等号是因为 ε ( ℓ ) \varepsilon(\ell) ε ( ℓ ) 仅在 ℓ = 1 \ell=1 ℓ = 1 即 k = n k=n k = n 时取得非零值.
最后,需要证明 f − 1 f^{-1} f − 1 存在,当且仅当 f ( 1 ) ≠ 0 f(1)\neq 0 f ( 1 ) = 0 .对于任意 f f f ,假设存在 g g g 使得 f ∗ g = ε f\ast g=\varepsilon f ∗ g = ε .这意味着
( f ∗ g ) ( n ) = ∑ k ℓ = n f ( k ) g ( ℓ ) = ε ( n ) . (f\ast g)(n) = \sum_{k\ell = n}f(k)g(\ell) = \varepsilon(n). ( f ∗ g ) ( n ) = k ℓ = n ∑ f ( k ) g ( ℓ ) = ε ( n ) .
这实际上给出了一系列关于 g ( n ) g(n) g ( n ) 取值的方程组,从中可以直接求出 g ( n ) g(n) g ( n ) .特别地,当 n = 1 n=1 n = 1 时,等式变为 f ( 1 ) g ( 1 ) = 1 f(1)g(1)=1 f ( 1 ) g ( 1 ) = 1 ,所以 g g g 存在,至少要求 f ( 1 ) ≠ 0 f(1)\neq 0 f ( 1 ) = 0 .而只要 f ( 1 ) ≠ 0 f(1)\neq 0 f ( 1 ) = 0 ,可以直接解出
g ( n ) = ε ( n ) − ∑ k ℓ = n , k ≠ 1 f ( k ) g ( ℓ ) f ( 1 ) . g(n) = \dfrac{\varepsilon(n) - \sum_{k\ell = n,~k\neq 1}f(k)g(\ell)}{f(1)}. g ( n ) = f ( 1 ) ε ( n ) − ∑ k ℓ = n , k = 1 f ( k ) g ( ℓ ) .
它可以用于递归计算 g ( n ) g(n) g ( n ) 的取值.因此,逆元 g g g 存在,当且仅当 f ( 1 ) ≠ 0 f(1)\neq 0 f ( 1 ) = 0 .
用抽象代数的语言说,这些代数性质说明,全体数论函数在(逐点)加法运算和 Dirichlet 卷积运算下构成 交换环 ,且它的全体可逆元就是那些在 n = 1 n=1 n = 1 处取非零值的函数.这个环称为 Dirichlet 环 (Dirichlet ring).
积性函数是一类特殊的数论函数.它对于 Dirichlet 卷积和 Dirichlet 逆都是封闭的.
定理
设 f , g f,g f , g 是积性函数,那么,f ∗ g f\ast g f ∗ g 也是积性函数.而且,逆元 f − 1 f^{-1} f − 1 一定存在,它也是积性函数.
证明
对于第一点,设 h = f ∗ g h=f\ast g h = f ∗ g ,直接验证可知,对于 n 1 ⊥ n 2 n_1\perp n_2 n 1 ⊥ n 2 ,都有
h ( n 1 ) h ( n 2 ) = ( ∑ k 1 ℓ 1 = n 1 f ( k 1 ) g ( ℓ 1 ) ) ( ∑ k 2 ℓ 2 = n 2 f ( k 2 ) g ( ℓ 2 ) ) = ∑ k 1 ℓ 1 = n 1 , k 2 ℓ 2 = n 2 f ( k 1 ) f ( k 2 ) g ( ℓ 1 ) g ( ℓ 2 ) = ∑ k ℓ = n 1 n 2 f ( k ) g ( ℓ ) = h ( n 1 n 2 ) . \begin{aligned}
h(n_1)h(n_2) &= \left(\sum_{k_1\ell_1=n_1}f(k_1)g(\ell_1)\right)\left(\sum_{k_2\ell_2=n_2}f(k_2)g(\ell_2)\right)\\
&= \sum_{k_1\ell_1=n_1,~k_2\ell_2=n_2}f(k_1)f(k_2)g(\ell_1)g(\ell_2)\\
&= \sum_{k\ell = n_1n_2}f(k)g(\ell) \\
&= h(n_1n_2).
\end{aligned} h ( n 1 ) h ( n 2 ) = ( k 1 ℓ 1 = n 1 ∑ f ( k 1 ) g ( ℓ 1 ) ) ( k 2 ℓ 2 = n 2 ∑ f ( k 2 ) g ( ℓ 2 ) ) = k 1 ℓ 1 = n 1 , k 2 ℓ 2 = n 2 ∑ f ( k 1 ) f ( k 2 ) g ( ℓ 1 ) g ( ℓ 2 ) = k ℓ = n 1 n 2 ∑ f ( k ) g ( ℓ ) = h ( n 1 n 2 ) .
其中,第三个等号改变求和顺序的逻辑是:当 k k k 遍历 n 1 n 2 n_1n_2 n 1 n 2 的因数时,k k k 的素因子可以根据它是 n 1 n_1 n 1 还是 n 2 n_2 n 2 的素因子分为两类,将两类中的素因子(计重复)分别乘起来得到 k 1 k_1 k 1 和 k 2 k_2 k 2 ,它们将分别遍历 n 1 n_1 n 1 和 n 2 n_2 n 2 的因数;反过来,根据 n 1 n_1 n 1 和 n 2 n_2 n 2 的因数 k 1 k_1 k 1 和 k 2 k_2 k 2 ,总是可以得到 n 1 n 2 n_1n_2 n 1 n 2 的因数 k = k 1 k 2 k=k_1k_2 k = k 1 k 2 .
对于第二点,设 g = f − 1 g=f^{-1} g = f − 1 ,考虑应用数学归纳法.首先,g ( 1 ) = 1 / f ( 1 ) = 1 g(1)=1/f(1)=1 g ( 1 ) = 1/ f ( 1 ) = 1 .此时,逆元的递归公式可以写作
g ( n ) = ε ( n ) − ∑ k ℓ = n , k ≠ 1 f ( k ) g ( ℓ ) . g(n) = \varepsilon(n) - \sum_{k\ell = n,~k\neq 1} f(k)g(\ell). g ( n ) = ε ( n ) − k ℓ = n , k = 1 ∑ f ( k ) g ( ℓ ) .
所以,对于 n 1 ⊥ n 2 n_1\perp n_2 n 1 ⊥ n 2 且 n 1 n 2 > 1 n_1n_2 > 1 n 1 n 2 > 1 ,有
g ( n 1 n 2 ) = − ∑ k ℓ = n 1 n 2 , k ≠ 1 f ( k ) g ( ℓ ) = − ∑ k 1 ℓ 1 = n 1 , k 2 ℓ 2 = n 2 , k 1 k 2 ≠ 1 f ( k 1 ) f ( k 2 ) g ( ℓ 1 ) g ( ℓ 2 ) = f ( 1 ) f ( 1 ) g ( n 1 ) g ( n 2 ) − ∑ k 1 ℓ 1 = n 1 , k 2 ℓ 2 = n 2 f ( k 1 ) f ( k 2 ) g ( ℓ 1 ) g ( ℓ 2 ) = g ( n 1 ) g ( n 2 ) − ( ∑ k 1 ℓ 1 = n 1 f ( k 1 ) g ( ℓ 1 ) ) ( ∑ k 2 ℓ 2 = n 2 f ( k 2 ) g ( ℓ 2 ) ) = g ( n 1 ) g ( n 2 ) − ε ( n 1 ) ε ( n 2 ) = g ( n 1 ) g ( n 2 ) . \begin{aligned}
g(n_1n_2) &= -\sum_{k\ell=n_1n_2,~k\neq 1}f(k)g(\ell) \\
&= -\sum_{k_1\ell_1=n_1,~k_2\ell_2=n_2,~k_1k_2\neq 1}f(k_1)f(k_2)g(\ell_1)g(\ell_2)\\
&= f(1)f(1)g(n_1)g(n_2) - \sum_{k_1\ell_1=n_1,~k_2\ell_2=n_2}f(k_1)f(k_2)g(\ell_1)g(\ell_2)\\
&= g(n_1)g(n_2) - \left(\sum_{k_1\ell_1=n_1}f(k_1)g(\ell_1)\right)\left(\sum_{k_2\ell_2=n_2}f(k_2)g(\ell_2)\right) \\
&= g(n_1)g(n_2) - \varepsilon(n_1)\varepsilon(n_2)\\
&= g(n_1)g(n_2).
\end{aligned} g ( n 1 n 2 ) = − k ℓ = n 1 n 2 , k = 1 ∑ f ( k ) g ( ℓ ) = − k 1 ℓ 1 = n 1 , k 2 ℓ 2 = n 2 , k 1 k 2 = 1 ∑ f ( k 1 ) f ( k 2 ) g ( ℓ 1 ) g ( ℓ 2 ) = f ( 1 ) f ( 1 ) g ( n 1 ) g ( n 2 ) − k 1 ℓ 1 = n 1 , k 2 ℓ 2 = n 2 ∑ f ( k 1 ) f ( k 2 ) g ( ℓ 1 ) g ( ℓ 2 ) = g ( n 1 ) g ( n 2 ) − ( k 1 ℓ 1 = n 1 ∑ f ( k 1 ) g ( ℓ 1 ) ) ( k 2 ℓ 2 = n 2 ∑ f ( k 2 ) g ( ℓ 2 ) ) = g ( n 1 ) g ( n 2 ) − ε ( n 1 ) ε ( n 2 ) = g ( n 1 ) g ( n 2 ) .
其中,第二个等号用到了归纳假设,即对于 ℓ 1 ℓ 2 < n 1 n 2 \ell_1\ell_2 < n_1n_2 ℓ 1 ℓ 2 < n 1 n 2 且 ℓ 1 ⊥ ℓ 2 \ell_1\perp\ell_2 ℓ 1 ⊥ ℓ 2 ,条件 g ( ℓ 1 ℓ 2 ) = g ( ℓ 1 ) g ( ℓ 2 ) g(\ell_1\ell_2)=g(\ell_1)g(\ell_2) g ( ℓ 1 ℓ 2 ) = g ( ℓ 1 ) g ( ℓ 2 ) 成立.
用抽象代数的语言说,全体积性函数在 Dirichlet 卷积运算下构成 Dirichlet 环乘法群的 子群 .
更为特殊的是完全积性函数.
定理
设 α \alpha α 是完全积性函数,f , g f,g f , g 是数论函数.那么,有:
分配律:( α f ) ∗ ( α g ) = α ⋅ ( f ∗ g ) (\alpha f)\ast(\alpha g) = \alpha\cdot(f\ast g) ( α f ) ∗ ( α g ) = α ⋅ ( f ∗ g ) .
逆元:( α f ) − 1 = α f − 1 (\alpha f)^{-1}=\alpha f^{-1} ( α f ) − 1 = α f − 1 ,只要 f − 1 f^{-1} f − 1 存在.
积性函数 f f f 是完全积性函数,当且仅当 f − 1 = μ f f^{-1}=\mu f f − 1 = μ f ,其中,μ \mu μ 是 莫比乌斯函数 .
证明
对于第一条,直接验证可知
( ( α f ) ∗ ( α g ) ) ( n ) = ∑ k ℓ = n ( α f ) ( k ) ( α g ) ( ℓ ) = ∑ k ℓ = n α ( k ) f ( k ) α ( ℓ ) g ( ℓ ) = ∑ k ℓ = n α ( n ) f ( k ) g ( ℓ ) = α ( n ) ( f ∗ g ) ( n ) . \begin{aligned}
((\alpha f)\ast(\alpha g))(n) &= \sum_{k\ell = n}(\alpha f)(k)(\alpha g)(\ell) \\
&= \sum_{k\ell = n}\alpha(k)f(k)\alpha(\ell)g(\ell) \\
&= \sum_{k\ell = n}\alpha(n)f(k)g(\ell) \\
&= \alpha(n)(f\ast g)(n).
\end{aligned} (( α f ) ∗ ( α g )) ( n ) = k ℓ = n ∑ ( α f ) ( k ) ( α g ) ( ℓ ) = k ℓ = n ∑ α ( k ) f ( k ) α ( ℓ ) g ( ℓ ) = k ℓ = n ∑ α ( n ) f ( k ) g ( ℓ ) = α ( n ) ( f ∗ g ) ( n ) .
其中,第三个等号用到了完全积性函数的性质:α ( n ) = α ( k ) α ( ℓ ) \alpha(n)=\alpha(k)\alpha(\ell) α ( n ) = α ( k ) α ( ℓ ) 对所有 n = k ℓ n=k\ell n = k ℓ 都成立.
对于第二条,利用第一条就有
( α f ) ∗ ( α f − 1 ) = α ( f ∗ f − 1 ) = α ε = ε . (\alpha f)\ast(\alpha f^{-1}) = \alpha(f\ast f^{-1}) = \alpha\varepsilon = \varepsilon. ( α f ) ∗ ( α f − 1 ) = α ( f ∗ f − 1 ) = α ε = ε .
其中,最后一个等号只利用了 α ( 1 ) = 1 \alpha(1)=1 α ( 1 ) = 1 .由逆元定义,( α f ) − 1 = α f − 1 (\alpha f)^{-1}=\alpha f^{-1} ( α f ) − 1 = α f − 1 .
对于第三条,利用第二条和 1 − 1 = μ 1^{-1}=\mu 1 − 1 = μ 可知,如果 f f f 是完全积性函数,那么
f − 1 = ( 1 f ) − 1 = 1 − 1 ⋅ f = μ f . f^{-1} = (1f)^{-1} = 1^{-1}\cdot f = \mu f. f − 1 = ( 1 f ) − 1 = 1 − 1 ⋅ f = μ f .
其中,1 1 1 是常数函数.反过来,如果 f f f 是积性函数且 f − 1 = μ f f^{-1}=\mu f f − 1 = μ f ,那么只需要证明对于所有素数 p p p 和 e ∈ N + e\in\mathbf N_+ e ∈ N + ,都有 f ( p e ) = f ( p ) e f(p^e)=f(p)^e f ( p e ) = f ( p ) e 成立,就能证明 f f f 是完全积性函数.为此,对 e ∈ N + e\in\mathbf N_+ e ∈ N + 应用数学归纳法.归纳起点 e = 1 e=1 e = 1 处命题显然成立.对于任意 e > 1 e > 1 e > 1 ,应用逆元递推公式,都有
f − 1 ( p e ) = − ∑ i = 1 e f ( p i ) f − 1 ( p e − i ) = − ∑ i = 1 e f ( p i ) μ ( p e − i ) f ( p e − i ) = − f ( p e ) f ( 1 ) μ ( 1 ) − f ( p e − 1 ) μ ( p ) f ( p ) = − f ( p e ) + f ( p ) e . \begin{aligned}
f^{-1}(p^e) &= -\sum_{i=1}^{e}f(p^i)f^{-1}(p^{e-i}) \\
&= -\sum_{i=1}^{e}f(p^i)\mu(p^{e-i})f(p^{e-i})\\
&= -f(p^e)f(1)\mu(1) - f(p^{e-1})\mu(p)f(p)\\
&= -f(p^e) + f(p)^e.
\end{aligned} f − 1 ( p e ) = − i = 1 ∑ e f ( p i ) f − 1 ( p e − i ) = − i = 1 ∑ e f ( p i ) μ ( p e − i ) f ( p e − i ) = − f ( p e ) f ( 1 ) μ ( 1 ) − f ( p e − 1 ) μ ( p ) f ( p ) = − f ( p e ) + f ( p ) e .
其中,最后一个等号用到了归纳假设 f ( p e − 1 ) = f ( p ) e − 1 f(p^{e-1})=f(p)^{e-1} f ( p e − 1 ) = f ( p ) e − 1 .应用 f − 1 = μ f f^{-1}=\mu f f − 1 = μ f ,就得到
f − 1 ( p e ) = μ ( p e ) f ( p e ) = 0. f^{-1}(p^e) = \mu(p^e)f(p^e) = 0. f − 1 ( p e ) = μ ( p e ) f ( p e ) = 0.
代入前式,就得到
f ( p e ) = f ( p ) e . f(p^e) = f(p)^e. f ( p e ) = f ( p ) e .
所以,归纳步骤成立.原命题得证.
用抽象代数的语言说,如果 α \alpha α 是完全积性函数,映射 f ↦ α f f\mapsto \alpha f f ↦ α f 是 Dirichlet 环的 自同态 .
Dirichlet 生成函数
与 Dirichlet 卷积紧密相关的是 Dirichlet 生成函数.
数论函数 f ( n ) f(n) f ( n ) ——也就是数列 { f ( n ) } \{f(n)\} { f ( n )} ——对应的 Dirichlet 生成函数 (Dirichlet series generating function,DGF)定义为形式 Dirichlet 级数(formal Dirichlet series):
F ( s ) = ∑ n = 1 ∞ f ( n ) n s . F(s) = \sum_{n=1}^{\infty}\dfrac{f(n)}{n^s}. F ( s ) = n = 1 ∑ ∞ n s f ( n ) .
级数中的 s s s 是形式变元.常见的 Dirichlet 生成函数中,s s s 往往可以看作是复变量,进而讨论 Dirichlet 级数的解析性质,但这超出了算法竞赛的范围.
Dirichlet 生成函数的乘积对应着相应的数论函数的 Dirichlet 卷积:
定理
对于数论函数 f , g f,g f , g 及其 Dirichlet 生成函数 F , G F,G F , G ,它们的 Dirichlet 卷积 f ∗ g f\ast g f ∗ g 的生成函数等于 F ⋅ G F\cdot G F ⋅ G .
证明
直接验证:
F ( s ) G ( s ) = ( ∑ k = 1 ∞ f ( k ) k s ) ( ∑ ℓ = 1 ∞ g ( ℓ ) ℓ s ) = ∑ k = 1 ∞ ∑ ℓ = 1 ∞ f ( k ) g ( ℓ ) ( k ℓ ) s = ∑ n = 1 ∞ ∑ k ℓ = n f ( k ) g ( ℓ ) n s = ∑ n = 1 ∞ ( f ∗ g ) ( n ) n s . \begin{aligned}
F(s)G(s) &= \left(\sum_{k=1}^\infty\dfrac{f(k)}{k^s}\right)\left(\sum_{\ell=1}^\infty\dfrac{g(\ell)}{\ell^s}\right)= \sum_{k=1}^\infty\sum_{\ell=1}^\infty\dfrac{f(k)g(\ell)}{(k\ell)^s}\\
&= \sum_{n=1}^{\infty}\dfrac{\sum_{k\ell = n}f(k)g(\ell)}{n^s} = \sum_{n=1}^\infty\dfrac{(f\ast g)(n)}{n^s}.
\end{aligned} F ( s ) G ( s ) = ( k = 1 ∑ ∞ k s f ( k ) ) ( ℓ = 1 ∑ ∞ ℓ s g ( ℓ ) ) = k = 1 ∑ ∞ ℓ = 1 ∑ ∞ ( k ℓ ) s f ( k ) g ( ℓ ) = n = 1 ∑ ∞ n s ∑ k ℓ = n f ( k ) g ( ℓ ) = n = 1 ∑ ∞ n s ( f ∗ g ) ( n ) .
利用 Dirichlet 卷积和 Dirichlet 生成函数乘积之间的对应关系,可以从 Dirichlet 生成函数的角度理解 Dirichlet 卷积的性质.由于形式 Dirichlet 级数的乘法运算满足交换律、结合律、对加法的分配律,数论函数的 Dirichlet 卷积运算满足同样的代数性质.
Euler 乘积
积性函数的特殊性同样反映在 Dirichlet 生成函数上.由于整数有 唯一分解定理 ,积性函数 f ( n ) f(n) f ( n ) 的生成函数 F ( s ) F(s) F ( s ) 可写成如下形式:
F ( s ) = ∑ n = 1 ∞ f ( n ) n s = ∑ n = 1 ∞ ∏ p ∈ P f ( p e ) p e s = ∏ p ∈ P ∑ e = 0 ∞ f ( p e ) p e s = ∏ p ∈ P ( 1 + f ( p ) p s + f ( p 2 ) p 2 s + f ( p 3 ) p 3 s + ⋯ ) . \begin{aligned}
F(s) &= \sum_{n=1}^{\infty}\dfrac{f(n)}{n^s} = \sum_{n=1}^{\infty}\prod_{p\in\mathbf P}\dfrac{f(p^{e})}{p^{es}} = \prod_{p\in\mathbf P}\sum_{e=0}^{\infty}\dfrac{f(p^e)}{p^{es}}\\
&= \prod_{p\in\mathbf P}\left(1 + \dfrac{f(p)}{p^s} + \dfrac{f(p^2)}{p^{2s}} + \dfrac{f(p^3)}{p^{3s}} + \cdots\right).
\end{aligned} F ( s ) = n = 1 ∑ ∞ n s f ( n ) = n = 1 ∑ ∞ p ∈ P ∏ p es f ( p e ) = p ∈ P ∏ e = 0 ∑ ∞ p es f ( p e ) = p ∈ P ∏ ( 1 + p s f ( p ) + p 2 s f ( p 2 ) + p 3 s f ( p 3 ) + ⋯ ) .
这意味着,F ( s ) F(s) F ( s ) 可以分解为若干 F p ( s ) F_p(s) F p ( s ) 的乘积,且每个 F p ( s ) F_p(s) F p ( s ) 对应的数论函数都只在 p p p 的幂次处可能取非零值.这一无穷乘积也称为 Euler 乘积 (Euler product).如果 F ( s ) F(s) F ( s ) 和 G ( s ) G(s) G ( s ) 都能分解成类似的形式,那么它们的乘积同样如此;将这一观察对应到数论函数上,就是积性函数的 Dirichlet 卷积仍然是积性函数.
进一步地,如果 f ( n ) f(n) f ( n ) 还是完全积性函数,那么 f ( p e ) = f ( p ) e f(p^e)=f(p)^e f ( p e ) = f ( p ) e ,上式可以继续简化:
F ( s ) = ∏ p ∈ P ∑ e = 0 ∞ f ( p ) e p e s = ∏ p ∈ P ( 1 − f ( p ) p s ) − 1 . F(s) = \prod_{p\in\mathbf P}\sum_{e=0}^{\infty}\dfrac{f(p)^e}{p^{es}} = \prod_{p\in\mathbf P}\left(1-\dfrac{f(p)}{p^s}\right)^{-1}. F ( s ) = p ∈ P ∏ e = 0 ∑ ∞ p es f ( p ) e = p ∈ P ∏ ( 1 − p s f ( p ) ) − 1 .
与积性函数不同,完全积性函数的 Dirichlet 生成函数的形式在乘法运算下并不具有封闭性,因此,完全积性函数的 Dirichlet 卷积和 Dirichlet 逆都未必是完全积性函数,但一定是积性函数.
例子
单位函数 ε ( n ) \varepsilon(n) ε ( n ) 是完全积性函数.它的 Dirichlet 生成函数是关于不定元 s s s 的常值函数
E ( s ) = ∑ n = 1 ∞ ε ( n ) n s = 1. E(s) = \sum_{n=1}^{\infty}\dfrac{\varepsilon(n)}{n^s} = 1. E ( s ) = n = 1 ∑ ∞ n s ε ( n ) = 1.
常数函数 1 ( n ) 1(n) 1 ( n ) 是完全积性函数.它的 Dirichlet 生成函数是 Riemann 函数
I ( s ) = ∑ n = 1 ∞ 1 n s = ∏ p ∈ P 1 1 − p − s = ζ ( s ) . I(s) = \sum_{n=1}^{\infty}\dfrac{1}{n^s} = \prod_{p\in\mathbf P}\dfrac{1}{1-p^{-s}} = \zeta(s). I ( s ) = n = 1 ∑ ∞ n s 1 = p ∈ P ∏ 1 − p − s 1 = ζ ( s ) .
莫比乌斯函数 μ ( n ) \mu(n) μ ( n ) 是常数函数的 Dirichlet 逆.它的 Dirichlet 生成函数是 ζ ( s ) \zeta(s) ζ ( s ) 的倒数:
M ( s ) = ∑ n = 1 ∞ μ ( n ) n s = ∏ p ∈ P ( 1 − p − s ) = 1 ζ ( s ) . M(s) = \sum_{n=1}^{\infty}\dfrac{\mu(n)}{n^s} = \prod_{p\in\mathbf P}(1-p^{-s}) = \dfrac{1}{\zeta(s)}. M ( s ) = n = 1 ∑ ∞ n s μ ( n ) = p ∈ P ∏ ( 1 − p − s ) = ζ ( s ) 1 .
幂函数 id k ( n ) = n k \operatorname{id}_k(n)=n^k id k ( n ) = n k 是完全积性函数.特别地,当 k = 0 k=0 k = 0 时,它就是常数函数;当 k = 1 k=1 k = 1 时,它就是恒等函数.它的 Dirichlet 生成函数是
I k ( s ) = ∑ n = 1 ∞ n k n s = ∏ p ∈ P 1 1 − p k − s = ζ ( s − k ) . I_k(s) = \sum_{n=1}^{\infty}\dfrac{n^k}{n^s} = \prod_{p\in\mathbf P}\dfrac{1}{1-p^{k-s}} = \zeta(s-k). I k ( s ) = n = 1 ∑ ∞ n s n k = p ∈ P ∏ 1 − p k − s 1 = ζ ( s − k ) .
欧拉函数 φ ( n ) \varphi(n) φ ( n ) 是积性函数.它的 Dirichlet 生成函数是
Φ ( s ) = ∏ p ∈ P ( 1 + p − 1 p s + p ( p − 1 ) p 2 s + p 2 ( p − 1 ) p 3 s + ⋯ ) = ∏ p ∈ P ( 1 1 − p 1 − s − 1 p s 1 1 − p 1 − s ) = ∏ p ∈ P 1 − p − s 1 − p 1 − s = ζ ( s − 1 ) ζ ( s ) . \begin{aligned}
\Phi(s) &= \prod_{p\in\mathbf P}\left(1+\dfrac{p-1}{p^s} + \dfrac{p(p-1)}{p^{2s}} + \dfrac{p^2(p-1)}{p^{3s}}+\cdots\right)\\
&= \prod_{p\in\mathbf P}\left(\dfrac{1}{1-p^{1-s}}-\dfrac{1}{p^s}\dfrac{1}{1-p^{1-s}}\right) = \prod_{p\in\mathbf P}\dfrac{1-p^{-s}}{1-p^{1-s}} = \dfrac{\zeta(s-1)}{\zeta(s)}.
\end{aligned} Φ ( s ) = p ∈ P ∏ ( 1 + p s p − 1 + p 2 s p ( p − 1 ) + p 3 s p 2 ( p − 1 ) + ⋯ ) = p ∈ P ∏ ( 1 − p 1 − s 1 − p s 1 1 − p 1 − s 1 ) = p ∈ P ∏ 1 − p 1 − s 1 − p − s = ζ ( s ) ζ ( s − 1 ) .
结合幂函数的 Dirichlet 函数表达式,就得到 i d = φ ∗ 1 \mathrm{id} = \varphi\ast 1 id = φ ∗ 1 .
约数函数 σ k ( n ) = ∑ d ∣ n d k \sigma_k(n)=\sum_{d\mid n}d^k σ k ( n ) = ∑ d ∣ n d k 是积性函数.它的 Dirichlet 生成函数是
Σ k ( s ) = ∏ p ∈ P ( 1 + 1 + p k p s + 1 + p k + p 2 k p 2 s + 1 + p k + p 2 k + p 3 k p 3 s + ⋯ ) = ∏ p ∈ P 1 1 − p k ( ( 1 − p k ) + 1 − p 2 k p s + 1 − p 3 k p 2 s + 1 − p 4 k p 3 k + ⋯ ) = ∏ p ∈ P 1 1 − p k ( 1 1 − p − s − p k 1 − p k − s ) = ∏ p ∈ P 1 ( 1 − p − s ) ( 1 − p k − s ) = ζ ( s − k ) ζ ( s ) . \begin{aligned}
\Sigma_k(s) &= \prod_{p\in\mathbf P}\left(1+\dfrac{1+p^k}{p^s}+\dfrac{1+p^k+p^{2k}}{p^{2s}}+\dfrac{1+p^k+p^{2k}+p^{3k}}{p^{3s}}+\cdots\right) \\
&= \prod_{p\in\mathbf P}\dfrac{1}{1-p^k}\left((1-p^k)+\dfrac{1-p^{2k}}{p^s}+\dfrac{1-p^{3k}}{p^{2s}}+\dfrac{1-p^{4k}}{p^{3k}}+\cdots\right)\\
&= \prod_{p\in\mathbf P}\dfrac{1}{1-p^k}\left(\dfrac{1}{1-p^{-s}} - \dfrac{p^k}{1-p^{k-s}}\right)\\
&= \prod_{p\in\mathbf P}\dfrac{1}{(1-p^{-s})(1-p^{k-s})} = \zeta(s-k)\zeta(s).
\end{aligned} Σ k ( s ) = p ∈ P ∏ ( 1 + p s 1 + p k + p 2 s 1 + p k + p 2 k + p 3 s 1 + p k + p 2 k + p 3 k + ⋯ ) = p ∈ P ∏ 1 − p k 1 ( ( 1 − p k ) + p s 1 − p 2 k + p 2 s 1 − p 3 k + p 3 k 1 − p 4 k + ⋯ ) = p ∈ P ∏ 1 − p k 1 ( 1 − p − s 1 − 1 − p k − s p k ) = p ∈ P ∏ ( 1 − p − s ) ( 1 − p k − s ) 1 = ζ ( s − k ) ζ ( s ) .
结合幂函数的 Dirichlet 表达式,就得到 σ k = i d k ∗ 1 \sigma_k = \mathrm{id}_k\ast 1 σ k = id k ∗ 1 .这正是 σ k \sigma_k σ k 的定义式.
无平方因子数的指示函数 u ( n ) = ∣ μ ( n ) ∣ u(n)=|\mu(n)| u ( n ) = ∣ μ ( n ) ∣ 是积性函数.它的 Dirichlet 生成函数是
U ( s ) = ∏ p ∈ P ( 1 + p − s ) = ∏ p ∈ P 1 − p − 2 s 1 − p − s = ζ ( s ) ζ ( 2 s ) . U(s) = \prod_{p\in\mathbf P}(1+p^{-s}) = \prod_{p\in\mathbf P}\dfrac{1-p^{-2s}}{1-p^{-s}} = \dfrac{\zeta(s)}{\zeta(2s)}. U ( s ) = p ∈ P ∏ ( 1 + p − s ) = p ∈ P ∏ 1 − p − s 1 − p − 2 s = ζ ( 2 s ) ζ ( s ) .
应用
Dirichlet 生成函数可以用于将积性函数表示为 Dirichlet 卷积.
例如在杜教筛的过程中,要计算积性函数 f f f 的前缀和,需要找到另一个积性函数 g g g 使得 f ∗ g f\ast g f ∗ g 和 g g g 都可以快速求前缀和.可以利用 Dirichlet 生成函数推导这一过程.
以杜教筛一节的例题 Luogu P3768 简单的数学题 为例,需要对 f ( n ) = n 2 φ ( n ) f(n)=n^2\varphi(n) f ( n ) = n 2 φ ( n ) 构造满足上述条件的数论函数 g ( n ) g(n) g ( n ) .由于 f f f 是积性函数,它的 Dirichlet 生成函数为
F ( s ) = ∏ p ∈ P ( 1 + ∑ k = 1 ∞ p 3 k − 1 ( p − 1 ) p k s ) = ∏ p ∈ P 1 − p 2 − s 1 − p 3 − s = ζ ( s − 3 ) ζ ( s − 2 ) . F(s) = \prod_{p\in\mathbf P}\left(1 + \sum_{k=1}^{\infty}\dfrac{p^{3k-1}(p-1)}{p^{ks}}\right) = \prod_{p\in\mathbf P}\dfrac{1-p^{2-s}}{1-p^{3-s}} = \dfrac{\zeta(s-3)}{\zeta(s-2)}. F ( s ) = p ∈ P ∏ ( 1 + k = 1 ∑ ∞ p k s p 3 k − 1 ( p − 1 ) ) = p ∈ P ∏ 1 − p 3 − s 1 − p 2 − s = ζ ( s − 2 ) ζ ( s − 3 ) .
对比幂函数的 Dirichlet 生成函数可知,只要取 g = i d 2 g = \mathrm{id}_2 g = id 2 ,就有 f ∗ g = i d 3 f \ast g = \mathrm{id}_3 f ∗ g = id 3 .两者都是可以快速计算前缀和的.
Dirichlet 卷积的计算
本节讨论 Dirichlet 卷积的计算问题,即给定序列 { f ( k ) } k = 1 n \{f(k)\}_{k=1}^n { f ( k ) } k = 1 n 和 { g ( k ) } k = 1 n \{g(k)\}_{k=1}^n { g ( k ) } k = 1 n ,求解 Dirichlet 卷积 h = f ∗ g h=f\ast g h = f ∗ g 的前若干项 { h ( k ) } k = 1 n \{h(k)\}_{k=1}^n { h ( k ) } k = 1 n 的问题.根据涉及到的函数性质,算法的复杂度也略有不同.
一般情形
如果 f , g , h f,g,h f , g , h 都没有特殊性质,那么 Dirichlet 卷积的计算只能利用其定义:
h ( n ) = ∑ k ℓ = n f ( k ) g ( ℓ ) . h(n) = \sum_{k\ell = n}f(k)g(\ell). h ( n ) = k ℓ = n ∑ f ( k ) g ( ℓ ) .
枚举 k k k 和 ℓ \ell ℓ ,将贡献 f ( k ) g ( ℓ ) f(k)g(\ell) f ( k ) g ( ℓ ) 累加到 h ( k ℓ ) h(k\ell) h ( k ℓ ) 上即可.枚举复杂度为
O ( ∑ k = 1 n n k ) = O ( n log n ) . O\left(\sum_{k=1}^{n}\dfrac{n}{k}\right) = O(n\log n). O ( k = 1 ∑ n k n ) = O ( n log n ) .
参考实现如下:
参考实现
auto dirichlet_convolute (const std::vector<int >& f, const std::vector<int >& g) {
int n = f.size () - 1 ;
std::vector<int > h (n + 1 ) ;
for (int k = 1 ; k <= n; ++k) {
for (int d = 1 ; k * d <= n; ++d) {
h[k * d] += f[k] * g[d];
}
}
return h;
}
与积性函数卷积的情形
如果 g g g 是积性函数,那么可以利用 Euler 乘积加速 Dirichlet 卷积的计算.计算 h h h 相当于计算它的 Dirichlet 生成函数 H H H 中各项的系数.由于
H ( s ) = F ( s ) G ( s ) = F ( s ) ∏ p ∈ P G p ( s ) . H(s) = F(s)G(s) = F(s)\prod_{p\in\mathbf P}G_p(s). H ( s ) = F ( s ) G ( s ) = F ( s ) p ∈ P ∏ G p ( s ) .
其中,G p ( s ) G_p(s) G p ( s ) 是 G ( s ) G(s) G ( s ) 的 Euler 乘积分解中的因式,它只包含 p p p 的幂次处的系数:
G p ( s ) = ∑ p k ≤ n f ( p k ) p k s = 1 + f ( p ) p s + f ( p 2 ) p 2 s + ⋯ . G_p(s) = \sum_{p^k\le n}\dfrac{f(p^k)}{p^{ks}} = 1 + \dfrac{f(p)}{p^s} + \dfrac{f(p^2)}{p^{2s}} + \cdots. G p ( s ) = p k ≤ n ∑ p k s f ( p k ) = 1 + p s f ( p ) + p 2 s f ( p 2 ) + ⋯ .
那么,从 F ( s ) F(s) F ( s ) 开始,遍历所有不超过 n n n 的素数 p p p ,将 G p ( s ) G_p(s) G p ( s ) 逐一乘上去,同样可以得到最终结果 H ( s ) H(s) H ( s ) .将 G p ( s ) G_p(s) G p ( s ) 乘上去时,直接应用一般情形中的暴力枚举算法即可.总枚举次数
∑ p ∈ P , p ≤ n ∑ k = 1 ∞ ⌊ n p k ⌋ ≤ ∑ p ∈ P , p ≤ n n p − 1 ≤ ∑ p ∈ P , p ≤ n 2 n p ∈ O ( n log log n ) . \sum_{p\in\mathbf P,~p\le n}\sum_{k=1}^{\infty}\left\lfloor\dfrac{n}{p^k}\right\rfloor \le \sum_{p\in\mathbf P,~p\le n}\dfrac{n}{p-1} \le \sum_{p\in\mathbf P,~p\le n}\dfrac{2n}{p} \in O(n\log\log n). p ∈ P , p ≤ n ∑ k = 1 ∑ ∞ ⌊ p k n ⌋ ≤ p ∈ P , p ≤ n ∑ p − 1 n ≤ p ∈ P , p ≤ n ∑ p 2 n ∈ O ( n log log n ) .
最后一步复杂度的估计与 Eratosthenes 筛法 复杂度的证明一致.所以,本算法的时间复杂度为 O ( n log log n ) O(n\log\log n) O ( n log log n ) .
参考实现如下:
参考实现
auto dirichlet_convolute (const std::vector<int >& f, const std::vector<int >& g) {
int n = f.size () - 1 ;
std::vector<int > h (f) ;
std::vector<bool > vis (n + 1 ) ;
for (int i = 2 ; i <= n; ++i) {
if (vis[i]) continue ;
for (int k = n / i * i; k; k -= i) {
vis[k] = true ;
int d = k;
while (true ) {
d /= i;
h[k] += h[d] * g[k / d];
if (d % i) break ;
}
}
}
return h;
}
特别地,当积性函数 g g g 是完全积性函数或其 Dirichlet 逆时,例如当 g = 1 g = 1 g = 1 或 g = μ g = \mu g = μ 时,那么算法可以进一步简化.此时,Dirichlet 卷积 h = f ∗ g h = f\ast g h = f ∗ g 的计算可以采用常数更小的 Dirichlet 前缀和/差分 算法,但是算法时间复杂度仍为 O ( n log log n ) O(n\log\log n) O ( n log log n ) .
结果为积性函数的情形
最后,考虑 h h h 是积性函数的情形.特别地,当 f , g f,g f , g 都是积性函数时,h = f ∗ g h=f \ast g h = f ∗ g 就是积性函数.要计算 h h h ,只需要确定它在素数幂处的取值,就可以通过 线性筛 在 O ( n ) O(n) O ( n ) 时间内计算.而对于素数幂 p e p^e p e 处的取值 h ( p e ) h(p^e) h ( p e ) 直接暴力计算即可:
h ( p e ) = ∑ i = 0 e f ( p i ) g ( p e − i ) . h(p^e) = \sum_{i=0}^e f(p^i)g(p^{e-i}). h ( p e ) = i = 0 ∑ e f ( p i ) g ( p e − i ) .
这些暴力计算需要的枚举次数为
∑ p ∈ P , p ≤ n ∑ e = 1 ⌊ log p n ⌋ ( e + 1 ) ≤ ∑ p ∈ P , p ≤ n ⌊ log p n ⌋ 2 + ∑ p ∈ P , n < p ≤ n 1 ≤ n ( log 2 n ) 2 + n ∈ O ( n ) . \begin{aligned}
\sum_{p\in\mathbf P,~p\le n}\sum_{e=1}^{\lfloor\log_p n\rfloor}(e+1) &\le \sum_{p\in\mathbf P,~p\le\sqrt{n}}\lfloor\log_p n\rfloor^2 + \sum_{p\in\mathbf P,~\sqrt{n} < p\le n}1 \\
&\le \sqrt{n}(\log_2 n)^2 + n \in O(n).
\end{aligned} p ∈ P , p ≤ n ∑ e = 1 ∑ ⌊ l o g p n ⌋ ( e + 1 ) ≤ p ∈ P , p ≤ n ∑ ⌊ log p n ⌋ 2 + p ∈ P , n < p ≤ n ∑ 1 ≤ n ( log 2 n ) 2 + n ∈ O ( n ) .
因此,这一算法的总时间复杂度为 O ( n ) O(n) O ( n ) .
参考实现如下:
参考实现
auto dirichlet_convolute (const std::vector<int >& f, const std::vector<int >& g) {
int n = f.size () - 1 ;
std::vector<int > h (n + 1 ) , primes, rem (n + 1 ) , lpf (n + 1 ) ;
std::vector<bool > vis (n + 1 ) ;
h[1 ] = 1 ;
for (int x = 2 ; x <= n; ++x) {
if (!vis[x]) {
primes.push_back (x);
rem[x] = 1 ;
lpf[x] = x;
}
for (int p : primes) {
if (x * p > n) break ;
vis[x * p] = true ;
rem[x * p] = x % p ? x : rem[x];
lpf[x * p] = p;
if (x % p == 0 ) break ;
}
if (rem[x] == 1 ) {
for (int k = x; k; k /= lpf[x]) {
h[x] += f[k] * g[x / k];
}
} else {
h[x] = h[rem[x]] * h[x / rem[x]];
}
}
return h;
}
参考资料与注释