网课-数论学习笔记

Miller-Rabin 素性测试

一个基于随机的、有概率出错的素性测试算法。

结合了两个定理:

  1. 费马小定理的逆命题

  2. 二次探测定理

  • 费马素性测试

    • 流程:随机选择基数 \(a\),验证是否满足 \(a^{x-1} \equiv 1 \pmod{x}\)

    • 局限:无法排除一种叫作 Carmicheal 数的合数,这种合数不管选什么基数,都满足同余 \(1\)

  • 二次探测定理

    • 内容:对于 \(p^e\)\(p\) 为奇素数,\(e \ge 1\)),\(x^2 \equiv 1 \pmod{p^e}\) 有且仅有两个解 \(x = 1\)\(x = p-1\)

    • 证明:移项得 \((x-1)(x+1) \equiv 0 \pmod{p^e}\)

      如果 \(p\) 为素数的话,\(x-1\)\(x+1\) 只能是 \(p\) 的倍数。

      否则 \(p\) 为合数的话,可能出现 $x-$1 和 \(x+1\) 分别是 \(p\) 的一个因数的倍数的情况。

      \(x = 1, x = p-1\) 为“平凡平方数”;反之,称之为“非平凡平方数”。

      可以证明,Carmicheal 数绝对不是 \(p^e\),因此运用二次探测定理可以排除 Carmicheal 数。(当然,毕竟是随机算法,不一定能完全排除。。。)

  • 总流程

    1. 每次随机一个基数 \(a\)。在 \(2^{64}\) 以内,使用前 \(12\) 个质数作为基数即可。

    2. 将指数 \(x-1\) 进行拆分:\(x-1 = u2^t\),其中 \(u\) 为一个奇数

      那么现在要计算的就是:\((a^u)^{2^t}\)

      如此可以平方的部分就被我们拆出来了。我们只需要先把 \(a^u\) 算出来,然后连续平方 \(t\) 次即可。

    3. 平方的过程中,应该这么判定:

      如果当前检测到了不平凡平方数,立即退出返回合数;

      如果最后不满足费马素性测试,返回合数。


筛法

众所周知筛法是用来筛质数的。但现在筛法往往被用于一些数论函数的求值。

  • 线性筛

    它可以线性复杂度预处理所有的 积性函数。例:\(\varphi(x), \mu(x), f(x)=x^k\)\(k\) 很大快速幂被卡时……)。因为我们一定可以应用该式子:

    \[f(n) = f(n/p^c)f(p^c) \]

  • 埃氏筛

    埃氏筛可以说蕴含了许多数论问题的基本思想:通过因子去筛数,而非通过数去枚举因子。

    一些线性筛无法处理的且与因子相关的函数可以使用埃氏筛处理。详见下文“狄利克雷卷积”。


欧拉函数


威尔逊定理

令质数集合为 \(P\),则有:

\[(p-1)! \equiv \begin{cases} -1 & p \in P \\ 2 & p = 4 \\ 0 & p \not\in P \text{ and } p \ne 4\end{cases} \pmod{p} \]

威尔逊定理可以解决一些与阶乘相关的和式。


光速乘

用于解决模意义下在过程中出现整形溢出的情况。

它主要运用的是:

\[ab \bmod p = ab - p\lfloor\dfrac{ab}{p}\rfloor \]

  • 首先使用 long double 计算出 \(\frac{ab}{p}\)

    【注意:因为有可能有浮点误差,在这里我们先将计算结果加上 0.5。此时的商向下取整可能会比正确的结果大 1,这个问题在后面会被解决。】

  • 然后使用 ull 计算出 \(ab\)\(p\lfloor\dfrac{ab}{p}\rfloor\),此时可能会发生自然溢出。

  • 将上一步计算出的结果相减,并将结果强转回 ll。此时的答案有两种情况:

    • 小于 0。这是由浮点误差造成的。

    • 其余情况在这里得到的结果都会是大于等于 0 的。

  • 最后,如果 ans < 0,将其加上模数恢复到正常范围内即可。

