在数论中,如果 ,我们就说 和 在模 意义下互为乘法逆元,记作 。
逆元有什么用呢?我们常常遇到一些题目要求结果对一个大质数 取模,这是因为答案很大,出题人为了不麻烦大家写高精,就采取这样的方法。加减法和乘法对取模运算都是封闭的,所以你可以处处取模来避免溢出。 但遇到除法时,就比较麻烦——因为处处取模和最后取模的结果是不一样的。 为了解决模意义下的除法问题,我们引入了逆元。 其实可以看做模 意义下的 ,那么在模 意义下, 就可以变形为 。
求逆元
求逆元共有三种方法:
- 拓展欧几里得
- 费马小定理
- 线性递推
拓展欧几里得
其实这篇文章里的那道例题就是了 拓展欧几里得
必须要最后的公约数等于 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);
}
线性递推
还没学,先不写了。