数论基础 学习笔记

观前提醒:博主是民科

RT,梳理一下这方面的理论。写到的并不代表我以前不会。

Part 1

线性丢番图方程、线性同余方程

草 真就从头学起了呗

u1s1 为啥线代和数论都是从解方程开始的啊/yiw

丢番图方程是一切(系数、解)在整数范围内进行的关于多个变量的多项式方程。线性丢番图方程就是次数必须为 \(1\) 的丢番图方程。我们先考虑解二元线性丢番图方程 \(ax+by=c\),这个是 exgcd 算法。

显然 LHS 一定是 \(\gcd(a,b)\) 的倍数。如果 \(\gcd(a,b)\nmid c\),那么显然无解。否则结论是一定有(无限组)解,我们求 \(ax+by=\gcd(a,b)\) 的一组特解,然后扩大 \(\dfrac{c}{\gcd(a,b)}\) 倍,然后不用脑子地表示成通解形式。

考虑辗转相除法的过程,归纳求解(边界是 \(b=0\),此时有解 \(x=1,y=0\)(u1s1 \(y\) 可以取任意整数))。假设现在已经得到 \(bx+(a\bmod b)y=\gcd(b,a\bmod b)\) 的一组特解 \(x=x_0,y=y_0\)。该方程和原方程的 RHS 显然相等,我们只要构造一组 \(x,y\) 使它们的 LHS 相等即可,即 \(ax+by=bx_0+(a\bmod b)y_0\)。RHS 展开得到 \(ax+by=bx_0+ay_0-b\left\lfloor\dfrac ab\right\rfloor y_0\),即 \(a(x-y_0)=b\left(x_0-\left\lfloor\dfrac ab\right\rfloor y_0-y\right)\)。令两边等于 \(0\),解得 \(x=y_0,y=x_0-\left\lfloor\dfrac ab\right\rfloor y_0\)。时间复杂度是对数级别。

然后扩大 \(\dfrac{c}{\gcd(a,b)}\) 倍得到 \(ax+by=c\) 的一组特解 \(x=x_0,y=y_0\),那么通解就是 \(x=x_0+\dfrac{b}{\gcd(a,b)}k,y=y_0-\dfrac{a}{\gcd(a,b)}k(k\in\Z)\)模板题 代码

多元线性丢番图方程 -> 二元线性丢番图方程

考虑多元线性丢番图方程 \(\sum\limits_{i=1}^na_ix_i=b\)。把 \(i=1\) 提出来,把 \(2\sim n\) 当作一个整体,这样后者显然是 \(d=\mathop{\gcd}\limits_{i=2}^na_i\) 的倍数。于是我们解二元线性丢番图方程 \(a_1x_1+dy=b\) 的任意一组特解 \(x_1=x_0,y=y_0\),然后解规模降一的线性丢番图方程 \(\sum\limits_{i=2}^na_ix_i=dy_0\)(根据归纳,若之前的二元者有解,则该方程一定有解)。这样就可以得到 \(x_{1\sim n}\) 的一组特解,不难得到有解的充要条件是 \(\mathop{\gcd}\limits_{i=1}^na_i\mid b\)

通解就没那么好表示了,大概就是可以任意选两个变量进行二元的增减。

线性同余方程 -> 二元线性丢番图方程

不难发现线性同余方程 \(ax\equiv b\pmod p\) 的解集是和二元线性丢番图方程 \(ax+py=b\) 的所有解中的 \(x\) 值构成的集合相等的。那么搞到模 \(p\) 意义下就是 \([0,p)\) 内的所有解。于是该线性同余方程有解当且仅当 \(\gcd(a,p)\mid b\),解集是 \(x=x_0+\dfrac{p}{\gcd(a,p)}k(k\in\Z)\)。模 \(p\) 意义下有唯一解显然当且仅当 \(a\perp p\)

乘法逆元的存在唯一性

一个数是 \(a\) 的模 \(p\) 意义下的乘法逆元当且仅当 \(ax\equiv 1\pmod p\) 在模意义下有唯一解(即 \(a\perp p\))且这个解就是这个数。若 \(p\) 是质数,要满足 \(a\perp p\) 的话,显然是当且仅当 \(a\neq 0\)(模意义下)。若 \(a\) 有乘法逆元,则 \(a\) 的乘法逆元 \(a^{-1}\) 也必定有乘法逆元,且为 \(a\):因为若否,则 \(a^{-1}\)\(p\) 有大于 \(1\) 的公因数,乘以 \(a\) 也一定有,而 \(a^{-1}a\equiv 1\pmod p\),矛盾。

容易发现,模意义下的除法 \(ax\equiv b\pmod p\) 有意义(存在唯一解)和 \(a\) 存在乘法逆元的充要条件是一样的。于是模意义下的有意义的除法显然是 \(\dfrac ba=a^{-1}b\)

对质数 \(p\),根据费马小定理显然有 \(a^{-1}=a^{p-2}\)。对合数 \(p\),根据欧拉定理有 \(a^{-1}=a^{\varphi(p)-1}\)。对于前者直接快速幂就好了;对于后者,这个单点欧拉函数求起来要分解质因数,有点麻烦,一般直接使用 exgcd 求解 \(b=1\) 的线性同余方程,或者对于除法直接用 exgcd 求解一般线性同余方程。

简化剩余系

对一个质数 \(p\),集合 \(A=\{x\mid x\in [0,p),x\perp p\}\) 称为模 \(p\) 的简化剩余系。显然有 \(|A|=\varphi(p)\)

性质:对任意 \(a\perp p\),构造 \(B=\{ax\bmod p\mid x\in A\}\),有 \(A=B\)

证明:

  1. 显然 \(B\subseteq A\)
  2. 因为 \(a\perp p\),所以 \(a\) 有逆元,则对 \(\forall y\in A\) 存在 \(x=a^{-1}y\in A\) 满足 \(ax=y\),于是 \(y\in B\),于是 \(A\subseteq B\)

综上,得证。

欧拉定理、费马小定理、扩展欧拉定理

