数学 同余
同余
一、同余的定义
设整数 \(a, b, m\),若 \(m \mid (a - b)\),称 \(a\) 同余于 \(b\) 模 \(m\),记作:
其中 \(m\) 为模数,\(a\) 对模 \(m\) 的剩余。如果没有特别说明,模数总是正整数。
直观理解:\(a\) 和 \(b\) 除以 \(m\) 的余数相同。例如 \(17 \equiv 5 \pmod{4}\),因为 \(17 - 5 = 12\) 是 \(4\) 的倍数。
同余式 \(a \equiv b \pmod{m}\) 等价于 \(a = b + km\)(\(k\) 为某个整数),也等价于 \(a\) 和 \(b\) 在模 \(m\) 的意义下「指向同一个位置」。
二、同余的基本性质
同余关系是一个等价关系,满足三条:
- 自反性:\(a \equiv a \pmod{m}\)
- 对称性:若 \(a \equiv b \pmod{m}\),则 \(b \equiv a \pmod{m}\)
- 传递性:若 \(a \equiv b \pmod{m}\) 且 \(b \equiv c \pmod{m}\),则 \(a \equiv c \pmod{m}\)
在运算层面,同余保持线性运算和乘法:
| 性质 | 表述 |
|---|---|
| 加法 | 若 \(a \equiv b \pmod{m}\),则 \(a + c \equiv b + c \pmod{m}\) |
| 减法 | 若 \(a \equiv b \pmod{m}\),则 \(a - c \equiv b - c \pmod{m}\) |
| 乘法 | 若 \(a \equiv b \pmod{m}\),则 \(ac \equiv bc \pmod{m}\) |
| 幂 | 若 \(a \equiv b \pmod{m}\),则 \(a^n \equiv b^n \pmod{m}\) |
消去律
同余的消去律比等式复杂,这是最容易出错的地方:
若 \(ac \equiv bc \pmod{m}\),且 \(\gcd(c, m) = d\),则 \(a \equiv b \pmod{m/d}\)。
当 \(\gcd(c, m) = 1\) 时,可以直接消去 \(c\):\(a \equiv b \pmod{m}\)。但当 \(c\) 与 \(m\) 不互质时,模数也要相应缩小——除以它们的最大公约数。
举例:\(6 \times 2 \equiv 3 \times 2 \pmod{6}\),即 \(12 \equiv 6 \pmod{6}\) 成立。但消去 \(2\) 后不能得到 \(6 \equiv 3 \pmod{6}\)(不成立)。正确的做法是 \(\gcd(2, 6) = 2\),所以 \(6 \equiv 3 \pmod{3}\),即 \(0 \equiv 0 \pmod{3}\),成立。
注:同余不满足「直接除法」。同余意义下的「除法」本质上是乘以逆元,而逆元的存在性本身就是一个问题。
三、裴蜀定理
定理:设 \(a, b\) 是不全为零的整数,则存在整数 \(x, y\),使得 \(ax + by = \gcd(a, b)\)。更一般地,\(ax + by = c\) 有整数解当且仅当 \(\gcd(a, b) \mid c\)。
证明(构造性,利用辗转相除法)
裴蜀定理的存在性可以通过辗转相除法本身来证明,而且这个证明是构造性的——它直接给出了计算 \((x, y)\) 的方法。
辗转相除法产生一列余数:
即 \(r_{i+1} = r_{i-1} - q_i \cdot r_i\),其中 \(q_i = \lfloor r_{i-1} / r_i \rfloor\)。余数序列严格递减,最终必有 \(r_{n+1} = 0\),此时 \(\gcd(a, b) = r_n\)。
断言:每个 \(r_i\) 都可以表示为 \(a\) 和 \(b\) 的整系数线性组合。对 \(i\) 归纳:
- \(r_0 = a = 1 \cdot a + 0 \cdot b\)
- \(r_1 = b = 0 \cdot a + 1 \cdot b\)
- 设 \(r_{i-1} = x_{i-1} \cdot a + y_{i-1} \cdot b\),\(r_i = x_i \cdot a + y_i \cdot b\),则:
仍然是 \(a, b\) 的线性组合,归纳成立。
特别地,\(r_n = \gcd(a, b)\) 也是 \(a, b\) 的线性组合,即存在整数 \(x, y\) 使得 \(ax + by = \gcd(a, b)\)。\(\quad \square\)
对于「当且仅当」的方向:若 \(ax + by = c\) 有解,则 \(\gcd(a, b) \mid ax\) 且 \(\gcd(a, b) \mid by\),故 \(\gcd(a, b) \mid c\)。反之若 \(\gcd(a, b) \mid c\),设 \(c = k \cdot \gcd(a, b)\),将 \(ax_0 + by_0 = \gcd(a, b)\) 两边乘 \(k\) 即得一组解。
这个证明不仅是理论保证,更给出了算法蓝图:从 \((x_0, y_0) = (1, 0)\) 和 \((x_1, y_1) = (0, 1)\) 出发,沿着辗转相除的每一步用 \(r_{i+1} = r_{i-1} - q_i r_i\) 同步更新系数,最终就得到 \(\gcd(a, b)\) 对应的 \((x, y)\)。这就是扩展欧几里得算法。
四、扩展欧几里得算法 exgcd
扩展欧几里得算法在辗转相除法的递归框架上,同步计算裴蜀等式 \(ax + by = \gcd(a, b)\) 的一组解 \((x, y)\)。
正确性证明(第一数学归纳法)
辗转相除法的核心递推为 \(\gcd(a, b) = \gcd(b,\ a \bmod b)\)。扩展欧几里得算法对这个递推做归纳,在求 \(\gcd\) 的同时求出对应的 \((x, y)\)。
边界(\(b = 0\)):\(\gcd(a, 0) = a\),而 \(a = 1 \cdot a + 0 \cdot 0\),所以取 \(x = 1,\ y = 0\) 即可。
归纳步:假设对子问题 \((b,\ a \bmod b)\),递归已正确返回 \((x', y')\) 满足:
将 \(a \bmod b = a - \lfloor a/b \rfloor \cdot b\) 代入左端:
按 \(a\) 和 \(b\) 重新合并同类项:
因此令 \(x = y'\),\(y = x' - \lfloor a/b \rfloor \cdot y'\),便得到 \(ax + by = \gcd(a, b)\)。归纳完成。\(\quad \square\)
归纳步给出了从子问题的解 \((x', y')\) 构造原问题解 \((x, y)\) 的递推公式。整个算法的递归结构与辗转相除法完全一致,递归深度 \(O(\log \min(a, b))\)。
代码实现
// 更直观的 exgcd:递归返回后,用局部变量 x1, y1 承接,再显式赋值
ll exgcd(ll a, ll b, ll &x, ll &y) {
if (b == 0) {
x = 1; y = 0;
return a;
}
ll x1, y1; // 承接下一层返回的 (x, y)
ll d = exgcd(b, a % b, x1, y1); // 形参顺序正常,逻辑最清晰
x = y1; // 本层 x = 下一层 y
y = x1 - (a / b) * y1; // 本层 y = 下一层 x - ⌊a/b⌋·下一层 y
return d;
}
注意递归调用时 x 和 y 的位置交换——这是上面推导 \(x = y'\) 的直接体现。
通解
若 \(exgcd(a, b, x_0, y_0)\) 返回 \(d = \gcd(a, b)\),则 \(ax + by = c\)(\(d \mid c\))的通解为:
五、乘法逆元
定义
如果线性同余方程 \(ax \equiv 1 \pmod{p}\) 有解,则 \(x\) 称为 \(a\) 在模 \(p\) 意义下的乘法逆元,记作 \(a^{-1}\)。
逆元的存在条件:\(\gcd(a, p) = 1\)。当 \(p\) 为质数且 \(a \not\equiv 0 \pmod{p}\) 时,逆元一定存在。
逆元的本质是模意义下的「倒数」——有了逆元,模意义下的除法就能转化为乘法:\(a / b \pmod{p}\) 等价于 \(a \cdot b^{-1} \pmod{p}\)。
方法一:扩展欧几里得法
\(ax \equiv 1 \pmod{p}\) 等价于 \(ax + py = 1\)。用扩展欧几里得算法直接求解,得到 \(x\) 即为逆元。
这种方法不要求 \(p\) 是质数,只要求 \(\gcd(a, p) = 1\)。
ll inv(ll a, ll p) {
ll x, y;
ll d = exgcd(a, p, x, y);
// d 应为 1,否则逆元不存在
return (x % p + p) % p; // 保证非负
}
方法二:费马小定理 + 快速幂
费马小定理:若 \(p\) 为质数且 \(p \nmid a\),则 \(a^{p-1} \equiv 1 \pmod{p}\)。
因此 \(a \cdot a^{p-2} \equiv 1 \pmod{p}\),即:
用快速幂计算即可。这种方法要求 \(p\) 是质数。
ll quick_pow(ll a, ll b, ll p) {
ll res = 1;
a %= p;
while (b) {
if (b & 1) res = res * a % p;
a = a * a % p;
b >>= 1;
}
return res;
}
ll inv_fermat(ll a, ll p) {
return quick_pow(a, p - 2, p); // 要求 p 为质数
}
方法三:线性递推求逆元
当需要求 \(1, 2, \ldots, n\) 在模 \(p\) 意义下的所有逆元时(\(p\) 为质数),可以 \(O(n)\) 线性递推:
推导:设 \(p = qi + r\)(\(r = p \bmod i\)),则 \(qi + r \equiv 0 \pmod{p}\),即 \(qi \equiv -r \pmod{p}\)。两边乘以 \(i^{-1}\) 和 \(r^{-1}\):
void linear_inv(int n, ll p, ll inv[]) {
inv[1] = 1;
for (int i = 2; i <= n; i++)
inv[i] = (p - p / i) * inv[p % i] % p;
}
三种方法的对比
| 方法 | 时间复杂度 | 适用条件 | 适用场景 |
|---|---|---|---|
| 扩展欧几里得 | \(O(\log p)\) | \(\gcd(a, p) = 1\) | 单个逆元,\(p\) 不一定是质数 |
| 费马小定理 + 快速幂 | \(O(\log p)\) | \(p\) 为质数 | 单个逆元,\(p\) 为质数 |
| 线性递推 | \(O(n)\) 预处理 | \(p\) 为质数 | 批量求 \(1 \sim n\) 的逆元 |
六、线性同余方程
定义
形如 \(ax \equiv b \pmod{n}\) 的方程称为线性同余方程,需要找到 \(x \in [0, n-1]\) 的全部解。
求解
\(ax \equiv b \pmod{n}\) 等价于 \(ax + ny = b\)(\(x, y\) 为整数)。由裴蜀定理,方程有解当且仅当 \(d = \gcd(a, n) \mid b\)。
有解时:用扩展欧几里得算法求出 \(ax_0 + ny_0 = d\) 的一组解,则原方程的一个特解为 \(x' = x_0 \cdot (b/d)\)。
通解(模 \(n\) 意义下):
共有 \(d\) 个不同的解(模 \(n\) 意义下)。
代码实现
// 返回 gcd(a,n),x 存一个特解
ll solve(ll a, ll b, ll n, ll &x) {
ll y;
ll d = exgcd(a, n, x, y);
if (b % d != 0) return -1; // 无解
x = x * (b / d) % n;
x = (x % (n / d) + (n / d)) % (n / d); // 最小非负解
return d;
}
七、中国剩余定理(CRT)
问题模型
中国剩余定理(Chinese Remainder Theorem)求解如下形式的同余方程组,其中 \(n_1, n_2, \ldots, n_k\) 两两互质:
算法
- 计算所有模数的积 \(N = \prod_{i=1}^{k} n_i\)。
- 对第 \(i\) 个方程,计算 \(m_i = N / n_i\),以及 \(m_i\) 在模 \(n_i\) 意义下的逆元 \(m_i^{-1}\)(存在性由 \(\gcd(m_i, n_i) = 1\) 保证,因为 \(n_i\) 两两互质)。
- 令 \(c_i = m_i \cdot m_i^{-1} \bmod N\)。
- 方程组在模 \(N\) 意义下的唯一解为:
正确性
当 \(i \neq j\) 时,\(n_i \mid m_j\)(因为 \(m_j\) 是其余所有 \(n\) 的乘积),所以 \(c_j \equiv 0 \pmod{n_i}\)。而 \(c_i = m_i \cdot m_i^{-1} \equiv 1 \pmod{n_i}\)。代入求和式:
每个方程都被满足。
经典示例:物不知数
三三数之剩二,五五数之剩三,七七数之剩二。问物几何?
\(N = 3 \times 5 \times 7 = 105\)。
- \(m_1 = 35\),\(35^{-1} \bmod 3 = 2\)(因为 \(35 \equiv 2 \pmod{3}\),\(2 \times 2 = 4 \equiv 1 \pmod{3}\)),\(c_1 = 70\)。
- \(m_2 = 21\),\(21^{-1} \bmod 5 = 1\)(因为 \(21 \equiv 1 \pmod{5}\)),\(c_2 = 21\)。
- \(m_3 = 15\),\(15^{-1} \bmod 7 = 1\)(因为 \(15 \equiv 1 \pmod{7}\)),\(c_3 = 15\)。
答案为 \(23\)。
代码实现
ll crt(int k, ll a[], ll n[]) {
ll N = 1, ans = 0;
for (int i = 0; i < k; i++) N *= n[i];
for (int i = 0; i < k; i++) {
ll m = N / n[i];
ll x, y;
exgcd(m, n[i], x, y); // 求 m 对 n[i] 的逆元
x = (x % n[i] + n[i]) % n[i];
ans = (ans + a[i] * m % N * x % N) % N;
}
return ans;
}
八、扩展中国剩余定理(exCRT)
问题模型
当模数不保证两两互质时,标准 CRT 的公式失效(\(m_i\) 与 \(n_i\) 不一定互质,逆元不一定存在)。扩展中国剩余定理通过两两合并方程来处理这种情况。
两方程合并
给定两个同余方程:
设 \(x = m_1 p + a_1\),代入第二个方程得 \(m_1 p + a_1 \equiv a_2 \pmod{m_2}\),即:
令 \(d = \gcd(m_1, m_2)\)。由线性同余方程的理论,该方程有解当且仅当 \(d \mid (a_2 - a_1)\)。
无解:若 \(d \nmid (a_2 - a_1)\),整个方程组无解。
有解:用扩展欧几里得算法求 \(m_1 p_0 + m_2 q_0 = d\) 的一组解,则 \(p = p_0 \cdot (a_2 - a_1) / d\)。
合并后的新方程为:
新模数为 \(M = \text{lcm}(m_1, m_2) = m_1 / d \cdot m_2\)。
多方程合并
对于 \(k\) 个方程,从第一个开始,每次将当前合并结果与下一个方程合并,共合并 \(k - 1\) 次。最终得到 \(x \equiv A \pmod{M}\),其中 \(M = \text{lcm}(m_1, m_2, \ldots, m_k)\)。
代码实现
ll mul(ll a, ll b, ll p) { // 龟速乘,防溢出
a = (a % p + p) % p;
b = (b % p + p) % p;
ll res = 0;
while (b) {
if (b & 1) res = (res + a) % p;
a = (a + a) % p;
b >>= 1;
}
return res;
}
ll excrt(int k, ll a[], ll m[]) {
ll M = m[0], ans = a[0]; // 初始:第一个方程
for (int i = 1; i < k; i++) {
ll x, y;
ll d = exgcd(M, m[i], x, y); // 求 M*x + m[i]*y = gcd(M, m[i])
ll c = ((a[i] - ans) % m[i] + m[i]) % m[i];
if (c % d != 0) return -1; // 无解
ll t = m[i] / d;
x = mul(x, c / d, t); // p = x * (c/d) mod (m[i]/d)
ans = ans + M * x; // 更新解
M = M / d * m[i]; // 更新模数 lcm(M, m[i])
ans = (ans % M + M) % M; // 保证非负
}
return ans;
}
龟速乘与溢出
exCRT 中模数可能很大(如 \(10^{18}\) 级别),两数相乘会溢出 long long。解决方案是龟速乘(也称快速乘):将乘法拆成加法,用二进制逐步累加并取模,复杂度 \(O(\log b)\)。
九、欧拉定理与费马小定理
欧拉函数
欧拉函数 \(\varphi(n)\) 表示 \(1 \sim n\) 中与 \(n\) 互质的整数个数。若 \(n = p_1^{a_1} p_2^{a_2} \cdots p_k^{a_k}\),则:
欧拉定理
若 \(\gcd(a, n) = 1\),则:
费马小定理
费马小定理是欧拉定理在 \(n\) 为质数时的特例。若 \(p\) 为质数且 \(\gcd(a, p) = 1\),则 \(\varphi(p) = p - 1\),代入欧拉定理得:
扩展欧拉定理
当 \(\gcd(a, n) \neq 1\) 时,欧拉定理不直接适用。扩展欧拉定理给出:
这个公式在处理大指数降幂时非常有用——当指数 \(b\) 很大(甚至无法用 long long 存储,以字符串形式给出)时,先对 \(\varphi(n)\) 取模再加 \(\varphi(n)\),就能把指数降到可处理范围。
应用:快速幂中的指数降幂
// 当 b 很大时,先用扩展欧拉定理降幂
ll phi(ll n) {
ll res = n, tmp = n;
for (ll i = 2; i * i <= tmp; i++) {
if (tmp % i == 0) {
res = res / i * (i - 1);
while (tmp % i == 0) tmp /= i;
}
}
if (tmp > 1) res = res / tmp * (tmp - 1);
return res;
}
十、知识体系总览
| 知识点 | 核心公式 | 关键条件 |
|---|---|---|
| 同余 | \(a \equiv b \pmod{m} \Leftrightarrow m \mid (a-b)\) | \(m > 0\) |
| 消去律 | \(ac \equiv bc \Rightarrow a \equiv b \pmod{m/d}\) | \(d = \gcd(c, m)\) |
| 裴蜀定理 | \(ax + by = \gcd(a, b)\) 有解 | \(a, b\) 不全为零 |
| 扩展欧几里得 | 求 \(ax + by = \gcd(a,b)\) 的 \((x, y)\) | — |
| 乘法逆元 | \(a \cdot a^{-1} \equiv 1 \pmod{p}\) | \(\gcd(a, p) = 1\) |
| 费马小定理 | \(a^{p-1} \equiv 1 \pmod{p}\) | \(p\) 质数,\(\gcd(a,p)=1\) |
| 欧拉定理 | \(a^{\varphi(n)} \equiv 1 \pmod{n}\) | \(\gcd(a, n) = 1\) |
| 线性同余方程 | \(ax \equiv b \pmod{n}\) 有 \(d\) 个解 | \(d = \gcd(a, n) \mid b\) |
| CRT | \(x \equiv \sum a_i c_i \pmod{N}\) | 模数两两互质 |
| exCRT | 两两合并 | 模数不互质,需 \(\gcd(m_1,m_2) \mid (a_2 - a_1)\) |
学习路径
同余理论的内在逻辑链是:同余定义 → 裴蜀定理 → 扩展欧几里得 → 逆元 → 线性同余方程 → CRT / exCRT。其中扩展欧几里得算法是整条链的枢纽——逆元用它求,线性同余方程用它解,exCRT 用它合并方程。理解了扩展欧几里得,其余知识点都是它的直接应用。
易错点
- 消去律不能直接除:\(ac \equiv bc \pmod{m}\) 不能直接得到 \(a \equiv b \pmod{m}\),必须检查 \(\gcd(c, m)\)。
- 逆元的存在性:\(\gcd(a, p) \neq 1\) 时逆元不存在,调用费马小定理前确认 \(p\) 是质数。
- exCRT 中的溢出:模数乘积可能超过
long long,需用龟速乘。 - 负数取模:C++ 中负数取模结果可能为负,统一用
(x % m + m) % m保证非负。 - exCRT 合并方向:合并两个方程时,新模数是 \(\text{lcm}\) 而非乘积,两者在模数不互质时不同。
- 扩展欧拉定理的适用条件:\(b \geq \varphi(n)\) 时才能用 \(b \bmod \varphi(n) + \varphi(n)\) 降幂,\(b < \varphi(n)\) 时直接算。
部分内容由 AI 润色
原创·转载请注明出处
✦
浙公网安备 33010602011771号