乘法逆元
乘法逆元
用途
在\(oi\)比赛中,比较常用的算法就是快速幂了,但是快速幂有一定的缺点比如他只能处理乘法,加法,减法,唯独不能处理除法,也很令人麻烦,此时就需要用到逆元的操作了,此若\(ax\equiv1 (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(\bmod p)\)然后设\(p=k*i+r,r<i,1<i<p\),再将这个式子放到\(\bmod {p}\)意义下就会得到:
\(k*i+r \equiv 0 (\bmod p)\)
然后乘上\(i^{-1}*r^{-1}\)就可以得到:
\(k*r^{-1}+i^{-1}\equiv 0 (\bmod p)\)
\(i^{-1}\equiv -k*r^{-1} (\bmod p)\)
\(i^{-1}\equiv -\lfloor \frac{p}{i} \rfloor*(p \bmod i)^{-1} (\bmod p)\)
这种题不太常见,一般出现在多种数据之中,比如洛谷的模板