欧拉定理:对整数 \(p>1\),若 \(a\perp p\),则 \(a^{\varphi(p)}\equiv 1\pmod p\)

证明:考虑模 \(p\) 的简化剩余系 \(A\)。构造 \(B=\{ax\bmod p\mid x\in A\}\),由简化剩余系的性质得到 \(A=B\)。于是有 \(\prod\limits_{i\in A}i\equiv \prod\limits_{i\in B}i\pmod p\),即 \(\prod\limits_{i\in A}i\equiv \prod\limits_{i\in A}i\cdot a^{\varphi(p)}\pmod p\)。又由于 \(\prod\limits_{i\in A}i\perp p\),所以 \(a^{\varphi(p)}\equiv 1\pmod p\),得证。

\(p\in\mathbb P\) 带入欧拉定理得到费马小定理:对质数 \(p\),若 \(p\nmid a\),则 \(a^{p-1}\equiv1\pmod p\)

欧拉定理可以将 \(a\perp p\) 时的 \(a^b\equiv c\pmod p\) 转化为等价的 \(a^{b\bmod\varphi(p)}\equiv c\pmod p\),它将指数降低到 \([0,p)\) 内。但并没有给出 \(a\not\perp p\) 时的方法。扩展欧拉定理:不管是否有 \(a\perp p\),只要 \(b\geq\varphi(p)\)(如果不满足,显然指数已经够小了),则有 \(a^b\equiv a^{b\bmod\varphi(p)+\varphi(p)}\pmod p\)

我们来研究一下后面的 \(+\varphi(p)\) 是怎么得来的。考虑将 \(p\) 质因数分解:\(p=\prod p_i^{\alpha_i}\),如果知道了 \(a^b\bmod p_i^{\alpha_i}\) 们,根据 CRT 可知对应 \(\bmod p\) 值是唯一的。而如果对所有 \(i\) 都有 \(a^b\equiv c\pmod{p_i^{\alpha_i}}\),那么可知 \(c\) 就是 \(a^b\equiv c\pmod p\) 的唯一解。于是我们现在要努力构造 \(c=a^d\) 满足这个条件。设 \(P=p_i^{\alpha_i}\),分是否有 \(a\perp P\) 两种情况讨论:

  1. \(a\perp P\),则根据欧拉定理有 \(a^b\equiv a^{b\bmod \varphi(P)}\pmod P\)。由 \(\varphi\) 的积性性可知 \(\varphi(P)\mid\varphi(p)\),于是 \(b\bmod\varphi(p)\equiv b\bmod\varphi(P)\pmod {\varphi(P)}\),所以 \(a^b\equiv a^{b\bmod\varphi(p)+k\varphi(p)}\pmod P\)
  2. \(a\not\perp P\),显然必有 \(p_i\mid a\)。我们知道 \(\varphi(P)=p_i^{\alpha_i-1}(p_i-1)\),可以证明 \(\varphi(P)\geq\alpha_i\) 恒成立(首先这俩玩意根本不是一个量级的,渐进意义上显然是大于,至于数值验证你可以取 \(p_i=2\) 代入 geogebra 发现在整点处都满足),此时有 \(b\geq\varphi(p)\geq\varphi(P)\geq\alpha_i\)。根据 \(b\geq\alpha_i\) 可知 \(a^b\equiv 0\pmod P\),而我们需要构造 \(c=a^d\) 其中 \(d\geq\alpha_i\) 即可,\(d\geq\varphi(p)\) 这个常量是个很好的选择。

综上,如果只有第一类,那么就满足欧拉定理的条件,直接选 \(k=0\) 即可。否则发现 \(k=0\)\(d=b\bmod\varphi(p)\) 不满足 \(d\geq\varphi(p)\),为了追求 \(d\) 尽量小,我们取 \(k=1\) 即可。

ExCRT

我们考虑求与由两个方程构成的线性同余方程组 \(\begin{cases}x\equiv a_1\pmod {p_1}\\x\equiv a_2\pmod{p_2}\end{cases}\) 等价的线性同余方程 \(x\equiv a\pmod p\) 中的 \(a\)\(p\)。两个方程的解集分别是 \(\begin{cases}x=a_1+p_1k_1(k_1\in\Z)\\x=a_2+p_2k_2(k_2\in\Z)\end{cases}\),得到 \(a_1+p_1k_1=a_2+p_2k_2\)\(p_1k_1-p_2k_2=a_2-a_1\),是一个关于 \(k1,k2\) 的线性丢番图方程。如果无解那么原方程组无解,否则用 exgcd 解得一组特解中的 \(k_1\) 的取值 \(k_1'\) 后,所有解中的 \(k_1\) 的取值可以表示成 \(k_1=k_1'+\dfrac{p_2}{\gcd(p_1,p_2)}k(k\in\Z)\)。代入 \(x=a_1+p_1k_1\) 得到 \(x=a_1+p_1k_1'+\mathrm{lcm}(p_1,p_2)k(k\in\Z)\),即 \(x\equiv a_1+p_1k_1'\pmod{\mathrm{lcm}(p_1,p_2)}\)

对多个方程构成的方程组的情况,只需要两两合并即可。这就是 ExCRT。

CRT sb,不学了

CRT 呢,就是针对 \(p_1\perp p_2\) 的情况,不难发现这种情况下方程组一定有解,且合并之后的模数等于 \(p_1p_2\)。至于过程并不简化很多,复杂度也没变,在 \(p_{1/2}\) 非质数的情况下还要 exgcd 求逆元,所以就不学了。

sb CRT 模板题 excited ExCRT 模板题 一份代码能过两题你敢信

阶、原根

对整数 \(p>1,a\perp p\),根据欧拉定理,一定存在 \(l\) 使得 \(a^l\equiv 1\pmod p\)。称 \(a\) 在模 \(p\) 意义下的阶 \(\mathrm{ord}_pa\) 为最小的这样的正整数 \(l\)

