扩展欧几里得算法
问题
给定a,b
求ax+by=gcd(a,b)的一组解
扩展欧几里得算法
通过欧几里得算法,gcd(a,b)=gcd(b,a%b)
先计算关于x′,y′的方程bx′+(a
由于a%b=a−⌊ab⌋∗b
那么将原式简化成
bx′+(a−⌊ab⌋∗b)y′=gcd(a,b)
bx′+ay′−⌊ab⌋∗b∗y′=gcd(a,b)
ay′+b(x′−⌊ab⌋∗y′)=gcd(a,b)
所以只要解出方程bx′+(a%b)y′=gcd(a,b)的解x′,y′
那么原方程的解x=y′,y=x′−⌊ab⌋∗y′
Code
int exgcd(int a, int b, int &x, int &y)//x,y表示答案
{
if (b == 0)//已经算出了gcd(a,b)
{
x = 1, y = 0;//变形为ax = a 的形式,得出答案
return a;//返回gcd(a,b)的值
}
int d = g(b, a % b, y, x);//交换x,y的位置,更方便的进行转换
y -= a / b * x;
return d;
}
答案转换
一般形式
在欧几里得算法的应用中
通常运用ax+by=c这样的方程
由于gcd(a,b)|a并且gcd(a,b)|b
所以c一定是gcd(a,b)的倍数
若不是,则无解
若ax0+by0=gcd(a,b)
那么ax0cgcd(a,b)+by0cgcd(a,b)=c
所以方程的一组解为x=x0cgcd(a,b),y=y0cgcd(a,b)
最小解
求ax+by=c方程中x的最小解
ax+by=c
ax+by+abk−abk=c
a(x−bk)+b(y+ak)=c
即(x%b+b)%b是最小解