您的位置:首页 > 其它

扩展欧几里德算法

2010-07-26 10:51 169 查看
让我纠结了很久的扩展欧几里德算法今天终于解决了!前一阵进行数学专题时并没有弄懂,当时我还用枚举写了个求逆元的函数……凑合着当时能用。不过这个没有弄懂的扩展欧几里德还是我的心结。今天花了点儿时间看看经典的《算法导论》,通过比较欧几里得和扩展欧几里得才发现两者其实都是一种迭代的思想,通过最大公约数的不变性质,最终得到结果;

对于解决方程:

ax+by=GCD(a,b)

想将算法导论的伪代码贴上

Extended-Euclid(a,b)

1 if(b==0)

2 then return (a,1,0)

3 (d',x',y')<---Extended-Euclid(b,a%b)

4 (d,x,y)<---(d',y',x'-a/b*y')

5 return (d,x,y)

我们知道GCD(a,b)==GCD(b,a%b);这是我们进行迭代求解建立等式的最根本的条件;

对于ax+by=GCD(a,b)==GCD(b,a%b)=bx‘+(a%b)y’

求x'和y'的过程还是扩展欧几里得算法,这就形成了迭代,同欧几里得算法一样当整除时迭代便终止从而证明了正确性!

现在贴上代码

]//利用扩展欧几里德求乘法逆元
#include <iostream>
using namespace std;
int GCD(int a,int b)
{
if(b==0)
return a;
if(a%b==0)
return b;
return GCD(b,a%b);
}
int x,y;
void EXTENDED_EUCLID(int a,int b)
{
if(b==0)
{
x=1;
y=0;
return;
}
EXTENDED_EUCLID(b,a%b);
int temp=x;
x=y;
y=temp-a/b*y;
}

int main()
{
int a,b;
while(cin>>a>>b)
{
EXTENDED_EUCLID(a,b);
cout<<x<<' '<<y<<endl;
}
return 0;
}


但两个数互质时便求的是乘法逆元,在求一次同余方程组,或者应用中国剩余定理时便有用了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: