使用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 time模块用法实例详解
Sep 11 Python
Eclipse中Python开发环境搭建简单教程
Mar 23 Python
python 把文件中的每一行以数组的元素放入数组中的方法
Apr 29 Python
Python实现base64编码的图片保存到本地功能示例
Jun 22 Python
numpy数组广播的机制
Jul 12 Python
python多环境切换及pyenv使用过程详解
Sep 27 Python
python numpy之np.random的随机数函数使用介绍
Oct 06 Python
python对Excel的读取的示例代码
Feb 14 Python
python 使用递归回溯完美解决八皇后的问题
Feb 26 Python
Python生成器传参数及返回值原理解析
Jul 22 Python
python实现图片九宫格分割的示例
Apr 25 Python
解决pytorch-gpu 安装失败的记录
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正则表达式替换站点关键字链接后空白的解决方法
2014/09/16 PHP
Javascript客户端将指定区域导出到Word、Excel的代码
2008/10/22 Javascript
Js类的静态方法与实例方法区分及jQuery拓展的两种方法
2016/06/03 Javascript
完美解决jQuery符号$与其他javascript 库、框架冲突的问题
2016/08/09 Javascript
原生js实现jquery函数animate()动画效果的简单实例
2016/08/21 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
2016/09/26 Javascript
jQuery Checkbox 全选 反选的简单实例
2016/11/29 Javascript
简单实现jQuery级联菜单
2017/01/09 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
2017/02/05 Javascript
使用canvas及js简单生成验证码方法
2017/04/02 Javascript
深入理解ES7的async/await的用法
2017/09/09 Javascript
微信小程序中时间戳和日期的相互转换问题
2018/07/09 Javascript
Vue中使用方法、计算属性或观察者的方法实例详解
2018/10/31 Javascript
详解vue中axios的使用与封装
2019/03/20 Javascript
浅谈Vue3.0之前你必须知道的TypeScript实战技巧
2019/09/11 Javascript
解决layui使用layui-icon出现默认图标的问题
2019/09/11 Javascript
微信小程序添加插屏广告并设置显示频率(一天一次)
2019/12/06 Javascript
python交互式图形编程实例(一)
2017/11/17 Python
django中send_mail功能实现详解
2018/02/06 Python
利用python实现微信头像加红色数字功能
2018/03/26 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
2018/11/07 Python
Pandas读取并修改excel的示例代码
2019/02/17 Python
利用Python模拟登录pastebin.com的实现方法
2019/07/12 Python
Python3 合并二叉树的实现
2019/09/30 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
2019/10/11 Python
opencv3/C++实现视频背景去除建模(BSM)
2019/12/11 Python
Python warning警告出现的原因及忽略方法
2020/01/31 Python
Python制作简易版小工具之计算天数的实现思路
2020/02/13 Python
Python MOCK SERVER moco模拟接口测试过程解析
2020/04/13 Python
印尼旅游网站:via
2017/11/12 全球购物
印度手工编织服装和家居用品商店:Fabindi
2019/10/07 全球购物
电气专业应届生求职信
2013/11/01 职场文书
上班离岗检讨书
2014/01/27 职场文书
3的组成教学反思
2014/04/30 职场文书
Vue项目打包、合并及压缩优化网页响应速度
2021/07/07 Vue.js