1.1.4 逆元

1.1.4 逆元

主要内容:扩欧求逆元,快速幂求逆元,线性(递归)求逆元,同余模公式(补充),反复平方法求幂(补充)

一、 逆元

首先给出逆元的定义:

\\begin{aligned} 假设a\\cdot p \&\\equiv 1 \\quad(mod \\quad b)\\\\ 且(a,b)\&=1\\quad即\\quad a,b互素\\\\ 则称p为a的逆元\&,记作p=a\^{-1} \\end{aligned}

用与前文类似的方法,我们将同余方程转化为二元一次不定方程:

pa+qb=1

则求解逆元的过程,就是对此不定方程求解的过程

二、扩欧求逆元

很明显,上面的方程是一个二元一次不定方程,我们可以使用扩欧求解

具体代码参考1.1.3 最大公约数-CSDN博客即可

三、快速幂求逆元

快速幂求逆元运用费马小定理,这要求p为素数

限于时间不足,作者将在之后的时间整理此部分内容

四、 线性(递归)求逆元

下面给出推导:

\\begin{aligned} 假设p\&=ki+r\\\\ 现在尝试求i在模p下的逆元i\^{-1},即有i\\cdot i\^{-1} \&\\equiv 1\\quad (mod\\quad p)\\\\ 将上述等式放在模p意义下,得到同余式:\\\\ k\\cdot i+ r\&\\equiv0\\quad(mod\\quad p)\\\\ 两边同乘i\^{-1},得到\\\\ k+r\\cdot i\^{-1}\&\\equiv 0\\quad(mod\\quad p)\\\\ 再同乘r\^{-1},得到\\\\ k\\cdot r\^{-1}+i\^{-1}\&\\equiv 0\\quad(mod\\quad p)\\\\ 即\\\\ i\^{-1}\&\\equiv-k\\cdot r\^{-1} \\quad(mod\\quad p)\\quad\\quad\\quad(\*)\\\\ 根据定义可知,k=\[\\frac{p}{i}\]\&,r=p\\%i\\\\ 于是,我们将一个求解i\^{-1}的问题\&转化为求解(p\\%i)\^{-1}的问题 \\end{aligned}

我们的算法基于(*)式得到

按照(\*)式,我们可以得到一个逆元的线性求法,时间复杂度为O(n),\\\\ 迭代方程如下:\\\\ inv\[i\] = (p - p / i) \\cdot inv\[p \\% i\] \\% p;\\\\ 但实际上,我们可以使用递归的方法,在O(log_2n)的时间里更高效地求出逆元\\\\ 递归方程如下:\\\\ i\^{-1}=\\left\\{ \\begin{matrix} \\begin{aligned} 1 \\quad \&i=1\\\\ -\[\\frac{p}{i}\]\\cdot(p\\%i)\^{-1} \\quad \&其他情况\\\\ \\end{aligned} \\end{matrix} \\right.\\quad\\quad(mod\\quad p)\\\\

递归法代码实现如下:

cpp 复制代码
int inv(int i, int p){
    if (i==1) return 1;
    return -(p/i)*inv(p%i);
}

四、 同余模公式、反复平方法求幂(补充)

同余模公式:

\\begin{aligned} (a+b)\\%p \\quad \&= \\quad (a\\%p + b\\%p) \\%p\\\\ (a\\cdot b)\\%p \\quad \&= \\quad (a\\%p \\cdot b\\%p) \\%p \\end{aligned}

反复平方法求幂:

这是快速幂取模的主要算法思想,想了解该算法的同学可以参照0x01 位运算(1)-CSDN博客

(如果没记错的话,笔者年幼时曾阅读《幻想数学大战》,在书中接触过类似的思想,该思想源于文中所谓的《阿梅斯草纸书》。

笔者尝试继续追溯,其可能对应史料《阿默斯纸草书》,也即《莱因德纸草书》)

本文由"小苏打NaHCO3"原创,未经允许,严禁转载!

如果觉得本文对你有用,不妨点赞收藏一下吧!