码迷,mamicode.com
首页 > 其他好文 > 详细

扩展欧几里得 推导及应用

时间:2018-04-29 16:59:52      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:观察   mod   导出   欧几里得算法   不同的   代码   简单   就是   取值   

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 \rfloor
b)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意义下的不同解

扩展欧几里得 推导及应用

标签:观察   mod   导出   欧几里得算法   不同的   代码   简单   就是   取值   

原文地址:https://www.cnblogs.com/niiick/p/8971276.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!