逆元

广义的来讲,对于任何域中的元素,有乘法运算和单位元模逆元 python 模逆元素_费马小定理,如果对于该域中的元素模逆元 python 模逆元素_取模_02,存在另一个元素模逆元 python 模逆元素_递推_03,且满足模逆元 python 模逆元素_递推_04,那么模逆元 python 模逆元素_递推_03就是模逆元 python 模逆元素_取模_02的逆元。

这里我们只讨论在整数域里的逆元,也就是当模逆元 python 模逆元素_费马小定理_07模逆元 python 模逆元素_费马小定理_08,其实这里的逆元模逆元 python 模逆元素_取模_09,但是我们要在模的意义下讨论它的求法。


在取模意义下,我们只需求出一个数模逆元 python 模逆元素_模逆元 python_10,是的这个数与模逆元 python 模逆元素_费马小定理_11同余即可,那么这个数模逆元 python 模逆元素_模逆元 python_10就是模逆元 python 模逆元素_取模_02在取模意义下的逆元。

费马小定理

内容:对于模逆元 python 模逆元素_费马小定理_14,在模模逆元 python 模逆元素_费马小定理_15的意义下,有模逆元 python 模逆元素_费马小定理_16

我们变换一个形式,左右同时除以模逆元 python 模逆元素_费马小定理_14,就是模逆元 python 模逆元素_模逆元 python_18,那么我们就发现模逆元 python 模逆元素_取模_19模逆元 python 模逆元素_取模_20是同余的,那么模逆元 python 模逆元素_取模_19就是模逆元 python 模逆元素_费马小定理_14的逆元了。

费马小定理证明:

  1. 用欧拉定理直接证明,这个就后面再说。
  2. 我们用剩余系来看:

引理1:假设模逆元 python 模逆元素_费马小定理_23模逆元 python 模逆元素_模逆元 python_24内的一个数,那么模逆元 python 模逆元素_递推_25可以在模模逆元 python 模逆元素_模逆元 python_26的意义下不重复的取遍模逆元 python 模逆元素_模逆元 python_24的值。

那么我们将模逆元 python 模逆元素_递推_28乘起来,在模模逆元 python 模逆元素_模逆元 python_26的意义下也就相当于把模逆元 python 模逆元素_取模_30乘起来,那么可以得到模逆元 python 模逆元素_递推_31,然后两端同时除以模逆元 python 模逆元素_费马小定理_32就可以得到模逆元 python 模逆元素_取模_33了,于是得证。

所以用费马小定理求取逆元的代码如下:

int inv(int a,int b=p-2){
	int ans=1;
	for(;b;b>>=1,a=(a*a)%p)if(b&1)ans=(ans*a)%p;
	return ans%p;
}

欧拉定理

内容:对于模逆元 python 模逆元素_费马小定理_14,在模模逆元 python 模逆元素_模逆元 python_26模逆元 python 模逆元素_模逆元 python_26为任意与模逆元 python 模逆元素_费马小定理_14互质的数)意义下,有模逆元 python 模逆元素_取模_38,其中模逆元 python 模逆元素_模逆元 python_39为欧拉函数,表示模逆元 python 模逆元素_模逆元 python_24中与模逆元 python 模逆元素_模逆元 python_26互质的个数。

那么我们知道,当模逆元 python 模逆元素_模逆元 python_26为质数时就有模逆元 python 模逆元素_模逆元 python_43,那么这个就是费马小定理了。

我们同样进行变形,可以得到模逆元 python 模逆元素_取模_44,那么这里模逆元 python 模逆元素_模逆元 python_45就为模逆元 python 模逆元素_费马小定理_14的逆元了。

我们看,这里只要求模逆元 python 模逆元素_模逆元 python_47互质,并没有要求模逆元 python 模逆元素_模逆元 python_26为质数,所以欧拉定理求逆元比费马小定理求逆元应用更加广泛。

其他应用:当快速幂取模时,指数较大,但我们发现模逆元 python 模逆元素_取模_38,所以我们可以将指数模了模逆元 python 模逆元素_模逆元 python_39,相当于除以很多个模逆元 python 模逆元素_费马小定理_51,然后再来快速幂。

