欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

逆元超详解

最编程 2024-03-05 22:42:28
...

目录

逆元的概念:

逆元的用处:

逆元的四种求法:

快速幂求逆元

扩展欧几里得求逆元

欧拉函数求逆元

线性递推求逆元:

逆元是什么?有什么作用?怎么求逆元呢?

逆元的概念:

  • 如果 a * x \equiv 1 (mod p) 成立,那么 x 是 a 在 mod m 的条件下的逆元
  • 注意,a和x一定都和p互质,如果不互质,则逆元不存在

逆元的用处:

计算a / b(mod p ) 的值时,如果 b 是一个很大的数,那么会爆double的精度;假设除数 b 的逆元为 inv[b] ,那么可做如下转换

a / b (mod p) \equiv 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为素数的前提下,a^{p-1} \equiv​1 (mod p)

将费马小定理变形一下 ——》 a^{p-2}​ * a \equiv1 (mod p)

由此可得,a的逆元就是 a^{p-2}​ (mod p)

所以,用快速幂求出a^{p-2}​的结果就行了;

扩展欧几里得求逆元

传送门:扩展欧几里得

由 a * x \equiv1(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^{\varphi (p)} \equiv 1 (modp)

则 : a^{\varphi (p)-1}​ * a \equiv 1(mod p)

得出 a^{\varphi (p)-1}​ 就是 a 在mod p 意义下的逆元

线性递推求逆元:

递推公式:

  • inv[1] = 1
  • inv[i] = (p-p/i) * inv[p%i] % p (i>=2开始递推)