乘法逆元
何为乘法逆元?
对于两个数a,p" role="presentation" style="position: relative;">a,p若gcd(a,p)=1" role="presentation" style="position: relative;">gcd(a,p)=1则一定存在另一个数b" role="presentation" style="position: relative;">b,使得ab≡1(modp)" role="presentation" style="position: relative;">ab≡1(modp),并称此时的b" role="presentation" style="position: relative;">b为a" role="presentation" style="position: relative;">a关于1" role="presentation" style="position: relative;">1模p" role="presentation" style="position: relative;">p的乘法逆元。我们记此时的b" role="presentation" style="position: relative;">b为inv(a)" role="presentation" style="position: relative;">inv(a)或a−1" role="presentation" style="position: relative;">a−1。
举个例子:5×3≡1(mod14)" role="presentation" style="position: relative;">5×3≡1(mod14),我们称此时的3" role="presentation" style="position: relative;">3为5" role="presentation" style="position: relative;">5关于1" role="presentation" style="position: relative;">1模14" 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时,则有ap≡a(modp)" role="presentation" style="position: relative;">ap≡a(modp)。
变一下形:a⋅ap−2≡1(modp)" role="presentation" style="position: relative;">a⋅ap−2≡1(modp)。是不是和上面的乘法逆元的定义是相似的?
所以,我们可以使用快速幂求出ap−2" role="presentation" style="position: relative;">ap−2,即求出a" role="presentation" style="position: relative;">a的逆元。
方法二:扩展欧几里得算法
由定义可知:ab≡1(modp)" role="presentation" style="position: relative;">ab≡1(modp),这个式子等价于已知a,p" role="presentation" style="position: relative;">a,p求一个二元一次不定方程ab=kp+1" role="presentation" style="position: relative;">ab=kp+1,移一下项得:ab−kp=1" role="presentation" style="position: relative;">ab−kp=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)
自然我们就得出递推式。
乘法逆元的作用?
我们由费马