博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
欧几里得算法(辗转相除法)
阅读量:6000 次
发布时间:2019-06-20

本文共 1077 字,大约阅读时间需要 3 分钟。

欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。

 

基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)。

 

第一种证明:

      a可以表示成a = kb + r,则r = a mod b

  假设d是a,b的一个公约数,则有

  d|a, d|b,而r = a - kb,因此d|r

  因此d是(b,a mod b)的公约数

  假设d 是(b,a mod b)的公约数,则

  d | b , d |r ,但是a = kb +r

  因此d也是(a,b)的公约数

  因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证

 

第二种证明:

    要证欧几里德算法成立,即证: gcd(a,b)=gcd(b,r),其中 gcd是取最大公约数的意思,r=a mod b

    下面证 gcd(a,b)=gcd(b,r)
    设  c是a,b的最大公约数,即c=gcd(a,b),则有 a=mc,b=nc,其中m,n为正整数,且m,n互为质数
    由 r= a mod b可知,r= a- qb 其中,q是正整数,
    则 r=a-qb=mc-qnc=(m-qn)c
    b=nc,r=(m-qn)c,且n,(m-qn)互质(假设n,m-qn不互质,则n=xd, m-qn=yd 其中x,y,d都是正整数,且d>1
                                                                则a=mc=(qx+y)dc, b=xdc,这时a,b 的最大公约数变成dc,与前提矛盾,
                                                                 所以n ,m-qn一定互质)
    则gcd(b,r)=c=gcd(a,b)
    得证。

 

算法的实现:

最简单的方法就是应用递归算法,代码如下:

1 int gcd(int a,int b)2 {3     if(b==0)4         return a;5     return 6         gcd(b,a%b);7 }

 

 

代码可优化如下:

1 int gcd(int a,int b)2 {3     return b ? gcd(b,a%b) : a;4 }

 

 

当然你也可以用迭代形式:

1 int Gcd(int a, int b) 2 { 3     while(b != 0) 4     { 5       int r = b; 6       b = a % b; 7       a = r; 8     } 9     return a;10 }

 

转载于:https://www.cnblogs.com/z360/p/6360274.html

你可能感兴趣的文章
ClassTag 、Manifest、ClassManifest、TypeTag代码实战及其在Spark中的应用源码解析之Scala学习笔记-37...
查看>>
python-尝试将Excel文件保存为图片并加上水印
查看>>
IDA动态调试SO文件
查看>>
[LeetCode] Edit Distance 解题报告
查看>>
Objective-C快速上手
查看>>
7、log4j.properties
查看>>
网络通信之检测远端连接是否断开连接
查看>>
Disjoint Sets
查看>>
centos 6.8安装java环境
查看>>
各种上传拿shell
查看>>
算法名称
查看>>
整数加减法练习
查看>>
javascript
查看>>
CF709B Checkpoints 模拟
查看>>
PHP简单计算器
查看>>
[self performselector: withObject: afterDelay:];一定时间后执行某个方法
查看>>
卡巴斯基手机安全软件:让遗失手机远离“短信门”
查看>>
C++类模版学习笔记
查看>>
【LabVIEW技巧】工厂模式_简单工厂
查看>>
页面的Tab选项卡 简单实例
查看>>