乘法逆元
在模意义下,我们有 amodc+bmodc=(a+b)modc,amodc−bmodc=(a−b)modc,(amodc)×(bmodc)=abmodc,但是没有 bmodcamodc=bamodc。
那,在模意义下遇到除法该怎么办呢?
我们有乘法逆元。
定义 a 模 p 意义下的乘法逆元为 a−1,a×a−1≡1(modp)。
当 gcd(a,p)=1 时,乘法逆元才存在。否则设 b∈[0,p),gcd(a×b,p)>1 也成立,要么 p∣a×b,要么 a×bmodp>1。
由于质数与比它小的数都互质,所以模质数 p 意义下所有非零元都有乘法逆元,这就成了一个域。
乘法逆元的求法
拓展欧几里得算法
根据逆元的定义,设 x 为 a 的逆元,ax≡1(modm),那么 ax−by=1,可以直接用拓欧求解,时间复杂度为 O(loga),一般情况下跑不满。
费马小定理
费马小定理 ap≡a(modp),其中 p 为任意质数而 a 为与其互质的任意整数。
证明在这里。
根据费马小定理,ap−1≡1(modp),ap−2×p≡1(modp),所以 ap−2 就是 a 的逆元。
用快速幂单次求时间复杂度可以达到 O(logp),比拓欧慢,但是写起来简单。
O(n) 预处理 1∼n 的逆元
神奇的思路。假设 1∼i−1 的逆元已求出,现在要求 i 的逆元。
模数 p 可以表示为 ki+r,那么 ki+r≡0(modp)。
两边同时乘以 i−1r−1 得 kr−1+i−1≡0(modp),i−1≡−kr−1(modp)。
r−1 是已经求出的,于是就可以线性求逆元了。
O(n) 预处理 1!,2!,…,n! 的逆元
显然 (n!)−1=∏i=1ni−1,求完 1∼n 的逆元后再跑一遍前缀积即可。