文章目录

数学 同余

同余

一、同余的定义

设整数 \(a, b, m\),若 \(m \mid (a - b)\),称 \(a\) 同余于 \(b\)\(m\),记作:

\[a \equiv b \pmod{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_0 = a,\quad r_1 = b,\quad r_{i+1} = r_{i-1} \bmod r_i \quad (i \ge 1) \]

\(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\),则:

\[r_{i+1} = r_{i-1} - q_i \cdot r_i = (x_{i-1} - q_i x_i) \cdot a + (y_{i-1} - q_i 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')\) 满足:

\[b \cdot x' + (a \bmod b) \cdot y' = \gcd(b,\ a \bmod b) = \gcd(a, b) \]

\(a \bmod b = a - \lfloor a/b \rfloor \cdot b\) 代入左端:

\[\gcd(a, b) = b \cdot x' + \bigl(a - \lfloor a/b \rfloor \cdot b\bigr) \cdot y' \]

\(a\)\(b\) 重新合并同类项:

\[\gcd(a, b) = a \cdot y' + b \cdot \bigl(x' - \lfloor a/b \rfloor \cdot y'\bigr) \]

因此令 \(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;
}

注意递归调用时 xy 的位置交换——这是上面推导 \(x = y'\) 的直接体现。

通解

\(exgcd(a, b, x_0, y_0)\) 返回 \(d = \gcd(a, b)\),则 \(ax + by = c\)\(d \mid c\))的通解为:

\[x = x_0 \cdot \frac{c}{d} + k \cdot \frac{b}{d}, \quad y = y_0 \cdot \frac{c}{d} - k \cdot \frac{a}{d}, \quad k \in \mathbb{Z} \]


五、乘法逆元

定义

如果线性同余方程 \(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}\),即:

\[a^{-1} \equiv a^{p-2} \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)\) 线性递推:

\[\text{inv}[1] = 1 \]

\[\text{inv}[i] = (p - \lfloor p/i \rfloor) \cdot \text{inv}[p \bmod i] \bmod p \]

推导:设 \(p = qi + r\)\(r = p \bmod i\)),则 \(qi + r \equiv 0 \pmod{p}\),即 \(qi \equiv -r \pmod{p}\)。两边乘以 \(i^{-1}\)\(r^{-1}\)

\[q \cdot r^{-1} \equiv -i^{-1} \pmod{p} \]

\[i^{-1} \equiv -q \cdot r^{-1} \equiv (p - q) \cdot \text{inv}[r] \pmod{p} \]

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\) 意义下):

\[x \equiv x' + k \cdot \frac{n}{d} \pmod{n}, \quad k = 0, 1, \ldots, d-1 \]

共有 \(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\) 两两互质

\[\begin{cases} x \equiv a_1 \pmod{n_1} \\ x \equiv a_2 \pmod{n_2} \\ \vdots \\ x \equiv a_k \pmod{n_k} \end{cases} \]

算法

  1. 计算所有模数的积 \(N = \prod_{i=1}^{k} n_i\)
  2. 对第 \(i\) 个方程,计算 \(m_i = N / n_i\),以及 \(m_i\) 在模 \(n_i\) 意义下的逆元 \(m_i^{-1}\)(存在性由 \(\gcd(m_i, n_i) = 1\) 保证,因为 \(n_i\) 两两互质)
  3. \(c_i = m_i \cdot m_i^{-1} \bmod N\)
  4. 方程组在模 \(N\) 意义下的唯一解为:

\[x \equiv \sum_{i=1}^{k} a_i \cdot c_i \pmod{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}\)。代入求和式:

\[x \equiv \sum_{j=1}^{k} a_j c_j \equiv a_i \cdot 1 + \sum_{j \neq i} a_j \cdot 0 \equiv a_i \pmod{n_i} \]

每个方程都被满足。

经典示例:物不知数

三三数之剩二,五五数之剩三,七七数之剩二。问物几何?

\[\begin{cases} x \equiv 2 \pmod{3} \\ x \equiv 3 \pmod{5} \\ x \equiv 2 \pmod{7} \end{cases} \]

\(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\)

\[x \equiv 2 \times 70 + 3 \times 21 + 2 \times 15 = 140 + 63 + 30 = 233 \equiv 23 \pmod{105} \]

答案为 \(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\) 不一定互质,逆元不一定存在)。扩展中国剩余定理通过两两合并方程来处理这种情况。

两方程合并

给定两个同余方程:

\[\begin{cases} x \equiv a_1 \pmod{m_1} \\ x \equiv a_2 \pmod{m_2} \end{cases} \]

\(x = m_1 p + a_1\),代入第二个方程得 \(m_1 p + a_1 \equiv a_2 \pmod{m_2}\),即:

\[m_1 p \equiv a_2 - a_1 \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\)

合并后的新方程为:

\[x \equiv m_1 p + a_1 \pmod{\text{lcm}(m_1, m_2)} \]

新模数为 \(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}\),则:

\[\varphi(n) = n \prod_{i=1}^{k} \left(1 - \frac{1}{p_i}\right) \]

欧拉定理

\(\gcd(a, n) = 1\),则:

\[a^{\varphi(n)} \equiv 1 \pmod{n} \]

费马小定理

费马小定理是欧拉定理在 \(n\) 为质数时的特例。若 \(p\) 为质数且 \(\gcd(a, p) = 1\),则 \(\varphi(p) = p - 1\),代入欧拉定理得:

\[a^{p-1} \equiv 1 \pmod{p} \]

扩展欧拉定理

\(\gcd(a, n) \neq 1\) 时,欧拉定理不直接适用。扩展欧拉定理给出:

\[a^b \equiv a^{b \bmod \varphi(n) + \varphi(n)} \pmod{n}, \quad b \geq \varphi(n) \]

这个公式在处理大指数降幂时非常有用——当指数 \(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 用它合并方程。理解了扩展欧几里得,其余知识点都是它的直接应用。

易错点

  1. 消去律不能直接除\(ac \equiv bc \pmod{m}\) 不能直接得到 \(a \equiv b \pmod{m}\),必须检查 \(\gcd(c, m)\)
  2. 逆元的存在性\(\gcd(a, p) \neq 1\) 时逆元不存在,调用费马小定理前确认 \(p\) 是质数。
  3. exCRT 中的溢出:模数乘积可能超过 long long,需用龟速乘。
  4. 负数取模:C++ 中负数取模结果可能为负,统一用 (x % m + m) % m 保证非负。
  5. exCRT 合并方向:合并两个方程时,新模数是 \(\text{lcm}\) 而非乘积,两者在模数不互质时不同。
  6. 扩展欧拉定理的适用条件\(b \geq \varphi(n)\) 时才能用 \(b \bmod \varphi(n) + \varphi(n)\) 降幂,\(b < \varphi(n)\) 时直接算。

部分内容由 AI 润色

posted @ 2026-09-10 20:16  lvwangshu  阅读(12)  评论(0)    收藏  举报