版权声明:本文是蒟蒻写出来的,神犇转载也要说一声哦! https://blog.csdn.net/AH_ljq/article/details/82393563
1 扩展欧几里德算法
1.1 gcd ( a , b ) = gcd ( b , a % b ) \gcd (a, b) = \gcd(b, a \% b) gcd(a,b)=gcd(b,a%b)
记 a = k ⋅ b + r a = k \cdot b + r a=k⋅b+r ,满足 a , b , k , r ≥ 0 , r < b a, b, k, r \ge 0, r < b a,b,k,r≥0,r<b , r = a − k ⋅ b r = a - k \cdot b r=a−k⋅b 。
设 gcd ( a , b ) = d \gcd (a,b) = d gcd(a,b)=d ,则有 ( k ⋅ b ) ∣ d , a ∣ d ⇒ r ∣ d ⇒ gcd ( a , b ) = gcd ( b , a % b ) (k \cdot b)| d , a | d \Rightarrow r|d \Rightarrow \gcd(a,b) = \gcd(b, a \%b) (k⋅b)∣d,a∣d⇒r∣d⇒gcd(a,b)=gcd(b,a%b) 。
1.2 a x + b y = c ax + by = c ax+by=c 的整数解
1.2.1 裴蜀定理
裴蜀定理: 若 a , b a,b a,b 是整数,且 gcd ( a , b ) = d \gcd(a,b)=d gcd(a,b)=d ,那么对于任意的整数 x , y x,y x,y , a x + b y ax+by ax+by 都一定是 d d d 的倍数。特别地,一定存在整数 x , y x,y x,y ,使 a x + b y = d ax+by=d ax+by=d 成立。
当 c % gcd ( a , b ) ≠ 0 c \% \gcd(a,b) \neq 0 c%gcd(a,b)̸=0 ,方程无解,否则方程有无穷多组解。
假设我们求得 x 0 , y 0 x0, y0 x0,y0 满足 a ⋅ x 0 + b ⋅ y 0 = gcd ( a , b ) ⇒ a ⋅ c ⋅ x 0 gcd ( a , b ) + b ⋅ c ⋅ y 0 gcd ( a , b ) = c a \cdot x0 + b \cdot y0 = \gcd(a,b) \Rightarrow a \cdot \frac{c \cdot x0}{\gcd(a,b)} + b \cdot \frac{c \cdot y0}{\gcd(a,b)} = c a⋅x0+b⋅y0=gcd(a,b)⇒a⋅gcd(a,b)c⋅x0+b⋅gcd(a,b)c⋅y0=c ,我们可以通过如下方法构造方程通解:
x = c ⋅ x 0 gcd ( a , b ) + b gcd ( a , b ) ⋅ k , y = c ⋅ y 0 gcd ( a , b ) − a gcd ( a , b ) ⋅ k , k ∈ Z x = \frac{c \cdot x0}{\gcd(a,b)} + \frac{b}{\gcd(a,b)} \cdot k, y = \frac{c \cdot y0}{\gcd(a,b)} - \frac{a}{\gcd(a,b)} \cdot k, k \in Z x=gcd(a,b)c⋅x0+gcd(a,b)b⋅k,y=gcd(a,b)c⋅y0−gcd(a,b)a⋅k,k∈Z
接下来我们考虑如何求得满足上述条件的 x 0 , y 0 x0, y0 x0,y0 。
1.2.1 扩展欧几里德算法
a ⋅ x 0 + b ⋅ y 0 = gcd ( a , b ) a \cdot x0 + b \cdot y0 = \gcd(a,b) a⋅x0+b⋅y0=gcd(a,b)
b ⋅ x 0 ′ + ( a − ⌊ a b ⌋ ⋅ b ) ⋅ y 0 ′ = gcd ( b , a % b ) b \cdot x0' + (a - \lfloor \frac{a}{b} \rfloor \cdot b) \cdot y0' = \gcd(b, a \% b) b⋅x0′+(a−⌊ba⌋⋅b)⋅y0′=gcd(b,a%b)
gcd ( a , b ) = gcd ( b , a % b ) \gcd(a,b) = \gcd(b, a\%b) gcd(a,b)=gcd(b,a%b)
⇒ b ⋅ x 0 ′ + a ⋅ y 0 ′ − ⌊ a b ⌋ ⋅ b ⋅ y 0 ′ = gcd ( b , a % b ) \Rightarrow b \cdot x0' + a \cdot y0' - \lfloor \frac{a}{b} \rfloor \cdot b \cdot y0' = \gcd(b, a \% b) ⇒b⋅x0′+a⋅y0′−⌊ba⌋⋅b⋅y0′=gcd(b,a%b)
⇒ b ⋅ ( x 0 ′ − ⌊ a b ⌋ ⋅ y 0 ′ ) + a ⋅ y 0 ′ = gcd ( b , a % b ) \Rightarrow b \cdot (x0' - \lfloor \frac{a}{b} \rfloor \cdot y0') + a \cdot y0' = \gcd(b, a \% b) ⇒b⋅(x0′−⌊ba⌋⋅y0′)+a⋅y0′=gcd(b