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

作者:PYTHON爱好者 时间:2021-03-20 07:58:51 

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,最大公约数
0
投稿

猜你喜欢

  • Mysql数据库名和表名的大小写敏感性问题

    2010-06-07 14:07:00
  • 发布网站改版时的3要3不要

    2008-12-31 18:48:00
  • Python Queue模块详细介绍及实例

    2022-03-08 11:03:58
  • asp下通过HTTP_USER_AGENT判断用户是从手机上访问,还是电脑IE上访问

    2011-02-24 11:00:00
  • Python基于Logistic回归建模计算某银行在降低贷款拖欠率的数据示例

    2023-11-27 21:26:53
  • python调用cmd复制文件代码分享

    2022-12-26 11:18:22
  • Python中WebService客户端接口调用及身份验证的问题

    2021-12-22 06:01:05
  • WEB2.0时代活动类网页我们该如何设计?

    2009-12-16 12:19:00
  • python2和python3在处理字符串上的区别详解

    2021-10-07 03:29:31
  • 栅格:灵活应变

    2008-07-22 12:22:00
  • 快速解决SQL server 2005孤立用户问题

    2009-01-04 14:02:00
  • asp动态页面生成html页面

    2008-10-24 09:03:00
  • 在ASP中使用SQL语句之1:SELECT 语句

    2007-08-11 12:18:00
  • Python实现批量下载ts文件并合并为mp4

    2022-07-15 20:24:09
  • java连接mysql数据库 java连接sql server数据库

    2023-07-16 06:56:50
  • 我的栅格系统实现

    2008-09-21 13:50:00
  • SQL语句参考及记录集对象详解

    2008-11-25 11:47:00
  • 简述Python中的进程、线程、协程

    2021-04-07 11:19:02
  • python实现员工管理系统

    2022-01-03 05:20:15
  • django 使用全局搜索功能的实例详解

    2023-01-26 05:56:56
  • asp之家 网络编程 m.aspxhome.com