Skip to content

线性同余方程

2021-08-16

INFO

若无特殊说明,本章涉及的变量皆为正整数。

简介

形如 axc(modb) 的方程称为线性同余方程。

特殊解

axc(modb)y,ax+by=c。由裴蜀定理知,当且仅当 gcd(a,b)c 时有整数解。

先用 扩展欧几里得算法 求出一组 x0,y0,使得:

ax0+by0=gcd(a,b)

两边同乘 cgcd(a,b)

acgcd(a,b)x0+bcgcd(a,b)y0=c

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

{x=cgcd(a,b)x0y=cgcd(a,b)y0

通解

x0,y0 为方程 ax+by=c 的一组解,则该方程的任意解可表示为:

{x=x0+bty=y0at

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

x=(x0modt+t)modt,t=bgcd(a,b)

模板

cpp
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;      // 最小正整数解
}