易证 \(a^x\equiv 1\pmod p\) 当且仅当 \(\mathrm{ord}_pa\mid x\)(只需要反证 + 模拟辗转相除 + 逆元存在性),于是显然有 \(\mathrm{ord}_pa\mid \varphi(p)\)。易证模意义下 \(a^{0\sim \mathrm{ord}_pa-1}\) 互不相等。一个小性质:\(\mathrm{ord}_pa^x=\dfrac{\mathrm{lcm}(\mathrm{ord}_pa,x)}x=\dfrac{\mathrm{ord}_pa}{\gcd(\mathrm{ord}_pa,x)}\),根据意义,正确性显然。

\(\mathrm{ord}_pa=\varphi(p)\),则称 \(a\)\(p\) 的一个原根。若 \(p\) 有原根,设其中任意一个为 \(g\),那么易证 \(g^{0\sim\varphi(p)-1}\) 恰好不重不漏地构成了 \(p\) 的简化剩余系,这就很好,能把恒等函数转化成指数函数。

假设 \(p\) 有原根,其中任意一个为 \(g\),那么我们考虑对特定的 \(l\mid \varphi(p)\) 有哪些 \(a\) 满足 \(\mathrm{ord}_pa=l\)。这个问题不太好直接解答,注意到阶有定义当且仅当 \(a\perp p\),对这样的 \(a\) 一定可以用唯一的 \(g^x(x\in[0,\varphi(p)))\) 来表达。于是我们考虑哪些 \(\mathrm{ord}_pg^x=l\)。根据小性质,即 \(\dfrac{\varphi(p)}{\gcd(\varphi(p),x)}=l\),即 \(\gcd(\varphi(p),x)=\dfrac{\varphi(p)}l\)。用莫反推柿子的常用技巧,这个式子等价于 \(\dfrac{\varphi(p)}l\mid x\)\(\dfrac{x}{\dfrac{\varphi(p)}l}\perp l\)。前者是 \(x=\dfrac{\varphi(p)}lk(k\in[0,l))\),观察后者发现 LHS 不就等于 \(k\) 嘛!所以这两个条件合起来的解集就是 \(x=\dfrac{\varphi(p)}lk(k\in[0,l),k\perp l)\),共有 \(\varphi(l)\) 个解。于是得到结论:对有原根的 \(p\),模意义下阶为 \(l\) 的数共有 \(\varphi(l)\) 个。这也恰好符合欧拉反演:\(\sum\limits_{l\mid\varphi(p)}\varphi(l)=\varphi(p)\)。将 \(l=\varphi(p)\) 代入结论,得到有原根的 \(p\) 共有 \(\varphi(\varphi(p))\) 个原根。

事实上,上述结论对无原根的 \(p\) 不成立:比如 \(l=\varphi(p)\) 时就只有 \(0\)\(a\)

关于一个数是否有原根,有以下结论:\(p\) 有原根当且仅当 \(p\in\{2,4\}\) 或存在奇质数 \(p_0\) 和正整数 \(k\) 使得 \(p\in\left\{p_0^k,2p_0^k\right\}\),证明太烦了不管了,并且也不太本质(这就是你偷懒的理由吗,这似乎是你自没搞懂 Dinic 跑二分图复杂度证明、min25 筛复杂度证明、杜教筛复杂度证明以来第四次不求甚解)。

那么可以用各种方法(临场分解 / 预处理)判断一个数 \(p\) 是否有原根,如果有的话原根数量是 \(\varphi(\varphi(p))\)。数学家王元证明了它的最小原根是 \(p^{0.25}\) 级别以内的,那么暴力枚举,判的话就看是否有 \(\varphi(p)\) 的真因数 \(d\) 使 \(a^{d}\equiv 1\pmod p\),但是你直接枚举真因数哪里枚举的过来,可以对 \(p\) 分解质因数 \(p=\prod p_i^{\alpha_i}\),仅对每个 \(d=\dfrac p{p_i}\) 判一下即可,正确性显然。然后求出最小原根 \(g\) 后,\(g^{x}(x\in[0,\varphi(p)),x\perp \varphi(p))\) 便是所有原根。模板

阶的 polylog 求法

\(a\perp p\),可以不通过 BSGS 求 \(x = \mathrm{ord}_pa\)

考虑求出 \(x\) 的每个质因子的次数。注意到:如果我们知道 \(x\mid X\)\(x\nmid \dfrac XY\),其中 \(Y\)\(X\) 的某个质因子,那么 \(x\) 的质因子 \(Y\) 的次数应该恰好与 \(X\) 一样。那么我们可以初始令 \(X = \varphi(p)\),对其每个质因子 \(Y\) 都不断验证 \(x\mid\dfrac XY\) 是否成立,如果是的话就令 \(X\gets\dfrac XY\),否则就停下。这样最终就有 \(x=X\),因为其每个质因子的次数都被确定了。而这个判断是否整除是容易的,\(x\mid y\) 当且仅当 \(a^y\equiv 1\pmod p\),快速幂即可。总复杂度 \(\mathrm O\!\left(\log^2 p\right)\)

离散对数问题

求方程 \(a^x\equiv b\pmod p\) 的解集。

BSGS 算法

考虑 \(a\perp p\) 的情况。那么 \(a\) 在模 \(p\) 意义下有阶,于是容易得到模意义下 \(a^x\) 的值是纯循环的,循环节是 \(\mathrm{ord}_pa\)。并且在一次循环内,\(a^x\) 互不相同,所以一次循环内最多有一个解。易知原方程要么无解,要么解集为 \(x\equiv ?\pmod{\mathrm{ord}_pa}\) 的形式。

所以一般我们先求最小自然数解,然后基本就结束了,毕竟求阶的话也要 BSGS 求 \(b=1\) 的方程的次小解(upd:求解其实可以 polylog,已经在上面补上了做法)。其实也可以直接求出原方程的最小解和次小解 \(x_0,x_1\),那么 \(\mathrm{ord}_pa=x_1-x_0\)。下面讲最小自然数解的求法,那么次小的,或者是区间计数啥的,应该有脑子就会了吧?