ll Times(ll a, ll b, ll p){
	ull t = (long double)a*b/p+0.5;
	ll ans = (ull)a*b-t*p;
	if(ans < 0)	ans += p;
	return ans;
}

线性预处理逆元

P3811 【模板】模意义下的乘法逆元:通过用 \(i\) 除以 \(p\),在模 \(p\) 意义下分解出 \(i^{-1}\)\(p \bmod i\),而后者已经计算过可以用于递推。\(O(n)\)

P5431 【模板】模意义下的乘法逆元 2:用快速幂处理出整个数列积的逆元,即可递推得到前缀积的逆元;再结合数列前缀积,即可得到数列每个数的逆元,\(O(n + \log p)\)


扩展欧几里得算法

最后求出的特解满足:\(|x| \le b, |y| \le a\)。因此,\(a, b\)int \(x, y\) 就开 int\(a, b\)long long \(x, y\) 就开 long long


同余最短路

或许这个更应该放到图论建模里边去?

同余最短路一般用于解决给定序列 \(a\),求 \(\sum a_ix_i(x_i \in N)\) 的相关问题。

如果要求出最小的正整数 \(b\),满足 \(\sum a_ix_i = b(x_i \in N)\) 无解,可以设置若干个点,并在每对 \(x, x+a_i\) 之间连边,得到一个 DAG,并在其上跑 DP。显然,这在 \(b\) 过大时是会炸的。

同余最短路通过将状态设置为 \([0, a_i-1]\)\(i\) 可取任意 \(1 \sim n\)),代表模 \(a_i\) 的每个同余类,节省了空间时间。此时,我们只需以 \(0\) 为起点,在其上跑最短路,即可得到每个同余类能被拼凑出的最小数

以下为几道板子题:


中国剩余定理

中国剩余定理大致有两种用途:

  1. 将某些难求的用分解质因数拆解,然后用中国剩余定理组装。

  2. 处理循环节问题。

例题:

image

这个题的难点个人认为反而不在 CRT 本身,而在转化的技巧。

  1. 循环小数化分数

    image

    以后遇到类似的别的种类的分小互化,可以学习此处的列方程法。

  2. 二进制运算互化

    \[a + b = a \oplus b + 2(a \And b) \]

    \[a + b = a | b + a \And b \]

    \[a | b = a \oplus b + a \And b \]

    本题需要用到第一种。主要是因为,与运算、循环节与 CRT 能很好地结合:找到任意两个 1 所在循环中对应的位置。


