**扩展欧几里得算法**（英語：）是欧几里得算法（又叫辗转相除法）的扩展。已知整数a、b，扩展欧几里得算法可以在求得a、b的最大公约数的同时，找到整数x、y（其中一个可能是负数），使它们满足貝祖等式ax+by=\gcd(a,b)。如果a是负数，可以把问题转化成\left|a\right|(-x)+by=\gcd(|a|,b)（\left|a\right|为a的绝对值），然后令x'=(-x)。

在欧几里得算法中，我们仅利用了每步带余除法所得的余数。扩展欧几里得算法还利用了带余除法所得的商，在辗转相除的同时也能得到貝祖等式中的x、y两个系数。以扩展欧几里得算法求得的系数是满足裴蜀等式的最简系数。

另外，扩展欧几里得算法是一种自验证算法，最后一步得到的{\displaystyle s\_{i+1}}和{\displaystyle t\_{i+1}}（{\displaystyle s\_{i+1}}和{\displaystyle t\_{i+1}}的含义见下文）乘以{\displaystyle \gcd(a,b)}后恰为a和b，可以用来验证计算结果是否正确。

扩展欧几里得算法可以用来计算模反元素(也叫模逆元)，求出模反元素是RSA加密算法中获得所需公钥、私钥的必要步骤。

算法和举例
-----

在标准的欧几里得算法中，我们记欲求最大公约数的两个数为a,b，第i步带余除法得到的商为q\_i，余数为{\displaystyle r\_{i+1}}，则欧几里得算法可以写成如下形式：

{\displaystyle {\begin{aligned}r\_{0}&=a\\r\_{1}&=b\\&\,\,\,\vdots \\r\_{i+1}&=r\_{i-1}-q\_{i}r\_{i}\quad {\text{且}}\quad 0\leq r\_{i+1}<|r\_{i}|\\&\,\,\,\vdots \end{aligned}}}
当某步得到的{\displaystyle r\_{i+1}=0}时，计算结束。上一步得到的r\_{i}即为a,b的最大公约数。

扩展欧几里得算法在q\_i，r\_{i}的基础上增加了两组序列，记作s\_{i}和t\_{i}，并令{\displaystyle s\_{0}=1}，{\displaystyle s\_{1}=0}，t\_{0}=0，{\displaystyle t\_{1}=1}，在欧几里得算法每步计算{\displaystyle r\_{i+1}=r\_{i-1}-q\_{i}r\_{i}}之外额外计算{\displaystyle s\_{i+1}=s\_{i-1}-q\_{i}s\_{i}}和{\displaystyle t\_{i+1}=t\_{i-1}-q\_{i}t\_{i}}，亦即：

{\displaystyle {\begin{aligned}r\_{0}&=a&r\_{1}&=b\\s\_{0}&=1&s\_{1}&=0\\t\_{0}&=0&t\_{1}&=1\\&\,\,\,\vdots &&\,\,\,\vdots \\r\_{i+1}&=r\_{i-1}-q\_{i}r\_{i}&{\text{且}}0&\leq r\_{i+1}<|r\_{i}|\\s\_{i+1}&=s\_{i-1}-q\_{i}s\_{i}\\t\_{i+1}&=t\_{i-1}-q\_{i}t\_{i}\\&\,\,\,\vdots \end{aligned}}}
算法结束条件与欧几里得算法一致，也是{\displaystyle r\_{i+1}=0}，此时所得的s\_{i}和t\_{i}即满足等式{\displaystyle \gcd(a,b)=r\_{i}=as\_{i}+bt\_{i}}。

下表以{\displaystyle a=240}，{\displaystyle b=46}为例演示了扩展欧几里得算法。所得的最大公因数是2，所得贝祖等式为{\displaystyle \gcd(240,46)=2=-9\*240+47\*46}。同时还有自验证等式{\displaystyle |23|\*2=46}和{\displaystyle |-120|\*2=240}。

| 序号 *i* | 商 *q**i*−1  | 余数 *r**i* | *s**i*  | *t**i* |
| --- | --- | --- | --- | --- |
| 0 |  | 240 | 1 | 0 |
| 1 |  | 46 | 0 | 1 |
| 2 | 240 ÷ 46 = 5 | 240 − 5 × 46 = 10 | 1 − 5 × 0 = 1 | 0 − 5 × 1 = −5 |
| 3 | 46 ÷ 10 = 4 | 46 − 4 × 10 = 6 | 0 − 4 × 1 = −4 | 1 − 4 × −5 = 21 |
| 4 | 10 ÷ 6 = 1 | 10 − 1 × 6 = 4 | 1 − 1 × −4 = 5 | −5 − 1 × 21 = −26 |
| 5 | 6 ÷ 4 = 1 | 6 − 1 × 4 = 2 | −4 − 1 × 5 = −9 | 21 − 1 × −26 = 47 |
| 6 | 4 ÷ 2 = 2 | 4 − 2 × 2 = 0 | 5 − 2 × −9 = 23 | −26 − 2 × 47 = −120 |

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

{\displaystyle {\begin{pmatrix}240&46\\1&0\\0&1\end{pmatrix}}\rightarrow {\begin{pmatrix}10&46\\1&0\\-5&1\end{pmatrix}}\rightarrow {\begin{pmatrix}10&6\\1&-4\\-5&21\end{pmatrix}}\rightarrow {\begin{pmatrix}4&6\\5&-4\\-26&21\end{pmatrix}}\rightarrow {\begin{pmatrix}4&2\\5&-9\\-26&47\end{pmatrix}}}

