使用輾轉相除法求兩個數的最大公因數(python實現)


數學背景:


 

  整除的定義:

 

    任給兩個整數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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM