greatest common divisor(最大公约数)

1.欧几里得算法

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

其计算原理依赖于下面的定理:
两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。
最大公约数(greatest common divisor)缩写为gcd。
gcd(a,b) = gcd(b,a mod b) (不妨设a>b 且r=a mod b ,r不为0),以此辗转相除得到最终结果。
证明:
a可以表示成a = kb + r(a,b,k,r皆为正整数,且r<b),则r = a mod b
假设d是a,b的一个公约数,记作d|a,d|b,即a和b都可以被d整除。
而r = a - kb,两边同时除以d,r/d=a/d-kb/d=m,等式左边可知m为整数,因此d|r
因此d也是b,a mod b的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。
代码实现:
C++:
int gcd(int a,int b){if (a < b)std::swap(a, b);return b == 0 ? a : gcd(b, a % b);
}

Python:

函数内递归

1 def gcd(a, b):
2     if a < b:
3         a, b = b, a
4     while b != 0:
5         a,b = b,a%b
6     return a

函数递归:

1 def gcd(a, b):
2     if b == 0:
3         return a
4     return gcd(b, a % b)

2.Stein算法:

欧几里德算法是计算两个数最大公约数的传统算法,无论从理论还是从实际效率上都是很好的。但是却有一个致命的缺陷,这个缺陷在素数比较小的时候一般是感觉不到的,只有在大素数时才会显现出来。
一般实际应用中的整数很少会超过64位(当然现在已经允许128位了),对于这样的整数,计算两个数之间的模是很简单的。对于字长为32位的平台,计算两个不超过32位的整数的模,只需要一个指令周期,而计算64位以下的整数模,也不过几个周期而已。但是对于更大的素数,这样的计算过程就不得不由用户来设计,为了计算两个超过64位的整数的模,用户也许不得不采用类似于多位数除法手算过程中的试商法,这个过程不但复杂,而且消耗了很多CPU时间。对于现代密码算法,要求计算128位以上的素数的情况比比皆是,设计这样的程序迫切希望能够抛弃除法和取模。
证明:
由J. Stein 1961年提出的Stein算法很好的解决了欧几里德算法中的这个缺陷,Stein算法只有整数的移位和加减法,为了说明Stein算法的正确性,首先必须注意到以下结论:
gcd(a,a)=a,也就是一个数和其自身的公约数仍是其自身。
gcd(ka,kb)=k gcd(a,b),也就是最大公约数运算和倍乘运算可以交换。特殊地,当k=2时,说明两个偶数的最大公约数必然能被2整除。
当k与b互为质数,gcd(ka,b)=gcd(a,b),也就是约掉两个数中只有其中一个含有的因子不影响最大公约数。特殊地,当k=2时,说明计算一个偶数和一个奇数的最大公约数时,可以先将偶数除以2。
代码实现:
Python:
 1 def gcd_Stein(a, b):
 2     if a < b:
 3         a, b = b, a
 4     if (0 == b):
 5         return a
 6     if a % 2 == 0 and b % 2 == 0:
 7         return 2 * gcd_Stein(a/2, b/2)
 8     if a % 2 == 0:
 9         return gcd_Stein(a / 2, b)
10     if b % 2 == 0:
11         return gcd_Stein(a, b / 2)
12
13     return gcd_Stein((a + b) / 2, (a - b) / 2) 

转载于:https://www.cnblogs.com/Dragon5/p/6401596.html

