使用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使用PyFetion来发送短信的例子
Apr 22 Python
Python中类的初始化特殊方法
Dec 01 Python
pandas 使用apply同时处理两列数据的方法
Apr 20 Python
Python装饰器限制函数运行时间超时则退出执行
Apr 09 Python
pytorch程序异常后删除占用的显存操作
Jan 13 Python
解决tensorflow添加ptb库的问题
Feb 10 Python
Python OpenCV实现测量图片物体宽度
May 27 Python
opencv-python的RGB与BGR互转方式
Jun 02 Python
如何使用Python处理HDF格式数据及可视化问题
Jun 24 Python
如何基于pandas读取csv后合并两个股票
Sep 25 Python
Python3中PyQt5简单实现文件打开及保存
Jun 10 Python
Python 中面向接口编程
May 20 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手机号码归属地查询代码(API接口/mysql)
2012/09/04 PHP
php生成数组的使用示例 php全组合算法
2014/01/16 PHP
PHP goto语句简介和使用实例
2014/03/11 PHP
PHP的一个完美GIF等比缩放类,附带去除缩放黑背景
2014/04/01 PHP
如何利用http协议发布博客园博文评论
2015/08/03 PHP
网页javascript精华代码集
2007/01/24 Javascript
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
2010/08/13 Javascript
js去除空格的12种实用方法
2013/11/08 Javascript
浅谈javascript的分号的使用
2015/05/12 Javascript
JS实现的多张图片轮流播放幻灯片效果
2016/07/22 Javascript
简单介绍react redux的中间件的使用
2018/04/06 Javascript
vue watch普通监听和深度监听实例详解(数组和对象)
2018/08/16 Javascript
详解用vue2.x版本+adminLTE开源框架搭建后台应用模版
2019/03/15 Javascript
nodejs微信开发之接入指南
2019/03/17 NodeJs
VUE的history模式下除了index外其他路由404报错解决办法
2019/08/21 Javascript
[51:06]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS Liquid
2018/03/30 DOTA
[47:04]EG vs RNG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
python实现端口转发器的方法
2015/03/13 Python
python使用urlparse分析网址中域名的方法
2015/04/15 Python
python 读取excel文件生成sql文件实例详解
2017/05/12 Python
对python列表里的字典元素去重方法详解
2019/01/21 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
2019/06/18 Python
Django用户认证系统 User对象解析
2019/08/02 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
2019/09/04 Python
python中的Elasticsearch操作汇总
2019/10/30 Python
Tensorflow Summary用法学习笔记
2020/01/10 Python
jupyter notebook运行命令显示[*](解决办法)
2020/05/18 Python
增大python字体的方法步骤
2020/07/05 Python
CSS3实现自定义Checkbox特效实例代码
2017/04/24 HTML / CSS
智能钱包:Ekster
2019/11/21 全球购物
专科应届毕业生求职信
2014/06/04 职场文书
师德师风个人自我剖析材料
2014/09/27 职场文书
党委干部批评与自我批评发言稿
2014/09/28 职场文书
中学生自我评价范文
2015/03/03 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书
原生JS实现分页
2022/04/19 Javascript