Skip to content

Latest commit

 

History

History
41 lines (33 loc) · 862 Bytes

欧几里得算法.md

File metadata and controls

41 lines (33 loc) · 862 Bytes

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

欧几里得算法:

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+yb$$

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

$$c%gcd(a,b)==0$$,最后给的出来的$$x,y$$都乘以$$\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)$$的值,这个值一直没有改变,同时还求出了x和y.