您的位置:首页 > 其它

欧几里德算法扩展

2017-10-11 16:59 148 查看
欧几里德算法(辗转相除法)

由计算公式gcd(a,b) = gcd(b,a%b)得到算法如下:
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

所以我们可以写出递归算法如下:


//递归方法一
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息