gcd和egcd算法、更相減損算法

歐幾里德算法(gcd)又稱輾轉相除法,用於計算兩個整數a,b的最大公約數。

基本思路:設a=qb+r,其中a,b,q,r都是整數,則gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)。

代碼(python):

    def gcd(a,b):
        if b==0:
            return a
        else:
            return gcd(b,a%b)
擴展歐幾里得算法(egcd):

基本思路:對於不全爲 0 的非負整數 a,b,gcd(a,b)表示 a,b 的最大公約數,必然存在整數對 x,y ,使得 gcd(a,b)=ax+by。

證明:設 a>b。
  1,顯然當 b=0,gcd(a,b)=a。此時 x=1,y=0;
  2,ab!=0 時
  設 ax1+by1=gcd(a,b);
  bx2+(a mod b)y2=gcd(b,a mod b);
  根據樸素的歐幾里德原理有 gcd(a,b)=gcd(b,a mod b);
  則:ax1+by1=bx2+(a mod b)y2;
  即:ax1+by1=bx2+(a-(a/b)*b)y2=ay2+bx2-(a/b)*by2;
  根據恆等定理得:x1=y2; y1=x2-(a/b)*y2;

     這樣我們就得到了求解 x1,y1 的方法:x1,y1 的值基於 x2,y2
   上面的思想是以遞歸定義的,因爲 gcd 不斷的遞歸求解一定會有個時候 b=0,所以遞歸可以結束。

代碼(python):

def egcd(a,b):
    if b==0:
        return 1,0
    else:
        x,y=egcd(b,a%b)
        return y,x-a/b*y

要理解代碼,關鍵在於知道x,y遞歸關係的推導過程

更相減損法:
基本思路:
第一步:任意給定兩個正整數;判斷它們是否都是偶數。若是,則用2約簡;若不是則執行第二步。
第二步:以較大的數減較小的數,接着把所得的差與較小的數比較,並以大數減小數。繼續這個操作,直到所得的減數和差相等爲止。
則第一步中約掉的若干個2的積與第二步中等數的乘積就是所求的最大公約數。
其中所說的“等數”,就是公約數。求“等數”的辦法是“更相減損”法。

def gys2(a,b):    #更相減損法
    while a!=b:
        if a<b:
            a,b=b,a
        temp=a-b
        a=temp
    return a

原文鏈接:https://blog.csdn.net/qq_31798427/article/details/55798805

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章