(a/b) mod m 的算法

(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`,就转化为可以用求逆元的方法解决的问题了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值