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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

乘法逆元总结 3种基本方法

發(fā)布時(shí)間:2024/10/8 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 乘法逆元总结 3种基本方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

逆元

逆元(inverse element)是在取模意義下,不能直接除以一個(gè)數(shù),而要乘以它的逆元;a*b ≡\equiv 1 (mod p) , 那么a和b互為模p意義下的逆元,比如要計(jì)算(x/a)%p,可以寫成x*b%p;

方法一

費(fèi)馬小定理

若P為素?cái)?shù),則 ap?1{a^{p-1}}ap?1 ≡\equiv 1 (mod p) 【費(fèi)馬小定理】
即:ap?2{a^{p-2}}ap?2 *a ≡\equiv 1 (mod p)
所以ap?2{a^{p-2}}ap?2就是a在模p意義下的逆元

const LL mod = 1e9+7; //快速冪 LL fastPow(LL a,LL b){LL ans=1;while(b){if(b&1)ans=(ans*a)%mod;a=(a*a)%mod;b>>=1;}return ans; } //求x的逆元 LL inv(LL x){return fastPow(x,mod-2); }

歐拉定理

若a和p互素(P不一定是素?cái)?shù)),則a?(p){a^{\phi{(p)}}}a?(p) ≡\equiv 1 (mod p)
a?(p)?1?a{a^{\phi{(p)}-1}}*aa?(p)?1?a ≡\equiv 1 (mod p)
所以a?(p)?1{a^{\phi{(p)}-1}}a?(p)?1 就是a在模p意義下的逆元

聯(lián)系

?(p){\phi{(p)}}?(p)稱為歐拉函數(shù),表示小于等于P且與P互素的個(gè)數(shù),顯然若p為素?cái)?shù),則?(p)=p?1{\phi{(p)}}=p-1?(p)=p?1

const LL mod = 1e9+7; //求歐拉函數(shù) long long phi(long long x) {long long res = x;for(long long i=2;i*i<=x;i++){if(x%i==0){res = res/i*(i-1);//res -= res/i;while(x%i==0)x/=i;}}if(x>1)res =res/x*(x-1);//res -= res/x;return res; } //快速冪 LL fastPow(LL a,LL b){LL ans=1;while(b){if(b&1)ans=(ans*a)%mod;a=(a*a)%mod;b>>=1;}return ans; } //求x的逆元 LL inv(LL x){return fastPow(x,phi(mod)-1); }

方法二

擴(kuò)展歐幾里得算法

a*b ≡\equiv 1 (mod p)
a * b+k * p = 1
a就是要求的逆元

LL exgcd(LL a,LL b,LL &x,LL &y)//擴(kuò)展歐幾里得算法 {if(b==0){x=1,y=0;return a;}LL ret=exgcd(b,a%b,y,x);y-=a/b*x;return ret; } LL getInv(LL a,LL mod)//求a在mod下的逆元,不存在逆元返回-1 {LL x,y;LL d=exgcd(a,mod,x,y);return d==1?(x%mod+mod)%mod:-1; }

方法三:遞推求逆元

P是模數(shù),i是待求的逆元,我們求的是i?1{i^{-1}}i?1在mod P意義下的值
p=k*i+r,若(r<i),則有k=p/i,r=p%i
k * i+r ≡\equiv 1 (mod p)
兩邊同時(shí)除以i*r, k?r?1+i?1≡0(modP){k*r^{-1}+i^{-1} \equiv 0 (mod P) }k?r?1+i?10(modP)
移項(xiàng)得:i?1≡?k?r?1(modP){i^{-1} \equiv -k*r^{-1} (mod P) }i?1?k?r?1(modP)
即:i?1≡?p/i{i^{-1} \equiv -p/i}i?1?p/i * inv[i % mod p]
邊界條件是 inv[1]=1

LL inv[mod+5]; void getInv(LL mod) {inv[1]=1;for(int i=2;i<mod;i++)inv[i]=(mod-mod/i)*inv[mod%i]%mod; }

總結(jié)

以上是生活随笔為你收集整理的乘法逆元总结 3种基本方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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