求ax=c%b的最小正整数解
首先我们应该知道所有的同余方程,均是从不定方程来的
例如ax=c%b,就是将不定方程ax+by=c的左右两边,同时模b得来的
于是我们先试着对ax+by=c这个方程进行求解,求解的方法是使用扩展欧几里德算法。
假设我们已得到了一组(X0,Y0)的解,即满足
aX0+bY0=c.
但此时求出来的X0的值,可能是负数,也可能是一个很大的正数。
如果是负数的话,我们可尝试着调整一下,将X0变成满足条件的最小正整数解
方法如下:
在方程的左边,同时加上一个数字delta,再减去一个数字delta。这样方程是不变的
那这个delta的值应该为多少呢?
易知设delta=a*b/gcd(a,b)
于是原方程变为
aX0+bY0+a*b/gcd(a,b)-a*b/gcd(a,b)=c
方程再变形为
a(X0+b/gcd(a,b))+b(Y0-a/gcd(a,b))=c
如果X0+b/gcd(a,b)仍为负数的话,那再加上一个delta,这样加下去的话
X0终会变成正数的,同时也易知在正整数范围内,这个方程是有无限多组解的。
当然如果X0是一个很大的正数,我们希望将其缩小的话,也可以采用上面这种方法,在此不再赘述了。
为了更快的得到方程的最小正整数解
我们不妨采用下述方法
X0=(X0%delta+delta)%delta
易知X0%delta后,其绝对值总是在区间[0..delta-1]之间的
如果X0%delta是个负数,则加上b后,就转为正数了
如果X0%delta是个正数,则加上delta再去模delta,对其值是没有影响的.
在找到最小正整数解后,如果还希望找出x在[0..b-1]范围内的所有解的话
为了表述方便,我们设方程的通解为
x=x0+k*b/gcd(a,b)
y=y0-k*a/gcd(a,b)
其中k>=0
不难发现,当k=gcd(a,b)时
x=x0+b,此时的x>b了,也就是说x在[0..b-1]范围内有gcd(a,b) 组解,则如果gcd(a,b)=1的话,则就只有一组解了。
同时也易发现此时x与x0是在模b的情况下是同余的。
这个结论在我们求解
ax=1%b时,有点小用处。
其实此时的x,被我们称之为a在模b的逆元。
一般求逆元,我们使用扩展欧几里德算法就行了。
但如果存在先决条件gcd(a,b)=1,并且b为质数时
根据费马小定理a^(b-1)%b=1
于是a的逆元,我们可直接设定成a^(b-2)即可。
根据前面所述,如果是希望找到a的最小逆元的话,则根据前面所述:由于gcd(a,b)=1.
于是方程ax+by=1,x在范围[0..b-1]只有一个解。
则只需将a^(b-2)%b即可。
如果先决条件中只保证gcd(a,b)=1,b并不为质数时
则可以使用欧拉定理进行求解。