您的位置:首页 > 其它

gcd,扩展gcd

2017-09-01 16:52 204 查看

欧几里得算法

int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}

扩展欧几里得

一个结论:ax+by的最小正整数等于gcd(a,b);

如何求出ax+by=gcd(a,b)的解呢?

例如 60x+36y = gcd(60,36)

模拟一下gcd过程

序号     a       b
  1       60     36    1*36+24
  2       36     24    1*24+12
  3       24     12    2*12+0
我们令 a = 60  b=36。
1  60=1*36+24  即 a=b+24 =》  24 = a-b
2  36=1*24+12  即 b=(a-b)+12  =》 12=2b-a
所以 2b-a=12 即x=-1,y=2是 60x+36y=gcd(60,36)的一组解。

代码
typedef __int64 ll;
void ex_gcd(ll a, ll b, ll& d, ll& x, ll &y)
{
if(!b)
{
d = a, x = 1, y = 0;
}
else
{
ex_gcd(b, a % b, d, y, x);
y -= x * (a / b);
}
}


求出x,y的一组解(x1,y1)之后,根据线性方程定理,可得任意解(x1+k*b/gcd(a,b),y1-k*a/gcd(a,b)),其中k为任意整数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: