扩展欧几里得算法是当已知a和b时,求得一组x和y使得
首先,根据数论中的相关定理,解一定存在 //留坑待填
之后我们可以推一推式子
将a替换掉
展开括号
提出b,合并
且
设
现在已经将原来的式子转化为一个小一点的问题了
当 b = 0 时,则有 x = 1 , y = 0
之后递归回去就可以求得最终的x和y了
整理上面的和可以得到:
之后代码就很好写了
int exgcd(int a,int b,int &x,int &y){
if(b==0){
x=1;
y=0;
return a;
}
int res,tmp;
res=exgcd(b,a%b,x,y);
tmp=x;
x=y;
y=tmp-a/b*y;
return res;
}
upd:
拿一道例题来说事 : 青蛙的约会