Skip to content

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

欧几里得算法:

cpp
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)=ax+by

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

cmodgcd(a,b)=0,最后求出来的x,y都乘以cgcd(a,b)就是我们要求的答案。

cpp
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.

基于 MIT 协议发布 · 使用 VitePress 构建