学exgcd的时候没好好听课,几乎每次遇到都忘记。
于是打算写篇博客。
扩展欧几里得算法,就是欧几里得算法的扩展。
欧几里得算法,就是 gcd,共产党 ,用来求最大公约数的。
还是一样,首先搞明白他是干啥的。
我们有一个等式, a , b a, b a,b 为常数:
a x + b y = gcd ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b)
求这个等式的一组可行整数解。
由于我们知道, gcd ( a , 0 ) = a \gcd(a, 0) = a gcd(a,0)=a(不要问我为什么,因为 gcd ( a , 0 ) \gcd(a, 0) gcd(a,0) 就等于 a a a)
所以当 b = 0 b = 0 b=0 时,有 a x = a ax=a ax=a,显然 x = 1 x = 1 x=1。
由于可以随便取一组可行解,为了让之后的计算简便,我们让 y = 0 y = 0 y=0。
我们知道 gcd ( a , b ) = gcd ( b , a m o d b ) \gcd(a, b) = \gcd(b,a\bmod b) gcd(a,b)=gcd(b,amodb)
所以
a x + b y = gcd ( a , b ) = gcd ( b , a m o d b ) = b x 0 + ( a m o d b ) y 0 = b x 0 + ( a − ⌊ a b ⌋ × b ) y 0 = b x 0 + a y 0 − ⌊ a b ⌋ × b y 0 = a y 0 + b ( x 0 − ⌊ a b ⌋ × y 0 ) \begin{aligned}ax+by & =\gcd(a, b) \\ & = \gcd(b, a\bmod b)\\& = bx_0+(a\bmod b)y_0\\ & =bx_0+(a -\left\lfloor\frac{a}{b}\right\rfloor\times b)y_0\\ &=bx_0 + ay_0 -\left\lfloor\frac{a}{b}\right\rfloor\times by_0\\&=ay_0+b(x_0-\left\lfloor\frac{a}{b}\right\rfloor\times y_0)\end{aligned} ax+by=gcd(a,b)=gcd(b,amodb)=bx0+(amodb)y0=bx0+(a−⌊ba⌋×b)y0=bx0+ay0−⌊ba⌋×by0=ay0+b(x0−⌊ba⌋×y0)
这样我们可以得到:
x = y 0 , y = x 0 − ⌊ a b ⌋ × y 0 x=y_0,y~=x_0-\left\lfloor\frac{a}{b}\right\rfloor\times y_0 x=y0,y =x0−⌊ba⌋×y0
根据这个,我们可以从 b = 0 b = 0 b=0 的时候的解反过来推出任意 a x + b y = gcd ( x , y ) ax + by = \gcd(x,y) ax+by=gcd(x,y) 的解
具体操作可以用普通 gcd \gcd gcd 的函数,通过回溯的方法求解。