使用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实现爬虫下载漫画示例
Feb 16 Python
Python使用gensim计算文档相似性
Apr 10 Python
用Python将IP地址在整型和字符串之间轻松转换
Mar 22 Python
Python学习笔记之open()函数打开文件路径报错问题
Apr 28 Python
详解python算法之冒泡排序
Mar 05 Python
matplotlib实现区域颜色填充
Mar 18 Python
详解python读取image
Apr 03 Python
Python银行系统实战源码
Oct 25 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
Feb 25 Python
Python参数传递实现过程及原理详解
May 14 Python
pytorch读取图像数据转成opencv格式实例
Jun 02 Python
python编写扎金花小程序的实例代码
Feb 23 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原创论坛
2006/10/09 PHP
利用PHP和AJAX创建RSS聚合器的代码
2007/03/13 PHP
php define的第二个参数使用方法
2013/11/04 PHP
js css后面所带参数含义介绍
2013/08/18 Javascript
html dom节点操作(获取/修改/添加或删除)
2014/01/23 Javascript
JS创建类和对象的两种不同方式
2014/08/08 Javascript
javascript面向对象之共享成员属性与方法及prototype关键字用法
2015/01/13 Javascript
使用window.prompt()实现弹出用户输入的对话框
2015/04/13 Javascript
js实现商城星星评分的效果
2015/12/29 Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
2016/01/19 Javascript
jQuery 获取页面li数组并删除不在数组中的key
2016/08/02 Javascript
Bootstrap框架的学习教程详解(二)
2016/10/18 Javascript
在vue中把含有html标签转为html渲染页面的实例
2019/10/28 Javascript
9种python web 程序的部署方式小结
2014/06/30 Python
python判断给定的字符串是否是有效日期的方法
2015/05/13 Python
解决Django中多条件查询的问题
2019/07/18 Python
python数据分析工具之 matplotlib详解
2020/04/09 Python
python操作微信自动发消息的实现(微信聊天机器人)
2020/07/14 Python
python实现简单的五子棋游戏
2020/09/01 Python
解决pycharm 格式报错tabs和space不一致问题
2021/02/26 Python
Html5定位终极解决方案
2020/02/05 HTML / CSS
美国现代家具购物网站:LexMod
2019/01/09 全球购物
教育专业个人求职信
2013/12/02 职场文书
会计电算化专业毕业生推荐信
2013/12/24 职场文书
个人近期表现材料
2014/02/11 职场文书
《小熊住山洞》教学反思
2014/02/21 职场文书
《伯牙绝弦》教学反思
2014/03/02 职场文书
2014春晚主持词
2014/03/25 职场文书
林肯就职演讲稿
2014/05/19 职场文书
2014年纪检监察工作总结
2014/11/11 职场文书
2016寒假假期总结
2015/10/10 职场文书
三严三实·严以修身心得体会
2016/01/15 职场文书
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android
一篇文章带你深入了解Mysql触发器
2021/08/02 MySQL
Redis字典实现、Hash键冲突及渐进式rehash详解
2021/09/04 Redis
python脚本框架webpy的url映射详解
2021/11/20 Python