# 歐幾里得算法,擴展歐幾裡得算法
###### tags: `Algorithm`
## 歐幾裡得算法
### gcd(a,b)=gcd(b,r)
> 已知 a\b=q...r
> a=bq+r
d=a,b 的公因數
→ d 為 a-bq的因數
→ d 為 r 的因數
→ a,b 的公因數為r的因數
:::info
gcd(a,b)=gcd(b,r)
:::
### 輾轉相除法
> (703,407)
703 / 407 = 1 ... 296
→ 求 (407,296)
> (407,296)
407 / 296 = 1...111
> 求 (206,111)
.
.
.
## 擴展歐幾裡得算法
>a,b ∈ Z
必存在整數 x,y 使ax+by = gcd(a,b)
求x,y
```
設 a*x1 + b*y1 = gcd(a, b) (1)
b*x2 + a%b * y2 = gcd(b, a%b)(2)
又 gcd(a,b) = gcd(b,a%b)
所以有a*x1 + b*y1 = b*x2 + (a - a/b * b)*y2 (此處的'/'為向下取整除)
化簡有a*x1 + b*y1 = a*y2 + b* (x2 – a/b * y2)
x1 = y2, y1 = (x2 - a/b * y2)
```
:::info
結論:
x1 = y2, y1 = (x2 - a/b * y2)
:::
```cpp=
void exGcd (int a, int b, int &x, int &y)
{
int t;
if (b==0) x = 1, y = 0;
else gcd(b,a%b,x,y), x = y, y = t-a/b*y;
}
```