目录
逆元是什么?有什么作用?怎么求逆元呢?
逆元的概念:
- 如果 a * x 1 (mod p) 成立,那么 x 是 a 在 mod m 的条件下的逆元
- 注意,a和x一定都和p互质,如果不互质,则逆元不存在
逆元的用处:
计算a / b(mod p ) 的值时,如果 b 是一个很大的数,那么会爆double的精度;假设除数 b 的逆元为 inv[b] ,那么可做如下转换
a / b (mod p) a * inv[b] ( mod p )
把除法转变成了乘法,避免的精度的损失;为什么上述式子是等价的呢?
设 b * k = 1 (mod p) 则 k 就是 b 的逆元(即 k = inv[b]) ;
所以 b = (m * p +1) / k ,
那么 a / b = a /( (m * p +1)/k )mod p = a * k/(m * p + 1)mod p
=a * k (mod p)
如此妙哉~
逆元的四种求法:
快速幂求逆元
快速幂求逆元的前提是费马小定理的成立:
费马小定理
- 在模数p为素数的前提下, 1 (mod p)
将费马小定理变形一下 ——》 * a 1 (mod p)
由此可得,a的逆元就是 (mod p)
所以,用快速幂求出的结果就行了;
扩展欧几里得求逆元
传送门:扩展欧几里得
由 a * x 1(mod p) 得 a*x = y0 * p +1 令y=-y0, b = p;
推出:ax + by = 1 (注意:前提gcd(a,b) == 1)
然后用扩欧解方程即可,得出来的 x 就是 a 在mod p 意义下的逆元
欧拉函数求逆元
传送门:欧拉函数
- 欧拉定理:若 a 和 p 互素 ,设Φ(p) 为小于p且与p互素的正整数的个数,则有
则 : * a
得出 就是 a 在mod p 意义下的逆元
线性递推求逆元:
递推公式:
- inv[1] = 1
- inv[i] = (p-p/i) * inv[p%i] % p (i>=2开始递推)