拓展欧几里得算法
先讲一下裴蜀定理
裴蜀定理:对于a,b∈Z,使h=gcd(a,b),则存在x,y使得h=ax+by
这里就会衍生出一系列关于c=ax+by此类不定方程解x,y的问题(c=gcd(a,b))
由原式可得gcd(a,b)=ax+by此为①式由辗转相除法推一步可得gcd(b,a%b)=gcd(a,b) ②式
展开gcd(b,a%b)=bx’+(a-b[a/b])y’(这里的中括号表示下取整数,后面也是此意),
②整理可以得出a(x-y’)+b(y-(x’-[a/b]y’))=0,我们希望这个式子对于一切a,b成立,所以可得x=y’,y=x’-[a/b]y’,这样,要求解x,y只需要求解x’,y’,而x’,y’对应的问题规模更小,所以可以递归求解。最后找一下边界条件,当b=0的时候,(a,0)对应x=1,y=0。这个算法的思路和欧几里得算法基本一致,而且在求出gcd的同时求解了一组适用裴蜀定理的系数,所以叫exgcd(extend gcd)
给个板子:
int gcd(int a,int b){return !b ? a : gcd(b, a % b);}
int exgcd(int a, int b, int& x, int& y) {
if(b == 0) {
x = 1; y = 0;
return a;
} else {
int d = exgcd(b, a % b, x, y);
int tmp = x;
x = y;
y = x - a / b * y;
return d;
}
}