使用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 25 Python
详解python实现识别手写MNIST数字集的程序
Aug 03 Python
Python创建字典的八种方式
Feb 27 Python
Python 给定的经纬度标注在地图上的实现方法
Jul 05 Python
利用python画出AUC曲线的实例
Feb 28 Python
关于Python turtle库使用时坐标的确定方法
Mar 19 Python
django为Form生成的label标签添加class方式
May 20 Python
tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例
Jun 22 Python
Python进行统计建模
Aug 10 Python
python线程池 ThreadPoolExecutor 的用法示例
Oct 10 Python
python实现高效的遗传算法
Apr 07 Python
python pygame入门教程
Jun 01 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脚本的10个技巧(6)
2006/10/09 PHP
php在线生成ico文件的代码
2007/10/09 PHP
Codeigniter实现发送带附件的邮件
2015/03/19 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
如何在PHP中使用数组
2020/06/09 PHP
查看图片(前进后退)功能实现js代码
2013/04/24 Javascript
解决用jquery load加载页面到div时,不执行页面js的问题
2014/02/22 Javascript
js实现类似于add(1)(2)(3)调用方式的方法
2015/03/04 Javascript
JS使用单链表统计英语单词出现次数
2016/06/16 Javascript
Node.js学习入门
2017/01/03 Javascript
D3.js中强制异步文件读取同步的几种方法
2017/02/06 Javascript
ES6入门教程之Class和Module详解
2017/05/17 Javascript
Angularjs的启动过程分析
2017/07/18 Javascript
详解React Native网络请求fetch简单封装
2017/08/10 Javascript
angular内置provider之$compileProvider详解
2017/09/27 Javascript
layui实现左侧菜单点击右侧内容区显示
2019/07/26 Javascript
vue用ant design中table表格,点击某行时触发的事件操作
2020/10/28 Javascript
vue项目实现减少app.js和vender.js的体积操作
2020/11/12 Javascript
微信小程序实现音乐播放页面布局
2020/12/11 Javascript
wxPython中文教程入门实例
2014/06/09 Python
python中的字典详细介绍
2014/09/18 Python
用PyQt进行Python图形界面的程序的开发的入门指引
2015/04/14 Python
Django Form 实时从数据库中获取数据的操作方法
2019/07/25 Python
快速查找Python安装路径方法
2020/02/06 Python
python 利用toapi库自动生成api
2020/10/19 Python
css3中用animation的steps属性制作帧动画
2019/04/25 HTML / CSS
一套C++笔试题面试题
2012/06/06 面试题
学生生病请假条范文
2014/02/16 职场文书
个人投资计划书
2014/05/01 职场文书
民事诉讼授权委托书范文
2014/08/02 职场文书
质量月活动总结
2014/08/26 职场文书
2015年度合同管理工作总结
2015/05/22 职场文书
简爱电影观后感
2015/06/10 职场文书
2016年乡镇七一建党节活动总结
2016/04/05 职场文书
检讨书范文
2019/04/16 职场文书
如何用JS实现网页瀑布流布局
2021/04/24 Javascript