原根与阶

  • 阶的定义:

    image

    记作 \(\text{ord}_p(a)\)

  • 阶的计算:

    image

  • 离散对数存在定理:现有 \(a^t \equiv b \pmod p\) ,保证 \(a, p\) 互质且 \(b, p\) 互质且 \(p\) 为质数。\(t\) 有解的充要条件是 \(\text{ord}(b)|\text{ord}(a)\)

    必要性:可得到 \(a^{\text{ord}(a)t} \equiv b^{\text{ord}(a)} \equiv 1 \pmod p\),故 \(\text{ord}(b)|\text{ord}(a)\)

    充分性如下:

    image

    image

  • 性质:若 \(\text{ord}(a), \text{ord}(b)\) 互质,则 \(\text{ord}(ab) = \text{ord}(a)\text{ord}(b)\)。(注意,这个和积性函数的定义是不同的。)

  • P4139 上帝与集合的正确用法

    答案为枚举 \(2^x \bmod p\)。可简单粗暴地通过扩展欧拉定理化为 \(2^{x\bmod\varphi(p)+\varphi(p)} \bmod p\)\(2^{2^{x\bmod\varphi(\varphi(p))+\varphi(\varphi(p))}\bmod\varphi(p)+\varphi(p)} \bmod p\)……一直递归计算。又暴力又巧妙,复杂度可证明为 \(\log p\) 级别。

  • 原根定义:

    image

  • 质数的原根存在定理:

    尝试证明:如果当前还有两个数 \(a, b\),满足 \(a^t \equiv b \pmod p\) 没有解,那么我们一定还能构造出一个新的数 \(c\),满足 \(\text{ord}(c) > \text{ord}(a)\And\text{ord}(b)\)。(显然,如果这个定理成立,即可推得原根一定存在。)

    因为 \(a^t \equiv b \pmod p\) 没有解,那么 \(\text{ord}(b)\) 不为 \(\text{ord}(a)\) 的因子,于是 \(\text{lcm}(\text{ord}(b), \text{ord}(a)) > \text{ord}(a)\And\text{ord}(b)\) 一定成立。现在试着构造一个数 \(c\) 使得 \(\text{ord}(c) = \text{lcm}(\text{ord}(b), \text{ord}(a))\)

    \(d = \gcd(\text{ord}(a), \text{ord}(b))\),则可以得到 \(\text{ord}(a^d) = \frac{\text{ord}(a)}{d}\),且 \(\frac{\text{ord}(a)}{d}, \text{ord}(b)\) 互质。根据性质“若 \(\text{ord}(a), \text{ord}(b)\) 互质,则 \(\text{ord}(ab) = \text{ord}(a)\text{ord}(b)\)”,可得到 \(c = a^db, \text{ord}(c) = \text{lcm}(\text{ord}(b), \text{ord}(a))\)

  • 原根的个数:\(\varphi(\varphi(p))\) 个。若已经有原根 \(g\),容易证明满足 \(\gcd(\varphi(p),k) = 1\)\(g^k\) 都是原根。

  • 原根的计算:最小的原根为 \(\log p\) 级别,直接枚举求阶即可。若想求出所有原根,枚举 \(\gcd(\varphi(p),k) = 1\)\(g^k\) 即可。


BSGS 算法

  • P3846 [TJOI2007] 可爱的质数/【模板】BSGS:通过除以 \(\sqrt{p}\),将指数拆为余数部分、商部分,预处理余数部分,检查商部分。而余数、商都在 \(\sqrt{p}\) 范围内。【直接使用 BSGS 的前提为 \(b, p\) 互质,因为只有此时才能在模 \(p\) 意义下进行 \(b\) 的除法运算。】

当模数不变,有 \(T\) 次询问,可以更改块大小,将复杂度从 \(O(T\sqrt{p})\) 变为 \(O(\sqrt{Tp})\)

  • P4195 【模板】扩展 BSGS/exBSGS:将同余方程 \(a^t \equiv b \pmod{p}\) 写为丢番图方程的形式 \(a^t+kp = b\)。令 \(d = \gcd(a, p)\),根据裴蜀定理,当且仅当 \(d|b\) 时有解。故可将问题转化为 \(\frac{a}{d}a^{t-1} \equiv \frac{b}{d} \pmod{\frac{p}{d}}\)。如果此时还存在公因数,则继续递归,直到化归为互质情况。

Pohlig-Hellman 算法(扩展扩展 BSGS)

discrete logarithm problem

……(暂略)……


二次剩余 + 相当匪夷所思的Cipolla 算法

image

image

证明:

对于任意两个解,一定满足 \(x_1^2 \equiv x_2^2 \equiv a\),得 \(x_1 \equiv x_2\)\(x_1 \equiv -x2\)。由此可见没有多于两个解。

设只有一个解,则 \(x \equiv -x\),即 \(2x\equiv0\)。由于 \(p\) 为奇质数,\(x\) 无解。

image

证明:

\(p\) 的一个原根 \(g\),则只有 \(g^0, g^2, g^4, \dots, g^{p-3}\) 为二次剩余。

image

证明:

\(a\) 是二次剩余时,\(a^{\frac{p-1}{2}} \equiv x^{p-1} \equiv 1\)

\(a\) 不是二次剩余时,取 \(p\) 的一个原根 \(g\),设 \(a \equiv g^{2n+1}\),则 \(a^{\frac{p-1}{2}} \equiv g^{(p-1)n+\frac{p-1}{2}} \equiv g^{\frac{p-1}{2}}\),因为 \((g^{\frac{p-1}{2}})^2 \equiv 1\)\(g^{\frac{p-1}{2}} \not\equiv 1\),有 \(a^{\frac{p-1}{2}} \equiv g^{\frac{p-1}{2}} \equiv -1\)

  • Cipolla 算法:

