乘法逆元

乘法逆元

用途

\(oi\)比赛中,比较常用的算法就是快速幂了,但是快速幂有一定的缺点比如他只能处理乘法,加法,减法,唯独不能处理除法,也很令人麻烦,此时就需要用到逆元的操作了,此若\(ax\equiv1 (mod~{b}),且\)\(a\)\(b\)互质,那么我们就能定义: \(x\)为(\(a\))的逆元,记为\(a^{-1}\),所以我们也可以称\(x\)\(a\)的倒数,当我们快速幂的时候如果遇到\(\frac{a}{b}mod~~m\)的情况,就可以将\(\frac{1}{b}\)换成\(b\)关于\(m\)逆元即\(b'\),这样就可以进行快速幂的运算了。

求法

乘法逆元共三种情况,每种情况都有其特有的优缺点。

  1. 首先就是采用扩展欧几里得的方法来求同余方程,\(ax \equiv 1(mod~ b)\)这个式子可以等价于\(ax+by=1\)这个方程的解,所以我们只需求出\(x\)来就行。 (比较通用)

  2. 其次就是采用费马小定理+快速幂来求,但是这个条件比较苛刻,需要上文中的\(b\)是个质数,这时我们根据费马小定理可以得出\(a^{b-1}\equiv 1(mod~b)\) —> \(a * a^{b-2} \equiv 1(mod~b)\) 此时\(x\)就是\(a^{b-2}\)就是逆元,此时就可以用快速幂来解了。但是这个还是有点慢,不过在比赛中一般模数都是质数,所以也比较常用。

  3. 当要处理比较多的数的时候,可以采用线性推的方法,这个在求多个数的逆元上比较舒服。首先我们需要推一下,首先我们有一个,\(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)\)

    这种题不太常见,一般出现在多种数据之中,比如洛谷的模板

posted @ 2018-10-29 19:05  DAGGGGGGGGGGGG  阅读(216)  评论(0编辑  收藏  举报