反演与筛法

坑:

  1. 代码,一方面用于验证口胡正确性,一方面还不会怎么写常数比较小。

  2. 狄利克雷生成函数的定义中,为什么使用 nx 作为形式记号而非 nx


本文大量参考了:

  • 《反演与筛法》,马耀华

  • 《OI中(?)常用数论函数求和法的大致描述、zzt求和法的简化版》,negiizhao

1 积性函数与反演

我们先给出一些关于数论函数的基本定义。

  • 定义 1.1(数论函数):以正整数集 N+ 为定义域的函数。

  • 定义 1.2(积性函数):称数论函数 f 为积性函数,当且仅当对于任意正整数 p,q 满足 pq 都有 f(pq)=f(p)f(q)。称数论函数 f 为完全积性函数,当且仅当对于任意正整数 p,q 都有 f(pq)=f(p)f(q)

    完全积性函数一定是积性函数。

f 为积性函数,则一定有 f(1)=0f(1)=1。而注意到当 f(1)=0 时,对于任意 n 都有 f(n)=0,我们将该数论函数记作 0

我们在接下来的讨论中将不讨论这种平凡情况,而默认积性函数都满足 f(1)=1

  • 例 1.3:接下来给出一些常见的积性函数:

    1. ϵ(n):=[n=1]
    2. 1(n):=1
    3. id(n):=n
    4. idk(n):=nk
    5. σk(n)=d|ndk
    6. μ(n):莫比乌斯函数。
    7. φ(n):欧拉函数。

    (其中前四者还是完全积性函数)

数论函数最基本的运算有点乘、数乘和加减法等,它们满足常见的代数算律,且积性(完全积性)关于点乘是封闭的,这里简单带过。

除此之外,我们再介绍一种数论函数上的重要运算:

  • 定义 1.4(狄利克雷卷积):定义两个数论函数 f,g 的狄利克雷卷积为数论函数 h(记为 fg),满足对于任意的 n 都有 h(n)=d|nf(d)g(nd)

  • 引理 1.5(狄利克雷卷积的代数算律):设 f,g,h 为数论函数。

    1. fg=gf
    2. (fg)h=f(gh)
    3. fϵ=f

    证明:略。

  • 引理 1.6(积性关于狄利克雷卷积是封闭的):若 f,g 为积性函数,则 h=fg 也为积性函数。

    证明:若 f,g 为积性函数,则对于任意正整数 p,q 满足 pq,都有:

    h(p)h(q)=(i|pf(i)g(pi))(j|qf(j)g(qj))=i|pj|qf(i)f(j)g(pi)g(qj)=i|pj|qf(ij)g(pqij)=T|pqf(T)g(pqT)=h(pq)

    其中第二行到第三行是因为 pq,i|p,j|qij;第三行到第四行是因为当 pq 时,任意 pq 的因数 T 和任意 p,q 的因数对 (i,j) 间能构成一一对应,且满足 T=ij

值得注意的是,引理 1.6 对于完全积性函数并没有类似的论断,在后面所讲的贝尔级数中可以看到更本质的原因。

类似形式幂级数的逆,在狄利克雷卷积的意义下,我们也能构造数论函数的逆。

  • 定义 1.7(数论函数的逆):定义数论函数 f0 的逆为数论函数 f1 满足 ff1=ϵ

  • 引理 1.8:非零数论函数的逆存在且唯一。

    证明:唯一性:若数论函数 f 存在两个逆 g1,g2,那么 g1=g1ϵ=g1(fg2)=(g1f)g2=ϵg2=g2

    存在性:利用 f1(1)=1d|nf(d)f1(nd)=0(n>1),来归纳构造 f1 并证明对于任意 n>1 都有 (ff1)(n)=0

  • 引理 1.9(积性关于求逆是封闭的):若 f 为积性函数,则 f1 也是积性函数。

    证明:类似引理 1.6 的证明,但更加繁琐(需要分类讨论),略去。

有了逆,我们就能定义数论函数的除法。

  • 定义 1.10(数论函数的除法):定义两个数论函数 fg0 的除法操作为 f/g:=fg1

刻画狄利克雷卷积的一种工具是狄利克雷生成函数。

  • 定义 1.11(狄利克雷生成函数):定义数论函数 f 的狄利克雷生成函数为 F(x):=n1f(n)nx

