擴展歐幾里得算法

擴展歐幾里得算法(英語:Extended Euclidean algorithm)是歐幾里得算法(又叫輾轉相除法)的擴展。已知整數a、b,擴展歐幾里得算法可以在求得a、b的最大公因數的同時,找到整數x、y(其中一個可能是負數),使它們滿足貝祖等式[1]如果a是負數,可以把問題轉化成為a的絕對值),然後令

在歐幾里得算法中,我們僅利用了每步帶餘除法所得的餘數。擴展歐幾里得算法還利用了帶餘除法所得的商,在輾轉相除的同時也能得到貝祖等式[2]中的x、y兩個係數。以擴展歐幾里得算法求得的係數是滿足裴蜀等式的最簡係數。

另外,擴展歐幾里得算法是一種自驗證算法,最後一步得到的的含義見下文)乘以後恰為,可以用來驗證計算結果是否正確。

擴展歐幾里得算法可以用來計算模反元素(也叫模逆元),求出模反元素是RSA加密算法中獲得所需公鑰、私鑰的必要步驟。

算法和舉例

在標準的歐幾里得算法中,我們記欲求最大公因數的兩個數為 ,第 步帶餘除法得到的商為 ,餘數為 ,則歐幾里得算法可以寫成如下形式:

 

當某步得到的 時,計算結束。上一步得到的 即為 的最大公因數。

擴展歐幾里得算法在  的基礎上增加了兩組序列,記作  ,並令    ,在歐幾里得算法每步計算 之外額外計算  ,亦即:

 

算法結束條件與歐幾里得算法一致,也是 ,此時所得的  即滿足等式 

下表以  為例演示了擴展歐幾里得算法。所得的最大公因數是 ,所得貝祖等式 。同時還有自驗證等式  

序號 i qi−1 餘數 ri si ti
0 240 1 0
1 46 0 1
2 240 ÷ 46 = 5 2405 × 46 = 10 15 × 0 = 1 0 − 5 × 1 = −5
3 46 ÷ 10 = 4 464 × 10 = 6 04 × 1 = −4 1 − 4 × −5 = 21
4 10 ÷ 6 = 1 101 × 6 = 4 11 × −4 = 5 −5 − 1 × 21 = −26
5 6 ÷ 4 = 1 61 × 4 = 2 −41 × 5 = −9 21 − 1 × −26 = 47
6 4 ÷ 2 = 2 42 × 2 = 0 52 × −9 = 23 −26 − 2 × 47 = −120

這個過程也可以用初等變換表示。

 [3]

得到 

證明

由於  序列是一個遞減序列,所以本算法可以在有限步內終止。又因為   的最大公因數是一樣的,所以最終得到的   的最大公因數。

在歐幾里得算法正確性的基礎上,又對於  有等式 成立(i = 0 或 1)。這一關係由下列遞推式對所有 成立:

 

因此  滿足裴蜀等式,這就證明了擴展歐幾里得算法的正確性。

實現

以下是擴展歐幾里德算法的Python實現:

def ext_euclid(a, b):
    old_s, s = 1, 0
    old_t, t = 0, 1
    old_r, r = a, b
    if b == 0:
        return 1, 0, a
    else:
        while(r!=0):
            q = old_r // r
            old_r, r = r, old_r-q*r
            old_s, s = s, old_s-q*s
            old_t, t = t, old_t-q*t
    return old_s, old_t, old_r

擴展歐幾里得算法C++實現:

#include <bits/stdc++.h>
using namespace std;

int ext_euc(int a, int b, int &x, int &y)
{
    if (b == 0)
    {
        x = 1, y = 0;
        return a;
    }

    int d = ext_euc(b, a % b, y, x);
    y -= a / b * x;

    return d;
}

int main()
{
    int a, b, x, y;
    cin >> a >> b;

    ext_euc(a, b, x, y);
    cout << x << ' ' << y << endl;
    return 0;
}

參考資料

  1. ^ 沈淵源. 數論輕鬆遊 (PDF). [2017-09-25]. (原始內容存檔 (PDF)於2021-01-24) (中文(臺灣)). 
  2. ^ Kenneth H.Rosen; 徐六通 楊娟 吳斌 譯. 离散数学及其应用 原書第七版. 2015-01-01: 232頁. ISBN 978-7-111-45382-6. 
  3. ^ 張慧玲. 介紹多項式帶餘除法的矩陣形式及其應用. 太原大學教育學院學報. 2014, (1): 第103–105頁 [2016-03-02]. (原始內容存檔於2022-12-14). 

參考文獻

外部連結