乘法逆元

满足x与y的乘积对z取模等于1时,x和y对于模数z来说互为逆元
即 x*y=1(mod z)
为什么要求逆元呢?
比如求 (b/a)mod p 时,如果b大到不可直接求出,我们可以先求出在模数p下与a互为逆元的数x,那么 (b/a)mod p 转化成 (b*x)mod p

证明略。。。

求逆元:
方法一(a和p互质,扩展欧几里算法):
:a * x + p * y = gcd( a , p )
等号两边同时对b取模:a * x % p = gcd( a , p )%p
当 gcd( a , p ) = 1 ,即a和p互质时:a * x % p = 1
得到了在模p下与a互为逆元的数x
注意:求出来x和p可能不同号,所以一定要判断并将x加p使之同号。!!!

x=(x%p+p)%p;

方法二(p是素数,费马小定理):
a的逆元就是a的p-2次方

方法三:
这里写图片描述

方法四(p素数):
O(p)求1~p内模p的所有逆元:
这里写图片描述
初始化 inv[1]=1,循环一遍即可求出所有逆元

方法五(阶乘的逆元):
O(n)求1~n,所有数的阶乘的逆元
inv[ (n-1)! ] = inv[ n! ] * n
用以上方法求出 n! 的逆元之后,循环一遍即可求出其他阶乘的逆元

更多方法及证明见此处

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值