坑:为什么使用 nx 作为形式记号而非 nx

那么两个数论函数的狄利克雷卷积对应它们狄利克雷生成函数的乘法。

  • 定义 1.12(黎曼 ζ 函数):根据定义 1.11,可知数论函数 1(n):=1 的狄利克雷生成函数为 ζ(x)=n=11nx,称为黎曼 ζ 函数。

可以看出,狄利克雷生成函数通常在计算上不太方便。对于积性函数来说,我们只关心它在所有质数幂上的取值,就能确定它了。

  • 定理 1.13:设 f 是积性函数,则有:

    n=1f(n)nx=pP(1+f(p)px+f(p2)p2x+)

    证明:略。

  • 例 1.14(快速狄利克雷卷积):为求两个数论函数的狄利克雷卷积前 n 项,直接暴力做是 O(nlogn) 的。

    但是如果其中一个数论函数还是积性函数,我们就能加速:

    根据定理 1.13,让一个数论函数 f 卷另一个积性函数 g,可以拆成让 f 卷很多次,第 i 次卷上一个只有在第 i 个质数的幂上有值的数论函数。

    对质数 p 卷的时间为 k1npk,由于 p2,所以它与 np 同级。那么总时间为 O(pPnp)=O(nloglogn)

  • 例 1.15:由定理 1.13 可知,黎曼 ζ 函数也可以表示为:

    ζ(x)=pP(1+px+p2x+)=1pP(1px)

    另一方面,考虑莫比乌斯函数 μ 的狄利克雷生成函数为:

    pP(1px)

    从而我们可以看出,μ 的狄利克雷生成函数恰为 1ζ(x)

从例 1.15 可以引出莫比乌斯反演:

  • 定理 1.16:(莫比乌斯反演):设 f,g 为数论函数。

    g(n)=d|nf(d)f(n)=d|nμ(nd)g(d)

    证明:设 f,g 的狄利克雷生成函数分别为 F(x),G(x),那么原式就等价于:

    G(x)=F(x)ζ(x)F(x)=1ζ(x)G(x)

    另一个很直观的理解是:这对应着高维前缀和及高维差分。

当我们在研究积性函数时,我们一般不用研究其整个狄利克雷生成函数,而是像定理 1.13 一样,只关注某一质数幂处的函数项,此时我们把形式记号改写成关于质数幂次的,将会变成我们熟知的形式幂级数。

  • 定义 1.17(贝尔级数):定义积性函数 f 在质数 p 上的贝尔级数为 fp(x)=n0f(pn)xn

于是两个积性函数的狄利克雷卷积对应它们在每个质数上的贝尔级数上的乘法。

  • 例 1.18:我们举出一些常用积性函数的贝尔级数:

    1. ϵp(x)=1
    2. 1p(x)=11x
    3. idp(x)=11px
    4. idkp(x)=11pkx
    5. μp(x)=1x
    6. φp(x)=1x1px
  • 例 1.19:从贝尔级数,容易看出两个等式:

    μ1=ϵφ1=id

    翻译成我们常见的形式即为:

    d|nμ(d)=[n=1]d|nφ(d)=n

  • 例 1.20:说明:为何两个完全积性函数的狄利克雷卷积不一定是完全积性函数。

    考虑某完全积性函数 f 在某质数 p 上的贝尔级数,发现形如:

    fp(x)=n0f(pn)xn=n0f(p)nxn=11f(p)x

    fp(x)2 显然不是 11ax 的形式,于是 f2 不一定是完全积性函数。

  • 例 1.21:从贝尔级数的角度说明:两个积性函数的狄利克雷卷积一定是积性函数,一个积性函数的逆也一定是积性函数。

    唯一性反证,存在性直接默认目标函数是积性函数,对贝尔级数做相应的多项式乘法/多项式求逆构造出目标函数后再证明。

  • 例 1.22(任意积性函数前缀和):当 n 不太大的时候,我们可以按如下算法得到积性函数前 n 项:我们在所有质数幂处暴力按定义计算,然后用线性筛法得到积性函数前 n 项的值。

    考虑分析这个做法的复杂度,关键在于暴力计算质数幂处积性函数值的复杂度。注意到 n 以内的质数个数是 O(nlogn),而 n 以内的严格质数幂(幂次 >1)的数量只有 O(nlogn),那么对于大多数积性函数,只要它们在质数处的计算较快,即使它们在严格质数幂处的计算量很大(比如是个关于幂次的多项式复杂度),总复杂度仍然是 O(n) 的,瓶颈仍然在线性筛。

