求逆元的三种方法

1什么是逆元?


如果 1/a ≡ x ( mod p ),称 x 是 a 的逆元(在 mod p 意义下,p 为一个大质数)。你可能会不理解吧,1/a 不是整数啊,x 却是整数,怎么会有同余关系呢?你可以理解成 ·b 和 /a 的效果是一样的,即除以 p 的余数是一样的。比如 b 是 a 的倍数,x 是 a 的逆元,那么一定有 b · x ≡ b / a ( mod p )。


2求法一(扩展欧几里得算法)


如果 x 是 a 的逆元,那么显然 x · a ≡ 1 ( mod p ),x · a - 1 ≡ 0 ( mod p )。假设 x · a -  1 = py,所以 ax + py = 1。由于 a 和 p 互质,即 gcd ( a,p ) = 1,这个不定方程就可以用 扩展欧几里得算法 来求解了,求得的 x 即为 a 的逆元。


3求法二(费马小定理与快速幂)


x · a ≡ 1 ( mod p ),即一个 a 的倍数 mod p = 1,这是不是让你想起了 费马小定理?a ^ ( p - 1 ) ≡ 1 ( mod p ),其中 p 是质数,当然这只是 欧拉定理 的一个特例。因此 x = a ^ ( p - 2 ) 为 a 的逆元。在用编程来求 a ^ ( p - 1 ) 时,如果直接一个一个乘,显然太慢了(p 是一个大质数)。其实,求较大幂次有一个很好实现又很快的方法:快速幂,时间复杂度是 log 级别的。


4求法三(线性批量求逆元)


p 可以写成 ak + r,其中 r 为除以 a 的余数。ak + r ≡ 0 ( mod p ),两边同时乘以 a^(-1) · r^(-1),得到 k · r^(-1) + a^(-1) ≡ 0 ( mod p )。再移项,得到 a 的逆元 a^(-1) ≡ - k · r^(-1) ( mod p )。r^(-1) 是 r 的逆元,这相当于一个递推的过程。即如果 i 的逆元记作 inv[ i ],则 inv[ i ] ≡ - ( p / i ) · inv [ p mod i ] ( mod p )。这样做的好处是可以线性求得很多个数的逆元,但同时需要一定的存储空间。


5后记


针对不同的题目,应选取不同的做法,这 3 种求逆元的方法也各有千秋。现在你知道如何快速求组合数 C ( m,n ) mod p 了吧?

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值