您的位置:首页 > 其它

扩展欧几里得算法

2017-05-02 10:58 295 查看
扩展欧几里得算法

算法分析:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示
a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。


递归代码

long long extgcd(long long a, long long b, long long &x, long long &y)
{
long long d, t;
if (b == 0) { x = 1; y = 0; return a; }
d = extgcd(b, a % b, x, y);
t = x - a / b * y; x = y; y = t;
return d;
}
非递归代码

//非递归代码
int exgcd(int m,int n,int &x,int &y)
{
int x1,y1,x0,y0;
x0=1; y0=0;
x1=0; y1=1;
x=0; y=1;
int r=m%n;
int q=(m-r)/n;
while(r)
{
x=x0-q*x1; y=y0-q*y1;
x0=x1; y0=y1;
x1=x; y1=y;
m=n; n=r; r=m%n;
q=(m-r)/n;
}
return n;
}


返回的值为a,b的最大公约数;
经历extgcd函数X值变为最小解这个解可能为负
可将X的负解变成正解x=x+b/d;y=y-a/r; 直到变成正


应用
扩展欧几里德算法的应用主要有以下三方面:
(1)求解不定方程;
(2)求解模线性方程(线性同余方程);
(3)求解模的逆元;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  扩展 gcd 算法