1. 程式人生 > >數論——逆元

數論——逆元

枚舉 spa bsp style 復雜 算法 數論 百度 正整數

逆元定義:對於正整數a,如果有a*x=1(mod m),那麽把這個同余方程中的最小正整數解x叫做a模m的逆元。(同余方程不了解的話可以先自行百度)

(即a*x%m==1)

那麽逆元有什麽用?

通常情況下我們會碰到形如(A/B)%m的情況,顯然(A/B)%m!=(A%m)/(B%m)。然而如果(A*B)%m=(A%m)*(B%m)。

如果我們將1/B轉化為A*X的形式。那麽X就是我們所要求的B在模m下的逆元!

下面講四種求逆元的方法:

1:暴力求解

給定模m和需要求逆的數x,直接暴力枚舉1~m-1
檢查是否有x*i=1(mod m),這種算法可以應用與寫暴力、對拍、模數較小,求逆次數少的情況
時間復雜度O(m)

2:費馬小定理:

限制條件:1、gcd(a,m)==1,即a,m互質。

     2、m為質數。

步驟:技術分享圖片技術分享圖片,所以技術分享圖片是a在模m下的逆元,用快速冪就可以得出結果。

附上一篇費馬小定理分析的通俗易懂的博客https://www.cnblogs.com/linyujun/p/5194184.html

3:擴展歐幾裏得求逆元:(不會擴展歐幾裏得戳這裏:http://www.cnblogs.com/ISGuXing/p/8379483.html)

使用條件:a,b互質。

由exgcd可知a*x+b*y=gcd(a,b),因為a,b互質,所以gcd(a,b)=1。故有a*x+b*y=1。故a*x=1(mod b)。

4:歐拉定理求逆元:(歐拉定理求逆元具有普適性,沒有a,b互質的限制)

有點費馬小定理的樣子,後面的處理和費馬小定理一樣用快速冪。

技術分享圖片

數論——逆元