费马小定理

定理

若 \(p\) 是质数,且整数 \(a\) 满足 \(\boldsymbol{a \not\equiv 0 \pmod p}\),则:

\a\^{p-1} \\equiv 1 \\pmod p \\

变形

  1. \(a^{p-2} \equiv a^{-1} \pmod p\)

  2. \(a^b \equiv a^{b \bmod (p-1)} \pmod p\)

前提:p为质数

运用

乘法逆元

在模质数 \(p\) 意义下,除法不能直接算,要乘逆元:

\\\frac{x}{y} \\pmod p = x \\times y\^{-1} \\pmod p \\

由费马:\(y^{-1}=y^{p-2}\pmod p\),用快速幂计算。

适用场景:组合数 \(\mathrm{C}_n^k \bmod p\),p为质数。

2. 快速幂降幂

求 \(a^b \bmod p\),当 \(b\) 极大,p质数,a、p互质:

\a\^b \\equiv a\^{b \\bmod (p-1)} \\pmod p \\

素数测试

随机选若干个a,检验 \(a^{p-1}\equiv1\pmod p\)

满足大概率(存在伪素数)是质数,不满足一定是合数。


模版

cpp 复制代码
typedef long long ll;
ll qpow(ll a,ll b,ll mod){
    ll res=1;
    while(b){
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
// 求a在模质数p下逆元
ll inv(ll a,ll p){
    return qpow(a,p-2,p);
}

例题

P2613

题目:给出 \(a,b,p\),求 \(\dfrac{a}{b} \bmod 19260817\),\(19260817\)是质数。

式子:

\\\frac{a}{b} \\equiv a \\times b\^{mod-2} \\pmod{mod} \\

片段:

cpp 复制代码
const int mod=19260817;
ll a,b;
cin>>a>>b;
ll ans=a%mod * qpow(b,mod-2,mod)%mod;

P3811

单点求逆元用费马快速幂

但本题n范围大 \(1\le n\le 3\times10^6\),费马快速幂会TLE,要用线性递推逆元。