数论杂记 2025.8.11始
0x1f Bézout 定理
如果 \(a,b\) 均为整数,则方程 \(ax + by = \gcd(a,b)\) 一定有解。
可以使用构造法证明,也就是 \(exgcd\)。。。
证明:
对于 \(ax + by = c\),对其进行变换 \(bx + (a \% b)y = c\)。
如果我们知道后者的解 \(x_1,y_1\),那么有
待定系数法得出 \(\begin{cases} x_0 = y_1 \\ y_0 = x_1 - \lfloor \cfrac{a}{b} \rfloor \times y_1 \end{cases}\)
显然根据辗转相除法,一定有 \(a\%b = 0\) 时,此时 \(ax = c\),\(x = \dfrac{c}{a}\)。
而当 \(a\%b = 0\) 时,\(a\) 为 \(\gcd(a,b)\),即 \(x = \dfrac{c}{\gcd(a,b)}\)。
当 \(c | \gcd(a,b)\) 时, \(x\) 有整数解。
证毕。\(\square\)
0x2f exgcd
想必你也已经发现了,根据证明 Bézout 定理 的过程,我们已经可以知道 \(ax + by = \gcd(a,b)\) 的一个解了。
那么这一节主要讲各种解的算法。
-
判断 \(ax + by =c\) 有无解
\(\textbf{Theorem}\):一个 \(ax + by =c\) 方程有解,当且仅当 \(c | \gcd(a,b)\)。
必要性:前文已经阐述。
充分性:\(\gcd(a,b)|a,\gcd(a,b)|b \to \gcd(a,b)|c\)。
-
通解
先举个例子:
\(3x + 2y = 18\)
你会怎么解?
首先随便找到一组解 \(x = 4,y = 3\)。
再减小 \(x\),增加 \(y\) 就找到另一组解 \(x = 2,y = 6\)。
那么设 \(x\) 的变化量 \(\Delta x\),\(y\) 的变化量 \(\Delta y\)。
显然 \(a(x + \Delta x) + b(y + \Delta y) = c\)。
有 \(a \Delta x + b \Delta y = 0\)。
显然我们想让 \(\Delta x/\Delta y\) 绝对值最小。
\(\Delta x\) 取 \(\cfrac{a}{\gcd(a,b)}\) 时。
原式转换成 \(1 - 1 = 0\)。
所以我们得到了通解。
\[a(x + k\cfrac{a}{\gcd(a,b)}) + b(y - k\cfrac{b}{\gcd(a,b)}) = c \] -
\(x/y\) 最小正整数解
对于 \(x = x + k\cfrac{a}{\gcd(a,b)}\) 最小正整数解,设 \(g = \cfrac{a}{\gcd(a,b)}\)
在 \((x \%g + g)\%g\) 产生(因为 \(g\) 是步长)。
-
方程是否有正整数解
我们一定有 \(x_{\min} \to y_{\max}\),对吧!
此时若 \(y_{\max} \le 0\),则无正整数解。
-
推推推论
\(\sum_{i=1}^n {a_i \times x_i} = c\) 的通解,当且仅当 \(c | \gcd_{i=1}^n a_i\)
0x3f 乘法逆元
定义:\(a \times a^{-1} \equiv 1 \pmod{p}\) ,\(a^{-1}\) 为 \(a\) 在模 \(p\) 意义下的逆元。
应用场景:在模意义下除以一个数时,只能乘它的逆元。
下面给出三种求逆的方法,在不同地方用到:
-
费马小定理
优点:大部分人都会,求单个逆元
缺点:要求互素。
设 \(n\) 是素数,\(a\) 与 \(n\) 互素,有 \(a^{n-1} \equiv 1 \pmod n\)。
变形 \(a \times a^{n-2} \equiv 1 \pmod n\)。
所以此时 \(a^{n-2}\) 为逆元。
-
\(\textbf {exgcd}\) 求解
\(ax \equiv 1 \pmod n\),求 \(x\)。
即 \(ax + bn = 1\)。
\(exgcd\) 求解即可。
-
递推求逆元
我们知道 \(1^{-1} = 1 \pmod n\)。
首先有 \(i \times \lfloor \dfrac{p}{i} \rfloor + p\mod i \equiv 0 \pmod p\)。
\(p \mod i\) 的逆元我们已经一定求出来了,整个式子同乘 \(i^{-1} (p \pmod i)^{-1}\)。
\[i^{-1} = -(p \pmod i)^{-1} \times \lfloor \dfrac{p}{i} \rfloor \]递推式证毕。\(\square\)
-
补充:倒推求逆元法
为什么要在这里介绍呢?因为它可以在 \(O(n)\) 内递推任意 \(n\) 个数的逆元。
证明:
假设我们有一列数 \(a_1,a_2,a_3,\dots,a_n\)。
- 用循环求出数列的前缀积。
- 用 \(exgcd\) 或费马小定理计算 \(\prod_{i=1}^n a_i\) 的逆元。
- 根据 \(\dfrac{1}{\prod_{i=1}^{k-1} a_i} = \dfrac{a_k}{\prod_{i=1}^{k} a_i}\),求出任意前缀积的逆元。
- 根据 \(\dfrac{1}{a_k} = \dfrac{\prod_{i=1}^{k-1} a_i}{\prod_{i=1}^{k} a_i}\),求出任意 \(a_i\) 的逆元。
证毕。\(\square\)
0x4f 中国剩余定理
Part 1
对于下列的同余方程组,能否知道解的情况呢?
其中 \(m_i\) 两两互质。
中国剩余定理给出了解答,我们会阐述其充要性。
构造:
-
设 \(M = \prod_{i=1}^n m_i\)。
-
设 \(M_i = \dfrac{M}{m_i}\)。
-
设 \(t_i = M^{-1} \pmod m_i\)
-
\[x = kM + \sum_{j=1}^n {a_i t_i M_i} \]
证明:
-
充分性:
由于 \(t_i\) 是 \(M_i\) 的逆元,有 \(a_i t_i M_i \equiv a_i \pmod{m_i}\)。
由于 \(M\) 的定义,\(a_i t_i M_i \equiv 0 \pmod{m_j} (i \ne j)\)。
\(x = kM + \sum_{j=1}^n {a_i t_i M_i} \equiv 0 + (a_i + \sum_{j=1,j \ne i}^n 0) \pmod{m_i}\)。
综上得证。\(\square\)
-
必要性
假设存在另一个解,\(x_1 \equiv x \pmod{M}\) 不成立(这里模 \(M\) 是消除步长),但是由于 \(x_1 \equiv a_i \equiv x \pmod{m_i}\)。
推广得到 \(\forall i,x_1 \equiv x \pmod{m_i}\)。
我们可以得到 \(x_1 \equiv x \pmod{M}\)。
假设推翻,固有唯一通解。
证毕。\(\square\)
Part 2
注意到以上的讨论是在 \(m_i\) 两两互质下进行的。
指出不互质后失效的地方:我们在证明充分性中用到了逆元,存在逆元的充分条件是 \(a,p\) 互质。
这是一切问题的根源。
所以我们要合并方程,使得剩余的方程两两互质。
推式子:
这个等价于:
可以得到:
那么便可以得到第一个结论:
\(\textbf{Theory 1}:\) 如果 \(\gcd(m_1,m_2)\ |\ (a_2-a_1)\),那么方程有解,否则方程无解。
接着,我们定义 \(g = \gcd(m_1,m_2)\),\(p_1 = \dfrac{m_1}{g}\),\(p_2 = \dfrac{m_2}{g}\)。
于是可以得到:
显然 \(p_1,p_2\) 互质,我们可以用 \(exgcd\) 求出一组解。
带回到含 \(x\) 的等式将 \(x_0\) 解出来就行了。
那通解如何求出呢?
\(\textbf{Theory 2}:\) 若有特解 \(x_0\),那么同余方程组通解为 \(x = x_0 + lcm_{i=1}^n m_i\)。
这样构造的解十分常见,因为同余方程组的周期一定为 \(lcm\)。
那么只需说明解的唯一性:
设两个解 \(x_1,x_2\),那么有 \(\begin{cases} x_1-x_2 \equiv0 \pmod{m_1} \\ x_1-x_2 \equiv0 \pmod{m_2} \end{cases}\)(两个方程组相减得到)。
那么:\(lcm(m_1,m_2)\ | \ (x_1-x_2)\)。
显然 \(x_1-x_2<lcm(m_1,m_2)\),矛盾。
证毕。\(\square\)
至此,我们得出了最终的结论。
\(\textbf{Theory 3}:\) \(\begin{cases} x \equiv a_1 \pmod{m_1} \\ x \equiv a_2 \pmod{m_2} \end{cases}\) 可以化简为 \(x \equiv x_0 \pmod{lcm(m_1,m_2)}\)。
按照这个来化简,即可写完扩展中国剩余定理。
0x5f Miller-Rabin 素性测试
推式子实在是推不动了,遂写一点和人类智慧相关联的东西(反正迟早要写abab。
完美的质数判断算法是 \(O(\sqrt{n})\) 的,在超过 \(1e16\) 的数字实在是吃不消,何况某些题还给你 \(100\) 个数字,你就只能筛 \(1e12\) 了。
那么,是否有方法可以乱搞呢?
\(\textbf{Lemma \ 1}:\) 对于 \(a,n\) 互质的情况,\(a^{n-1} \equiv 1 \pmod{n}\)。
费马小定理。
那么如果 \(a^{n-1} \equiv 1 \pmod{n}\) 并不成立,那么 \(n\) 一定不是质数,因为 \(a^{n-1} \equiv 1 \pmod{n}\) 这种东西实在是太过于巧合了,可以用来做素性测试。
只要 \(a\) 足够多,费马素性测试乍一看就很高明。
遗憾的是,费马素性测试是不严谨的,因为有 \(Carmichael\) 数 的存在,使费马素性测试失效了。
于是我们采用了 \(Miller-Rabin\) 素性测试。
\(\textbf{Lemma \ 2 二次探测定理}:\) 如果 \(p\) 是一个奇素数,那么 \(x^2 \equiv 1 \pmod{p}\) 仅有两个解 \(x_1 = 1,x_2 = -1\),这其实很好理解,\((x+1)(x-1) \equiv 0 \pmod{p}\),如果存在另外的解,那么 \(x + 1\ |\ p,x - 1\ |\ p\),\(p\) 不是素数。
下面给出 \(Miller-Rabin\) 素性测试流程(基数是\(a\),测试数为 \(n\)):
- 将 \(n-1\) 拆成 \(2^t \times u\) 的形式
- 计算 \(A = a^u\)
- 对 \(A\) 进行 \(t\) 次平方,每次平方后得到 \(A^2\),若 \(A^2 \equiv 1 \pmod{n}\),采用二次探测定理进行素数判定。
- 现在得到了 \(a^{n-1}\),使用费马素性测试。
以上的流程可以有效判定 \(Carmichael\) 数。

浙公网安备 33010602011771号