乘法逆元详解【费马小定理+扩展欧几里得算法】

2019-04-13 20:48发布

乘法逆元

何为乘法逆元?

对于两个数a,p" role="presentation" style="position: relative;">a,pgcd(a,p)=1" role="presentation" style="position: relative;">gcd(a,p)=1则一定存在另一个数b" role="presentation" style="position: relative;">b,使得ab1(modp)" role="presentation" style="position: relative;">ab1(modp),并称此时的b" role="presentation" style="position: relative;">ba" role="presentation" style="position: relative;">a关于1" role="presentation" style="position: relative;">1p" role="presentation" style="position: relative;">p的乘法逆元。我们记此时的b" role="presentation" style="position: relative;">binv(a)" role="presentation" style="position: relative;">inv(a)a1" role="presentation" style="position: relative;">a1。 举个例子:5×31(mod14)" role="presentation" style="position: relative;">5×31(mod14),我们称此时的3" role="presentation" style="position: relative;">35" role="presentation" style="position: relative;">5关于1" role="presentation" style="position: relative;">114" role="presentation" style="position: relative;">14的乘法逆元。

如何求乘法逆元?

方法一:费马小定理

费马小定理:当有两数a,p" role="presentation" style="position: relative;">a,p满足gcd(a,p)=1" role="presentation" style="position: relative;">gcd(a,p)=1时,则有apa(modp)" role="presentation" style="position: relative;">apa(modp)。 变一下形:aap21(modp)" role="presentation" style="position: relative;">aap21(modp)。是不是和上面的乘法逆元的定义是相似的? 所以,我们可以使用快速幂求出ap2" role="presentation" style="position: relative;">ap2,即求出a" role="presentation" style="position: relative;">a的逆元。

方法二:扩展欧几里得算法

由定义可知:ab1(modp)" role="presentation" style="position: relative;">ab1(modp),这个式子等价于已知a,p" role="presentation" style="position: relative;">a,p求一个二元一次不定方程ab=kp+1" role="presentation" style="position: relative;">ab=kp+1,移一下项得:abkp=1" role="presentation" style="position: relative;">abkp=1。这东西不是扩展欧几里得算法?

方法三:递推计算阶乘的逆元

当我们要计算一大串连续的阶乘的逆元时,采用费马小定理或扩展欧几里得算法就有可能超时,所以我们必须采用一个更快的算法。 令fi=i!" role="presentation" style="position: relative;">fi=i!,则可得:inv(fi+1)inv(fi(i+1))(modp)" role="presentation">inv(fi+1)inv(fi(i+1))(modp)
我们将(i+1)" role="presentation" style="position: relative;">(i+1)乘过去,则有:inv(fi)inv(fi+1)(i+1)(modp)" role="presentation">inv(fi)inv(fi+1)(i+1)(modp)
自然我们就得出递推式。

乘法逆元的作用?

我们由费马