使用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实现去除下载电影和电视剧文件名中的多余字符的方法
Sep 23 Python
使用Python中的tkinter模块作图的方法
Feb 07 Python
深入解答关于Python的11道基本面试题
Apr 01 Python
Python实现的多线程同步与互斥锁功能示例
Nov 30 Python
python3实现windows下同名进程监控
Jun 21 Python
详解Python3 基本数据类型
Apr 19 Python
Python 自由定制表格的实现示例
Mar 20 Python
Python3 shelve对象持久存储原理详解
Mar 23 Python
基于Keras中Conv1D和Conv2D的区别说明
Jun 19 Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
Oct 28 Python
Python通过字典映射函数实现switch
Nov 06 Python
手把手教你用Django执行原生SQL的方法
Feb 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
php5.2的curl-bug 服务器被php进程卡死问题排查
2016/09/19 PHP
PHP使用mongoclient简单操作mongodb数据库示例
2019/02/08 PHP
javascript之函数直接量(function(){})()
2007/06/29 Javascript
javascript数组操作总结和属性、方法介绍
2014/04/05 Javascript
NodeJS学习笔记之Connect中间件模块(二)
2015/01/27 NodeJs
javascript 实现map集合
2015/04/03 Javascript
JavaScript中字符串分割函数split用法实例
2015/04/07 Javascript
jQuery插件kinMaxShow扩展效果用法实例
2015/05/04 Javascript
IE8下jQuery改变png图片透明度时出现的黑边
2015/08/30 Javascript
使用CoffeeScrip优美方式编写javascript代码
2015/10/28 Javascript
JavaScript给每一个li节点绑定点击事件的实现方法
2016/12/01 Javascript
简单易懂的天气插件(代码分享)
2017/02/04 Javascript
JS实现定时任务每隔N秒请求后台setInterval定时和ajax请求问题
2017/10/15 Javascript
详解小程序开发经验:多页面数据同步
2019/05/18 Javascript
[02:56]DOTA2英雄基础教程 巨魔战将
2013/12/10 DOTA
Python单链表简单实现代码
2016/04/27 Python
python3中dict(字典)的使用方法示例
2017/03/22 Python
详解python里使用正则表达式的分组命名方式
2017/10/24 Python
rabbitmq(中间消息代理)在python中的使用详解
2017/12/14 Python
Python编程求解二叉树中和为某一值的路径代码示例
2018/01/04 Python
python3去掉string中的标点符号方法
2019/01/22 Python
Python操作MySQL数据库的两种方式实例分析【pymysql和pandas】
2019/03/18 Python
浅谈PySpark SQL 相关知识介绍
2019/06/14 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
2019/12/26 Python
开启Django博客的RSS功能的实现方法
2020/02/17 Python
opencv之颜色过滤只留下图片中的红色区域操作
2020/06/05 Python
Django中如何用xlwt生成表格的方法步骤
2021/01/31 Python
Muziker英国:中欧最大的音乐家商店
2020/02/05 全球购物
最新党员思想汇报
2014/01/01 职场文书
大学生咖啡店创业计划书
2014/01/21 职场文书
党务公开方案
2014/05/06 职场文书
初中差生评语
2014/12/29 职场文书
2015年全国爱眼日活动方案
2015/05/05 职场文书
《雪地里的小画家》教学反思
2016/02/16 职场文书
2019年怎样才能撰写出优秀的自荐信
2019/03/25 职场文书
Java实战之课程信息管理系统的实现
2022/04/01 Java/Android