扩展欧几里得算法
2015-08-06 01:03
381 查看
对于 a 、b 不全为0,存在整数 x 和 y 使得 gcd(a,b)=x*a+y*b ; 整数。。。也就是可以使负的。
代码:
扩展欧几里得算法
首先,我们看一下他是怎么形成的。从最后一层往上推:首先b=0 时得到最大公约数 a ,return a; 现在看上一层,从r那句后继续往下运行,可以知道,此后,每次都从r 句 获得已经得到的最大公约数,然后再往下执行。。。
对于倒二层的a、b来说,b就是a、b的最大公约数,那么有 b = x1*a + y1*b ; (即 x1=0; y1=1;)
同样,对于倒三层的a、b来说,倒二层的b也是这一层a、b的最大公约数 有 b' = x2*a + y2*b ; b'=a%b; b'=x1*a'+y1*b' ; b'=x1*b+y1*(a%b) ;
---> x1*b+y1*(a%b) = x2*a+ y2*b;
----> (***) 这一步非常关键。就是化解a%b x1*b+y1*(a-a/b*b) = x2*a + y2*b (这里的除是计算机编程里的除)
-----> 合并同类项 x1*b + a* y1 - (a/b*b)*y1= x2*a+y2*b;
----> b*(x1-a/b*y1)+a*y1=x2*a+y2*b;
-----> x2=y1; y2=x1- a/b *y1; (la-la-la 终于出来了、、)
也就是说下一层的x等于上一层的y,下一层的y等于上一层的x-a/b*上一层的y,这里的a/b是这一层的。。。这里虽然拿特列:倒二倒三层解释,但由于没有涉及具体的x、y值,所以得出的公式应该是通用的。 这解释了我们代码的写法原因,同时最后一层的a本身就是公约数,b为0,所以x0=1;y0=0;
采用递归写法先到底层,然后由底层的x、y逐步上推,得到顶层的x、y,就是我们想求的x、y。。。
......
代码:
int exGcd(int a,int b,int &x,int &y) { if(b==0) { x=1; y=0; return a; } int r=exGcd(b,a%b,x,y); int t=x; x=y; y=t-a/b*y; return r; }
扩展欧几里得算法
首先,我们看一下他是怎么形成的。从最后一层往上推:首先b=0 时得到最大公约数 a ,return a; 现在看上一层,从r那句后继续往下运行,可以知道,此后,每次都从r 句 获得已经得到的最大公约数,然后再往下执行。。。
对于倒二层的a、b来说,b就是a、b的最大公约数,那么有 b = x1*a + y1*b ; (即 x1=0; y1=1;)
同样,对于倒三层的a、b来说,倒二层的b也是这一层a、b的最大公约数 有 b' = x2*a + y2*b ; b'=a%b; b'=x1*a'+y1*b' ; b'=x1*b+y1*(a%b) ;
---> x1*b+y1*(a%b) = x2*a+ y2*b;
----> (***) 这一步非常关键。就是化解a%b x1*b+y1*(a-a/b*b) = x2*a + y2*b (这里的除是计算机编程里的除)
-----> 合并同类项 x1*b + a* y1 - (a/b*b)*y1= x2*a+y2*b;
----> b*(x1-a/b*y1)+a*y1=x2*a+y2*b;
-----> x2=y1; y2=x1- a/b *y1; (la-la-la 终于出来了、、)
也就是说下一层的x等于上一层的y,下一层的y等于上一层的x-a/b*上一层的y,这里的a/b是这一层的。。。这里虽然拿特列:倒二倒三层解释,但由于没有涉及具体的x、y值,所以得出的公式应该是通用的。 这解释了我们代码的写法原因,同时最后一层的a本身就是公约数,b为0,所以x0=1;y0=0;
采用递归写法先到底层,然后由底层的x、y逐步上推,得到顶层的x、y,就是我们想求的x、y。。。
......
相关文章推荐
- 最长公共子字符串(动态规划)
- Intellij IDEA 快捷键整理
- centos curl版本nss改成openssl
- 使用jquery实现点击按钮弹出层和点击空白处隐藏层
- 从PyOpenCV到CV2
- Handler、Looper、MessageQueue(一)
- POJ 1066 Treasure Hunt(计算几何)
- 从PyOpenCV到CV2
- 聊天服务器:Ejabberd 安装与离线转发模块的实现
- QEMU代码中os_daemonize()函数的理解
- 使用Jayrock开源组件开发基于JSON-RPC协议的接口
- iOS-真机调试
- 宏 宏定义
- BestCoder Round #49 Dynamic Cactus 即 hdu5342
- 对网页渲染的初步认识
- 机器学习入门-了解相关概念
- POJ - 2001Shortest Prefixes字典树记录
- Android性能优化典范
- HDOJ 3188 Just A Triangle
- JSP文件是否有必要放在WEB-INF下