乘法逆元总结 3种基本方法
逆元
逆元(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意義下的逆元
歐拉定理
若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就是要求的逆元
方法三:遞推求逆元
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?1≡0(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
總結(jié)
以上是生活随笔為你收集整理的乘法逆元总结 3种基本方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ1741 Tree 树中点对统计【
- 下一篇: 2018ACM-ICPC Asia Na