数学背景:


整除的定义:

    任给两个整数a,b,其中b≠0,如果存在一个整数q使得等式

                                       a = bq

    成立,我们就说是b整除a,记做b|a.

  性质1:如果c|a,c|b,且对于任意的整数m,n,则有c|ma + nb

  证明: 利用上述定义进行证明

            因为c|a ,c|b,所以有a = c*q1,b = c*q2,

            对于任意m,n有,ma+nb = m(c*q1) + n(c*q2) = c(m*q1 + n*q2),

            因为m*q1 +n*q2为整数,很显然有 c|ma + nb .

  带余除法: 设a,b 是两个整数,其中b > 0 ,则存在两个唯一的整数q和r,使得

                              a = b*q + r,          0≤ r < b

                   成立.

  公因数和最大公因数的定义:

    设a1,a2,a3,......,an是n个不全为0的整数,若整数d是它们之中每一个数的因数,那么d就叫做a1,a2,a3,......,an的一个公因数.这时它们的公因数只有有限个,整数a1,a2,a3,......,an的公因数中最大的一个叫做最大公因数,记做(a1,a2,a3,......,an),若(a1,a2,a3,......,an)=1,我们说a1,a2,a3,......,an互素.

  定理1:设a,b,c是任意三个不全为零的整数,且 a = bq + c,其中q是整数,则(a,b) = (b,c).也就是说,a和b的最大公因数等于b和c的最大公因数.

  证明: 因为(a,b)是a和b的最大公因数,所以(a,b)|a,且(a,b)|b,由于c = a - bq,所以由性质1可以知道(a,b)|c,所以可以看到,(a,b)是b,c的一个公因数,而由公因数的定义可以知道 (b,c)是b,c的最大公因数,任何公因数都是小于最大公因数的,所以(a,b) ≤ (b,c).

    同样的道理可以证明 (b,c) ≤(a,b).

            因此有(a,b) = (b,c)

辗转相除法:给任意整数 a > 0,b >0, 由带余除法,有以下等式

                    a = b*q1 + r1,     0 < r1 < b,

                    b = r1*q2 + r2,    0 < r2 < r1,

                    r1 = r2*q3 + r3,   0 < r3 < r2,

                    ......

                    rn-2  =  rn-1*q+ rn , 0< r<rn-1

                    rn-1  = r*qn+1  + rn+1  ,rn+1 = 0

                   因为 b> r1 > r2 > r3 >....,故经过有限次带余除法以后,总可以得到一个余数为0,上面rn+1 = 0

                  由上面的定理1可以知道,(a,b) = (b,r1) = (r2,r1) = ....= (rn-2,rn-1) = (rn-1,rn) = (rn,0) = rn

                  所以要想求a,b得最大公因数,就需要不断的使用带余除法,直到余数为0,就可以得到a,b的最大公因数.

举例:


    使用辗转相除法求 288 和 158 的最大公因数

    288  = 158 * 1 + 130

    158  = 130 * 1 + 28

    130 =  28 * 4 + 18

    28 =18 * 1 + 10

    18 = 10 * 1 + 8

    10 = 8 * 1 + 2

    8 = 2 * 4

    所以(288,158) = (158,130) = (130,28) = (28,18)=(18,10)=(10,8)=(8,2)=(2,0)=2

python 实现:


递归

def gcd(a,b):
if b == 0 : return a
return gcd(b,a % b)

迭代

def gcd(a,b):
while b != 0:
a,b = b,a%b
return a