Python 最大公约数的欧几里得算法及Stein算法相关推荐

  1. Python:三种方法计算最大公约数和最小公倍数(欧几里德法、穷举法、stein算法)

    Python:三种方法计算最大公约数和最小公倍数 1.穷举法 2.欧几里德法 3.Stein算法 题目:求取任意两个非负数(至多一个数为0)的最大公约数和最小公倍数: 参考资料:Python解决求最大 ...

  2. 最小公约数(欧几里得算法stein算法)

    求最小公约数,最容易想到的是欧几里得算法,这个算法也是比较容易理解的,效率也是很不错的.也叫做辗转相除法. 对任意两个数a,b(a>b),d=gcd(a,b),如果b不为零,那么gcd(a,b) ...

  3. 枚举算法:求两个整数m,n(m>n)最大公约数的欧几里得算法描述。

    求两个整数m,n(m>n)最大公约数的欧几里得算法描述. 思路: (1)m除以n得余数r:若r=0:则n为所求的最大公约数. (2)若r!=0,以n为m,r为n,继续(1). 流程图: 代码: ...

  4. 贫乏却最美好的三段论和神奇而不太严格的欧几里得算法-逻辑与算法之六

    贫乏却最美好的三段论和神奇而不太严格的欧几里得算法- 逻辑与算法之六 三段论是没有数字计算的推理,虽然如有些学者所言,这个来自希腊语的术语"三段论"本身就有计算的涵义.但希腊语的这 ...

  5. 用欧几里得算法求最大公约数_欧几里得算法:GCD(最大公约数),用C ++和Java示例解释...

    用欧几里得算法求最大公约数 For this topic you must know about Greatest Common Divisor (GCD) and the MOD operation ...

  6. 【最大公约数 GCD】 --- 常用四大算法(辗转相除法,穷举法,更相减损法,Stein算法)

    [最大公约数 GCD] --- 常用的四大算法 1. 辗转相除法(又名欧几里德算法) 2. 穷举法(也称枚举法) 3. 更相减损法 (又名辗转相减法) 4. Stein算法 1. 辗转相除法(又名欧几 ...

  7. 数论 --- 约数和定理公式推导、最大公约数、欧几里得算法

    试除法求约数 和<试除法判断一个数是不是质数>是一个道理 从小到大枚举所有的约数,如果当前数能整除这个数的话,说明这个数就是当前数的约数 优化,与<试除法判断质数>是一样的 如 ...

  8. 辗转相除法、更相减损法、Stein算法

    最大公约数和最小公倍数求解,常用的方法是短除法进行因式分解,然后最大公约数是所有公共因子的乘积,最小公倍数是所有因子的乘积. 本质上求最小公倍数就是求最大公倍数:x=m*a, y=m*b:m是最大公约 ...

  9. java实现rsa欧几里得算法求d_RSA算法中利用欧几里得算法求d详细过程

    文章转自新浪博客@任家 正文: RSA是第一个也是使用的最广泛的公钥加密算法,在1978年由R.Rivest.AdiShamir和Adleman三人发明, 并以他们的名字命名.RSA算法的安全性基于大 ...

  10. matlab扩展的欧几里得算法_最大公约数问题(欧几里得算法)

    讨论范围为自然数(N)范围 题目描述:求m,n的最大公约数Xmax,m > n, m,n∈N 分析: m(0) =m(input), n(0) = n(input)求 Xmax 满足 : m(i ...

最新文章

  1. 内存泄漏和内存溢出的关系和区别
  2. error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
  3. mysql数据库加载太慢_mysql千万级数据库插入速度和读取速度的调整记录
  4. 你不会想到这个购物平台竟然能智能到这种程度
  5. 2008 R2 Server core 下的常用命令
  6. 《微软的软件测试之道》读书笔记 之 结构测试技术
  7. 【ACL2021】话题感知的语义建模
  8. 当前五大浏览器内核及简史
  9. hsql mybatis 表不存在_Mybatis-plus 查询数据库表时抛异常提示数据库表不存在
  10. Autojs.pro 7.0 - 免root 连点器
  11. ArrayList类的基本使用,完成案例随机不重复点名的程序
  12. 考点图文详解 - 网络管理(第十一章)
  13. 2019中南大学考研计算机考试,2019年中南大学计算机考研经验分享(复试+真题)...
  14. 计算机专业考研的好学校排名2015,计算机类专业考研最好的学校排名
  15. VMware Workstation16设置共享文件夹
  16. SEO网站优化步骤和技巧小结
  17. U-Net实现医学图像分割(pytorch)
  18. python 删除sheet_Python操作Excel删除一个Sheet
  19. 工作岗位必备技能总结
  20. android kotlin 上传文件 上传图片

热门文章

  1. HRBEU 字符串 1003
  2. ASP.NET 控件开发速成教程:生成复合控件
  3. Solr搜索引擎——中文分词器
  4. html 中电话号码的使用
  5. C#开发之DataGridView填充数据使用小结
  6. html画圣诞树—动态效果展示【炫酷合集 免费获取源码】
  7. MinIO之C#上传文件等各项操作
  8. ASP.NET MVC 不能加载项目的解决办法
  9. 记录下Visual Studio中的快捷键
  10. Hibernate之组件映射