扩展欧几里得 推导及应用
Posted niiick
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了扩展欧几里得 推导及应用相关的知识,希望对你有一定的参考价值。
ax+by=gcd(a,b)求解
简单推导
假设有$ax_{1}+by_{1}=gcd(a,b)$成立
由欧几里得算法知$gcd(a,b)=gcd(b,a$%$b)$
又有$bx_{2}+(a$%$b)y_{2}=gcd(b,a$%$b)$
合并得$ax_{1}+by_{1}=bx_{2}+(a$%$b)y_{2}$
$a$%$b=a- \lfloor a/b \rfloorb $
带入上式得$ax_{1}+by_{1}=bx_{2}+(a- \lfloor a/b \rfloorb)y_{2}$
整理后得$ax_{1}+by_{1}=ay_{2}+b*(x_{2}- \lfloor a/b \rfloor y_{2})$
所以最后有
\begin{cases}
x_{1}=y_{2}\quad \
y_{1}=x_{2}-\lfloor a/b \rfloor y_{2}\quad
\end{cases}
既然有了这样的递归关系,那么边界呢
显然$gcd(a,0)=a$
即在$b=0$时有$x=1,y=0$使得$a1+b0=gcd(a,b)$成立
那么只要在$b==0$时返回$x=1,y=0$即可一步一步回推出原方程的解
代码实现
void exgcd(int a,int b,int &x,int &y)
{
if(b==0){x=1;y=0;return a;}
int gcd=exgcd(b,a%b,x,y);
int tp=x;
x=y; y=tp-a/b*y;
return gcd;
}
拓展
上述代码仅仅求出了方程的一组解,但其实答案远远不止一组
怎么求出剩下的解呢
当前以已出的解为$x_{1},y_{1}$,设下一组解为$x_{1}+s_{1},y_{1}+s_{2}$
那么有$a(x_{1}+s_{1})+b(y_{1}+s_{2})=gcd(a,b)$
与$ax_{1}+by_{1}=gcd(a,b)$化简后得
$as_{1}=-bs_{2}$
$\frac {s_{1}}{s_{2}}=-\frac ba=-\frac {b/gcd}{a/gcd}$
为了让$s_{1},s_{2}$取值最小(为了得到最小正周期)
显然可以让等式右边上下同时除以$gcd(a,b)$
这样我们就得到了所有解的关系式
\begin{cases}
x_{2}=x_{1}+\frac {b}{gcd(a,b)}k\quad \
y_{2}=y_{1}-\frac {a}{gcd(a,b)}k\quad
\end{cases}
其中k取任意整数
特别的,原方程的最小非负整数解的关系式为
$x=(x_{1}$%$\frac {b}{gcd(a,b)}+\frac {b}{gcd(a,b)})$%$\frac {b}{gcd(a,b)}$
***************************
ax+by=c求解
简单推导
(以下简记$gcd(a,b)$为$gcd$)
假设有$ax_{1}+by_{1}=gcd$成立
令等式两边同时乘以$\frac {c}{gcd}$
有$a\frac {cx_{1}}{gcd}+b\frac {cy_{1}}{gcd}=c$成立
所以我么就可以先用欧几里得算法求出$x_{1},y_{1}$
那么$x=\frac {cx_{1}}{gcd},y=\frac {cy_{1}}{gcd}$就是原方程的一组解
不过这样的方程存在解的必要条件为$c|gcd(a,b)$
同样用与上述类似的方法推导出所有解的关系式
\begin{cases}
x_{2}=\frac {cx_{1}}{gcd}+\frac {b}{gcd(a,b)}k\quad \
y_{2}=\frac {cy_{1}}{gcd}-\frac {a}{gcd(a,b)}k\quad
\end{cases}
其中k取任意整数
原方程的最小非负整数解的关系式为
$x=(\frac {cx_{1}}{gcd}$%$\frac {b}{gcd(a,b)}+\frac {b}{gcd(a,b)})$%$\frac {b}{gcd(a,b)}$
***************************
同余式ax$\equiv$ c(mod b)求解
简单推导
由$ax\equiv c(mod b)$不难得到
$(ax-c)$%$b=0$
即一定有整数y使得$ax+by=c$成立
问题转化为上一模型
然而由于是同余式求解
事实上转化等式后求出的许多解在膜b意义下是相同的
所以我们需要找出所有膜b意义下不同的解
观察上一模型的关系式
\begin{cases}
x_{2}=\frac {cx_{1}}{gcd}+\frac {b}{gcd(a,b)}k\quad \
y_{2}=\frac {cy_{1}}{gcd}-\frac {a}{gcd(a,b)}k\quad
\end{cases}
我们发现k取$[0,gcd(a,b)-1]$时符合要求
恰好有gcd(a,b)个膜b意义下的不同解
以上是关于扩展欧几里得 推导及应用的主要内容,如果未能解决你的问题,请参考以下文章