使用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可变参数函数用法实例
Jul 07 Python
python+pygame简单画板实现代码实例
Dec 13 Python
Python之循环结构
Jan 15 Python
分析经典Python开发工程师面试题
Apr 08 Python
python networkx 根据图的权重画图实现
Jul 10 Python
Python 分享10个PyCharm技巧
Jul 13 Python
python 实现手机自动拨打电话的方法(通话压力测试)
Aug 08 Python
pytorch中的自定义反向传播,求导实例
Jan 06 Python
Python使用os.listdir和os.walk获取文件路径
May 21 Python
关于tensorflow softmax函数用法解析
Jun 30 Python
Python做图像处理及视频音频文件分离和合成功能
Nov 24 Python
MATLAB 全景图切割及盒图显示的实现步骤
May 14 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不写闭合标签的好处
2014/03/04 PHP
使用Discuz关键词服务器实现PHP中文分词
2014/03/11 PHP
PHP使用feof()函数读文件的方法
2014/11/07 PHP
php天翼开放平台短信发送接口实现方法
2014/12/22 PHP
php绘制一条直线的方法
2015/01/24 PHP
laravel框架数据库配置及操作数据库示例
2019/10/10 PHP
windows系统php环境安装swoole具体步骤
2021/03/04 PHP
js的event详解。
2006/09/06 Javascript
为JavaScript添加重载函数的辅助方法
2010/07/04 Javascript
jQuery的deferred对象使用详解
2011/08/20 Javascript
jquery ajax同步异步的执行最终解决方案
2013/04/26 Javascript
js判断屏幕分辨率的代码
2013/07/16 Javascript
js使用ajax读博客rss示例
2014/05/06 Javascript
js图片模糊切换显示特效的方法
2015/02/17 Javascript
setTimeout内不支持jquery的选择器的解决方案
2015/04/28 Javascript
javascript实现简单查找与替换的方法
2015/07/22 Javascript
有关文件上传 非ajax提交 得到后台数据问题
2016/10/12 Javascript
Node.js使用Express.Router的方法
2017/11/14 Javascript
js如何找出字符串中的最长回文串
2018/06/04 Javascript
JavaScript中.min.js和.js文件的区别讲解
2019/02/13 Javascript
jQuery中DOM操作原则实例分析
2019/08/01 jQuery
Vue3 中的数据侦测的实现
2019/10/09 Javascript
[42:32]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.27
2020/12/01 DOTA
Python中List.index()方法的使用教程
2015/05/20 Python
Windows平台Python连接sqlite3数据库的方法分析
2017/07/12 Python
python实现汉诺塔算法
2021/03/01 Python
使用PyCharm进行远程开发和调试的实现
2019/11/04 Python
python程序文件扩展名知识点详解
2020/02/27 Python
Html5移动端网页端适配(js+rem)
2021/02/03 HTML / CSS
美国在线鲜花速递:ProFlowers
2017/01/05 全球购物
C语言笔试题回忆
2015/04/02 面试题
给排水工程师岗位职责
2013/11/21 职场文书
厂区绿化方案
2014/05/08 职场文书
个人借款协议书范本
2014/11/17 职场文书
2014年机关党委工作总结
2014/12/11 职场文书
工作岗位职责范本
2015/02/15 职场文书