模运算公式整理

数论 - 模运算

加减乘除

(个人习惯, m o d mod mod 表示用来取模的数。)

加法: ( a + b ) % m o d = ( a % m o d + b % m o d ) % m o d (a+b) \% mod = (a \%mod + b\%mod)\%mod (a+b)%mod=(a%mod+b%mod)%mod

减法: ( a − b ) % m o d = ( a % m o d − b % m o d ) % m o d (a-b) \% mod = (a \%mod - b\%mod)\%mod (ab)%mod=(a%modb%mod)%mod

乘法: a × b % m o d = ( a % m o d × b % m o d ) % m o d a \times b \%mod=(a\%mod\times b\%mod)\%mod a×b%mod=(a%mod×b%mod)%mod

除法:

  • 可以用逆元:

    • b a % m o d = b × a m o d − 2 % m o d \frac ba\%mod=b\times a^{mod-2}\%mod ab%mod=b×amod2%mod,其中 m o d mod mod 为素数(根据费马小定理)。
    • b a % m o d = b × a ϕ ( m o d ) − 1 % m o d \frac ba\%mod=b \times a^{\phi(mod)-1}\%mod ab%mod=b×aϕ(mod)1%mod,其中 a a a m o d mod mod 互质(根据欧拉定理)。但也可以由欧拉函数的性质推出, a ϕ ( m o d ) − 1 a^{\phi(mod)-1} aϕ(mod)1 = a m o d − 1 − 1 =a^{mod-1-1} =amod11 = a m o d − 2 =a^{mod-2} =amod2
  • 不能用逆元: b a % m o d = a % m o d × b b \frac ba\%mod=\frac {a\%mod\times b}{b} ab%mod=ba%mod×b

    • 证明:
      a b m o d    k = d a b = k x + d a = k b x + b d a m o d    k b = b d a m o d    k b b = d \frac ab\mod k = d \\ \frac ab=kx+d\\ a=kbx+bd\\ a\mod kb=bd\\ \frac {a \mod kb}{b}=d bamodk=dba=kx+da=kbx+bdamodkb=bdbamodkb=d

板子如下:

LL qm (LL a, LL b ,LL c){  //要取模
    LL res = 1;
    while(b){
        if(b & 1)
            res = res * a % c;
        a = a * a % c;
        b = b >> 1;
    }
    return res;
}
LL inv(LL x) {return qm(x, mod - 2, mod);}
//四种取模运算
LL add(LL x, LL y) {return (x % mod + y % mod) % mod;}
LL sub(LL x, LL y) {return (x % mod - y % mod) % mod;}
LL mul(LL x, LL y) {return x * y % mod;}
LL div_1(LL x, LL y) {return x * inv(y) % mod;}  //可以求逆元的情况
LL div_2(LL x, LL y) {return x % mod * y / y;}  //不能求逆元的情况

幂运算

欧拉降幂。
a b % p = { a b % ϕ ( p ) % p g c d ( a , p ) = 1 a b % p g c d ( a , p ) ≠ 1 , b < ϕ ( p ) a b % ϕ ( p ) + ϕ ( p ) % p g c d ( a , p ) ≠ 1 , b ≥ ϕ ( p ) a^b\%p=\left\{ \begin{aligned} &a^{b\%\phi(p)}\%p& \quad gcd(a,p)=1\\ &a^b\%p& \quad gcd(a,p) \neq1,b<\phi(p)\\ &a^{b\%\phi(p)+\phi(p)}\%p& \quad gcd(a,p) \neq1,b\ge\phi(p)\\ \end{aligned} \right . ab%p=ab%ϕ(p)%pab%pab%ϕ(p)+ϕ(p)%pgcd(a,p)=1gcd(a,p)=1,b<ϕ(p)gcd(a,p)=1,bϕ(p)

此处仅给出第三种情况(常用)的代码。

LL qm(LL a, LL b, LL c) {
    LL res = 1;
    while (b) {
        if (b & 1) res = res * a % c;
        a = a * a % c;
        b >>= 1;
    }
    return res;
}

LL jm(LL a, LL b) {  //欧拉降幂
    LL mi = b % phi(mod) + phi(mod);
    return qm(a, mi, mod);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值