使用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之模块的加载
Oct 24 Python
Python聚类算法之DBSACN实例分析
Nov 20 Python
python顺序的读取文件夹下名称有序的文件方法
Jul 11 Python
在pycharm中设置显示行数的方法
Jan 16 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
Jun 18 Python
新手如何发布Python项目开源包过程详解
Jul 11 Python
python实现图片插入文字
Nov 26 Python
pytorch之ImageFolder使用详解
Jan 06 Python
django教程如何自学
Jul 31 Python
python接口自动化之ConfigParser配置文件的使用详解
Aug 03 Python
python 基于opencv操作摄像头
Dec 24 Python
只需要这一行代码就能让python计算速度提高十倍
May 24 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循环语句笔记(foreach,list)
2011/11/29 PHP
使用PHP强制下载PDF文件示例
2014/01/17 PHP
PHP URL参数获取方式的四种例子
2014/02/28 PHP
PHP实现显示照片exif信息的方法
2014/07/11 PHP
PHP 获取ip地址代码汇总
2015/07/05 PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
2019/04/16 PHP
修改jQuery Validation里默认的验证方法
2012/02/14 Javascript
javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2012/07/21 Javascript
Js,alert出现乱码问题的解决方法
2013/06/19 Javascript
JS实现关键字搜索时的相关下拉字段效果
2014/08/05 Javascript
js获取UserControl内容为拼html时提供方便
2014/11/02 Javascript
微信小程序实现图片上传、删除和预览功能的方法
2017/12/18 Javascript
vue中使用cookies和crypto-js实现记住密码和加密的方法
2018/10/18 Javascript
JS实现动态星空背景效果
2019/11/01 Javascript
[02:41]2015国际邀请赛中国区预选赛观战指南
2015/05/20 DOTA
Python MySQLdb模块连接操作mysql数据库实例
2015/04/08 Python
python实现生命游戏的示例代码(Game of Life)
2018/01/24 Python
python 删除指定时间间隔之前的文件实例
2018/04/24 Python
详解Python 装饰器执行顺序迷思
2018/08/08 Python
python Django中models进行模糊查询的示例
2019/07/18 Python
Python3标准库之threading进程中管理并发操作方法
2020/03/30 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
2020/04/14 Python
发现两个有趣的CSS3动画效果
2013/08/14 HTML / CSS
中国酒类在线零售网站:酒仙网
2016/08/20 全球购物
猫咪家具:CatsPlay
2018/11/03 全球购物
美国最好的葡萄酒网上商店:Wine Library
2019/11/02 全球购物
大学生求职中的自我评价
2013/10/01 职场文书
竞争上岗演讲稿
2014/01/05 职场文书
乡镇办公室工作决心书
2014/03/11 职场文书
党员公开承诺书和承诺事项
2014/03/25 职场文书
汽车运用工程专业求职信
2014/06/18 职场文书
党员剖析材料范文
2014/09/30 职场文书
2015年教师国培感言
2015/08/01 职场文书
解决linux下redis数据库overcommit_memory问题
2022/02/24 Redis
django项目、vue项目部署云服务器的详细过程
2022/07/23 Servers