数论总结之 乘法逆元

  最近在补数论的知识,然后发现其实很多地方都要用到逆元。

  所以我来了,写篇博客证明一下我其实是会的。【假的

  参考自【洛谷日报第30期】。

乘法逆元

  首先,假设你会扩展欧几里得(exgcd)的话,那么乘法逆元就很简单了。

  首先看一下定义:

  在(mod p) 意义下( p 是素数),如果 a*a'=1 ,那么我们就说 a' 是 a 的逆元。当然啦,反过来, a 也是 a' 的逆元。

  感觉跟倒数很像啊。

  确实是这样没错,比如我们求组合数的时候,经常就会用到它,可以说是非常有用了。

  逆元一般的表示方法是 inv,基本上看见这个变量,就都是逆元。

  接下来我们来看看逆元都有什么性质,进一步了解一下逆元的应用。

    一.性质:

    1. 存在唯一性

      意思就是说,对于每一个数而言,一定存在且只存在一个数,是他的逆元。

      关于存在性:

        由于 p 是质数,所以 a 和 p 一定是互质的,那么显然一定存在至少一个逆元。

      那么我们来证明一下唯一性。

      证明: 假设对于一个数a,有两个不同的逆元 a'a''

        

        不妨先设 a' < a'' 且 a'' - a' =k

        由于 a ≠ 0 ,所以 k =0 (mod p).

        所以 a’ 与 a''的值相等,即只有一个逆元

    2.完全积性函数

      意思是说,两个数的逆元的积等于这两个数积的逆元,即 inv[a]*inv[b]=inv[a*b] 。

      证明:

        

        

        

      出现了,(a*b) 的逆元的定义。

    3.a*inv[b]=a/b(mod p)

      证明:

        

        在两边都称上 a

        

        再把 b 除过去

        

      ok了。

      这个性质非常重要:当需要算出 a/b mod p 的值时,使用朴素的方法,我们只能在 a 上不断加 p ,直到它能被 b 整除为止。

               但是当 a,b,p 都很大的时候,这种方法就GG了,但如果有了逆元,我们就可以 “ 非常方便,快捷 ” 地求解。

  二.求法

    说这么多我还没说怎么求。【等于没说

    垃圾枚举几乎题题爆炸,这里就不说了。

    1.费小

      我们都知道费马小定理::当 p 为素数时, a^{p-1}=1 (mod p) 。

      那么 a*a^{p-2}=1 (mod p) 。

      所以我们只需要快速幂求出 a^(p-2)就ok

     2.扩欧

      仔细想想,发现其实我们寻找 a*x=1 ( mod p )的解就相当于寻找方程 a*x+p*y=1 的解。

      我们知道 扩展欧几里得 ax+by=c

      好的,确定 a 和 p 互质,可以用了。

    3.欧拉筛

      我没用过,引用一段话:

  如果我们要求出 1 ~ p-1 所有数的逆元呢?

  还记得逆元是完全积性函数吗?所以对于每个合数 a ,我们把所有它的因子的逆元筛出来再相乘即可。

  所以我们可以直接把所有素数筛出来,对它们求逆元(二或三),再把它的逆元乘给它的倍数就可以了。

    4.线性递推

      这个很常用的。【至少我常用

       

      因为很难写,我就直接放图片了。


后记

  基本上全了,没有代码辅助,因为我也学的很浅显,并不是每一种都写过。

  真的很遗憾,快NOIP了才意识到自己会的并不多,感觉要GG怎么办QAQ  

  希望能多补救一点吧。

  祝大家RP+++++++++++++++++++++++++++。

原文地址:https://www.cnblogs.com/qxyzili--24/p/11230421.html