使用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 24 Python
Python实现测试磁盘性能的方法
Mar 12 Python
让python在hadoop上跑起来
Jan 27 Python
Ubuntu下创建虚拟独立的Python环境全过程
Feb 10 Python
解决PyCharm中光标变粗的问题
Aug 05 Python
对python字典元素的添加与修改方法详解
Jul 06 Python
Python文件读写常见用法总结
Feb 22 Python
python实现七段数码管和倒计时效果
Nov 23 Python
使用python+poco+夜神模拟器进行自动化测试实例
Apr 23 Python
Python基于数列实现购物车程序过程详解
Jun 09 Python
python 爬取华为应用市场评论
May 29 Python
如何利用python实现Simhash算法
Jun 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面向对象学习笔记之一 基础概念
2012/10/06 PHP
无需重新编译php加入ftp扩展的解决方法
2013/02/07 PHP
php中FTP函数ftp_connect、ftp_login与ftp_chmod用法
2014/11/18 PHP
php在线解压ZIP文件的方法
2014/12/30 PHP
redirect_uri参数错误的解决方法(必看)
2017/02/16 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
2020/02/27 PHP
JS模拟多线程
2007/02/07 Javascript
JS 页面自动加载函数(兼容多浏览器)
2009/05/18 Javascript
修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
2009/10/11 Javascript
javascript GUID生成器实现代码
2009/10/31 Javascript
jquery学习笔记 用jquery实现无刷新登录
2011/08/08 Javascript
extjs_02_grid显示本地数据、显示跨域数据
2014/06/23 Javascript
解决jquery版本冲突的有效方法
2014/09/02 Javascript
用jquery模仿的a的title属性的例子
2014/10/22 Javascript
JSON格式化输出
2014/11/10 Javascript
javascript无刷新评论实现方法
2015/05/13 Javascript
使用jquery动态加载Js文件和Css文件
2015/10/24 Javascript
React数据传递之组件内部通信的方法
2017/12/31 Javascript
layui前端框架之table表数据的刷新方法
2018/08/17 Javascript
微信小程序下拉框功能的实例代码
2018/11/06 Javascript
深度了解vue.js中hooks的相关知识
2019/06/14 Javascript
Vue+webpack实现懒加载过程解析
2020/02/17 Javascript
python实现文本界面网络聊天室
2018/12/12 Python
python自定义线程池控制线程数量的示例
2019/02/22 Python
Python 实例方法、类方法、静态方法的区别与作用
2019/08/14 Python
python图形开发GUI库pyqt5的基本使用方法详解
2020/02/14 Python
ALEX AND ANI:手镯,项链,耳环和更多
2017/04/20 全球购物
美国最值得信赖的宠物药房:Allivet
2019/03/23 全球购物
自我介绍演讲稿
2014/01/15 职场文书
国贸专业的职业规划书
2014/03/15 职场文书
2014全国两会心得体会
2014/03/17 职场文书
电焊工岗位工作职责
2014/07/09 职场文书
初中班干部工作总结
2015/08/10 职场文书
环保建议书作文500字
2015/09/14 职场文书
Redis字典实现、Hash键冲突及渐进式rehash详解
2021/09/04 Redis
MySQL时区造成时差问题
2022/04/13 MySQL