乘法逆元的一些求法

逆元

广义的来讲,对于任何域中的元素,有乘法运算和单位元II,如果对于该域中的元素AA,存在另一个元素AA',且满足A×A=IA\times A'=I,那么AA'就是AA的逆元。

这里我们只讨论在整数域里的逆元,也就是当AZA\in \rm ZI=1I=1,其实这里的逆元A=1AA'=\frac{1}{A},但是我们要在模的意义下讨论它的求法。


在取模意义下,我们只需求出一个数invinv,是的这个数与1A\frac{1}{A}同余即可,那么这个数invinv就是AA在取模意义下的逆元。

费马小定理

内容:对于xx,在模p,pP质数p,p\in \mathbb{P}\text{质数}的意义下,有xp11(mod p)x^{p-1}\equiv 1(mod\ p)

我们变换一个形式,左右同时除以xx,就是xp21x(mod p)x^{p-2}\equiv \frac{1}{x}(mod\ p),那么我们就发现xp2x^{p-2}1x\frac{1}{x}是同余的,那么xp2x^{p-2}就是xx的逆元了。

费马小定理证明:

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

引理1:假设aa1p11\sim p-1内的一个数,那么a,2a,3a, ,(p1)aa,2a,3a,\cdots,(p-1)a可以在模pp的意义下不重复的取遍1p11\sim p-1的值。引理1的证明-这里面有

那么我们将a,2a, ,(p1)aa,2a,\cdots,(p-1)a乘起来,在模pp的意义下也就相当于把1,2, ,(p1)1,2,\cdots,(p-1)乘起来,那么可以得到ap1(p1)!(p1)!(mod p)a^{p-1}(p-1)!\equiv (p-1)!(mod\ p),然后两端同时除以(p1)!(p-1)!就可以得到ap11(mod p)a^{p-1}\equiv 1(mod\ p)了,于是得证。

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

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;
}

欧拉定理

内容:对于xx,在模pppp为任意与xx互质的数)意义下,有xφ(p)1(mod p)x^{\varphi(p)}\equiv 1(mod\ p),其中φ(p)\varphi(p)为欧拉函数,表示1p11\sim p-1中与pp互质的个数。

那么我们知道,当pp为质数时就有φ(p)=p1\varphi(p)=p-1,那么这个就是费马小定理了。

我们同样进行变形,可以得到xφ(p)11x(mod p)x^{\varphi(p)-1}\equiv \frac{1}{x}(mod\ p),那么这里xφ(p)1x^{\varphi(p)-1}就为xx的逆元了。

我们看,这里只要求x,px,p互质,并没有要求pp为质数,所以欧拉定理求逆元比费马小定理求逆元应用更加广泛。

其他应用:当快速幂取模时,指数较大,但我们发现xφ(p)1(mod p)x^{\varphi(p)}\equiv 1(mod\ p),所以我们可以将指数模了φ(p)\varphi(p),相当于除以很多个11,然后再来快速幂。

欧拉定理的证明:

我们先令x1xφ(p)x_1\sim x_{\varphi(p)}pp的简化剩余系,再令pi=xxip_i=xx_i,其中gcd(xi,p)=1gcd(x_i,p)=1

引理1. pip_i之间两两在模pp的意义下不同余,同样xix_i也是。

  • 证明引理1. :

假设有pipj(mod p)p_i\equiv p_j(mod\ p),那么pipj0(mod p)p_i-p_j\equiv 0(mod\ p),我们将其变形得xxixxj0(mod p)xx_i-xx_j\equiv 0(mod\ p),也就是x(xixj)0(mod p)x(x_i-x_j)\equiv 0(mod\ p),由于gcd(x,p)=1gcd(x,p)=1,所以只有在xixjx_i-x_jpp的倍数时,这个式子才满足,而xi,xjpx_i,x_j\leq p,那么它们相减就更加不可能为pp的倍数了,所以假设不成立,得证。

引理2. 每个pip_ipp的结果都与pp互质。

  • 证明引理2. :

假设pir(mod p),gcd(p,r)>1p_i\equiv r(mod\ p),gcd(p,r)>1
那么变形就有xxi=kp+rxx_i=kp+r,也就是xxikp=rxx_i-kp=r,我们可以得知xxixx_i肯定与pp互质(因为x,xix,x_i分别与pp互质),那么我们令d=gcd(p,r)d=gcd(p,r),那么变形可知xxi=r+kpxx_i=r+kp,也就是xxi=d(w1+kw2)其中(dw1=r,dw2=p)xx_i=d(w_1+kw_2)\text{其中}(dw_1=r,dw_2=p),那么xxixx_i肯定有因子dd,那么它与pp就不互质了,所以假设不成立,得证。

  • 证明欧拉定理:

由1,2引理可得,(xx1×xx2×xxφ(p))(x1×x2×xφ(p))(mod p)(xx_1\times xx_2\cdots\times xx_{\varphi(p)})\equiv (x_1\times x_2\cdots\times x_{\varphi(p)})(mod\ p)

所以变形得xφ(p)xixi(mod p)x^{\varphi(p)}\prod x_i\equiv \prod x_i(mod\ p),两端同除就得xφ(p)1(mod p)x^{\varphi(p)}\equiv 1(mod\ p)

扩展欧拉定理

内容
xk={xk mod φ(p)gcd(x,p)=1xkk<φ(p)xk mod φ(p)+φ(p)gcd(x,p)1,kφ(p)x ^ { k } = \left\{ \begin{array} { l l } { x ^ { k \bmod \varphi ( p ) } } & { g c d ( x , p ) = 1 } \\ { x ^ { k } } & { k < \varphi ( p ) } \\ { x ^ { k \bmod \varphi ( p ) + \varphi ( p ) } } & { g c d ( x , p ) \neq 1 , k \geq \varphi ( p ) } \end{array} \right.


扩展欧几里得算法

内容 : exgcd(a,b,x,y) 【见详解于这里

这个也就是求方程ax+by=cax+by=c的解。
那么我们将ax1(mod y)ax\equiv 1(mod\ y)看作方程ax+by=1ax+by=1,那么当gcd(a,b)=1gcd(a,b)=1的时候,这个肯定有解,所以我们用扩展欧几里得定理求出xx,那么可以发现ax1(mod y)ax\equiv 1(mod\ y)的,所以此时的xx就是在mod ymod\ y意义下的逆元。


线性递推求法

首先我们知道11的逆元一定为11,所以考虑ii的逆元(i>1i>1)。

对于模数为pp,我们令p=i×k+d(d<i)p=i\times k+d(d<i),那么对于k,dk,d则有:k=pi,d=p mod ik=\lfloor\frac{p}{i}\rfloor,d=p\ mod\ i

那么原式可以写成i×k+d0(mod p)i\times k+d\equiv 0(mod\ p)

两边同时乘以i1×d1i^{-1}\times d^{-1}可得

d1×k+ii10(mod p)d^{-1}\times k+i^{i-1}\equiv 0(mod\ p)

那么i1(k×d1)(mod p)i^{-1}\equiv (-k\times d^{-1})(mod\ p),所以将k,dk,d带回即有:

i1pi×(p mod i)1(mod p)i^{-1}\equiv -\lfloor\frac{p}{i}\rfloor\times(p\ mod\ i)^{-1}(mod\ p)

由于ii以内的逆元已经求出,所以递推即可。

所以inv(i)=(pi)×inv(p mod i)inv(i)=(-\frac{p}{i})\times inv(p\ mod\ i)


参考大佬文章IN-Luogu

posted @ 2018-10-31 08:39  VictoryCzt  阅读(319)  评论(0编辑  收藏  举报