逆元浅析

单独的考逆元,现在已经不多了
但是掌握很有必要

逆元是什么

当题目中最终答案太大时,往往会要求我们模一个数。这样的题往往是 d p 、递推之类。所以我们要步步取模。但如果某一步中出现了除法,或者一道概率 d p 要求答案取模,这时就要涉及到模意义下的除法。
例如:a/b%m.这时我们将式子变形得到 a × 1 b mod m 这样就得到了一个乘法。
设c是逆元,得 b 1 c ( m o d m )
b × c 1 ( m o d m )

怎么求单个的逆元

显然可以用 e x g c d 解这个方程。
b × c + m × k = 1
求得最小的一个 c 即可。
还有,注意到了这个方程是不一定有解的,意思就是说不一定有逆元。但注意到 m 为质数一定有解。这为接下来的线性求逆元提了个醒:只有质数才能线性求逆元。
另外一种做法,是使用欧拉定理。
有欧拉定理有:

a ϕ ( p ) 1

所以逆元可求为 b ϕ ( m ) 1
注意到这个不能判断是否有逆元,使用时要注意。然后具体操作时,只需打一个快速幂就可以了。(一般模的是质数,所以 ϕ ( p ) = p 1 );

怎么线性求逆元

逆元有一种线性求法,就是在 O ( n ) 内求1~n的逆元。
具体推理与操作过程如下;

p = k × i + r

p 0 ( mod p )

k × i + r 0 ( mod p )

为了强行构造逆元,我们同乘 i 1 × r 1
k × r 1 + i 1 0 ( mod p )

i 1 k × r 1 ( mod p )

i 1 [ p i ] × ( p mod i ) 1 ( mod p )

实际操作中仍有以下两点需要注意

  1. 注意到右边是一个负数,实际中要加p再去模。
  2. 注意到这里只能求比p小的逆元,实际上比p大的模一个p就可以了。

代码

会后续补充…….

猜你喜欢

转载自blog.csdn.net/jh_2002/article/details/80739254