使用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中命名空间的查找规则LEGB
Aug 06 Python
python 实现删除文件或文件夹实例详解
Dec 04 Python
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
Nov 08 Python
python编写朴素贝叶斯用于文本分类
Dec 21 Python
Python查看微信撤回消息代码
Jun 07 Python
python用插值法绘制平滑曲线
Feb 19 Python
Python 正则表达式匹配字符串中的http链接方法
Dec 25 Python
简单了解python协程的相关知识
Aug 31 Python
Python类中的装饰器在当前类中的声明与调用详解
Apr 15 Python
python基于爬虫+django,打造个性化API接口
Jan 21 Python
Python绘制地图神器folium的新人入门指南
May 23 Python
Python使用海龟绘图实现贪吃蛇游戏
Jun 18 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
在任意字符集下正常显示网页的方法一
2007/04/01 PHP
PHP实现获取url地址中顶级域名的方法示例
2019/06/05 PHP
JQuery CSS样式控制 学习笔记
2009/07/23 Javascript
JavaScript DOM 学习第五章 表单简介
2010/02/19 Javascript
jQuery使用toggleClass方法动态添加删除Class样式的方法
2015/03/26 Javascript
javascript实现类似java中getClass()得到对象类名的方法
2015/07/27 Javascript
jquery实现点击变换导航样式的方法
2015/08/31 Javascript
jquery对复选框(checkbox)的操作汇总
2016/01/13 Javascript
JS 获取HTML标签内的子节点的方法
2016/09/21 Javascript
JavaScript创建对象_动力节点Java学院整理
2017/06/27 Javascript
Vue将页面导出为图片或者PDF
2020/08/17 Javascript
新手如何快速理解js异步编程
2019/06/24 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
2019/09/06 Javascript
Vue.js标签页组件使用方法详解
2019/10/19 Javascript
vue iview实现动态新增和删除
2020/06/17 Javascript
vue根据条件不同显示不同按钮的操作
2020/08/04 Javascript
JS实现密码框效果
2020/09/10 Javascript
解决基于 keep-alive 的后台多级路由缓存问题
2020/12/23 Javascript
Python类的基础入门知识
2008/11/24 Python
Python实现栈的方法
2015/05/26 Python
PyQt5 实现给窗口设置背景图片的方法
2019/06/13 Python
Python之修改图片像素值的方法
2019/07/03 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
2019/12/02 Python
django 装饰器 检测登录状态操作
2020/07/02 Python
mysql有关权限的表都有哪几个
2015/04/22 面试题
军训自我鉴定
2013/12/14 职场文书
优秀教师的感人事迹
2014/02/04 职场文书
高一数学教学反思
2014/02/07 职场文书
高中生学期学习自我评价
2014/02/24 职场文书
建材投资建议书
2014/05/16 职场文书
捐献物资倡议书范文
2014/05/19 职场文书
高中军训的心得体会
2014/09/01 职场文书
2015年依法行政工作总结
2015/04/29 职场文书
MySQL 使用自定义变量进行查询优化
2021/05/14 MySQL
Python使用openpyxl批量处理数据
2021/06/23 Python
海贼王十大潜力果实,路飞仅排第十,第一可毁世界(震震果实)
2022/03/18 日漫