扩展欧几里得--part3

来源:互联网 发布:真三国无双7mac版 编辑:程序博客网 时间:2024/06/03 22:01

乘法逆元

扩欧不仅解一元同模方程好用,而且能求乘法逆元.

概念引入

如果我们要算两个贼大的数相除取模的结果,而我们知道乘法与加法减法运算都是可以先取余再运算的,不影响结果。但是除法比如
12 / 3 % 5 = 4
12 % 5 / 3 = 0.666666就马上gg了,
所以,我们引入了乘法逆元的概念(可以理解成再取模方程中除以一个数等于乘它的逆元[类似倒数])
令 a / b % mod = c
则 a / b = k*mod + c
a = k * b * mod + b * c
这个时候 如果可以找到一个数 inv(b) 使得 b * inv(b) % mod = 1
那么我们给两边同时乘上inv(b) 就有
a * inv(b) = k * mod + c
则原算式解为(a%mod*inv(b)%mod)%mod
所以我们就可以巧妙的将原先的除法转换成了乘法
那么这个问题的关键就在于b * inv(b) % mod = 1有解
这实际上就是扩展欧几里得判断是否有解,那么b 与 mod必须互质

求乘法逆元方法

而如何求乘法逆元(inv(b))咧?
很简单啊,套到扩欧里面呗
b * inv(b) % mod = 1转化一下可以得到b*inv(b)=k*mod+1;
再移项得到b*inv(b)+k*mod=1(此处没变号不是写错而是对于模运算下加减是可以换的)
所以inv(b)就是extgcd(b,mod)解出的x了.
ps:如果出现负的要稍微处理下

原创粉丝点击