求 a x + b y = d ax+by=d ax+by=d 的一组解, d = gcd ( a , b ) d = \gcd(a,b) d=gcd(a,b)。
辗转相除递归求解。
假设已经求出 b x + ( b m o d a ) y = d bx + (b \bmod a)y = d bx+(bmoda)y=d 的一组解。
a x + b y = b x ′ + ( b m o d a ) y ′ = b x ′ + ( b − b × ⌊ a b ⌋ ) y ′ = a y ′ + b ( x ′ − ⌊ a b ⌋ y ′ ) ax+by=bx'+(b\bmod a)y'\\ =bx'+(b-b \times \lfloor\frac{a}{b} \rfloor)y'\\ =ay'+b(x'- \lfloor\frac{a}{b}\rfloor y') ax+by=bx′+(bmoda)y′=bx′+(b−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 = d a = d a=d,则 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, b%a, 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 ( m o d p ) ax +py \equiv 1 \pmod p ax+py≡1(modp)。 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 = d ax + by = d ax+by=d 对一组特解后乘以 c d \frac c d dc 即可(由裴属定理得 c d \frac c d dc 为整数)。
再找出特解后,加上 a x + b y = 0 ax+by=0 ax+by=0 的解即可得到该不定方程的通解。