欧几里得gcd+扩展欧几里得exgcd模板

gcd:辗转相除

参考核心代码:

int gcd(int a,int b)
{
  if(!b) return a;
  return gcd(b,a%b);
}

exgcd:扩展欧几里得 求gcd(x,y)=ax+by;

int exgcd(int a,int b,int &x,int &y)
{
  if(!b)
  {
    x=1;
    y=0;
    return a;
  }
  int gcd=exgcd(b,a%b,x,y);
  int tmp=x;
  x=y;
  y=tmp-(a/b)*y;
  return gcd;
}
模 ay===1(mod m)即 ay=1+mk;

使其有解 代码如下:

int mod_inverse(int a,int m)
{
  int x,y;
  exgcd(a,m,x,y);
  return (m+x%m)%m;
  //由于可能x为负数,所以对m取模再+m再取模使x为正
}



你可能感兴趣的:(数论)