裴蜀定理:对于任意x,y,若满足k1x+k2y=d有解,则d一定为k1,k2的最大公约数
证明:
∵d为x,y的最大公约数
∴x,y一定为d的倍数
∴k1x+k2y也一定为d的倍数,则一定存在k1,k2为方程的一组解
通过欧几里得算法递归来求k1,k2
核心为gcd(a,b)=gcd(b,a%b)
若满足k1x+k2y=d,则k1y+k2(x%y)=d,
显然,当x%y=0时,k1=1,k2=N
因为x%y=x−⌊yx⌋∗y
代入得k1y+k2(x−⌊yx⌋∗y)=d,
化简得k2x+(k1−⌊yx⌋∗k2)y=d
为了方便计算,我们可以在递归时交换k1,k2
则会得到k1x+(k2−⌊yx⌋∗k1)y=d
结合代码理解
int exgcd(int x,int y,int &k1,int &k2) { if(!y) { k1 = 1, k2 = 0; return x; } int d = exgcd(y, x % y, k2, k1); k2 -= x / y * k1; return d; }
|
递归结束时k1,k2即为答案