扩展欧几里得(exgcd):
用途:求不定方程的解
根据裴蜀定理 可知:当 ax+by=c有解的充分必要条件为 gcd(a,b) | c
因此方程就转化为了 ax+by=gcd(a,b)
《快乐求解》:
1.令 x’ y’,满足 bx′+a%by′=gcd(b,a%b)=gcd(a,b)bx'+a\%by'=gcd(b,a\%b) =gcd(a,b)bx′+a%by′=gcd(b,a%b)=gcd(a,b)
2.因此此式与原式右边相等,可得:
ax+by=bx′+(a−[a/b]∗b)y′ax+by=bx'+(a-[a/b]*b)y'ax+by=bx′+(a−[a/b]∗b)y′
3.将右边移项得ax+by=ay′+b(x′−[a/b]y)ax+by=ay'+b(x'-[a/b]y)ax+by=ay′+b(x′−[a/b]y)
解得 {x=y′y=x′−[a/b]y\left\{\begin{matrix}x=y'\\y=x'-[a/b]y\end{matrix}\right.{x=y′y=x′−[a/b]y
当b = 0时,a就是这两个数的最大公约数,所以x = 1 , y = 0 时就满足等式。
当b ≠ 0 时就先算出当a = b , b = a m o d b时等式成立的x 和y ,显然新的a 和b 的最大公约数和原来是相同的。
当求 ax+by=c 时,我们只需要将答案都*(c/gcd(a,b))即可
Code
void exgcd(int a,int b,int &x,int &y,int &g){
if(b==0){
x=1,y=0;
}
else{
exgcd(b,a%b,g,x,y);
int k=x;
x=y;
y=k-(a/b)*y;
}
}
扩展欧几里得算法(exgcd)用于解决不定方程的求解问题,根据裴蜀定理,gcd(a, b)整除c是方程ax+by=c有解的必要条件。算法通过递归将原方程转化为ax+by=gcd(a, b),并给出解的表达式。当b为0时,直接得出最大公约数;否则,通过递归求解得到新的x和y。最终,将解乘以(c/gcd(a, b))即可得到原方程的解。该算法在计算理论中有着广泛应用。
866

被折叠的 条评论
为什么被折叠?