接下来的章节我们将介绍一些求数论函数前缀和的筛法,我们先做一些简单的铺垫。

  • 定义 1.23(整除集合):定义正整数 n 的整除集合为 D(n):={nm:mN+}={1,,n,nn,nn1,,n}

    定义 Sn,f 表示数论函数 fD(n) 处的前缀和函数。

  • 引理 1.24:设 n 为正整数。对于任意 nD(n),有 D(n)D(n)

    证明nab=nab

2 Dirichlet 双曲线法 / 杜教筛

Sn,h,其中 h=fg 且已知 Sn,f,Sn,g

那么有:

i=1nh(i)=i=1nd|if(d)g(id)=i=1ng(i)j=1(n/i)f(j)

另一种类似的方法是:

i=1nh(i)=i=1nab=if(a)g(b)=anbnaf(a)g(b)+bnanbf(a)g(b)anbnf(a)g(b)

这种方法用几何可以理解为:要求 xy=n(即 y=nx)下方的所有点对 (x,y)f(a)g(b) 的和,那么对 xnyn 的两部分分别求和,然后再减去二者的公共部分:

那么能 O(n) 单点求 hn 处的前缀和。

若用该方法计算 Sn,h,得到时间为:

i=1ni+i=1nni

积分近似为 O(n3/4)

进一步地,设置阈值 S,考虑对 S 的部分暴力 O(SlogS) 计算狄利克雷卷积。这样时间为:(假设 S>n

SlogS+i=1n/Sni

积分近似为 O(SlogS+nS1/2),取 S=(nlogn)2/3 得到 O(n2/3log1/3n)

h 还是积性函数,即我们能在 O(S) 的时间内对 Sh 进行预处理的话,此时总复杂度为:

S+i=1n/Sni

积分近似为 O(S+nS1/2),取 S=n2/3 得到 O(n2/3)

注意到,Dirichlet 双曲线法也可以类似地用 Sn,h,Sn,g 反推 Sn,f,此时它叫杜教筛。

为了 Sn,h,Sn,g 的方便计算,在杜教筛过程中构造 g,h 时可以先假设它们为完全积性函数试试,此时必有 fp(x)=1ax1bx 的形式。

根据上述两种类似筛法,我们可以得到如下结论:若讨论范围仅限制在积性函数内,那么若 f,g 可杜教筛,那么 fg,fg1 也可杜教筛。从而,在任意积性函数卷积式中都可以 “知二筛一”,且可以拿已知可筛的函数卷积组合出各种可筛的函数。

3 Powerful Numbers

Sn,f。其中已知一数论函数 gSn,g,满足对于任意 pP 都有 f(p)=g(p)

h=f/g,这里要求 h 是积性函数(所以一般来说直接要求 f,g 为积性函数即可)。那么有:

i=1nf(i)=i=1nd|ig(d)h(id)=i=1nh(i)j=1(n/i)g(j)

注意到,当 f(p)=g(p) 时,由于 f(p)=d|pg(d)h(pd)=g(p)+h(p),所以得 h(p)=0。而 h 是积性函数,从而 h(n) 非零当且仅当 n 的每个质因子的幂次都 >1。我们考虑暴力枚举这样的 npowerful numbers)并统计贡献。

注意到这样的 n 只包含 n 的质因子,所以我们考虑对每个 n 的质数 p 算出 hp 的幂上的取值,可以直接暴力 O((logpn)2) 按照定义做狄利克雷求逆(注意这里还需要快速知道 f(pk)g(pk) 的单点值)。根据例 1.22 的类似讨论,这部分的时间复杂度仍然是 O(nlogn) 的。

知道了 h 在质数幂处的取值后(贝尔级数),我们可以暴力 dfs 所有 powerful 的 n 并统计贡献,关键在于 powerful 的 n 的数量。

