【数学】二元一次不定方程、裴蜀定理、扩展欧几里得算法与乘法逆元

二元一次不定方程

形如 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+by0c(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 ax+by=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=abab
所以 b x ′ + ( a − ⌊ a b ⌋ ⋅ b ) y ′ = c bx'+ (a-\lfloor \frac a b\rfloor\cdot b)y'=c bx+(abab)y=c
整理得 a y ′ + b ( x ′ − ⌊ a b ⌋ ⋅ y ′ ) = c ay'+b(x'-\lfloor \frac a b\rfloor\cdot y')=c ay+b(xbay)=c
故取 { x = y ′ y = x ′ − ⌊ a b ⌋ ⋅ y ′ \begin{cases}x=y'\\y=x'-\lfloor \frac a b\rfloor\cdot y'\end{cases} {x=yy=xbay 满足要求。

如果要求 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)cx0,y=gcd(a,b)cy0 显然符合。

代码

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;
}

参数

  • 时间复杂度: O ( log ⁡ ( max ⁡ ( a , b ) ) ) O(\log(\max(a,b))) O(log(max(a,b)))
  • 空间复杂度: Θ ( 1 ) \Theta(1) Θ(1)

乘法逆元

a a a 在模 p p p 意义下的乘法逆元记作 a − 1 ( m o d p ) a^{-1}\pmod p a1(modp),在不引起歧义时一般记作 a − 1 a^{-1} a1
a a a p p p 的乘法逆元定义为 a x ≡ 1 ( m o d p ) ax\equiv1\pmod p ax1(modp) 的解。 即乘上乘法逆元相当于做除法。
a x ≡ 1 ( m o d p ) ax\equiv1\pmod p ax1(modp) 的解可化为 a x + p y = 1 ax+py=1 ax+py=1 的解,不妨使用扩展欧几里得算法求出一组特解。
当然,乘法逆元还有多种其他求法。

练习

  • 洛谷P4549
  • 洛谷P3811
  • 洛谷P1082
  • 洛谷P5656

你可能感兴趣的:(数学,#,数论,c++,算法,OI,数论,数学)