形如 a x + b y = c ax+by=c ax+by=c 的方程称为二元一次不定方程。在数论中一般研究该方程的整数解。
明显原方程无整数解或有无穷多组整数解。
裴蜀定理:当且仅当 gcd ( a , b ) ∣ c \gcd(a,b)|c gcd(a,b)∣c 时,二元一次不定方程有整数解。
一方面, a x + b y ≡ 0 ≡ c ( m o d gcd ( a , b ) ) ax+by\equiv0\equiv c\pmod{\gcd(a,b)} ax+by≡0≡c(modgcd(a,b)),则 gcd ( a , b ) ∣ c \gcd(a,b)|c gcd(a,b)∣c
另一方面,由下文的扩展欧几里得算法,在 gcd ( a , b ) ∣ c \gcd(a,b)|c gcd(a,b)∣c 时可构造一组解。
当然,裴蜀定理可以用数学归纳法推广至 n n n 元一次不定方程,读者不妨自行尝试证明。
扩展欧几里得算法是解二元一次不定方程的一种算法。
不妨先得到 a x + b y = gcd ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b) 的特解。
在欧几里得算法中,我们得到了 gcd ( a , b ) = gcd ( a 0 , b 0 ) = ⋯ = gcd ( a k , 0 ) \gcd(a,b)=\gcd(a_0,b_0)=\cdots=\gcd(a_k,0) gcd(a,b)=gcd(a0,b0)=⋯=gcd(ak,0)
容易发现,迭代至 gcd ( a k , 0 ) \gcd(a_k,0) gcd(ak,0) 时,取 { x = 1 y = 0 \begin{cases}x=1\\y=0\end{cases} {x=1y=0 即可满足要求。
接下来考虑得到了 a ′ x ′ + b ′ y ′ = c a'x'+b'y'=c a′x′+b′y′=c 的特解时,怎么得到 a x + b y = c ax+by=c ax+by=c 的特解。
首先代换一下,得到 b x ′ + ( a m o d b ) y ′ = c bx'+(a\mod b)y'=c bx′+(amodb)y′=c
又因为 a m o d b = a − ⌊ a b ⌋ ⋅ b a\mod b=a-\lfloor \frac a b\rfloor\cdot b amodb=a−⌊ba⌋⋅b
所以 b x ′ + ( a − ⌊ a b ⌋ ⋅ b ) y ′ = c bx'+ (a-\lfloor \frac a b\rfloor\cdot b)y'=c bx′+(a−⌊ba⌋⋅b)y′=c
整理得 a y ′ + b ( x ′ − ⌊ a b ⌋ ⋅ y ′ ) = c ay'+b(x'-\lfloor \frac a b\rfloor\cdot y')=c ay′+b(x′−⌊ba⌋⋅y′)=c
故取 { x = y ′ y = x ′ − ⌊ a b ⌋ ⋅ y ′ \begin{cases}x=y'\\y=x'-\lfloor \frac a b\rfloor\cdot y'\end{cases} {x=y′y=x′−⌊ba⌋⋅y′ 满足要求。
如果要求 a x + b y = c ax+by=c ax+by=c,不妨先得到 a x 0 + b y 0 = gcd ( a , b ) ax_0+by_0=\gcd(a,b) ax0+by0=gcd(a,b),再取 x = c ⋅ x 0 gcd ( a , b ) , y = c ⋅ y 0 gcd ( a , b ) x=\frac{c\cdot x_0}{\gcd(a,b)},y=\frac{c\cdot y_0}{\gcd(a,b)} x=gcd(a,b)c⋅x0,y=gcd(a,b)c⋅y0 显然符合。
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,y,x);//这里已经交换了x,y
y-=a/b*x;//这里就只需要减一下了
return d;
}
a a a 在模 p p p 意义下的乘法逆元记作 a − 1 ( m o d p ) a^{-1}\pmod p a−1(modp),在不引起歧义时一般记作 a − 1 a^{-1} a−1。
a a a 模 p p p 的乘法逆元定义为 a x ≡ 1 ( m o d p ) ax\equiv1\pmod p ax≡1(modp) 的解。 即乘上乘法逆元相当于做除法。
a x ≡ 1 ( m o d p ) ax\equiv1\pmod p ax≡1(modp) 的解可化为 a x + p y = 1 ax+py=1 ax+py=1 的解,不妨使用扩展欧几里得算法求出一组特解。
当然,乘法逆元还有多种其他求法。