狄利克雷生成函数

文章目录

  • 简介
  • 狄利克雷函数求导/积分
  • 狄利克雷卷积
  • 狄利克雷逆
  • 狄利克雷 ln
  • 狄利克雷 exp
  • 狄利克雷幂
  • 狄利克雷多次根
  • ~~板~~题

简介

源自 command_block(命令方块)的博客

当我们对于一些数论函数进行狄利克雷卷积作为乘法的时候,往往会遇到狄利克雷幂、狄利克雷逆之类的相关运算。

我们讨论的并不是一些作为多项式形式存在的函数,而是作为点值表达式存在的函数。我们限定这些函数的定义域都是 [ 1 , N ] ∩ Z [1,N]\cap\Z [1,N]Z


支撑这些运算的数学基础都是狄利克雷生成函数

一个数论函数 f f f 对应的狄利克雷生成函数是
F ( x ) = ∑ i = 1 + ∞ f ( i ) i x F(x)=\sum_{i=1}^{+\infty}\frac{f(i)}{i^x} F(x)=i=1+ixf(i)

两个狄利克雷生成函数相乘,再换回数论函数的形式,就相当于一次狄利克雷卷积了,因为上式的 a x a^x ax b x b^x bx 可以贡献到 ( a b ) x (ab)^x (ab)x 。这就可以保证,狄利克雷卷积的各种运算与多项式函数运算是性质相同的。

我们选择 1 i x \frac{1}{i^x} ix1 而不是 i x i^x ix ,因为后者不收敛。

狄利克雷函数求导/积分

本质是在狄利克雷生成函数上求导,不难得到
F ′ ( x ) = ( ∑ i = 1 + ∞ f ( i ) i x ) ′ = ∑ i = 1 + ∞ f ( i ) ln ⁡ i i x = ∑ i = 1 + ∞ f ′ ( i ) i x F'(x)=\left(\sum_{i=1}^{+\infty}\frac{f(i)}{i^x}\right)'=\sum_{i=1}^{+\infty}\frac{f(i)\ln i}{i^x}=\sum_{i=1}^{+\infty}\frac{f'(i)}{i^x} F(x)=(i=1+ixf(i))=i=1+ixf(i)lni=i=1+ixf(i)

得到 f ′ ( i ) = f ( i ) ln ⁡ i f'(i)=f(i)\ln i f(i)=f(i)lni 。不难发现 f ′ ( 1 ) = 0 f'(1)=0 f(1)=0

但是此处 ln ⁡ i \ln i lni 我们没法算,因此我们将 ln ⁡ i \ln i lni 替换为 λ ( i ) \lambda(i) λ(i) i i i 质因数分解后的幂次和),同样满足 λ ( a b ) = λ ( a ) + λ ( b ) \lambda(ab)=\lambda(a)+\lambda(b) λ(ab)=λ(a)+λ(b) λ \lambda λ 函数可以 O ( n log ⁡ n ) O(n\log n) O(nlogn) 预处理。

于是 f ′ ( i ) = f ( i ) λ ( i ) f'(i)=f(i)\lambda(i) f(i)=f(i)λ(i) 。不难发现同样 f ′ ( 1 ) = 0 f'(1)=0 f(1)=0

那么积分就是 f ( i ) λ − 1 ( i ) f(i)\lambda^{-1}(i) f(i)λ1(i) ,需要特别注意的是,这里的积分并不是该函数的前缀和。另外,往往需要令 ( ∫ f ) ( 1 ) = 1 (\int f)(1)=1 (f)(1)=1

狄利克雷卷积

一般的函数往往不是积性函数,只能通过狄利克雷卷积的定义来进行运算:
F ( n ) = ∑ d ∣ n f ( d ) g ( n d ) F(n)=\sum_{d|n}f(d)g(\frac{n}{d}) F(n)=dnf(d)g(dn)

