Exgcd

Exgcd–扩展欧几里得算法

用来求一组(x,y)使
(1)ax+by=gcd(a,b)
我们不难发现
(2)gcd(a,b)=gcd(b,amodb)
(3)amodb=aabb

设一组(x1,y1)使得
(4)bx1+(amodb)y1=gcd(b,amodb)

由上式可得
(5)ax+by=bx1+(amodb)y1
整理可得
(6)ax+by=ay1+b(x1aby1)
会发现一组特解
(7){x=y1 y=x1aby1
x1,y1代回原方程可得
(8){x1=y2 y1=x2aby2
发现这是一个递归式

那么边界条件是什么呢?

显然当a=nb(nN+)amodb=0y=0

此时有
(9)ax+0=gcd(a,0)
因为gcd(a,0)=a

故此时我们得到一组解
(10){x=1 yR
将结果返回即可

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int x,y;
void Exgcd(int a,int b)
{
if(b==0)
{
x=1;
y=0;
return;
}
Exgcd(b,a%b);
temp=x;
x=y;
y=temp-(a\b)y;
}