乘法逆元
乘法逆元
用途
在(oi)比赛中,比较常用的算法就是快速幂了,但是快速幂有一定的缺点比如他只能处理乘法,加法,减法,唯独不能处理除法,也很令人麻烦,此时就需要用到逆元的操作了,此若(axequiv1 (mod~{b}),且)(a)与(b)互质,那么我们就能定义: (x)为((a))的逆元,记为(a^{-1}),所以我们也可以称(x)为(a)的倒数,当我们快速幂的时候如果遇到(frac{a}{b}mod~~m)的情况,就可以将(frac{1}{b})换成(b)关于(m)逆元即(b'),这样就可以进行快速幂的运算了。
求法
乘法逆元共三种情况,每种情况都有其特有的优缺点。
-
首先就是采用扩展欧几里得的方法来求同余方程,(ax equiv 1(mod~ b))这个式子可以等价于(ax+by=1)这个方程的解,所以我们只需求出(x)来就行。 (比较通用)
-
其次就是采用费马小定理+快速幂来求,但是这个条件比较苛刻,需要上文中的(b)是个质数,这时我们根据费马小定理可以得出(a^{b-1}equiv 1(mod~b)) —> (a * a^{b-2} equiv 1(mod~b)) 此时(x)就是(a^{b-2})就是逆元,此时就可以用快速幂来解了。但是这个还是有点慢,不过在比赛中一般模数都是质数,所以也比较常用。
-
当要处理比较多的数的时候,可以采用线性推的方法,这个在求多个数的逆元上比较舒服。首先我们需要推一下,首先我们有一个,(1 ^ {-1}equiv 1(mod p))然后设(p=k*i+r,r<i,1<i<p),再将这个式子放到(mod {p})意义下就会得到:
(k*i+r equiv 0 (mod p))
然后乘上(i^{-1}*r^{-1})就可以得到:
(k*r^{-1}+i^{-1}equiv 0 (mod p))
(i^{-1}equiv -k*r^{-1} (mod p))
(i^{-1}equiv -lfloor frac{p}{i} floor*(p mod i)^{-1} (mod p))
这种题不太常见,一般出现在多种数据之中,比如洛谷的模板