求最大公约数
2016-01-30 18:11
197 查看
欧几里德算法
欧几里德算法又称辗转相除法,用于计算两个整数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)
得证。
算法的实现:
最简单的方法就是应用递归算法,代码如下:
int gcd(int a,int b) {
if(b==0) return a; return gcd(b,a%b); }
代码可优化如下:
int gcd(int a,int b)
{ return b ? gcd(b,a%b) : a; }
当然你也可以用迭代形式:
int Gcd(int a, int b) { while(b != 0) { int r = b; b = a % b; a = r; } return a; }
相关文章推荐
- operation not possible due to RF-kill
- Golang 学习,第一篇:环境配置
- 在linux上手动安装最新版的redis数据库
- HDU 5596/BC 66B GTW likes gt
- 折线分割平面
- Zernike矩之边缘检测(附源码)
- Android Glide图片库优缺点及使用
- POJ 1141 Brackets Sequence 添加括号进行匹配
- 常用通信协议介绍(HTTP,UDP,TCP,HTTPS)
- (csdn高校俱乐部编程挑战)2的补码
- 输出json格式数据
- mysql ERROR 1045 (28000): Access denied for user解决方法
- 使用远程链接数据库工具无法链接到 linxu 系统上的数据库配置 1045
- unity, 如果碰撞使用2d物理,为防止颤动,需将更新position的代码写在FixedUpdate里
- 微信自定义分享获取签名
- 第八周 C++实践 分支程序设计
- HTTP Get请求
- iOS开发-申请iOS公司开发者账号
- javascript正则表达式中的一个奇葩问题 有关于参数g
- iOS动画和特效(三)MotionEffects