最大公约数和快速gcd
来源:互联网 发布:java语言程序代码培训 编辑:程序博客网 时间:2024/05/21 07:50
最大公约数有两种基本的求法:(1)辗转相除法(2)更相减损法,首先来证明一下:
(1)证明gcd(a,b)=gcd(b,a
假设a=k1m,b=k2m,a=sb+r
可以知道r=a−sb=(k1−sk2)m,所以m是(b,r)的公约数
如果存在n>m,使得n也是(b,r)的公约数,b=k3n,r=k4n那么a=sk3n+k4n
那么n也是(a,b)的公约数,这与m是(a,b)最大公约数矛盾。
(2)证明gcd(a,b)=gcd(a−b,b)
假设a=k1m,b=k2m,a−b=(k1−k2)m
可以知m是(a−b,b)的公约数,
如果存在n>m,使得n也是(a−b,b)的公约数,那么a=(k3+k4)n,则n也是(a,b)的最大公约数,这同样与m=gcd(a,b)矛盾
(3)那么相对于辗转相除法,显然更相减损法要慢的多
然而当我们进行高精度计算的时候(比如几千位的运算),取余操作时非常慢的。但是我们可以在更相减损的基础上加以改进,加快算法的实现,避免求余:起始所谓的快速gcd很简单,只要把a,b的奇数与偶数的性质分类讨论一下,就很容易优化。比如a,b同时为偶数,那么可以同时让a,b右移一位,同时记得将最后的结果乘2。如果一奇一偶,很容易就可以想到:2一定不是约数,所以可以将偶数右移。如果两个奇数,那么就可以相减,这样就会转换到一奇数一偶数的状态。c++的实现如下:
long long int gcd1(const long long int _a,const long long int _b){ auto a = _a, b = _b; if (a < b) return gcd1(b, a); long long int t; while (b>0){ t = a; a = b; b = t%b; } return a;}long long int gcd3(const long long int _a,const long long int _b){ auto a = _a, b = _b; if (a < b){ gcd3(b, a); } int factor = 1; int cond = 0; int s; while (a != b){ if (a < b) { long long int t = a; a = b; b = t; } cond = ((a & 1) << 1) + (b & 1); if (cond == 0) { factor <<= 1; a >>= 1; b >>= 1; }//even, even else if (cond == 1){ a >>= 1; }//a = even, b = odd else if (cond == 2){ b >>= 1; }//a = odd, b = even else { long long int t = a; a = b; b = t - b; //#a = odd, b = odd } } return a*factor;}
python实现
def gcd1(a,b): if a<b:return gcd1(b,a) while b: a,b = b,a%b return adef gcd2(a,b): if a<b:return gcd2(b,a) while a!=b: a,b = b,a-b if a< b:a,b = b,a return adef gcd3(a,b): if a<b:gcd3(b,a) factor = 0 while a!=b: if a<b: a,b = b,a cond = ((a&1)<<1)+(b&1) if cond==0:a=1;b>>=1;factor += 1#even,even elif cond==1:a,b = a>>1,b #a = even,b = odd elif cond==2:a,b = a,b>>1 #a = odd,b = even else:a,b = b,a-b #a = odd,b = odd return a*(1<<factor)
0 0
- 最大公约数和快速gcd
- 最小公倍数(LCM)和最大公约数(GCD)
- 最大公约数和最小公倍数(gcd)
- 最大公约数gcd和最小公倍数lcm
- 最大公约数(GCD)和最小公倍数(LCM)
- 最大公约数gcd
- 最大公约数GCD
- 最大公约数GCD
- GCD最大公约数
- 最大公约数GCD
- 最大公约数GCD
- 【GCD|LCM】最大公约数和最小公倍数问题 WIKIOI1012
- 最大公约数GCD和最小公约数LCM
- 数论(1):最大公约数和最小公倍数(Gcd&Lcm)
- 求最大公约数(gcd)和最小公倍数(lcm)算法
- python 中的 Fraction和GCD求最大公约数
- 欧拉算法最大公约数(gcd)&&最大子序列和
- 求两个或N个数的最大公约数(gcd)和…
- UIViewContentMode各类型效果
- VS堆栈溢出异常
- 算法基础复习-HeapSort
- Dubbo架构设计详解
- iOS 自定义UITableViewCell上添加UIButton按钮如何确定点击了哪一行,代码块实现
- 最大公约数和快速gcd
- 关于任正非和华为,这10条必看!最后一条看哭无数人。。。
- Codevs4880 位数问题 数位dp?
- iOS经典讲解之获取沙盒文件路径写入和读取简单对象
- android设置时间回拨后让闹钟重新启动
- JavaScript 数据类型
- Codeforces Round #378 (Div. 2)题解报告
- Apache Thrift-可伸缩的跨语言服务开发框架
- IOS开发-使用Storyboard进行界面跳转及传值