考虑令 \(x=iS-j\),其中 \(S=\left\lceil\sqrt p\right\rceil,i,j\in[1,S]\)。这样用 \(i,j\) 显然能精准表示出 \([0,p)\) 内的所有 \(x\),那么最小解一定在里面,因为循环节最大为 \(\varphi(p)\)有同学可能要问了,你为啥不取 \(\varphi(p)\) 的平方根呢?你想想看 \(p\) 为质数的时候这样也没区别啊,还要多算个欧拉函数(

那么 \(a^{iS-j}\equiv b\pmod p\),由于 \(a\perp p\),根据逆元存在性 \(a^{-j}\) 可以除过去,得到 \(a^{iS}\equiv a^jb\pmod p\)。那么可以预先把所有 \(a^jb\) 存进哈希表,然后枚举 \(i\),看哈希表里是否有等于 \(a^{iS}\) 的。这样复杂度是 \(\mathrm O(\sqrt p)\)(不需要快速幂,直接递推)。mol ban

ExBSGS 算法

考虑一般情况(不存在逆元,用不了 BSGS)。\(a\perp p\) 的时候是已知问题,于是我们努力将原方程转化为这种情况。设 \(d=\gcd(a,p)\),如果 \(d=1\) 直接 BSGS 即可。否则可以发现 \(a^x\bmod p\) 仅在 \(x=0\) 时为 \(1\),其它时候都一定是 \(d\) 的倍数。于是看是否有 \(b=1\),如果是就直接报答案,否则必须满足 \(d\mid b\),如果不满足就报无解,否则继续。

\(a'=\dfrac ad,b'=\dfrac bd,p'=\dfrac pd\)。那么原方程,如果强行令 \(x\geq 1\),那么显然等价于 \(a^{x-1}a'd\equiv b'd\pmod{p'd}\);对 \(x=0\) 的情况,由于肯定是 \(b\neq 1\) 才来到这一步的,前面判过了,所以肯定不是解。那么两边和模数都除以 \(d\) 显然是前后等价的,得到 \(a^{x-1}a'\equiv b'\pmod{p'}\)。显然有 \(a'\perp p'\),除过去,得到 \(a^{x-1}\equiv b'(a')^{-1}\pmod{p'}\)。于是我们只需要用 \(x\) 代换 \(x-1\),得到一个新的同类问题,解掉之后答案就是新问题的答案加一。这样每次递归虽然 \(a\) 不变,但是 \(p\) 至少减半(或者说 \(p\) 被除以的次数上界是它的质因子个数),于是转化到 \(a\perp p\) 的情况的步数是对数级别的,复杂度 \(\mathrm O\!\left(\log^2p+\sqrt p\right)\)(2log 是因为要求逆元,需要 exgcd)。

求次小解等等的变通应该不用讲了吧。可以发现 \(a\not\perp p\)\(a^x\bmod p\) 是混循环的,不是很优美,自然也就不存在阶之类的定义。无解就不用说了;若只有一个解,说明它是处于混循环在进入循环前的那个前奏中;如果找到最小解和次小解 \(x_0,x_1\),那么通解是 \(x\geq x_0,x\equiv x_0\pmod{x_1-x_0}\)(当然我也相信通解这玩意基本不会考)

mol ban(洛谷的 mol ban 题太垃圾了,管理员又不愿意加强数据

高次剩余问题

鸽子

upd 21.10.22(CSP 考前一天):终于来补了,高次剩余学习笔记 / P5668 - 【模板】N次剩余 题解 - ycx060617 - 博客园 (cnblogs.com)

二次剩余

学完高次剩余,以上帝视角来看二次剩余。

\(x^2\equiv a\pmod p\) 的解,其中 \(p\) 是奇质数。\(a=0\) 先特判掉,以下 \(a\neq 0\)。设 \(g\) 为任意原根,设 \(a=g^\alpha\),令 \(x=g^y\),原方程等价于 \(g^{2y}\equiv g^\alpha\pmod p\),即 \(2y\equiv \alpha\pmod{p-1}\)。可以看到:当 \(2\mid \alpha\) 时,有两个解;当 \(2\nmid \alpha\) 时无解。并且我们知道若 \(x\) 是解,则 \(-x\) 也是解,并且显然 \(x\not\equiv -x\),于是可知二次剩余的两个平方根互为相反数。

那么难道要 BSGS 求 \(\alpha\)?那样时间复杂度我们不满意。注意到为了判二次剩余,我们只要知道 \(\alpha\) 的奇偶性。注意到 \(2\mid \alpha\) 等价于 \(a^{\frac{p-1}2}\equiv 1\),否则会得到 \(a^{\frac{p-1}2}\equiv g^{\frac{p-1}2}\equiv -1\),快速幂判一下即可。

如何求解?一个思路是试图构造 \(x_0^{2k}\equiv a\),则 \(x\equiv \pm x_0^k\)。Cipolla 算法给出了一个方案。

为了了解这个算法,我们首先需要了解模意义下扩域的套路。对于二次非剩余 \(o\),我们定义虚数单位 \(\omega\) 满足 \(\omega^2=o\),每个模意义下复数表示为 \(a+b\omega\),满足若 \(a\equiv c,b\equiv d\)\(a+b\omega\equiv c+d\omega\),加法定义为 \((a+b\omega)+(c+d\omega)\equiv (a+c)+(b+d)\omega\),乘法定义为 \((a+b\omega)(c+d\omega)\equiv (ac+bdo)+(ad+bc)\omega\),容易验证加法交换律、结合律,乘法交换律、结合律、对加法的线性性。总之满足基本一切实剩余系下的性质(除了欧拉定理、费马小定理),跟与实数对应的复数异曲同工,但由于是离散的,比复数要简单多了。这个套路常用于对二次非剩余强制开方。

下面讲 Cipolla:考虑找到一个 \(b\) 使得 \(o\equiv b^2-a\) 是二次非剩余,以 \(o\) 为虚数单位的平方定义复数,那么可以证明 \((b+\omega)^{p+1}\equiv a\)(证明见下),那么取 \(x\equiv\pm (b+\omega)^{\frac{p+1}2}\) 即可(容易证明复数系下 \(a\) 依然仅有实平方根,具体证明略)。

引理 1:\(\omega^{p}\equiv \omega^{p-1}\omega\equiv o^{\frac{p-1}2}\omega\equiv -\omega\)

引理 2:在复数系下有 \((a+b)^p\equiv a^p+b^p\)
证明:不能用到费小,因为对复数失效。二项式定理展开,对 \(i\notin\{0,p\}\)\(\dbinom{p}{i}\),由于 \(p\) 是质数,放在分子上约不掉,所以这一项一定是 \(p\) 的倍数,得证。

证明:根据引理 2,\((b+\omega)^{p+1}\equiv (b+\omega)(b+\omega)^p\equiv (b+\omega)\left(b^p+\omega^p\right)\),对 \(b^p\) 用费小,对 \(\omega^p\) 用引理 1,等于 \((b+\omega)(b-\omega)\equiv b^2-\omega^2\equiv b^2-o\equiv a\),得证。

如何找到 \(b\)?注意到 \([1,p)\) 内有恰好一半二次剩余,随机 check 即可在期望 2 次内找到二次非剩余。同时,\(b^2-a\) 的剩余性应该是关于 \(b(b\neq 0)\) 保持随机性的。实现就搞个复数类即可。mol ban tea code

Part 2

数论函数、狄利克雷卷积、莫比乌斯反演

一个定义在 \(\N_+\) 上的函数叫做数论函数。若数论函数 \(f\) 满足 \(f(x)=1\)(这个看似不需要规定,但如果对 \(\forall x>1\) 都有 \(f(x)=0\) 就萎了)且对任意 \(x\perp y\) 都有 \(f(xy)=f(x)f(y)\),则 \(f\) 是积性函数;进一步,若对所有 \(x,y\) 都满足,则是完全积性函数。设 \(x\) 分解质因数为 \(x=\prod p_i^{\alpha_i}\):若 \(f\) 是积性函数,则 \(f(x)=\prod f\!\left(p_i^{\alpha_i}\right)\);若 \(f\) 是完全积性函数,则 \(f(x)=\prod f^{\alpha_i}(p_i)\)(乘法幂)。也就是说,确定一个积性函数的所有质数的幂处的取值,即可确定整个积性函数;对完全积性函数只需确定所有质数处的取值。易证对(完全)积性函数 \(f,g\)\(f\times g,f*g\) 也是(完全)积性函数(特殊地,完全积性卷完全积性不一定是完全积性)。

亿些常见的数论函数:

  1. (完全积性)单位函数:\(\epsilon(x)=[x=1]\)
  2. (完全积性)幂函数:\(\mathrm{id}_k(x)=x^k\)\(k=0\) 时为常值函数 \(1\)\(k=1\) 时为恒等函数 \(\mathrm{id}\)
  3. (积性)除数函数:\(\sigma_k(x)=\sum\limits_{i\mid x}i^k\)\(k=0\) 时为因数个数函数 \(\mathrm d\)\(k=1\) 时为因数和函数 \(\sigma\)
  4. (积性)欧拉函数:\(\varphi(x)=\sum\limits_{i=1}^n[i\perp x]\)。对 \(x\) 分解质因数,易得 \(\varphi(x)=x\prod\dfrac {p_i-1}{p_i}\),于是易证积性性;
  5. 不同质因子个数函数:\(\omega(x)\),它是一个加性函数,满足若 \(x\perp y\)\(\omega(xy)=\omega(x)+\omega(y)\)。加性函数的 exp 显然是积性函数;
  6. (积性)莫比乌斯函数:\(\mu(x)=\begin{cases}0&\exists \alpha_i>1\\(-1)^{\omega(x)}&\text{otherwise}\end{cases}\)。积性性易证,它的积性函数版本定义为对 \(p^k(p\in\mathbb P,k\in\N_+)\)\(\mu\!\left(p^k\right)=-[k=1]\)

定义两个数论函数 \(f,g\) 的狄利克雷卷积 \((f*g)(x)=\sum\limits_{i\mid x}f(i)g\!\left(\dfrac xi\right)\)。易证狄卷满足交换律、结合律、对加法的分配律。容易发现任何数论函数卷上 \(\epsilon\) 等于它本身,所以 \(\epsilon\) 是狄卷单位元;而 \((f*1)(x)\) 的意义是 \(\sum\limits_{i\mid x}f(i)\),所以 \(1\) 是狄卷万恶元。易证对任意 \(f(1)\neq 0\) 的数论函数 \(f\) 都存在唯一数论函数 \(g\) 满足 \(f*g=\epsilon\)(证明的话只需要递推构造 \(g\) 即可),则 \(f,g\) 互为逆元,分别记作 \(g^{-1},f^{-1}\)。所以狄卷等式可以除来除去反复横跳,非常优美,不像模意义下的乘法逆元还需要当心逆元的存在性。

对完全积性函数 \(f\),它的逆是 \(f\times\mu\),因为根据提公因式有 \((f\times\mu)*f=f\times\epsilon=\epsilon\)。对积性函数 \(f\),可以证明它的逆一定是积性函数,只不过有些麻烦(但是非常优美):设 \(g=f^{-1}\),根据求法有

\[\begin{cases}g(1)=1\\ g(x)=-\sum\limits_{i\mid x,i>1}f(i)g\!\left(\dfrac xi\right) (x>1) \end{cases} \]

考虑归纳,设 \(n-1\) 以前都满足积性性,只要证对 \(x\perp y,xy=n\) 都有 \(g(x)g(y)=g(n)\)\(x=1\)\(y=1\) 时显然,否则:

\[\begin{aligned} g(x)g(y)&=\left(-\sum_{i\mid x,i>1}f(i)g\!\left(\dfrac xi\right)\right)\!\left(-\sum_{j\mid y,j>1}f(j)g\!\left(\dfrac yj\right)\right)\\ &=\sum_{i\mid x,i>1}\sum_{j\mid y,j>1}f(ij)g\!\left(\dfrac{xy}{ij}\right)\\ &=\sum_{i\mid n,i\nmid x,i\nmid y}f(i)g\!\left(\dfrac ni\right)\\ &=\sum_{i\mid n,i>1}f(i)g\!\left(\dfrac ni\right)-\sum_{i\mid x,i>1}f(i)g\!\left(\dfrac ni\right)-\sum_{i\mid y,i>1}f(i)g\!\left(\dfrac ni\right)\\ &=\sum_{i\mid n,i>1}f(i)g\!\left(\dfrac ni\right)-\sum_{i\mid x,i>1}f(i)g\!\left(\dfrac xi\right)\!g(y)-\sum_{i\mid y,i>1}f(i)g\!\left(\dfrac yi\right)\!g(x)\\ &=-g(n)+g(x)g(y)+g(y)g(x)\\&=g(n) \end{aligned} \]

得证。

亿些常见的狄卷恒等式:

  1. \(\sigma_k=\mathrm{id}_k*1\),这也是除数函数的另一种定义;

  2. 对任意数论函数 \(f,g\),完全积性函数 \(h\)\((f\times h)*(g\times h)=(f*g)\times h\)

  3. \(\mu^2*1=2^\omega\)。证明比较显然,考虑 \(\mu^2\) 的数论意义,就是 \(x\) 是否不含有平方因子,那该狄卷式显然成立了;

  4. \(\varphi*1=\mathrm{id}\)

    证明:三者都是积性函数,所以只要证在质数的幂处满足狄卷式即可。对 \(x=p^k(p\in\mathbb P,k\in\N_+)\)

    \[\begin{aligned}\sum_{i\mid x}\varphi(i)&=\sum_{i=0}^k\varphi\!\left(p^i\right)\\&=1+\sum_{i=1}^k\dfrac{p-1}pp^i\\&=1+\left(p^k-1\right)\\&=x\end{aligned} \]

    得证;

  5. \(\mu*1=\epsilon\)。这是个核心的东西,等价于莫反。这个式子说明 \(\mu\)\(1\) 互为狄卷逆元。

    证明:将 \(x\) 分解质因数后,设 \(x'=\prod p_i\),则显然有

    \[\begin{aligned}\sum_{i\mid x}\mu(i)&=\sum_{i\mid x'}\mu(i)\\&=\sum_{i=0}^{|p|}\dbinom{|p|}i(-1)^i\\&=((-1)+1)^{|p|}\\&=[x=1]\end{aligned} \]

    得证;

  6. (这个应该不算狄卷式)\(\dfrac{\varphi(x)}x=\sum\limits_{i\mid x}\dfrac{\mu(i)}i\)。这是上面两条的推论,将 \(\varphi*1=\mathrm{id}\)\(1\) 除过去得到 \(\varphi=\mathrm{id}*\mu\),即 \(\varphi(x)=\sum\limits_{i\mid x}\mu(i)\dfrac xi\),两边同除以 \(x\) 就得到了。

莫比乌斯反演有两个形式,都是基于 \(\mu*1=\epsilon\):对数论函数 \(f,g\)

  1. \(g(x)=\sum\limits_{i\mid x}f(i)\),则 \(f(x)=\sum\limits_{i\mid x}\mu(i)g\!\left(\dfrac xi\right)\)。证明:这就等价于若 \(g=f*1\),则 \(f=\mu*g\)。根据 \(\mu*1=\epsilon\),这是显然的;

  2. \(g(x)=\sum\limits_{x\mid i}f(i)\),则 \(f(x)=\sum\limits_{x\mid i}\mu\!\left(\dfrac xi\right)\!g(i)\)。证明:换个写法,若 \(g(x)=\sum\limits_{x\mid i}f(i)\),则 \(f(x)=\sum\limits_{i=1}^{+\infty}\mu(i)g(ix)\)。考虑将前式带入后式的 RHS,有

    \[\begin{aligned}\mathrm{RHS}&=\sum_{i=1}^{+\infty}\mu(i)\sum_{ix\mid j}f(j)\\&=\sum_{x\mid j}f(j)\sum_{i\mid\frac jx}\mu(i)\\&=\sum_{x\mid j}f(j)\epsilon\!\left(\dfrac jx\right)\\&=f(x)\end{aligned} \]

    得证。

数论函数的求法——筛法

线性筛

埃氏筛可以 \(\mathrm O(n\log\log n)\) 求出 \(n\) 以内的质数列表。然而有线性的方法,还可以顺带求出指定积性函数的 \(1\sim n\) 的值。

埃氏筛慢就慢在,一个数可能被多个质数给筛到。线性筛使得每个数只被最小质因数筛到。这只需要,对每个数,不论是质数和合数,都遍历一下当前质数表,把它的当前质数倍给筛一下。当当前质数能整除当前数时,说明以后的质数不再是当前数乘以对应质数所得结果的最小质因数,就 break;。这样是线性的。

求积性函数有个通法:你只需要快速求出质数的幂处的值,然后对其它数,维护一下最小质因子、最小质因子的最大能整除该数的次数 / 幂等等信息,就可以拆开来计算值了。其实对于非积性函数,但是是和分解质因数有那么点关系的函数(比如加性函数 \(\omega\)),也是可以顺带求出来的,这个就见机行事了,非常简单。

下面是一份求出 \(1\sim n\) 质数表、最小质因子的最大能整除该数的次数、该数除尽最小质因子后的值、\(\mathrm d\)\(\sigma\)\(\varphi\)\(\omega\)\(\mu\) 的线性筛 code

min25 筛

\(\mathrm o(n)\) 时间内求特定积性函数 \(f\) 的前 \(n\) 项的和。

使用该算法的先决条件:\(f\) 在质数 \(p\) 处的值可以用关于 \(p\) 的低次多项式表达出来,并且在质数的幂处的值可以较快算出。事实上对于前者,大部分积性函数都满足,例如 \(\sigma_k(p)=p^k+1\)\(\varphi(p)=p-1\)\(\mu(p)=-1\);对后者也是大部分积性函数都满足。所以可以发现 min25 筛的适用性还是很广的,但它也有它自己的缺点,就是不能顺便获得关键点 \(\left\lfloor\dfrac nx\right\rfloor\) 处的前缀和。

min25 筛分成两个部分:一是算 \(n\) 以内质数的总贡献,二是算合数(当然最后要把 \(1\) 处的值 \(1\) 加上)。

第一部分:考虑模拟埃氏筛的过程,用一个个质数把所有合数筛掉,最终只剩下质数。由于合数最终不会被算,所以合数处的值搞成什么样都可以,不妨当作质数,和质数享有一样的低阶多项式表达式。考虑对多项式的每一项求和,最终加起来,这样不仅由于多项式低阶,计算次数可以忽略,而且幂函数是完全积性函数,并且前缀和有通项。考虑设 \(g(i,j)\) 表示 \(i\) 以内的数用前 \(j\) 个质数筛过以后剩下来的所有数的幂的和,即所有质数和最小质因子大于第 \(j\) 个质数的合数的总贡献。考虑埃氏筛的过程,若 \(P_j^2>i\),则显然 \(g(i,j)=g(i,j-1)\);否则 \(g(i,j-1)\to g(i,j)\) 显然筛掉了最小质因子恰好等于第 \(j\) 个质数的所有合数,根据完全积性函数的性质,转移方程显然有:

\[g(i,j)=g(i,j-1)-f(P_j)\!\left(g\!\left(\left\lfloor\dfrac i{P_j}\right\rfloor\!,j-1\right)-g(P_{j-1},j-1)\right) \]

可以发现,转移到的 \(i\),由于 \(\left\lfloor\dfrac{\left\lfloor\dfrac na\right\rfloor}b\right\rfloor=\left\lfloor\dfrac n{ab}\right\rfloor\),一定是某个 \(\left\lfloor\dfrac nx\right\rfloor\) 的值,只有根号个。存储的话,还要进行离散化,这里有个巧方法:对 \(\leq \sqrt n\) 的值记录 \(i\),否则记录 \(\left\lfloor\dfrac nx\right\rfloor=i\) 的唯一解 \(x=\left\lfloor\dfrac ni\right\rfloor\)\(g(P_{j-1},j-1)\) 表示小于 \(P_j\) 的质数贡献和。由于仅当 \(P_j^2\leq i\leq n\) 的时候才会用到这个转移式,所以这个质数的前缀和可以直接线筛,筛到 \(\sqrt n\)。然后 \(j\) 这一维显然可以滚掉,就外层枚举 \(j\),内层倒过来枚举 \(i\) 转移。这样滚动还有个好处,就是将 \(i\) 排序后,对每个 \(j\) 需要更新的 \(i\) 是一个后缀,可以直接搞。不难发现第一部分利用了低阶多项式的种种优美性质,以及埃氏筛中 \(>\sqrt n\) 的质数不起作用这个重要的保障复杂度的事情。

第二部分:设 \(h(i,j)\) 表示 \(i\) 以内最小质因子大于 \(P_j\) 的所有数的原积性函数值和。这次是倒过来转移的,即之前 \(g\) 的边界 \(g(i,0)\) 由于幂函数的优美性质可以直接算,而这次边界为 \(h(i,pcnt)\) 仅包含质数的贡献,最后答案是 \(h(n,0)\)。考虑转移,计算 \(h(i,j)\) 时先把之前算过的质数的贡献算上(以下直接假定 \(g\) 为第一部分所计算出的对多项式每一项分别的 \(g\) 的和),然后枚举合数的最小质因子及其次数,利用积性函数的性质把值拆出来转移:

\[h(i,j)=g(i,pcnt)-g(P_j,j)+\sum_{p>j,P_p^2\leq i}\sum_{k\geq1,P_p^k\leq i}f\!\left(P_p^k\right)\!\left(h\!\left(\left\lfloor\dfrac i{P_p^k}\right\rfloor\!,p\right)+[k>1]\right) \]

\(g(P_j,j)\) 依然是那个被线筛预处理的玩意。合数的最小质因子一定 \(\leq\sqrt n\) 这个性质再一次保障了复杂度,保障了 \(j\) 的范围是到根号,使得 \(g\)\(h\) 的状态结构相同(另一个 point 是 \(h\) 的有效 \(i\) 值也是整除的形式)。枚举最小质因子的时候,也用到了这个性质来保障复杂度。然后就直接爆搜递归转移,边界是 \(h(i,j)=0(P_j>i)\),甚至不需要记忆化。

这两个部分的总复杂度被证明是 \(\mathrm O\!\left(n^{0.75}\log^{-1}n\right)\) 或者是 \(\mathrm O\!\left(n^{1-\epsilon}\right)\) 我也不知道。总之挺快的,\(n=10^{10}\) 大概跑 1s。

min25 筛模板 杜教筛模板(用 min25 筛写的)\(\mu\) 如果有平方因子那么贡献为 \(0\),所以在第二部分中不需要枚举最小质因子的次数)

杜教筛

\(\mathrm o(n)\) 时间内求特定数论函数(注意不要求是积性函数,虽然大部分情况都是积性函数)对于特定 \(n\) 的所有 \(\left\lfloor\dfrac nx\right\rfloor\) 处的前缀和。

考虑将该数论函数放进一个狄卷式 \(f*g=h\) 里(以下设它们的前缀和函数为对应大写字母)。如果该函数在右边,也就是 \(h\),那么显然有

\[H(x)=\sum_{ij\leq x}f(i)g(j)=\sum_{i=1}^xf(i)G\!\left(\left\lfloor\dfrac xi\right\rfloor\right) \]

考虑整除分块,对 \(g\) 显然要知道每个整除值处的前缀和;对 \(f\) 的话,算区间和的时候需要的前缀和是边界处的前缀和,而观察整除分块的代码 r=n/(n/i),所以边界也一定是整除值,于是对 \(f\) 依然只需要整除值处的前缀和。那么就能 \(\mathrm O(\sqrt n)\) 计算 \(H(n)\),如果要求每个整除值处的前缀和的话,直接暴力枚举整除分块,被证明是 \(\mathrm O\!\left(n^{0.75}\right)\) 的。如果对 \(x\leq n^{\frac 23}\) 都线筛预处理,可以证明总体复杂度是 \(\mathrm O\!\left(n^{\frac 23}\right)\),达到最优(实际效率跟 min25 筛差不多)。

如果要求的函数在左边,不妨设为 \(g\),那么将上式 \(\sum\)\(i=1\) 那一项提出来,其余的移到右边去(然后翻一下等式)得到

\[G(x)=\dfrac{H(x)-\sum\limits_{i=2}^xf(i)G\!\left(\left\lfloor\dfrac xi\right\rfloor\right)}{f(1)} \]

虽然大部分情况 \(f\) 是积性函数,\(f(1)=1\),但是非积性函数的时候也不能忘掉。那么可以对 \(G\) 的根号个关键点递推,存储可以仿照 min25 筛里面的 trick。需要的原料是 \(F\)\(H\) 在关键点的值。这种情况下,想要求出 \(n\) 处的前缀和,就必须顺带求出关键点处的前缀和,没得选了,必须是 \(\mathrm O\!\left(n^{\frac 23}\right)\),同样要线筛预处理。

我们把可以在 \(\mathrm O\!\left(n^{\frac 23}\right)\) 时间内求得所有关键点处前缀和的数论函数称作「可杜教筛的」。那么显然,如果一个数论函数可线筛(需要预处理),可以放到一个狄卷式里,并且该式另两个函数都可杜教筛,则该函数也可杜教筛(知二筛一)。不难发现杜教筛具有很强的构造性,可能在经典的知识体系里较好用,但是如果刻意定义奇怪的积性函数,就萎了;相比之下 min25 筛就很万能了,但它也有缺点:码量大,并且不能求得所有关键点处的前缀和。

放一下几个经典的筛法:对 \(\mu\)\(\mu*1=\epsilon\);对 \(\varphi\)\(\varphi*1=\mathrm{id}\);对 \(\sigma_k\)\(\sigma_k=\mathrm{id}_k*1\);对 \(?\times\mathrm{id}_k\)\((?\times\mathrm{id}_k)*(??\times \mathrm{id}_k)=(?*??)\times\mathrm{id}_k\)(提公因式)。

模板题


用于求数论函数 / 积性函数前缀和的筛法还有很多,暂时先不学了。min25 筛和杜教筛足以应付绝大多数 OI 比赛里的涉及到数论函数前缀和的数论题。遇到求数论函数前缀和,首先考虑能不能杜教筛(因为好写),如果不能,根据「闫氏题目不毒瘤猜想」,一定不会要求所有关键点处的前缀和(否则就不在我的数论能力范围内),然后 min25 筛直接上。

trick(s)

整除分块

\(\sum\limits_{i=1}^n\left\lfloor\dfrac mi\right\rfloor\)

引理(这个引理是核心,遇到其它更奇怪的关于除法下取整的题,一般都是用这个引理下手):\(\left|\left\{\left\lfloor\dfrac ci\right\rfloor\right\}\right|=\mathrm O(\sqrt c)\)。证明的话,就根号分治一下,\(i\leq \sqrt c\) 的显然,否则值是 \(\mathrm O(\sqrt c)\) 个的。

那么可以把整个 \(1\sim n\) 分成若干段,每段的 \(\left\lfloor\dfrac mi\right\rfloor\) 相等,这样相当于就把整除这个难搞的东西给解决了。写的时候并不需要根号分治地讨论,只需要枚举这样的段 \([l,r]\) 即可。我们从小往大枚举,每次令 \(l=r+1\),那么 \(r\) 是多少呢?考虑 \(\left\lfloor\dfrac cx\right\rfloor=d\) 的解集:即 \(d\leq\dfrac cx<d+1\),即 \(\dfrac c{d+1}<x\leq\dfrac cd\)。前面下界不管,后面上界的下取整就是 \(r\)

代码:

for(int l=1,r;l<=n;l=r+1){
	r=min(n,m/l?m/(m/l):inf);
	ans+=(m/l)*(r-l+1);
}

小变化:求 \(\sum\limits_{i=1}^n\left\lfloor\dfrac mi\right\rfloor f(i)\)。还是分个块,每块相当于一个固定的数乘以 \(f\) 的区间和。

中变化:求 \(\sum\limits_{i=1}^n\left\lfloor\dfrac mi\right\rfloor\left\lfloor\dfrac si\right\rfloor f(i)\)。这次分块需要满足两个整除的值都固定,这样的块数依然是根号 + 根号 = 根号,代码里改成 r=min(n,min(m/l?m/(m/l):inf,s/l?s/(s/l):inf));

大变化:(!@#$%^&*())。需要灵活运用那个引理,来降低复杂度。

狄利克雷前 / 后缀和

对任意数论函数 \(f\)\(g=f*1\) 称为 \(f\) 的狄利克雷前缀和。直接暴力算狄卷是线对的,我们有算法能够在 \(\mathrm O(n\log\log n)\) 算出 \(g\) 的前 \(n\) 项。(如果 \(f\) 是积性函数那不就线筛了嘛)

将每个数看作 \(pcnt\) 维的点,每维的值是所含该质因数的次数。那么狄利克雷前缀和本质上就是个高维前缀和。直接按照质数序列一维一维作用,每维的作用轮得到那些该质数的倍数们。最终复杂度就是 \(\mathrm O\!\left(\sum\limits_{p\leq n,p\in\mathbb P}\left\lfloor\dfrac np\right\rfloor\right)\)。这和埃氏筛复杂度分析是一样的,是 \(\mathrm O(n\log\log n)\)好耶 终于看到非二进制的高维前缀和应用了

mol ban

对应地,\(g(x)=\sum\limits_{x\mid i}f(i)\) 称为 \(f\) 的狄利克雷后缀和(必要的时候在 \(\sum\) 里加个上界)。容易发现就是高维后缀和,把高维前缀和倒过来写即可。

posted @ 2021-02-10 21:58  ycx060617  阅读(108)  评论(7编辑  收藏  举报