exgcd

exgcd&逆元

简介

用于求方程形如 ax + by = gcd(a,b) 的一个特解(亦可用此解推出所有解)。

算法

递归求解,其实本质是用方程

bx + (a mod b)y = gcd(b,a mod b)

的解递推出方程

ay0 + bx0 = gcd(a,b)

的解。具体递推关系为

x0 = y, y0 = x - a/b*y

递归的边界条件为当a mod b递归至0,则必有gcd(a,b)=b,则此时方程为

bx = b

则x=1,y为任意值,不妨设它为0.

递推关系的证明很显然,直接将模的形式化为除的形式(a mod b = a - a/b*b),然后以a,b为主元变形后将a,b的系数直接相等,即可得到递推关系。

下面考虑求其它解

设已知一个解(x0,y0),欲求解(x,y),则由定义

ax0 + by0 = gcd(a,b) = ax + by

简单变形得

a(x - x0) = b(y0 - y)

由定义,必有

gcd(a,b) | a ,gcd(a,b) | b

则两边同除以gcd(a,b)得

a'(x - x0) = b'(y0 - y)

其中a'与b'互质,则必有

b' | (x - x0),a' | (y0 - y)

则两边同除以b',得

a'k = y0 - y

y = y0 - a'k

又有

b'k = x - x0

x = x0 + b'k

则其它解为(x0 + b'k , y0 - a'k)其中k可取任何整数。

下面考虑将方程中的 gcd(a,b)推广至任意整数c

即ax + by = c

首先,这个方程不一定 有解,方程有解条件为

gcd(a,b) | c

且这是一个充分必要条件。

证明如下

gcd(a,b) | a , gcd(a,b) | b

gcd(a,b) | (ax + by)

所以必有

gcd(a,b) | c

才能使方程有解且必有解。

注意到,此方程要么无解,要么有无数解。

tip:观察这个方程的形式,它也是一个直线方程,方程有解的意义便是该直线过整点。

下面考虑有解情况下解的求法,因为

gcd(a,b) | c

c = k*gcd(a,b)

然后可以先求方程

ax + by = gcd(a,b)

的解(x0,y0)

则易得原方程解为(kx0,ky0)

应用

求逆元

即求a在mod p剩余系下的逆元x

则ax = 1(mod p)

即ax - 1 = kp

ax - kp = 1

按前面方程的形式判断有解以及求解即可


exgcd
http://example.com/2018/10/18/数论/exgcd/
作者
robin2333
发布于
2018年10月18日
许可协议