由于每个质因子幂次都 >1n 都可以被表示成 a2b3 的形式(虽然可能有多种表示方式),那么总的 n 的个数不超过:

i=1nni23

积分近似为 O(n)

那么类似杜教筛能分析出求 Sn,f 的复杂度为 O(n3/4);若 f 还是积性函数的话,能通过预处理做到 O(n2/3)

事实上还可以做到更快:考虑要求的式子 i=1nh(i)j=1(n/i)g(j)。注意到我们有两种分析方式:一种是数论分块,一种是 powerful number 的数量。考虑把二者结合起来:当 in2/3 时,powerful 的 i 的数量是 O(n2/3)=O(n1/3) 级别的;当 i>n2/3 时,ni 只有 O(n1/3) 种不同的取值,而预处理 Sn,h 是容易的(powerful 的 i 只有 O(n) 个)。

于是对单个 n 计算的复杂度能降至 O(n1/3)。总复杂度将至:

i=1ni1/3+i=1n(ni)1/3

积分近似为 O(n2/3)

同样地,若 f 为积性函数,则设置阈值 S,并对 S 的部分进行预处理,时间为:

S+i=1n/S(ni)1/3

积分近似为 O(S+nS2/3),取 S=n3/5 得到 O(n3/5)

4 min25 筛

Sn,f。其中要求 f(p) 的形式较为简单,是易于求前缀和的完全积性函数的线性组合。(好像普通积性函数也可以做,但得精细实现)

min25 筛的算法分为两部分:先对所有 nd 处求 f(p) 的前缀和,再 dfs 求出完整 f 的前缀和。

先考虑第一部分。我们找到 f(p)=g(p),使得 g 是一个容易求前缀和的数论函数。

然后我们考虑先求出所有 g(i) 的和,再筛去 iPg(i) 的贡献,最后得到 g(p) 的和,即 f(p) 的和。

考虑从小往大枚举质数 p,并筛去最小质因数为 p 的非质数 ing(i) 的贡献,这可以从已经筛去最小质因子 <pj(n/p)g(j) 的贡献转移过来。

于是做一个 DP,设 sx,j 表示所有 ixg(i) 的和,其中已经筛掉了最小质因数 pj 的非质数 ig(i) 的贡献。这里满足 x 是某个 nd

分析该部分的时间复杂度。一个重要的观察是,最小质因数为 p 的非质数 i 必须满足 ip2。所以每次我们只需要枚举 xpj2x 做更新。考虑当 pjn1/4 时,x 本来就只有 O(n) 种;当 pj>n1/4 时,xpj2,x=nddnpj2,于是 x 只有 npj2 种。结合起来,并根据素数分布,总共枚举 x 的次数不超过:

O((n1/4n+i=n1/4nni2)/logn)=O(n3/4logn)

现在考虑第二部分。我们反过来,先以所有质数的 f(i) 的和为基础,再从大到小加入最小质因数为 p 的合数的 f(i) 的贡献。直接枚举 p 的幂次 e 并转移即可。

于是也考虑 DP。设 tx,j 表示合数 ix 的所有 f(i) 的和,其中 i 的最小质因数 pj

类似地,当 pjn1/4 时,时间为 O(nlogpn);当 pj>n1/4 时,同样只需枚举 xpj2x 做更新。那么总时间为:

O((i=2n1/4nlogin+i=n1/4nni2login)/logn)=O(n3/4logn)

in1/4 时,使用 n1/4 来估计 i=2n1/4login,经实测后者仅为前者的 4 倍左右大。而当 in1/4 时,login4 可视为常数。

看到一个很好的总结:对于积性函数 f,依据定理 1.13,我们可以将其拆为 f=pPfp。而我们可以在 O(nlogpn) 的时间从 Sn,f 得到 Sn,ffp。而对于 >n 的质数,其幂次不超过 1,我们考虑先预处理这部分质数的 Sn,p>nfp。此时我们另找积性函数 g 使得 g(p)=f(p)Sn,g 易求,然后再类似地,从 Sn,g 开始,不断使 g 除去 gp 最后得到 Sn,p>ngp,即 Sn,p>nfp。当然你发现在具体实现上还需对质数单独讨论,不然复杂度只是 O(nlogn) 的。

posted @   ez_lcw  阅读(97)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示