Exgcd
Exgcd–扩展欧几里得算法
用来求一组$(x,y)$使
$$
ax+by=gcd(a,b)
$$
我们不难发现
$$
gcd(a,b)=gcd(b,a\quad mod\quad b)
$$
$$
a\quad mod\quad b=a-\lfloor \frac{a}{b} \rfloor b
$$
设一组$(x_1,y_1)$使得
$$
bx_1+(a\quad mod\quad b)y_1=gcd(b,a \quad mod \quad b)
$$
由上式可得
$$
ax+by=bx_1+(a\quad mod\quad b)y_1
$$
整理可得
$$
ax+by=ay_1+b(x_1-\lfloor \frac {a}{b} \rfloor y_1)
$$
会发现一组特解
$$
\begin{cases} x=y_1\ y=x_1-\lfloor \frac {a}{b} \rfloor y_1 \end {cases}
$$
将$x_1,y_1$代回原方程可得
$$
\begin{cases} x_1=y_2\ y_1=x_2-\lfloor \frac {a}{b} \rfloor y_2 \end {cases}
$$
发现这是一个递归式
那么边界条件是什么呢?
显然当$a=nb(n\in N^+)$时$a mod b=0$即$y=0$
此时有
$$
ax+0=gcd(a,0)
$$
因为$gcd(a,0)=a$
故此时我们得到一组解
$$
\begin {cases} x=1 \ y \in R \end {cases}
$$
将结果返回即可
代码如下
1 | int x,y; |