欧拉定理的证明:

我们先令模逆元 python 模逆元素_模逆元 python_52模逆元 python 模逆元素_模逆元 python_26的简化剩余系,再令模逆元 python 模逆元素_模逆元 python_54,其中模逆元 python 模逆元素_取模_55

引理1. 模逆元 python 模逆元素_费马小定理_56之间两两在模模逆元 python 模逆元素_模逆元 python_26的意义下不同余,同样模逆元 python 模逆元素_取模_58也是。

  • 证明引理1. :

假设有模逆元 python 模逆元素_费马小定理_59,那么模逆元 python 模逆元素_递推_60,我们将其变形得模逆元 python 模逆元素_模逆元 python_61,也就是模逆元 python 模逆元素_取模_62,由于模逆元 python 模逆元素_取模_63,所以只有在模逆元 python 模逆元素_递推_64模逆元 python 模逆元素_模逆元 python_26的倍数时,这个式子才满足,而模逆元 python 模逆元素_递推_66,那么它们相减就更加不可能为模逆元 python 模逆元素_模逆元 python_26的倍数了,所以假设不成立,得证。

引理2. 每个模逆元 python 模逆元素_费马小定理_56模逆元 python 模逆元素_模逆元 python_26的结果都与模逆元 python 模逆元素_模逆元 python_26互质。

  • 证明引理2. :

假设
那么变形就有模逆元 python 模逆元素_费马小定理_71,也就是模逆元 python 模逆元素_费马小定理_72,我们可以得知模逆元 python 模逆元素_递推_73肯定与模逆元 python 模逆元素_模逆元 python_26互质(因为模逆元 python 模逆元素_模逆元 python_75分别与模逆元 python 模逆元素_模逆元 python_26互质),那么我们令模逆元 python 模逆元素_费马小定理_77,那么变形可知模逆元 python 模逆元素_递推_78,也就是模逆元 python 模逆元素_递推_79,那么模逆元 python 模逆元素_递推_73肯定有因子模逆元 python 模逆元素_费马小定理_81,那么它与模逆元 python 模逆元素_模逆元 python_26就不互质了,所以假设不成立,得证。

  • 证明欧拉定理:

由1,2引理可得,模逆元 python 模逆元素_模逆元 python_83

所以变形得模逆元 python 模逆元素_取模_84,两端同除就得模逆元 python 模逆元素_取模_38

扩展欧拉定理

内容


扩展欧几里得算法

内容 : exgcd(a,b,x,y)

这个也就是求方程模逆元 python 模逆元素_模逆元 python_86的解。
那么我们将模逆元 python 模逆元素_模逆元 python_87看作方程模逆元 python 模逆元素_取模_88,那么当模逆元 python 模逆元素_模逆元 python_89的时候,这个肯定有解,所以我们用扩展欧几里得定理求出模逆元 python 模逆元素_费马小定理_14,那么可以发现模逆元 python 模逆元素_模逆元 python_87的,所以此时的模逆元 python 模逆元素_费马小定理_14就是在模逆元 python 模逆元素_模逆元 python_93意义下的逆元。


线性递推求法

首先我们知道模逆元 python 模逆元素_费马小定理_51的逆元一定为模逆元 python 模逆元素_费马小定理_51,所以考虑模逆元 python 模逆元素_取模_96的逆元(模逆元 python 模逆元素_模逆元 python_97)。

对于模数为模逆元 python 模逆元素_模逆元 python_26,我们令模逆元 python 模逆元素_费马小定理_99,那么对于模逆元 python 模逆元素_模逆元 python_100则有:模逆元 python 模逆元素_费马小定理_101

那么原式可以写成模逆元 python 模逆元素_取模_102

两边同时乘以模逆元 python 模逆元素_模逆元 python_103可得

模逆元 python 模逆元素_取模_104

那么模逆元 python 模逆元素_模逆元 python_105,所以将模逆元 python 模逆元素_模逆元 python_100带回即有:

模逆元 python 模逆元素_模逆元 python_107

由于模逆元 python 模逆元素_取模_96以内的逆元已经求出,所以递推即可。

所以模逆元 python 模逆元素_递推_109