1. 程式人生 > >乘法逆元的一些求法

乘法逆元的一些求法

逆元

廣義的來講,對於任何域中的元素,有乘法運算和單位元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}同餘即可,那麼這個數i

nvinv就是AA在取模意義下的逆元。

費馬小定理

內容:對於xx,在模p,pP質數p,p\in \mathbb{P}\text{質數}的意義下,有xp11(modp)x^{p-1}\equiv 1(mod\ p)

我們變換一個形式,左右同時除以xx,就是xp21x(modp)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)

p1)乘起來,那麼可以得到ap1(p1)!(p1)!(modp)a^{p-1}(p-1)!\equiv (p-1)!(mod\ p),然後兩端同時除以(p1)!(p-1)!就可以得到ap11(modp)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(modp)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(modp)x^{\varphi(p)-1}\equiv \frac{1}{x}(mod\ p),那麼這裡xφ(p)1x^{\varphi(p)-1}就為xx的逆元了。

我們看,這裡只要求x,px,p互質,並沒有要求pp為質數,所以尤拉定理求逆元比費馬小定理求逆元應用更加廣泛。

其他應用:當快速冪取模時,指數較大,但我們發現xφ(p)1(modp)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(modp)p_i\equiv p_j(mod\ p),那麼pipj0(modp)p_i-p_j\equiv 0(mod\ p),我們將其變形得xxixxj0(modp)xx_i-xx_j\equiv 0(mod\ p),也就是x(xixj)0(modp)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(modp),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)其中(dw