(a/b) mod m 的算法
取模运算对加法、减法、乘法都封闭,所以我们很容易计算`(a+b)mod m`,`(a-b)mod m`,`(a*b)mod m`。但是,要计算`(a/b) mod m`就不是那么容易了。
下面分两种情况讨论(保证`a`是`b`的倍数)
1. `gcd(b,m) = 1`
此时可求`b`相对于`m`的逆元`b^(-1)`,即`b*(b^(-1)) = 1 (mod m)`
有`b*b^(-1) - km = 1`,其中k是一整数
用Extended Euclid算法可以求出`b^(-1)`
然后计算`a*b^(-1) mod m`,其值与`(a/b) mod m`相同
2. `gcd(b,m) /neq 1`
此时方程`b*b^(-1) - km = 1`无整数解,求逆元的方法失效了。
但是可以把问题转化成上面解决的问题。
思路:既然`gcd(b,m) /neq 1`,`a`又是`b`的倍数,那么`gcd(b,m)`一定是`a`和`b`的公约数。这提示我们把`a`和`b`约掉那些m的素因子之后问题就解决了。
令`a = a_0*t`, `b = b_0*t`,其中`t`的素因子集合包含于`m`的素因子集合,而`a`和`b`的素因子集合不能与`m`的素因子集合有交集。
这样有`(a/b) = ((a_0)/(b_0))`,并且`gcd(b_0, m) = 1`,就转化为可以用求逆元的方法解决的问题了。