欧几里得/扩展欧几里得算法

欧几里得算法:

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

扩展欧几里得:

描述:设a,b不全为0,则存在整数x,y,使得:gcd(a,b)=xa+ybgcd(a,b)=x*a+y*b

现在假设,我们要求一个ax+by=cax+by=cx,yx,y的值,我们通过扩展欧几里得求出的x,yx,y是满足ax+by=gcd(a,b)ax+by=gcd(a,b)的,所以要使方程有解,还需要满足

c%gcd(a,b)==0c\%gcd(a,b)==0,最后给的出来的x,yx,y都乘以cgcd(a,b)\frac{c}{gcd(a,b)}就是我们要求的答案。

int exgcd(int a,int b,int &x,int &y)
{
  if(b==0)
  {
      x=1;
      y=0;
      return a;
  }
  int r=exgcd(b,a%b,x,y);
  int t=x;
  x=y;
  y=t-a/b*y;
  return r;
}

说明:这里的返回值指的是gcd(a,b)gcd(a,b)的值,这个值一直没有改变,同时还求出了x和y.

results matching ""

    No results matching ""