使用辗转相除法求两个数的最大公因数(python实现)的更多相关文章

  1. C实现辗转相除法求两个数的最大公约数

    什么是辗转相除法? 辗转相除法(又名欧几里德算法),它主要用于求两个正整数的最大公约数.是已知的最古老的算法. 用辗转相除法求132和72的最大公约数的步骤: 132 / 72 = 1 ... 60 ...

  2. C++中用辗转相除法求两个数的最大公约数和最小公倍数

    两个数的最大公约数:不能大于两个数中的最小值,算法口诀:小的给大的,余数给小的,整除返回小的,即最大公约数,(res=max%min)==0?  max=min,min=res return min; ...

  3. python 函数求两个数的最大公约数和最小公倍数

    1. 求最小公倍数的算法: 最小公倍数  =  两个整数的乘积 /  最大公约数 所以我们首先要求出两个整数的最大公约数, 求两个数的最大公约数思路如下: 2. 求最大公约数算法: 1. 整数A对整数 ...

  4. C语言辗转相除法求2个数的最小公约数

    辗转相除法最大的用途就是用来求两个数的最大公约数. 用(a,b)来表示a和b的最大公约数. 有定理: 已知a,b,c为正整数,若a除以b余c,则(a,b)=(b,c). (证明过程请参考其它资料) 例 ...

  5. 求两个数的最大公约数&求N个数的最大公约数

    一.求两个数的最大公约数 如何编程计算N个数的最大公约数(Greatest common divisor)呢?第一想法那便是两两计算,但是往往最简单的想法是不怎么靠谱的.下面用递归来解决.递归有一大好 ...

  6. 求两个数的最大公约数(Euclid算法)

    求两个数 p 和 q 的最大公约数(greatest common divisor,gcd),利用性质 如果 p > q, p 和 q 的最大公约数 = q 和 (p % q)的最大公约数. 证 ...

  7. 求两个数中的较大值max(a,b)。(不用if,>)

    题目:求两个数的较大值,不能使用if.>. 1.不使用if.>,还要比较大小,貌似就只能使用条件表达式: x=<表达式1>?<表达式2>:<表达式3>; ...

  8. 求两个数a、b的最大公约数

    //求两个数a.b的最大公约数 function gcd(a,b){ return b===0?a:gcd(b,a%b) }

  9. c语言实践:求两个数的最大公约数

    我的思路是这样的:比如12和16这两个数.先理解一下概念,什么叫最大公约数.就是12有很多个因数,16也有很多个因数,这两堆因数中有一些重合的因数,在这些重合的因数中找到那个最大的.那么最大公约数一定 ...

随机推荐

  1. SPOJ DQUERY D-query (在线主席树/ 离线树状数组)

    版权声明:本文为博主原创文章,未经博主允许不得转载. SPOJ DQUERY 题意: 给出一串数,询问[L,R]区间中有多少个不同的数 . 解法: 关键是查询到某个右端点时,使其左边出现过的数都记录在 ...

  2. Spring Boot 在接收上传文件时,文件过大异常处理问题

    Spring Boot 在接收上传文件时,文件过大时,或者请求过大,spring内部处理都会抛出异常,并且捕获不到. 虽然可以通过调节配置,增大 请求的限制值. 但是还是不太方便. 之所以捕获不到异常 ...

  3. Struts2使用

    Struts2是一个基于MVC设计模式的Web应用框架.在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互.Struts 2是Struts的下一代产品,是在 ...

  4. nginx allow 多个ip & ipv4的网段表示方法解析

    参考:https://www.baidu.com/link?url=5aVe_syihQzhHnSDAdLsNNQYqDe_W2GYG1GeIQ130e4mEZbusxQfqGVTdg-dJg8fqM ...

  5. ajax刷新输出实时数据

    setInterval('shuaxin()',3000); function shuaxin(){ $.ajax({//股票 url:"http://apimarkets.wallstre ...

  6. Jury Jeopardy(反向模拟)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAy8AAAI7CAIAAABqfzNeAAAgAElEQVR4nOy9e2AU1d3/f2ov07q166

  7. 这是我在word 2010上发布的第一篇文章

    1.设置word 2010,添加cnblogs帐户 配置参考链接 其中URL地址为: http://rpc.cnblogs.com/metaweblog/fariver,在cnblogs配置的最下方可 ...

  8. 洛谷 P2043质因子分解 题解

    题目传送门 N的范围很小,所以使用O(n2)的算法就能过啦! #include<bits/stdc++.h> using namespace std; ],n; int main(){ c ...

  9. appium---【Mac】Appium-Doctor提示WARN:“ opencv4nodejs cannot be found”解决方案

    报错提示: AppiumDoctor  ✖. opencv4nodejs cannot be found 如下截图: 解决方案: 第一步:安装cmake并配置环境变量 1.打开terminal执行:c ...

  10. 791. Custom Sort String

    S and T are strings composed of lowercase letters. In S, no letter occurs more than once. S was sort ...