乘法逆元
/ / 阅读耗时 4 分钟 乘法逆元在ACM中常用于在除法运算取模,这是一个重要方法。
首先先认识什么是乘法逆元,对于整数a,若存在整数x使得$ax\equiv1(mod p)$,则称x为a关于1模p的乘法逆元。
将同余式化为整除式可得$ax+py=1$,根据裴蜀定理可知a与p互质,即$gcd(a,p)=1$。这说明当且仅当a与p互质时,a关于模p的乘法逆元才存在。
乘法逆元有什么作用呢?它常用于除法的取模,已知:
但是除法并没有:
这对计算除法的模带来困难,乘法逆元可以解决这个问题,假设最后结果为x,则有:
当b与p互质时,上式等价于:
设b的乘法逆元为b-1,即有:
那么有:
所以如果要算a/b对p的模,只需计算ab-1对p的模即可,关键在于求b的逆元。下面先介绍两种通用方法。
- 用费马小定理求解逆元
【费马(Fermat)小定理】当p为质数且a与p互质时,有$a^{p-1}\equiv 1(mod p)$
费马小定理变形一下得到$aa^{p-2}\equiv 1(mod p)$,那么逆元就是ap-2。用快速幂算法求出ap-2并取模就是逆元。这个方法需要p为质数,并且a与p互质。
费马小定理其实是欧拉定理的特殊情况,p不为质数时,用欧拉函数值代替p-1然后求逆元也是可以的,这样便不要求p为质数。
- 用扩展欧几里得算法求解逆元
当a与p互质时,可以用扩展欧几里得算法求出一个特解x、y使得$ax+bp=1$,也就是$ax\equiv 1(mod p)$,这样x就是逆元。本方法只需要a与p互质(这也是逆元存在的条件),缺点是求出的x可能为负数。
若用inv(x)来表示x的乘法逆元,则有:
这说明逆元是积性的,很容易证明,这是逆元的一个重要性质。
最后介绍逆元的递推求法。对于一个数a,现欲求a在模p意义下的逆元,根据带余除法原理,可以将p表示为ak+b。假设b的逆元为b-1,那么:
也就是:
即:
因此:
就得到了一个递推式:
这个递推式可以帮助我们在O(n)复杂度下求出1~n的逆元。