线性同余方程

注意:若无特殊说明,本章涉及的变量皆为正整数.

简介 #

形如 $ax≡c\pmod{b}$ 的方程称为线性同余方程.

特殊解 #

$ax≡c\pmod{b}\eq ax+by=c$. 由 裴蜀定理 可知,当且仅当 $gcd(a,b)\mid c$ 时有整数解.

先用 扩展欧几里得算法 求出一组 $x_0,y_0$,使得:

$$ax_0+by_0=gcd(a,b)$$

两边同时乘 $\frac{c}{gcd(a,b)}$:

$$a\frac{c}{gcd(a,b)}x_0+b\frac{c}{gcd(a,b)}y_0=c$$

于是找到方程 $ax+by=c$ 的一组特殊解:

$$\left\{\begin{aligned} x=\frac{c}{gcd(a,b)}x_0\\ y=\frac{c}{gcd(a,b)}y_0 \end{aligned}\right.$$

通解 #

若 $x_0,y_0$ 为方程 $ax+by=c$ 的一组解,则该方程的任意解可表示为:

$$\left\{\begin{aligned} x=x_0+bt\\ y=y_0-at \end{aligned}\right.$$

在实际问题中,往往只需要最小正整数解:

$$x=(x_0 \bmod t+t) \bmod t, \ t=\frac{b}{gcd(a,b)}$$

模板 #

int exGcd(int a, int b, int& x, int& y) {
    if (b == 0) { x = 1, y = 0; return a; }
    int d = exGcd(b, a % b, x, y);
    int t = x; x = y, y = t - a / b * y;
    return d;
}

int liEu(int a, int b, int c) { // ax ≡ c (mod b)
    int x, y, d = exGcd(a, b, x, y);
    if (c % d != 0) return -1;          // 没有整数解
    return x * (c / d);                 // 特殊解
    // int t = b / d;
    // return x = (x % t + t) % t;      // 最小正整数解
}