P5491 【模板】二次剩余

首先使用欧拉判别法,如果 \(c\) 不是二次剩余则无解。

如果有解,则不断随机 \(a\),直到 \(a^2-c\) 不是 \(p\) 的二次剩余。单次随机的成功率为 \(50\%\),故最坏也只需要随 \(\log\) 次。

添加一个数 \(w\),令其满足 \(w^2 \equiv a^2-c\)。方程的解即为 \(x \equiv (a+w)^{\frac{p+1}{2}}\)

你肯定在思考:\(a^2-n\) 都不是二次剩余,这个数 \(w\) 存不存在?它又该怎么求?其实这里运用的是类似“虚数”的方法定义的 \(w\)——我们令 \(w\) 相当于虚数单位 \(i = \sqrt{-1}\),那么 \((a+w)^{\frac{p+1}{2}}\) 只需要类比复数的运算法则计算。另外,我们根本不需要真正求出 \(w\),可以证明它在最后会被抵消——这是一种设而不求的思想。

接下来证明:为什么 \((a+w)^{\frac{p+1}{2}}\) 就是答案 & 为什么答案中 \(w\) 会被抵消。

image

image

关于 Cipolla 算法有什么用——它相当于模意义下开根。如果遇到在模意义下解二元一次方程,就可以用它解决根号部分。


整除分块

两个重要结论:

\[\left\lfloor\dfrac{x}{a}\right\rfloor = \left\lfloor\dfrac{\lfloor x\rfloor}{a}\right\rfloor \]

\[\left\lfloor\dfrac{a}{bc}\right\rfloor = \left\lfloor\dfrac{\lfloor\frac{a}{b}\rfloor}{c}\right\rfloor \]

image

整除分块又称数论分块。

image

  • P2261 [CQOI2007] 余数求和

  • P3935 CalculatingP2424 约数和:区间因子和。有很多数论问题在对每个位置处的函数单独求再求和时很困难时,会选择用函数的组成部分得到函数之和

  • 二次数论分块:有些题目可能有内外两层数论分块,即 \(\sum_{i=1}^n\sum_{j=1}^{\lfloor\frac{n}{i}\rfloor}\sum_{k=1}^{\lfloor\frac{m}{j}\rfloor}\)。此时我们可以对两层分别跑一次数论分块,时间复杂度为 \(O(\sum_{i=1}^{\sqrt{n}}\sqrt{i} + \sum_{i=1}^{\sqrt{n}}\sqrt{\frac{n}{i}}) = O(n^{\frac{3}{4}})\)。(用积分求的)


狄利克雷卷积

狄利克雷卷积是一个作用于数论函数、返回数论函数的运算,满足交换律、结合律和分配律。它的定义为:

\[(f*g)(n) = \sum_{d|n} f(d)g\left(\frac{n}{d}\right) \]

有一些函数进行狄利克雷卷积后可以得到一些特殊函数:

  • \(\epsilon(n) = \begin{cases}1&n=1 \\ 0&n>1\end{cases}\)(元函数),满足对于任意 \(f(x)\)\(f*\epsilon = f\)

  • \(I(n) = n\)(恒等函数)

  • \(1(n) = 1\)(常数函数)

  • \(d(n) = 1*1\)(因数个数函数)

  • \(\sigma(n) = I*1\)(因数和函数)

  • \(I(n) = \varphi*1\)(欧拉函数)

  • \(\epsilon(n) = \mu*1\)(莫比乌斯函数)

  • 两个积性函数的卷积依旧为积性函数。

可以发现上面大多数性质都是“\(f*1 = F\)”的形式。于是,我们可以定义 \(*1\) 情景下的狄利克雷卷积——即狄利克雷前缀和:

\[F(n) = \sum_{d|n}f(d) \]

