使用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中的实例方法、静态方法、类方法、类变量和实例变量浅析
Apr 26 Python
pycharm中连接mysql数据库的步骤详解
May 02 Python
python实现多线程行情抓取工具的方法
Feb 28 Python
Django组件cookie与session的具体使用
Jun 05 Python
Django Rest framework三种分页方式详解
Jul 26 Python
用Python批量把文件复制到另一个文件夹的实现方法
Aug 16 Python
pytorch 可视化feature map的示例代码
Aug 20 Python
python装饰器相当于函数的调用方式
Dec 27 Python
利用Python脚本实现自动刷网课
Feb 03 Python
Python生成随机验证码代码实例解析
Jun 09 Python
python和C++共享内存传输图像的示例
Oct 27 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
Feb 07 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
备份mysql数据库的php代码(一个表一个文件)
2010/05/28 PHP
php中file_get_content 和curl以及fopen 效率分析
2014/09/19 PHP
ThinkPHP模板Volist标签嵌套循环输出多维数组的方法
2016/03/23 PHP
php禁用函数设置及查看方法详解
2016/07/25 PHP
PHP简单实现欧拉函数Euler功能示例
2017/11/06 PHP
PDO::beginTransaction讲解
2019/01/27 PHP
PHP批斗大会之缺失的异常详解
2019/07/09 PHP
脚本收藏iframe
2006/07/21 Javascript
javascript instanceof,typeof的区别
2010/03/24 Javascript
细说浏览器特性检测(2)-通用事件检测
2010/11/05 Javascript
javascript中自定义对象的属性方法分享
2013/07/12 Javascript
JavaScript获取FCK编辑器信息的具体方法
2013/07/12 Javascript
当某个文本框成为焦点时即清除文本框内容
2014/04/28 Javascript
jquery禁止回车触发表单提交
2014/12/12 Javascript
jQuery+css实现炫目的动态块漂移效果
2016/01/28 Javascript
AngularJS解决ng界面长表达式(ui-set)的方法分析
2016/11/07 Javascript
React.Js添加与删除onScroll事件的方法详解
2017/11/03 Javascript
修改npm全局安装模式的路径方法
2018/05/15 Javascript
vue-cli脚手架引入弹出层layer插件的几种方法
2019/06/24 Javascript
vue设置一开始进入的页面教程
2019/10/28 Javascript
跟老齐学Python之不要红头文件(2)
2014/09/28 Python
Python实现把xml或xsl转换为html格式
2015/04/08 Python
安装Python的web.py框架并从hello world开始编程
2015/04/25 Python
Python易忽视知识点小结
2015/05/25 Python
在tensorflow中实现屏蔽输出的log信息
2020/02/04 Python
python3操作注册表的方法(Url protocol)
2020/02/05 Python
TensorFlow加载模型时出错的解决方式
2020/02/06 Python
基于Python pyecharts实现多种图例代码解析
2020/08/10 Python
局部内部类是否可以访问非final变量?
2013/04/20 面试题
暑期实习鉴定
2013/12/16 职场文书
关于九一八事变的演讲稿2014
2014/09/17 职场文书
2015年全国科普日活动总结
2015/03/23 职场文书
2015年社区文体活动总结
2015/03/25 职场文书
2015年安全生产工作总结范文
2015/04/02 职场文书
投标单位介绍信
2015/05/05 职场文书
PyTorch dropout设置训练和测试模式的实现
2021/05/27 Python