这里要强调的是,我们不要傻到通过枚举 n n n 以及其因数 d d d O ( n n ) O(n\sqrt n) O(nn ) 地计算。我们应该选择埃氏筛法。

狄利克雷逆

为了方便理解和区分,下文都用 f [ i ] f[i] f[i] 而不是 f ( i ) f(i) f(i) 来表示整数 i i i 处的函数值。

已知数论函数 F F F F [ 1 ] = 1 F[1]=1 F[1]=1),求 G G G ,满足
F ∗ G = e F*G=e FG=e

我们令 G [ 1 ] = 1 G[1]=1 G[1]=1,剩下 > 1 >1 >1 的就是推式子了:
n > 1 , ∑ d ∣ n G [ d ] F [ n d ] = 0 G [ n ] F [ 1 ] + ∑ d ∣ n , d < n G [ d ] F [ n d ] = 0 G [ n ] = − ∑ d ∣ n , d < n G [ d ] F [ n d ] n>1,\sum_{d|n}G[d]F[\frac{n}{d}]=0\\ G[n]F[1]+\sum_{d|n,dn>1,dnG[d]F[dn]=0G[n]F[1]+dn,d<nG[d]F[dn]=0G[n]=dn,d<nG[d]F[dn]

同样通过埃氏筛法递推,时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)

狄利克雷 ln

已知数论函数 F F F F [ 1 ] = 1 F[1]=1 F[1]=1),求 G G G ,满足
ln ⁡ F = G \ln F=G lnF=G

我们对其求导( ln ⁡ F ( i ) \ln F(i) lnF(i) i i i 求导)再积分,可得:
G = ∫ F ′ F = ∫ ( F ′ ∗ F − 1 ) G=\int\frac{F'}{F}=\int(F'*F^{-1}) G=FF=(FF1)

不难发现 G [ 1 ] = 0 G[1]=0 G[1]=0

时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)

狄利克雷 exp

已知数论函数 F F F F [ 1 ] = 0 F[1]=0 F[1]=0),求 G G G ,满足
ln ⁡ G = F \ln G=F lnG=F

G [ 1 ] = 1 G[1]=1 G[1]=1

两边求导推式子:
G ′ G = F ′ ⇒ G ′ = F ′ ∗ G G ′ [ n ] = ∑ d ∣ n G [ d ] F ′ [ n d ] = ∑ d ∣ n , d < n G [ d ] F ′ [ n d ] + G [ n ] F [ 1 ] λ ( 1 ) = ∑ d ∣ n , d < n G [ d ] F ′ [ n d ] \frac{G'}{G}=F'\Rightarrow G'=F'*G\\ G'[n]=\sum_{d|n}G[d]F'[\frac{n}{d}]=\sum_{d|n,dGG=FG=FGG[n]=dnG[d]F[dn]=dn,d<nG[d]F[dn]+G[n]F[1]λ(1)=dn,d<nG[d]F[dn]

用埃氏筛法递推,再积分一下就好了。

时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)

狄利克雷幂

已知自然数 k k k 和数论函数 F F F F [ 1 ] = 0 F[1]=0 F[1]=0),求 G G G ,满足
G = F ∗ F ∗ . . . ∗ F = F k G=F*F*...*F=F^k G=FF...F=Fk

ln ⁡ \ln ln exp ⁡ \exp exp 就行了:
G = exp ⁡ ( k ln ⁡ F ) G=\exp(k\ln F) G=exp(klnF)

时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)

狄利克雷多次根

已知数论函数 F F F F [ 1 ] = 0 F[1]=0 F[1]=0),求 G G G ,满足
G k = F G^k=F Gk=F

众所周知,多项式函数幂的 k k k 是可以直接对原模数取模的,狄利克雷也一样:
G = F k − 1 G=F^{k^{-1}} G=Fk1

时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)


通篇都只需要埃筛,因此就不拉模板了。

「EC Final 2019」狄利克雷 k 次根 加强版

你可能感兴趣的:(数学,学习笔记,算法,数论,狄利克雷卷积)