求解乘法逆元

费马小定理

适用条件: m o d mod mod是素数
整数 a a a,质数 p p p
如果 a a a p ^{p} p − a - a a p p p 的倍数, a p ≡ a ( m o d a^p ≡ a (mod apa(mod p ) p) p)
如果 a a a 不是 p p p 的倍数, a a a p − 1 ^{p-1} p1 ≡ 1 ( m o d ≡ 1 (mod 1(mod p ) p) p)
所以 a a a p − 2 ^{p-2} p2 * a ≡ 1 ( m o d ≡ 1 (mod 1(mod p ) p) p)
所以 a a a p − 2 ^{p-2} p2 a a a 在模 p p p下的逆元

ll M(ll a) {return a%mod;}//取模
ll Pow(ll a,ll b = mod-2){ll c; while(b){if(b&1) c=M(c*a); b>>=1; a=M(a*a);} return c;}//快速幂

在这里插入图片描述

扩展欧几里得

适用条件:存在逆元,个数不多, m o d mod mod很大
a x ≡ 1 ( m o d p ) ax≡1 (mod p) ax1(modp) a x − y p = 1 ax-yp=1 axyp=1.
y y y写成 + + +的形式就是 a x + p y = 1 ax+py=1 ax+py=1
x x x a a a 的模 p p p 乘法逆元, y y y b b b 的模 a a a 乘法逆元。

void exgcd(ll a,ll b,ll &d,ll &x,ll &y) {//扩展欧几里得算法 
    if(!b) { d = a; x = 1; y = 0; return;}
    exgcd(b, a%b, d, y, x); 
    y -= x*(a/b);
}

ll inv(ll a, ll p) {//求a在p下的逆元,不存在逆元返回-1 
    ll d, x, y;
    exgcd(a, p, d, x, y);
    return d==1 ? (x+p)%p : -1;
}

在这里插入图片描述

递归法

ll inv(int i) {return i==1 ? 1 : (mod - mod/i) * inv(mod%i) % mod;}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值