日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

乘法逆元 java_浅谈乘法逆元(示例代码)

發(fā)布時(shí)間:2024/1/1 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 乘法逆元 java_浅谈乘法逆元(示例代码) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

淺談乘法逆元

乘法逆元,一般用于求解(frac{A}{C}(mod ~ P))的值,因?yàn)槲覀兺ㄟ^(guò)模的定義可以知道上式顯然不等于(frac{A \% P}{B \% P})。例子有很多不再舉了。那么如果我們要求上式大多數(shù)情況都需要借助逆元。

首先是定義:

若(A imes X equiv 1 (mod ~ P)),并且(A perp P)((perp):互質(zhì)),那么我們就稱(X)為(A)的逆元,簡(jiǎn)稱為(A^{- 1}),也就是(A)在(mod ~ P)意義下的倒數(shù)。

借此我們可以知道(frac{A}{C}(mod ~ P))的求法:我們先求出(C)在(mod ~ P)意義下的逆元,然后(imes A)就是答案了。那么我們主要求的就是(C)的逆元。

擴(kuò)展歐幾里得版

首先從最簡(jiǎn)單開(kāi)始,就是一個(gè)擴(kuò)展歐幾里得,直接求解(A imes X + P imes Y = 1)就行了。

inline void Exgcd(int A, int P, int X, int Y) {

if (! B) X = 1, Y = 0 ;

else Exgcd(P, A % P, Y, X), Y -= A / B * X ;

}

這個(gè)方法雖然時(shí)間上比較慢,但是有一個(gè)優(yōu)點(diǎn),就是當(dāng)(A)與(P)不互質(zhì)的時(shí)候,依然可以適用。但是下面介紹的其他方法就必須滿足(A perp P)了。

費(fèi)馬小定理版

回顧一下費(fèi)馬小定理的內(nèi)容:

若(A perp P), 則(A^{P - 1} equiv 1(mod ~ P))。

我們可以把它運(yùn)用到乘法逆元里。結(jié)合(A imes X equiv 1(mod ~ P))可以得到(A imes X equiv A^{P - 1}(mod ~ P))。當(dāng)(P)為質(zhì)數(shù)的時(shí)候,我們把左右都除以一個(gè)(A)可以得到(X equiv A^{P - 2}(mod P))。然后就可以一個(gè)快速冪求出來(lái)了。

inline void Fpm(int A, int P) {

int Ans = 1 ; int M = P ;

A %= M ; P -= 2 ;

while (P) {

if (P & 1) Ans = Ans * A % M ;

A = A * A % M ; P >> = 1 ;

} return Ans % M ;

}

上面的復(fù)雜度是(O(logN))的,在求多個(gè)逆元的時(shí)候可能(O(NlogN))是過(guò)不去的。當(dāng)然我們還有一種利用地推打出逆元表的方法做到(O(N)).

歐拉篩版

設(shè)(INV[i])為(i)的逆元。我們知道有(INV[A] = A ^ {P - 2}(mod ~ P),~INV[B] = B ^ {P - 2} (mod ~ P))

我們利用費(fèi)馬小定理可以得(INV[A imes B] = (AB) ^ {P - 2} (mod P))也就是說(shuō)(INV[A imes B] = INV[A] imes INV[B])。求得遞推式。我們就可以利用歐拉篩。

遞推版

為了方便起見(jiàn)就直接寫(xiě)過(guò)程了。

設(shè)(P = kA + r~~(r in [0, P)~))。因?yàn)槲覀冎廊魏我粋€(gè)數(shù)都可以寫(xiě)成這個(gè)形式嘛。

那么有(kA + r equiv 0 (mod ~ P))

因?yàn)?A^{P - 1} equiv 1(mod ~ P))

所以((kA +r) imes A^{- 1} imes r^{- 1} equiv 0 (mod ~ P))

把左邊的括號(hào)拆開(kāi)得(kr^{- 1} + A^{- 1} equiv 0 (mod ~ P))

移項(xiàng):(A^{- 1} equiv -kr^{- 1})

在這里我們知道(k = lfloor frac{P}{A} floor)。

(A^{- 1} equiv -lfloor frac{P}{A} floor imes r^{- 1})

并且我們還知道(r ≤ A)。那么我們就可以借用數(shù)組(INV[r])完成遞推。同時(shí)我們還知道(r = P \% A)

最后得到(INV[A] = (P - lfloor frac{P}{A} floor) imes INV[P\% A])

遞推完成,時(shí)間復(fù)雜度(O(N))。

for (int i = 2 ; i <= N ; i ++)

INV[i] = P - (P / i) * INV[P % i] % P;

當(dāng)然不要忘了初始化的問(wèn)題。

總結(jié)

以上是生活随笔為你收集整理的乘法逆元 java_浅谈乘法逆元(示例代码)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。