关于扩展欧几里得中求最小非负x的方法的推导
推导
假设,我们已经求出有一对x,y满足ax+by=gcd(a,b)。
我们想要求最小非负整的x,那么必须要减去一个能减的 最大值,我们设减去一个D,则方程变为: a(x-D)+by+aD=gcd(a,b)
整合一下: a(x-D)+b(y-aD/b)=gcd(a,b)
我们知道,gcd(a,b)是整数,我们假设aD/b不为整数。 则对应的’y’(现在的y)为小数,不成立,所以aD/b是整数 即aD%b=0。
又因为aD%a=0,所以aD一定而且只需是a,b的倍数,所以aD=k(Lcm(a,b))=abk/gcd(a,b)
两边同时除a
D=k*b/gcd(a,b)//即D为b/gcd(a,b)的k倍,k为任意整数
我们要使D尽可能大,则k也要尽可能大所以可以表达为代码:
int D=b/gcd(a,b)//当k==1时D的值
while(x>=0)
{
x-=D;
}
if(x<0){
x+=D;
}
不过,这样明显浪费时间,于是我们想到了用取摸代替减法:
x%=D;
if(x<0){
x+=D;
}
另类整合if:
x=(x%D[保证x变为最小正或最大负]+D)%D