如果要求一个函数 \(f\) 的狄利克雷前缀和,有 \(O(n \log n)\) 的朴素算法——将每个因子的 \(f\) 加到它们倍数的 \(F\) 中。

还有一种更高效的办法,考虑对每个质数 \(p\)前缀和。对于每个 \(p\),从小到大枚举 \(p|x\),令新的 \(f(x) = f(x)+f\left(\frac{x}{p}\right)\)(可以认为,步骤过程中的 \(f(x)\) 代表的是只有 \(\le p\) 的质因子时,\(F(x)\) 的值)。可以发现这个过程类似埃氏筛,复杂度为 \(O(n \log\log n)\)

当然,当 \(F(n)\) 为积性函数时,我们也完全可以使用线性筛 \(O(n)\) 处理出 \(F(n)\)。特别地,\(f(n)\) 为积性函数是 \(F(n)\) 为积性函数的充要条件


莫比乌斯反演

若算数函数 \(f, F\) 满足:

\[F(n) = \sum_{d|n}f(d) \]

(即 \(f*1 = F\)

则:

\[f(n) = \sum_{d|n}\mu(d)F(\frac{n}{d}) \]

(即 \(\mu*F = f\)

这个的证明有了上面给出的性质是很容易的。

莫比乌斯反演狄利克雷前缀和逆运算

但基本所有所谓“莫比乌斯反演”的题目,使用的是这条式子:

\[\epsilon(n) = \sum_{d|n}\mu(d) \]

这条式子更应该被称为 \(\mu\) 的一个性质而非莫反吧??

如果硬要从莫反的角度来理解它的话,可以看作 \(f = \epsilon, F = 1\),对它们应用莫比乌斯反演。

更具体地,在这些题目中,我们使用最多的是这条式子:

\[\sum_{i=1}^n\sum_{j=1}^m[\gcd(i, j)=1]f(i)g(j) = \sum_{i=1}^n\sum_{j=1}^m\sum_{d|\gcd(i,j)}\mu(d)f(i)g(j) = \sum_{d=1}^{\min(n,m)}\mu(d) \sum_{i=1}^{\lfloor\frac{n}{d}\rfloor} \sum_{j=1}^{\lfloor\frac{m}{d}\rfloor} f(id)g(jd) \]

然后再根据具体情况,更方便地处理 \(f(id), g(id)\)

  • P4450 双亲数P3455 [POI2007] ZAP-Queries

    可以发现这道题是前面 P2158 [SDOI2008] 仪仗队 的拓展版。

    \[\sum_{i=1}^n\sum_{j=1}^m[\gcd(i, j)=1] = \sum_{i=1}^n\sum_{j=1}^m\sum_{d|\gcd(i,j)}\mu(d) = \sum_{d=1}^{\min(n,m)}\mu(d)\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor \]

  • P1829 [国家集训队] Crash的数字表格 / JZPTAB:将不方便维护的 \(\text{lcm}\) 转化为 \(\gcd\) 和互质;二次数论分块,复杂度 \(O(n^{\frac{3}{4}})\)

  • P2257 YY的GCD:通过令 \(T = kd\),得到一个 \(\sum_{d|T}\) 的式子,而这个式子可以预处理。

  • P3911 最小公倍数之和\(n(1+\frac{1}{2}+\frac{1}{3}+\cdots+\frac{1}{n}) = n \ln n\) 调和级别复杂度,一般见于标记倍数或者暴力算 \(\sum_{d=1}^n\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\);令 \(T = dk\) 化出一块可以预处理的函数;\(\text{lcm}\) 的转化;将某位置有几个数化为一个函数 \(c(x)\),在莫反推导中我们往往不用去化这种非算术函数。

  • P6156 简单题\(\mu^2\) 可用于判断是否有平方因子;当卡快速幂时,可用线性筛 \(O(n)\) 得到 \(1 \sim n\) 的所有 \(i^k\);当一个函数为一堆积性函数的狄利克雷卷积形式时,可以 \(O(n)\) 筛出。(具体推导过程

  • P3704 [SDOI2017] 数字表格\(a^{\sum b} = \prod a^b\);令 \(T = dk\) 化出一块可以预处理的函数;在莫反推导中我们可以不化斐波那契这种非算术函数,只用预处理即可。

  • GCDMAT - GCD OF MATRIX:这个利用了 \(\varphi\) 的和函数为 \(I\) 的欧拉反演。(其实也可以套路莫反,推到最后就可以发现可以用 \(\mu\) 化出 \(\varphi\) 的表达式。)

  • P3327 [SDOI2015] 约数个数和

    (以为已经掌握莫比乌斯反演的我被这道题当头一棒)

    最关键的就在不知道:

    \[d(ij) = \sum_{x|i}\sum_{y|j}[\gcd(x, y) = 1] \]

    关于这个怎么证:

    考虑在 \(ij\) 的每个因子间与这个 \([\gcd(x, y) = 1]\) 间建立映射。

    先考虑 \(ij\) 因子的每一个质数。如果 \(ij\) 的因子 \(k\) 中有一个因子 \(p^c\)\(i\) 中有因子 \(p^a\)\(j\) 中有因子 \(p^b\)。现在要在 \(i, j\) 中选出 \(p^c\),我们规定如下选法:

    1. 如果 \(c \le a\),那么全部在 \(i\) 中选择。

    2. 如果 \(c > a\),那么在 \(i\) 中选择 \(p^a\),在 \(j\) 中选择 \(p^{c-a}\)

    对于以上选法,我们将 1. 在 \(i\) 中所选的全都累计到 \(x\) 中去;在 2. 中所选的 \(j\) 全都累计到 \(y\) 中去。这样,\(k\)\(x, y\) 之间就建立了一一对应关系。

接下来是和 \([\gcd(i, j)=1]\) 那个式子无关的题目:

  • P4318 完全平方数

    易求:

    \[F(n) = \sum_{d=1}^n \sum_{i=1}^n [d^2|i] \]

    欲求:

    \[f(n) = \sum_{d=1}^n \sum_{i=1}^n [d^2|i][i\text{ 不存在其余平方因子}] \]

    满足:

    \[F(n) = \sum_{d|n} f(d) \]

    进行莫比乌斯反演:

    \[f(n) = \sum_{d|n}\mu(d)F\left(\frac{n}{d}\right) \]

    (这才是真正的莫反!)


杜教筛

OI-wiki

杜教筛递推式:

\[g(1)S(n) = \sum_{i=1}^n(f*g)(i) - \sum_{i=2}^ng(i)S\left(\left\lfloor\dfrac{n}{i}\right\rfloor\right) \]

注意:不一定得是积性函数才能用杜教筛,只要能构造出满足如下条件的 \(g\) 即可用杜教筛:

  1. 可以快速计算 \(\sum_{i=1}^n(f*g)(i)\)

  2. 可以快速计算 \(g\) 的前缀和,以用数论分块求解 \(\sum_{i=2}^ng(i)S\left(\left\lfloor\dfrac{n}{i}\right\rfloor\right)\)

具体实现:

  1. 线性筛预处理到 \(n^{\frac{2}{3}}\)

  2. 记忆化递归计算答案。这里使用 map。(其实杜教筛复杂度的保证源于数论分块的递归最多只有两层,其余都为重复。)

如此,杜教筛有总复杂度 \(O(n^{\frac{2}{3}})\)

能够用杜教筛处理的函数举例:

  • 欧拉函数:构造 \(g(x) = 1, (g*f)(x) = x\),则有 \(S(n) = \frac{n(n+1)}{2} - \sum_{i=2}^nS(\lfloor\frac{n}{i}\rfloor)\)

  • 莫比乌斯函数:构造 \(g(x) = 1, (g*f)(x) = \epsilon\),则有 \(S(n) = 1 - \sum_{i=2}^nS(\lfloor\frac{n}{i}\rfloor)\)

题目:


image

浙江陈哲。

posted @ 2024-05-02 15:06  David_Mercury  阅读(18)  评论(0编辑  收藏  举报