使用Python求解最大公约数的实现方法


Posted in Python onAugust 20, 2015

1. 欧几里德算法

欧几里德算法又称辗转相除法, 用于计算两个整数a, b的最大公约数。其计算原理依赖于下面的定理:
定理: gcd(a, b) = gcd(b, a mod 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) 和(a, a mod b)的公约数是一样的,其最大公约数也必然相等,得证。

欧几里德的Python语言描述为:

def gcd(a, b):
 if a < b:
  a, b = b, a

 while b != 0:
  temp = a % b
  a = b
  b = temp

 return a

2. Stein算法
欧几里德算法是计算两个数最大公约数的传统算法,无论是理论,还是从效率上都是很好的。但是他有一个致命的缺陷,这个缺陷只有在很大的素数时才会显现出来。
考虑现在的硬件平台,一般整数最多也就是64位, 对于这样的整数,计算两个数值就的模很简单的。对于字长为32位的平台,计算两个不超过32位的整数的模,只需要一个指令周期,而计算64位以下的整数模,也不过几个周期而已。但是对于更大的素数,这样的计算过程就不得不由用户来设计,为了计算两个超过64位的整数的模,用户也许不得不采用类似于多位除法手算过程中的试商法,这个过程不但复杂,而且消耗了很多CPU时间。对于现代密码算法,要求计算128位以上的素数的情况比比皆是,设计这样的程序迫切希望能够抛弃除法和取模。
Stein算法由J.Stein 1961年提出,这个方法也是计算两个数的最大公约数。和欧几里德算法不同的是,Stein算法只有整数的移位和加减法,这对于程序设计者是一个福音。
为了说明Stein算法的正确性,首先必须注意到以下结论:
  gcd(a, a) = a, 也就是一个数和他自己的公约数是其自身。
  gcd(ka, kb) = k * gcd(a, b),也就是最大公约数运算和倍乘运算可以交换,特殊的,当k=2时,说明两个偶数的最大公约数比如能被2整除。
Stein算法的python实现如下:

def gcd_Stein(a, b):  
  if a < b:
    a, b = b, a
  if (0 == b):
    return a
  if a % 2 == 0 and b % 2 == 0:
    return 2 * gcd_Stein(a/2, b/2)
  if a % 2 == 0:
    return gcd_Stein(a / 2, b)
  if b % 2 == 0:
    return gcd_Stein(a, b / 2)
  
  return gcd_Stein((a + b) / 2, (a - b) / 2)

3. 一般求解实现

核心代码很简单:

def gcd(a, b):
if b == 0:return a
return gcd(b, a % b)

附上一个用Python实现求最大公约数同时判断是否是素数的一般方法:
程序如下:

#!/usr/bin/env python 
 
def showMaxFactor(num): 
  count = num / 2  
  while count > 1: 
    if num % count == 0: 
      print 'largest factor of %d is %d' % (num, count) 
      break    #break跳出时会跳出下面的else语句 
    count -= 1 
  else: 
    print num, "is prime" 
 
for eachNum in range(10,21): 
  showMaxFactor(eachNum)

输出如下:

largest factor of 10 is 5
11 is prime
largest factor of 12 is 6
13 is prime
largest factor of 14 is 7
largest factor of 15 is 5
largest factor of 16 is 8
17 is prime
largest factor of 18 is 9
19 is prime
largest factor of 20 is 10
Python 相关文章推荐
Python中的Numpy入门教程
Apr 26 Python
python实现在无须过多援引的情况下创建字典的方法
Sep 25 Python
Python中动态获取对象的属性和方法的教程
Apr 09 Python
python计算对角线有理函数插值的方法
May 07 Python
Python3读取UTF-8文件及统计文件行数的方法
May 22 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
Jul 02 Python
Python3实现带附件的定时发送邮件功能
Dec 22 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
Sep 04 Python
tesserocr与pytesseract模块的使用方法解析
Aug 30 Python
Keras中的两种模型:Sequential和Model用法
Jun 27 Python
Python3如何在服务器打印资产信息
Aug 27 Python
python基础之类方法和静态方法
Oct 24 Python
使用Python3编写抓取网页和只抓网页图片的脚本
Aug 20 #Python
详解Python3中yield生成器的用法
Aug 20 #Python
Python中集合的内建函数和内建方法学习教程
Aug 19 #Python
深入解析Python中的集合类型操作符
Aug 19 #Python
Python中的集合类型知识讲解
Aug 19 #Python
深入理解Python中字典的键的使用
Aug 19 #Python
详解Python中映射类型的内建函数和工厂函数
Aug 19 #Python
You might like
PHP实现将textarea的值根据回车换行拆分至数组
2015/06/10 PHP
Yii框架连接mongodb数据库的代码
2016/07/27 PHP
php实现购物车功能(以大苹果购物网为例)
2017/03/09 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
表单项的name命名为submit、reset引起的问题
2007/12/22 Javascript
Google AJAX 搜索 API实现代码
2010/11/17 Javascript
点击按钮或链接不跳转只刷新页面的脚本整理
2013/10/22 Javascript
js定时器(执行一次、重复执行)
2014/03/07 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
2015/02/13 Javascript
详解JavaScript中shift()方法的使用
2015/06/09 Javascript
jQuery实现点击行选中或取消CheckBox的方法
2016/08/01 Javascript
Vue.js 父子组件通讯开发实例
2016/09/06 Javascript
BootStrap入门教程(三)之响应式原理
2016/09/19 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
2017/01/12 Javascript
JS三目运算(三元运算)方法详解
2017/03/01 Javascript
bootstrap实现动态进度条效果
2017/03/08 Javascript
Vue实现typeahead组件功能(非常靠谱)
2017/08/26 Javascript
详解webpack-dev-server 设置反向代理解决跨域问题
2018/04/18 Javascript
node.js到底要不要加分号浅析
2018/07/11 Javascript
[01:56]无止竞 再出发——中国军团出征2017年DOTA2国际邀请赛
2017/07/05 DOTA
Linux下将Python的Django项目部署到Apache服务器
2015/12/24 Python
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
2017/12/14 Python
Python用于学习重要算法的模块pygorithm实例浅析
2018/08/16 Python
python3.4爬虫demo
2019/01/22 Python
使用Python爬虫库requests发送表单数据和JSON数据
2020/01/25 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
2020/06/01 Python
python3处理word文档实例分析
2020/12/01 Python
scrapy-splash简单使用详解
2021/02/21 Python
Europcar澳大利亚官网:全球汽车租赁领域的领导者
2019/03/24 全球购物
冬季施工防火方案
2014/05/17 职场文书
企业宗旨标语
2014/06/10 职场文书
整顿机关作风心得体会
2014/09/10 职场文书
授权委托书怎么写
2014/09/25 职场文书
2015年副班长工作总结
2015/05/15 职场文书
音乐课《小猫钓鱼》教学反思
2016/02/18 职场文书