在数论中,如果 ,我们就说
和
在模
意义下互为乘法逆元,记作
。
逆元有什么用呢?我们常常遇到一些题目要求结果对一个大质数
取模,这是因为答案很大,出题人为了不麻烦大家写高精,就采取这样的方法。加减法和乘法对取模运算都是封闭的,所以你可以处处取模来避免溢出。 但遇到除法时,就比较麻烦——因为处处取模和最后取模的结果是不一样的。 为了解决模意义下的除法问题,我们引入了逆元。
其实可以看做模
意义下的
,那么在模
意义下,
就可以变形为
。
求逆元
求逆元共有三种方法:
- 拓展欧几里得
- 费马小定理
- 线性递推
拓展欧几里得
其实这篇文章里的那道例题就是了 拓展欧几里得
必须要最后的公约数等于 1,即a和p 两个数互质才能求出逆元ll exgcd(ll a, ll b, ll &x, ll &y)// 拓欧{if (b == 0){x = 1;y = 0;return a;}ll d = exgcd(b, a % b, y, x);y -= (a / b) * x;return d;}ll inv(ll a, ll p){ll x, y;if (exgcd(a, p, x, y) != 1) // 无解的情形return -1;return (x % p + p) % p;}
费马小定理
费马小定理是数论里的重要定理,叙述如下:若
是质数,且
,则有
从逆元的定义推导,可得 ,于是有
inline ll qpow(ll a, ll n, ll p)// 快速幂 (a^n)%p{ll ans = 1;while (n){if (n & 1)ans = ans % p * a % p;a = a % p * a % p;n >>= 1;}return ans;}inline ll inv(ll a, ll p)//求逆元{return qpow(a, p - 2, p);}
线性递推
还没学,先不写了。
