C++ 逆元

C++ 快速幂求逆元

问题引入

在这里插入图片描述

定义

a ⋅ c = 1 ( m o d b ) a\cdot c= 1(modb) ac=1(modb),且a与b互质,就定义c为a的逆元,记作 a − 1 a^{-1} a1
也可以叫做c为a在mod p意义下的倒数。

应用

若需求 a b ( m o d P ) \frac{a}{b}(modP) ba(modP), 可转化为求 b ( m o d p ) b(mod p) b(modp)下的逆元,然后乘 a a a,再 m o d P modP modP, 即为所求。

在这里插入图片描述

核心思想

费马小定理
费马小定理, 只适用于模数为质数的情况,
如果p是一个质数,且a不是p的倍数则有
a ( p − 1 ) ≡ = 1 ( m o d P ) a^{(p-1)}\equiv=1(modP) a(p1)=1(modP)
两边同除以a
a ( p − 1 ) ≡ = a − 1 ( m o d P ) a^{(p-1)}\equiv=a^{-1}(modP) a(p1)=a1(modP)
所以
a − 1 ≡ = a ( p − 2 ) ( m o d P ) a^{-1}\equiv=a^{(p-2)}(modP) a1=a(p2)(modP)

核心代码

int qmi(int a, int b, int p){
	int res = 1;
	if(a % p == 0){
		res = -1;
	}
    else{
		while (b-2){
        	if (b & 1) res = res * a % p;
        	a = a * a % p;
        	b >>= 1;
    	}
    }
    return res;
}

主要借鉴该文章

原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞滕人生TYF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值