求 a x + b y = g ax+by=g ax+by=g 的一组解,其中 g = gcd ( a , b ) g = \gcd(a,b) g=gcd(a,b)。
辗转相除递归求解。
假设已经求出 b x + ( a m o d b ) y = d bx + (a \bmod b)y = d bx+(amodb)y=d 的一组解。
a x + b y = b x ′ + ( a m o d b ) y ′ = b x ′ + ( a − b × ⌊ a b ⌋ ) y ′ = a y ′ + b ( x ′ − ⌊ a b ⌋ y ′ ) ax+by=bx'+(a\bmod b)y'\\ =bx'+(a-b \times \lfloor\frac{a}{b} \rfloor)y'\\ =ay'+b(x'- \lfloor\frac{a}{b}\rfloor y') ax+by=bx′+(amodb)y′=bx′+(a−b×⌊ba⌋)y′=ay′+b(x′−⌊ba⌋y′)
则 x = y ′ , y = x ′ − ⌊ a b ⌋ y ′ x = y', y = x' - \lfloor\frac{a}{b} \rfloor y' x=y′,y=x′−⌊ba⌋y′。递归计算即可。 b = 0 b = 0 b=0 时,由辗转相除得 a = g a = g a=g,则 x = 1 , y = 0 x=1,y=0 x=1,y=0 显然是一组解。
void exgcd(int a, int b, int &x, int &y)
{
if(b == 0) return x = 1, y = 0, void();
exgcd(b, a%b, y, x), y -= (a / b) * x;
}
求 a a a 在模 p p p 下得逆元,等价于求 a x ≡ 1 ( m o d p ) ax \equiv 1 \pmod p ax≡1(modp),等价于 a x + p y = 1 ax +py = 1 ax+py=1。 gcd ( a , p ) = 1 \gcd(a,p)=1 gcd(a,p)=1 时才有解,即 a a a 有逆元。
我们对问题加以扩展,求解 a x + b y = c ax + by = c ax+by=c。
裴属定理:方程有解当且仅当 gcd ( a , b ) ∣ c \gcd(a,b) \mid c gcd(a,b)∣c。
若方程有解,则用扩欧求出 a x + b y = g ax + by = g ax+by=g 对一组特解后乘以 c g \frac c g gc 即可(由裴属定理得 c g \frac c g gc 为整数)。
再找出特解后,加上 a x + b y = 0 ax+by=0 ax+by=0 的解即可得到该不定方程的通解。
{ x = x 0 + b g t y = y 0 − a g t ( t ∈ Z ) {x=x0+bgty=y0−agt \\(t\in \mathbb{Z}) {x=x0+gbty=y0−gat(t∈Z)
不妨令 m > n m > n m>n。
首先有 n + a x = m + b y n + ax=m + by n+ax=m+by。
等价于 a x + b y = m − n ax+by=m-n ax+by=m−n, x ≥ 0 , y ≤ 0 x\ge 0,y \le 0 x≥0,y≤0。
裴属定理判断有无解。
因 m > n m>n m>n, y ≤ 0 y \le 0 y≤0 时 x x x 一定 ≥ 0 \ge 0 ≥0,而 x ≥ 0 x \ge 0 x≥0 时 y y y 不一定 ≤ 0 \le 0 ≤0。
故扩欧找出一组特解后,利用零解找一组 y ≤ 0 y \le 0 y≤0 的解。又由题, y y y 应为最小负数。代码。
n + a x ≡ m + b x ( m o d P ) n+ax \equiv m + bx \pmod P n+ax≡m+bx(modP)
( a − b ) x ≡ m − n ( m o d P ) (a-b)x \equiv m-n \pmod P (a−b)x≡m−n(modP)
采用逆元 / 改写二元不定方程的方式,两者本质相同。