使用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自动生成文章
Dec 25 Python
使用Python对MySQL数据操作
Apr 06 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
Jun 14 Python
Java分治归并排序算法实例详解
Dec 12 Python
在PyCharm中实现关闭一个死循环程序的方法
Nov 29 Python
Python基础知识点 初识Python.md
May 14 Python
解决python 上传图片限制格式问题
Oct 30 Python
Tensorflow实现部分参数梯度更新操作
Jan 23 Python
python 使用raw socket进行TCP SYN扫描实例
May 05 Python
Keras自定义实现带masking的meanpooling层方式
Jun 16 Python
matplotlib基础绘图命令之errorbar的使用
Aug 13 Python
Python安装Bs4的多种方法
Nov 28 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针对cookie操作的队列操作类实例
2014/12/10 PHP
php获取、检查类名、函数名、方法名的函数方法
2015/06/25 PHP
js 父窗口控制子窗口的行为-打开,关闭,重定位,回复
2010/04/20 Javascript
js截取函数(indexOf,join等)
2010/09/01 Javascript
jquery ajax提交整个表单元素的快捷办法
2013/03/27 Javascript
javascript特殊用法示例介绍
2013/11/29 Javascript
ExtJS4中的requires使用方法示例介绍
2013/12/03 Javascript
调试代码导致IE出错的避免方法
2014/04/04 Javascript
用console.table()调试javascript
2014/09/04 Javascript
JavaScript中的style.cssText使用教程
2014/11/06 Javascript
node.js中的buffer.Buffer.isEncoding方法使用说明
2014/12/14 Javascript
JavaScript操作select元素和option的实例代码
2016/01/29 Javascript
实例讲解Jquery中隐藏hide、显示show、切换toggle的用法
2016/05/13 Javascript
jQGrid Table操作列中点击【操作】按钮弹出按钮层的实现代码
2016/12/05 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
Mac下通过brew安装指定版本的nodejs教程
2018/05/17 NodeJs
详解Vue微信授权登录前后端分离较为优雅的解决方案
2018/06/29 Javascript
Vue中 key keep-alive的实现原理
2018/09/18 Javascript
JS实现的tab切换并显示相应内容模块功能示例
2019/08/03 Javascript
Vue的props父传子的示例代码
2020/05/20 Javascript
Python警察与小偷的实现之一客户端与服务端通信实例
2014/10/09 Python
python subprocess 杀掉全部派生的子进程方法
2017/01/16 Python
Python实现性能自动化测试竟然如此简单
2019/07/30 Python
python禁用键鼠与提权代码实例
2019/08/16 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
2019/11/11 Python
利用SVG和CSS3来实现一个炫酷的边框动画
2015/07/22 HTML / CSS
size?瑞典:英国伦敦的球鞋精品店
2018/03/01 全球购物
美赞臣营养马来西亚旗舰店:Enfagrow马来西亚
2019/07/26 全球购物
几道PHP的面试题
2012/05/19 面试题
财务管理专业推荐信
2013/11/19 职场文书
剪彩仪式主持词
2014/03/19 职场文书
运动会口号8字
2014/06/07 职场文书
财务会计求职信范文
2015/03/20 职场文书
2015年超市员工工作总结
2015/05/04 职场文书
python 实现德洛内三角剖分的操作
2021/04/22 Python
golang 在windows中设置环境变量的操作
2021/04/29 Golang