- 欧几里德算法(辗转相除法)
int gcd(int a,int b)
{
if(b == 0) return a;
else return gcd(b,a%b);
}
- 欧几里德扩展
欧几里德扩展用来求方程ax+by = 1的解
首先进行第一个状态的转换:
我们知道gcd(a,b) = gcd(b,a%b)
所以有bx+a%b*y = 1
又a%b = a-(a/b)*b
代入上式,得到ay1+b(x1-(a/b)y1) = 1
两式对比,有:
x = y1
y = x1-(a/b)y1
就是说我们可以从最后一个状态推到最初的状态,而最后一个状态b == 0
所以我们可以写出递归算法如下:
首先进行第一个状态的转换:
我们知道gcd(a,b) = gcd(b,a%b)
所以有bx+a%b*y = 1
又a%b = a-(a/b)*b
代入上式,得到ay1+b(x1-(a/b)y1) = 1
两式对比,有:
x = y1
y = x1-(a/b)y1
就是说我们可以从最后一个状态推到最初的状态,而最后一个状态b == 0
所以我们可以写出递归算法如下:
//递归方法一
int extgcd(int a,int b,int &x,int &y)
{
int ans;
if(b == 0){ ans = a;x = 1;y = 0;}
else{
extgcd(b,a%b,x,y);
int temp = x;
x = y;
y = temp-(a/b)*y;
}
return ans;
}
//简化下代码,如下所示
//递归方法二
int extgcd(int a,int b,int &x,int &y)
{
int ans;
if(b == 0){ ans = a;x = 1;y = 0;}
else{ ans = extgcd(b,a%b,y,x); y -= (a/b)*x;}
return ans;
}