乘法逆元: 扩展欧几里德 费马小定理 递推 带余数同余式的一般解法

定义


ax1(modp),(a,p)=1

则称x为a的乘法逆元(mod p)。
//其中(a, b) 表示a和b的最大公约数。

有解条件

正如上面所言,当且仅当a和p互素时,a才有关于p的乘法逆元x。

求解方法

先总结一些这里要讲的四种情况

1. 拓展欧几里德求逆元
2. 费马小定理求逆元
3. 递推求[1, .., n]逆元
4. 不求逆元也可以解带除法的同余式

  • 拓展欧几里德求逆元
     欧几里德可以求ax + by = (a, b)中的x和y, 所以这里只要求出 ax + py = 1中的x即可, 这也是为什么(a, b)要等于1的原因。
 LL Inv(LL a, LL p) {
    LL x, y, d;
    d = extgcd(a, p, x, y)
    if(d == 1) return (x%p+p)%p;
    return -1;
}
  • 费马小定理求逆元
//费马小定理 a^(p-1) === 1(mod p)
//inv(a) === a^(p-2) (mod p);
LL pow_mod(LL a, LL b, LL mod) {
    LL r = 1; a %= mod;
    while(b) {
        if(b&1) r = (r*a) % mod;
        a = (a*a) % mod;
        b >>= 1;
    }
    return r;
}
LL Inv(LL a, LL p) {    //前提是a,p互素且p为素
    return pow_mod(a, p-2, p);
}

费马小定理的定义如下:

ap11(modp),(a,p)=1

当且仅当a与p互素时成立, 故上式可以变形为
aap21(modp)

那么a的逆元就是 ap2 了。
这里使用快速幂加速计算。

  • 递推求[1, .., n]逆元
//O(n)时间求[1,,n]内所有数的逆元(n < p 且 p 为素)
int inv[maxn];
void invTable(int n, int p, int inv[]) {
    inv[1] = 1;
    for(int i = 2; i <= n; ++i)
        inv[i] = (p-p/i) * inv[p%i] % p;
}

递推式的证明如下

设如下变量:
inv[i]: i 的逆元(mod p), 其中i < p, inv[i] < p。
k  : p  / i
b  : p % i       //即 p = k * i + b, 显然b < i

则要证 inv[i]=(ppi)inv[p(modi)](modp)
即证 inv[i]=(pk)inv[b](modp)

下证:

易知

ki+b0(modp)

两边除以i得
k+bi0(modp)

即(保证同余式两边皆为最小剩余)
binv[i]k(modp)pk(modp)

两边除以b得
inv[i]pkb(modp)

inv[i](pk)inv[b](modp)

得证。

 另外补充一点也许很重要的知识:[1,,p-1]的逆元(mod p)对应[1,,p-1]的每一个数,即它们都是p的最小剩余系(除去0外)。
关于这一点的证明, 显然逆元也都是最小剩余,所以只要使用反证法证得任意两个数的逆元不相等即可。


  • 不求逆元也可以解带除法的同余式(x为最小剩余即 x < p)

xab(modp)

等价于
x=a(mod(bp))b

此式的证明如下

xab(modp)

ab=kp+x

其中k为任意整数, x < p, 移项得
a=kpb+xb

将此转为同余式得
xba(modpb)

将b除过去得
x=a(mod(pb))b

得证

注意模数(b*p)可能会很大,取模之后不一定是int型(可用快速乘取模解决)。

应用

主要用于求带除法的同余式。

Grids HDU - 4828
Sumdiv POJ - 1845
沙拉公主的困惑 HYSBZ - 2186

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值