---
title: Extended GCD Algorithm
tags: crypto
lang: zh_tw
---
* [筆記總覽](https://hackmd.io/@LJP/rkerFdnqS)
[TOC]
# Extended GCD Algorithm
給此演算法 a, b 可以快速找到整數 x, y 符合下列式子
- $ax + by = gcd(a, b)$
運用輾轉相除法
$\begin{split}
&gcd(a,b) \\
&=gcd(b, r_1)\ \mathrm{// a = k_1b+r_1}\\
&=gcd(r_1, r_2)\ \mathrm{// b = k_2r_1+r_2}\\
&=gcd(r_2, r_3)\ \mathrm{// r_1 = k_3r_2+r_3}\\
&...\\
&=gcd(r_{n-3}, r_{n-2})\ \mathrm{// r_{n-4} = k_{n-2}r_{n-3}+r_{n-2}}\\
&=gcd(r_{n-2}, r_{n-1})\ \mathrm{// r_{n-3} = k_{n-1}r_{n-2}+r_{n-1}}\\
&=gcd(r_{n-1}, r_n)\ \mathrm{// r_{n-2} = k_{n}r_{n-1}+r_n}\\
&=gcd(r_n, 0)\ \mathrm{// r_{n-1} = k_{n+1}r_n + 0}\\
&= r_n
\end{split}$
反推
$\begin{split}
gcd(a, b) = ax + by &= r_n\\
&= r_{n-2} - k_nr_{n-1}\\
&= (r_{n-4} - k_{n-2}r_{n-3}) - k_n(r_{n-3} - k_{n-1}r_{n-2})\\
\end{split}$
如此一直往回追溯,就能變成跟 $x, y$ 有關的式子
## 例子
$\begin{split}
&gcd(a, b)\\
&=gcd(32,12) \\
&=gcd(12, 8)\ \mathrm{// a = 2b+8}\\
&=gcd(8, 4)\ \mathrm{// b = 1\times 8+4}\\
&=gcd(4, 0)\ \mathrm{// 8 = 2\times 4+0}\\
\end{split}$
反推
$\begin{split}
gcd(a, b) = gcd(32, 12) &= 4 \\
&= b - 8\\
&= b - (a - 2b)\\
&= -a + 3b\\
&= ax + by
\end{split}$
配出 $x=-1, y=3$