1. 程式人生 > >用Python實現歐幾里得和廣義歐幾里得公式

用Python實現歐幾里得和廣義歐幾里得公式

題目:

  • 用廣義歐幾里得除法求兩個整數的最大公因數。
  • 用定理1.3.7求s和t使得:sa+tb = (a,b) 。
    在這裡插入圖片描述
    以上兩題要求對任意大整數給出結果。
    這裡給出python的題解。


    這個表是對定理的打表:
    這個是對定理的打表
    遞推式為:
    在這裡插入圖片描述

因此用遞推可得。
因為前三行的下標為-1,-2,所以用個n替換
n和j遵循同樣的遞推式。
因此建議直接建立一個新的遞推表,下標直接沿用成n相關,驗證同等位置是否和原來遵循相同的規律就好。
不要讓原來有時候 j-1,有時候j+1, j和行數還完全不一樣干擾自己。
把錶轉換成計算機能夠直接讀懂的模式!
把*看成0輸入到列表。
Python的list類似於C++的vector,沒定義之前不能直接使用,沒插入值之前也不能直接下標呼叫

在這裡插入圖片描述
注意:Python的整除不是/ ,而是//

原始碼是:

def gcd(big, small):
    while small:
        r = big % small
        big = small
        small = r
    return str(big)


def ex_gcd(a, b):
    s = [0, 1, 0]
    t = [0, 0, 1]
    r = [a, b]
    r.append(r[0] % r[1])
    q = [0, 0, r[0] // r[1]]

    n = 3
    while 1:
        q.
append(r[n - 2] // r[n - 1]) r.append(r[n - 2] % r[n - 1]) s.append(s[n - 2] - (q[n - 1] * s[n - 1])) t.append(t[n - 2] - (q[n - 1] * t[n - 1])) if r[n] == 0: break n = n + 1 print("s= "+str(s[n])+" t= "+str(t[n])) a = int(input("輸入第一個數a:")) b =
int(input("輸入第二個數b:")) if a > b: big = a small = b else: big = b small = a print("a,b的最大公約數為:"+gcd(big, small)) ex_gcd(big, small)