众所周知逆元是由扩展欧几里得算法得来的。
可是经由扩展欧几里德算法算出来的解。只是一个特解。
我们实际生活中往往需要这些解集中的一个最小正解。又或者有某个式子来描绘整个解集的状态。
在这里我们有一个这样的式子。
对于方程nn'+mm'=t
已知n',m'为该方程的一组特解。
那么解集组为:(n'+m/d,m'-n/d).其中d = gcd(n,m)
那么对于计算乘法逆元:(n'+m,m'-n).
我们首先来证明当(n',m')为方程解的时候。
(n'+m/d,m'-n/d)确实为方程的解。
因为nn'+mm'=t
所以n(n'+m/d)+m(m'-n/d)=nn'+nm/d+mm'-mn/d = nn'+mm' = t 成立。
接下来证明其最小性。
因为水平有限。这个也许我描述也许不会特别清楚。望见谅。
我们要求最小当然需要的是最小的整数添量。
我们首先只考虑一个变量。n' (假如一个变量的最小整数添量为m/d。那么当然就可以直接对应的m'所更变的量。因为是对应的。)
nn' + mm' = t 可以看作同余式。
nn' ≡ t (mod m)
即 nn' mod m = t mod m.
令 g = t mod m .
那么 nn' mod m = g
我们令n'加上m/d.
n(n'+m/d) = nn'+nm/d (再提醒一次d = gcd(n,m))
(nn'+nm/d) mod m = nn' mod m 这是显然的。从这里我们也可以看出(n'+m/d,m'-n/d)确实为方程的解。
笼统地讲nm/d mod m = 0
即我们要构造出来的增量乘上n之后一定是m的倍数。knm.
我们自然会想到最小增量是m/n 因为m/n*n = m 而m是最小的m的倍数。(废话,也许不能称作倍数)
可是你有考虑过。是最小整数增量嘛?注意整数。所以自然而然地 m/gcd(n,m) 才是最小整数增量。
因此当我们计算出n'的时候。要转换成最小的正整数解。
设 q = m/gcd(n,m)
n'+kq>0
如果n'>0
n' = n'%q
如果n'<0
n ' = n'%q + q
即可。
总结是: n' = (n'%q+q)%q.
注意题设。有可能n' = 0要特判。
实际上我们往往求的不是n'。而是nn'。那么对于nn'。的解集会如何分布呢?
设。x = nn'. X 为 x 的解集。
X = n(n'+k*m/gcd(n,m)) = nn'+k*m*n/gcd(n,m) = nn' + k*lcm(n,m).
其中nn'为一个解集中的一个解。
这个X解集也是很有用的。在求中国剩余定理的时候。求最小正整数X满足同余线性方程组的时候。即会用到。