使用Python求解最大公约数的实现方法

使用Python求解最大公约数的实现方法,第1张

概述1.欧几里德算法欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:

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,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 areturn 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) 

输出如下:

@H_502_61@largest factor of 10 is 511 is primelargest factor of 12 is 613 is primelargest factor of 14 is 7largest factor of 15 is 5largest factor of 16 is 817 is primelargest factor of 18 is 919 is primelargest factor of 20 is 10

总结

以上是内存溢出为你收集整理的使用Python求解最大公约数的实现方法全部内容,希望文章能够帮你解决使用Python求解最大公约数的实现方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/1205024.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存