Eculid算法  欧几里得算法

证明:

设两数a,b(a<b).

  1. 令c=gcd(a,b) . 则 设a=mc, b=nc 。
  2. 所以 r= r =a-kb=mc-knc=(m-kn)c  。
  3. 所以 c也是r的因数 。
  4. 可以断定 m-kn 与 n 互质 。【假设m-kn=xd,n=yd (d>1),则m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)cd,b=nc=ycd,则a与b的一个公约数cd>c,故c非a与b的最大公约数,与前面结论矛盾】,因此,c也是b与r的最大公约数。
  5. 得证。

代码实现:

int gcd (int a, int b)
{
return b == ? a : gcd(b, a%b);
}

Extend_Eculid  拓展欧几里得算法

证明:

设a>b

当b=0时,a∗1+b∗0=a=gcd(a,b),此时x=1,y=0

当b!=0时,设

a∗x1+b∗y1=gcd(a,b)

b∗x2+a%b∗y2=gcd(b,a%b)

由于gcd(a,b)=gcd(b,a%b),所以有a∗x1+b∗y1=b∗x2+a%b∗y2

将a%b=a−(a/b)∗b代入,

得到 a∗x1+b∗y1=a∗y2+b∗x2−(a/b)∗b∗y2

即 x1=y2,y1=x2−(a/b)∗y2

因此可以递归的定义exgcd,同样b=0时递归结束。返回最大公约数

代码实现:

void ext_gcd(int a, int b, int &d, int &x, int &y)
{
if(!b)
{
d = a;
x = ;
y = ;
}
else
{
ext_gcd(b, a%b, d, y, x);
y -= x*(a/b);
}
}

最新文章

  1. JavaWeb-springMVC
  2. 【转】Linux下如何清除系统日志
  3. xfire框架内部基本结构解析
  4. Bootstrap 我的学习记录2 栅格系统初识
  5. 比较StringBuffer字符串内容是否相等?
  6. python 练习 13
  7. 《Linear Algebra and Its Applications》-chaper6-正交性和最小二乘法- 格拉姆-施密特方法
  8. Android 自定义View (一)
  9. mockito学习笔记
  10. Web Server PROPFIND Method internal IP Discosure
  11. 跨平台的C++应用和UI开发库 QT
  12. NYOJ-914 Youth的最大化(贪心)
  13. 黄文俊:Serverless小程序后端技术分享
  14. Netty源码—四、事件处理
  15. 让pip使用python3而不是python2
  16. C++: 模板函数定义与声明分离;
  17. 页面滚动到指定class样式位置
  18. I/O复用之select
  19. 经典矩阵快速幂之一-----poj3233(矩阵套矩阵
  20. i=i+1,i+=1,i++哪个执行效率最高?为什么?

热门文章

  1. 轻松进行iPad Safari设置
  2. Hibernate5.2之一对一主键关联(四)
  3. emacs不能使用中文输入法
  4. 每天一个 Linux 命令(20):find命令之exec
  5. 别人整理的DP大全(转)
  6. 数据结构与算法(1)支线任务3——Largest Rectangle in Histogram
  7. 使用delphi+intraweb进行微信开发4—微信消息加解密
  8. QBC
  9. delphi.位操作
  10. openlayers优化项