扩展欧几里德算法
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'的过程还是扩展欧几里得算法,这就形成了迭代,同欧几里得算法一样当整除时迭代便终止从而证明了正确性!
现在贴上代码
但两个数互质时便求的是乘法逆元,在求一次同余方程组,或者应用中国剩余定理时便有用了。
对于解决方程:
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; }
但两个数互质时便求的是乘法逆元,在求一次同余方程组,或者应用中国剩余定理时便有用了。
相关文章推荐
- 扩展欧几里德算法详解
- PKU-1061 青蛙的约会 (扩展的欧几里德算法)
- 扩展欧几里德算法模版题(求逆元+分析+题目)HDU1576 A/B
- 欧几里德算法的扩展-求解不定方程
- 扩展欧几里德算法
- 扩展的欧几里德算法求乘法逆元
- 扩展欧几里德算法
- 欧几里德算法与扩展(中国剩余定理)
- 用扩展的欧几里德算法求最大公约数以及逆元
- 欧几里德算法的扩展-求解不定方程
- 扩展的欧几里德算法
- 扩展欧几里德算法
- 扩展欧几里德算法求逆元3
- 扩展欧几里德算法详解
- 扩展欧几里德算法理解(二)
- 数学(1.费马定理 2.扩展欧几里德算法 3.莫比乌斯反演)
- 扩展欧几里德算法 线性同余方程 中国剩余定理
- (扩展)欧几里德算法
- 欧几里德算法及其扩展
- 扩展欧几里德算法