得到{\displaystyle -9\times 240+47\times 46=2}

证明
--

由于{\displaystyle 0\leq r\_{i+1}<|r\_{i}|}，{\displaystyle r\_{i}}序列是一个递减序列，所以本算法可以在有限步内终止。又因为{\displaystyle r\_{i+1}=r\_{i-1}-r\_{i}q\_{i}}， {\displaystyle (r\_{i-1},r\_{i})}和{\displaystyle (r\_{i},r\_{i+1})}的最大公约数是一样的，所以最终得到的{\displaystyle r\_{k}}是a，b的最大公约数。

在欧几里得算法正确性的基础上，又对于{\displaystyle a=r\_{0}}和{\displaystyle b=r\_{1}}有等式{\displaystyle as\_{i}+bt\_{i}=r\_{i}}成立（*i* = 0 或 1）。这一关系由下列递推式对所有i>1成立：

{\displaystyle r\_{i+1}=r\_{i-1}-r\_{i}q\_{i}=(as\_{i-1}+bt\_{i-1})-(as\_{i}+bt\_{i})q\_{i}=(as\_{i-1}-as\_{i}q\_{i})+(bt\_{i-1}-bt\_{i}q\_{i})=as\_{i+1}+bt\_{i+1}}
因此s\_{i}和t\_{i}满足裴蜀等式，这就证明了扩展欧几里得算法的正确性。

实现
--

以下是扩展欧几里德算法的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.  引文使用过时参数`coauthors` (帮助)
3. ↑  張慧玲.. 太原大學教育學院學報. 2014, (1): 第103–105頁  [2016-03-02]. （原始内容存档于2022-12-14）.

參考文獻
----

* Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. *算法导论*, Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7. Pages 859–861 of section 31.2: Greatest common divisor.
* Christof Paar,Jan Pelzl著 马小婷 译. *深入浅出密码学*, 清华大学出版社, ISBN 9787302296096. Pages 151-155 6.3.2 扩展的欧几里得算法

外部連結
----

* Source for the form of the algorithm used to determine the multiplicative inverse in GF(2^8) （页面存档备份，存于）

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
数论算法 |
| --- |
|  |
| 素数测试 | 
* AKS
* APR（英语：）
* Baillie–PSW（英语：）
* 椭圆曲线（英语：）
* Pocklington（英语：）
* 费马
* 卢卡斯（英语：）
* *卢卡斯-莱默*
* *Lucas–Lehmer–Riesel（英语：）*
* *普罗斯*
* *Pépin（英语：）*
* 二次Frobenius（英语：）
* Solovay–Strassen（英语：）
* 米勒-拉宾

 |
|  |
| 質數生成（英语：） | 
* 阿特金筛法（英语：）
* 埃拉托斯特尼筛法
* Pritchard筛法（英语：）
* Sundaram筛法（英语：）
* 輪式因數分解法（英语：）

 |
|  |
| 整数分解 | 
* 連分數分解 (CFRAC)（英语：）
* Dixon's（英语：）
* Lenstra橢圓曲線 (ECM)（英语：）
* 欧拉因式分解法（英语：）
* 波拉德ρ算法（英语：）
* *p* − 1（英语：）
* *p* + 1（英语：）
* 二次篩選法
* 普通数域筛选法
* *特殊數域篩選法 (SNFS)（英语：）*
* 有理筛选法
* 费马因式分解法（英语：）
* Shanks二次形式（英语：）
* 试除法
* 秀爾演算法

 |
|  |
| 乘法算法 | 
* 古埃及乘算（英语：）
* 長乘法
* 卡拉楚巴算法
* 图姆-库克算法
* 頌哈吉-施特拉森演算法
* 富尔算法（英语：）

 |
|  |
| 歐幾里德除法除法算法 | 
* 二進制（英语：）
* 倍塊法（英语：）
* Fourier（英语：）
* Goldschmidt（英语：）
* Newton-Raphson（英语：）
* 長除法
* 短除法
* SRT

 |
|  |
| 离散对数 | 
* 大步小步算法
* 波拉德ρ算法
* Pollard kangaroo（英语：）
* Pohlig–Hellman（英语：）
* Index calculus（英语：）
* Function field sieve（英语：）

 |
|  |
| 最大公因數 | 
* 二进制最大公因数算法（英语：）
* 輾轉相除法
* 扩展欧几里得算法
* Lehmer's（英语：）

 |
|  |
| 二次剩余 | 
* Cipolla（英语：）
* Pocklington's（英语：）
* Tonelli–Shanks（英语：）
* Berlekamp（英语：）
* Kunerth（英语：）

 |
|  |
| 其他算法 | 
* Chakravala（英语：）
* Cornacchia（英语：）
* 整數關係（英语：）（LLL（英语：）；KZ（英语：））
* 平方求冪
* 整数平方根
* 模幂运算
* 蒙哥马利算法
* Schoof（英语：）
* 特拉亨伯格系統（英语：）

 |
|  |
| 
* *斜体*表示该算法只适用于特殊形式的数字

 |

 |