乘法逆元

微笑、不失礼 提交于 2020-01-22 21:23:06

普通求逆元

\[ax≡1\ (mod\ p)\]

其中\(x\)就是\(a\)在模\(p\)意义下的乘法逆元\((inv)\)

\(gcd(a,p)=1\)时存在,即\(a\)在模\(p\)意义下有逆元的充要条件是\(a,\ p\)互质

计算等价于解方程\(ax+bp=1\)

定义了剩余系中的除法\(\frac{a}{b}≡a × inv_p(b)\ (mod\ p)\)

费马小定理也求乘法逆元

费马小定理:若\(p\)为质数,且\(gcd(a,p)=1\)\(a,\ p\)互质),那么\(a^{p-1}≡1(mod\ p)\)

两侧同除\(a\),即得到\(a\)的逆元:\(inv_p(a)≡a^{p-2}(mod\ p)\),用快速幂计算即可

线性求逆元

\(p=ka+b(1<a<b<p)\),得

\[ka+b≡0\ (mod\ p)\]

等式两边同除\(ab\),得

\[inv(a)≡-k×inv(b)\ (mod\ p)\]

\[inv(a)≡-\lfloor\frac{p}{a} \rfloor×inv(p\ mod\ a)\ (mod\ p)\]

\(code:\)

for(int i=2;i<=n;++i) inv[i]=(p-p/i)*inv[p%i]%p;

/*inv[i]=-p/i*inv[p%i];
inv[i]=((inv[i])%p+p)%p;*/

若所需求逆元的数不连续,考虑用前缀积解决

\(s_i=\prod\limits_1^na_i\)

先求出\(inv(s_n)\),那么\(inv(a_n)=inv(s_n)×s_{i-1}\)

同时\(inv(s_{i-1})=inv(s_i)×a_i\)

于是便可以递推求解

\(code:\)

for(int i=n;i;--i)
{
    inv[i]=(s[i]*s[i-1])%mod;
    s[i-1]=(s[i]*a[i])%mod;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!