使用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 08 Python
Python实现生成随机日期字符串的方法示例
Dec 25 Python
python实现知乎高颜值图片爬取
Aug 12 Python
Python:二维列表下标互换方式(矩阵转置)
Dec 02 Python
python如何实现单链表的反转
Feb 10 Python
pycharm通过ssh连接远程服务器教程
Feb 12 Python
tensorflow生成多个tfrecord文件实例
Feb 17 Python
基于Numba提高python运行效率过程解析
Mar 02 Python
Mac PyCharm中的.gitignore 安装设置教程
Apr 16 Python
Python如何使用PIL Image制作GIF图片
May 16 Python
django美化后台django-suit的安装配置操作
Jul 12 Python
Python从MySQL数据库中面抽取试题,生成试卷
Jan 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
PHP5.6读写excel表格文件操作示例
2019/02/26 PHP
jQuery关于导航条背景切换效果实现示例
2013/09/04 Javascript
Javascript 学习笔记之 对象篇(二) : 原型对象
2014/06/24 Javascript
javascript函数特点实例分析
2015/05/14 Javascript
JavaScript中数据结构与算法(四):串(BF)
2015/06/19 Javascript
js实现延时加载Flash的方法
2015/11/26 Javascript
Bootstrap 粘页脚效果
2016/03/28 Javascript
原生js获取元素样式的简单方法
2016/08/06 Javascript
微信小程序 页面跳转传参详解
2016/10/28 Javascript
AngularJS入门教程之过滤器用法示例
2016/11/02 Javascript
jQuery ajax请求struts action实现异步刷新
2017/04/19 jQuery
利用Ionic2 + angular4实现一个地区选择组件
2017/07/27 Javascript
vue读取本地的excel文件并显示在网页上方法示例
2019/05/29 Javascript
详细分析vue表单数据的绑定
2020/07/20 Javascript
openlayers实现地图弹窗
2020/09/25 Javascript
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
2020/10/22 Javascript
ant-design-vue 时间选择器赋值默认时间的操作
2020/10/27 Javascript
[42:22]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第一局
2016/02/27 DOTA
python实现带验证码网站的自动登陆实现代码
2015/01/12 Python
Python中的一些陷阱与技巧小结
2015/07/10 Python
Python进阶之递归函数的用法及其示例
2018/01/31 Python
python中数据爬虫requests库使用方法详解
2018/02/11 Python
基于DataFrame改变列类型的方法
2018/07/25 Python
浅谈python编译pyc工程--导包问题解决
2019/03/20 Python
python画图的函数用法以及技巧
2019/06/28 Python
css3实现的多级渐变下拉菜单导航效果代码
2015/08/31 HTML / CSS
惠普墨西哥官方商店:HP墨西哥
2016/12/01 全球购物
英国泽西岛植物:Jersey Plants Direct
2019/08/07 全球购物
工作自荐信
2013/12/11 职场文书
教师评优事迹材料
2014/01/10 职场文书
小学生打架检讨书
2014/01/26 职场文书
学校党的群众路线教育实践活动对照检查材料
2014/09/24 职场文书
发布会邀请函
2015/01/31 职场文书
英语导游欢迎词
2015/09/30 职场文书
matplotlib之pyplot模块实现添加子图subplot的使用
2021/04/25 Python
javascript之Object.assign()的痛点分析
2022/03/03 Javascript