视频加载失败

取模与逆元

1613 字
8 分钟
取模与逆元

定义#

对于两个数 aa 和 bb,a,b∈Za,b\in \mathbb{Z},则如果存在整数 cc,dd,使得 bc+d=abc+d=a,且保证 0≤∣d∣<b0\leq \lvert{d}\rvert \lt b,则称 cc 是 aa 除以 bb 的商,dd 是 aa 除以 bb 的余数,也被称为 aa 模 bb 的结果,记作 a mod b=da\bmod{b}=d.取模运算和乘除拥有同一运算优先级.

对于两个整数 aa 和 bb,如果有整数 pp,使得 a mod p=b mod pa\bmod{p} = b\bmod{p},则称 aa 和 bb 对模 pp 同余,记作 a≡b(modp)a\equiv b\pmod p,像这样的式子叫做同余方程.

对于两个整数 aa 和 pp,如果 a≡0(modp)a\equiv 0\pmod p,则 pp 整除 aa,记作 p∣ap \mid a .

性质#

同余的基本性质#

对于两个整数 a,ba,b,如果有 a≡b(modp)a\equiv b\pmod p,则可得 p∣a−bp \mid a - b

证明:

由已知可得:

{k1p+n=ak2p+n=b\left\{ \begin{aligned} & k_1p+n=a \\ & k_2p+n=b\end{aligned} \right.

其中,

n,k1,k2∈Zn,k_1,k_2\in\mathbb{Z}

所以:

a−b=k1p+n−k2p−n=k1p−k2p=p(k1−k2)⇒a−b≡0(modp)⇒p∣a−b\begin{aligned} a-b &=k_1p+n-k_2p-n\\ &=k_1p-k_2p\\ &=p(k_1-k_2)\\ &\Rightarrow a-b\equiv 0\pmod p \\ &\Rightarrow p \mid a-b \end{aligned}

加法性质#

对于整数 a,b,c,d,pa,b,c,d,p,如果有:

{a≡b(modp)c≡d(modp)\left\{ \begin{aligned} & a\equiv b\pmod p \\ & c\equiv d\pmod p\end{aligned} \right.

则有:

(a+c)≡(b+d)(modp)(a+c) \equiv (b+d)\pmod p

证明:

由已知条件可得:

{k1p+n=ak2p+n=bk3p+m=ck4p+m=d\left\{ \begin{aligned} & k_1p+n=a \\ & k_2p+n=b \\ & k_3p+m=c \\ & k_4p+m=d\end{aligned} \right.

其中,

n,m,k1,k2,k3,k4∈Zn,m,k_1,k_2,k_3,k_4\in\mathbb{Z}

所以:

(a+c)=k1p+n+k3p+m=(k1+k3)p+m+n(a+c) mod p=m+n\begin{align*} (a+c)&=k_1p+n+k_3p+m\\&=(k_1+k_3)p+m+n\\(a+c)\bmod p &= m+n\end{align*}

同理:

(b+d) mod p=m+n(b+d)\bmod p=m+n

所以:(a+c)≡(b+d)(modp)(a+c) \equiv (b+d)\pmod p

加法性质的引申性质#

对于整数 a,b,c,d,pa,b,c,d,p,如果有:

{a≡b(modp)c≡d(modp)\left\{ \begin{aligned} & a\equiv b\pmod p \\ & c\equiv d\pmod p\end{aligned} \right.

则有:

a−c≡b−d(modp)a-c \equiv b-d\pmod pa×c≡b×d(modp)a\times c \equiv b\times d\pmod pac≡bd(modp)a^c \equiv b^d\pmod p

移项和约分#

同余方程允许移项.

对于整数 a,b,c,pa,b,c,p,如果有:

a≡b+c(modp)a\equiv b+c\pmod p

则有:

a−c≡b(modp)a-c \equiv b\pmod p

证明:

a≡b+c(modp)a−c≡b+c−c(modp)a−c≡b(modp)\begin{align*} a&\equiv b+c\pmod p\\ a-c&\equiv b+c-c\pmod p\\ a-c&\equiv b\pmod p \end{align*}

同余方程允许约分.

对于整数 a,b,pa,b,p,如果有:

a≡b(modp)a\equiv b\pmod p

且 cc 是 a,b,pa, b, p 的公因数,则有:

ac≡bc(modpc)\frac{a}{c} \equiv \frac{b}{c}\pmod {\frac{p}{c}}

证明:

由已知条件可得:

{k1p+n=ak2p+n=b\left\{ \begin{aligned} & k_1p+n=a \\ & k_2p+n=b \end{aligned} \right.

其中,

n,k1,k2∈Zn,k_1,k_2\in\mathbb{Z}

所以:

ac mod pc=k1p+nc mod pc=(k1pc+nc) mod pc=nc\begin{aligned} \frac{a}{c}\bmod \frac{p}{c}&=\frac{k_1p+n}{c}\bmod \frac{p}{c}\\ &=(k_1\frac{p}{c}+\frac{n}{c})\bmod \frac{p}{c}\\ &=\frac{n}{c} \end{aligned}

同理可证,

bc mod pc=nc\frac{b}{c}\bmod \frac{p}{c}=\frac{n}{c}

所以:

ac≡bc(modpc)\frac{a}{c} \equiv \frac{b}{c}\pmod {\frac{p}{c}}

逆元#

若 ab≡1(modp)ab\equiv 1\pmod p,且 a,b,p∈Za,b,p \in \mathbb{Z} ,则称 aa 和 bb 互为模 pp 下的逆元,aa 的逆元可以记作 a−1a^{-1}.若 aa 和 pp 不互质,则不存在 a−1a^{-1}.

特别的,1 的逆元总是 1.

那么,逆元在 OI 中有什么用呢?

众所周知,取模有以下性质:

a mod p+b=(a+b) mod pa \bmod p + b = (a + b) \bmod pa mod p−b=(a−b) mod pa \bmod p - b = (a - b) \bmod pa mod p×b=(a×b) mod pa \bmod p \times b = (a \times b) \bmod p

但取模有以下性质吗?

a mod p÷b=?(a÷b) mod pa \bmod p \div b \overset{\text{?}}{=} (a \div b) \bmod p

随便取个特殊值,当 aa 为 15,bb 为 5,pp 为 10 时,a mod p÷b=1a \bmod p \div b = 1,(a÷b) mod p=3(a \div b) \bmod p = 3,显然不成立.

那该怎么办呢?又不可能在程序的最后才取模,那样早报 long long 了.

在取模运算中,除以一个数等于乘它的逆元.故拥有以下性质:

(a÷b) mod p=a mod p×b−1(a \div b) \bmod p = a \bmod p \times b^{-1}

除法性质#

对于整数 a,b,ca,b,c,如果有:

ac≡bc(modp)\begin{aligned} & ac\equiv bc\pmod p\end{aligned}

则有:

a≡b(modp)a \equiv b\pmod p

证明:

ac≡bc(modp)ac⋅c−1≡bc⋅c−1(modp)a≡b(modp)\begin{aligned} ac&\equiv bc\pmod p\\ ac\cdot c^{-1}&\equiv bc\cdot c^{-1} \pmod p\\ a &\equiv b\pmod p \end{aligned}

剩余类和完全剩余系#

对于正整数 pp,全部整数可以分为 pp 个集合,令其为 K0,K1,K2,⋯ ,Kp−1K_0,K_1,K_2,\cdots,K_{p-1},其中,整数 nn 和其所在的集合 KiK_i 所满足的条件为:

n≡i(modp)n\equiv i\pmod p

则称 K0,K1,K2,⋯ ,Kp−1K_0,K_1,K_2,\cdots,K_{p-1} 为模 pp 的剩余类.

对于一个集合 ss,如果集合中有 pp 个元素,且每一个元素和其他元素都不在同一个模 pp 的剩余类中,则称这个集合 ss 是模 pp 的完全剩余系.模 pp 的完全剩余系有无数个.

费马小定理#

如果 pp 是一个质数,而整数 aa 和 pp 互质,则有:

ap−1≡1(modp)a^{p-1}\equiv 1\pmod p

证明:

假定模 pp 的完全剩余系 s={0,1,2,⋯ ,p−1}s=\{0, 1, 2, \cdots, p-1\},不妨将 ss 中的每一项都乘 a∈Za\in\mathbb{Z},a≠0a\neq 0,得到一个新的集合 s′={0,a,2a,⋯ ,(p−1)a}s'=\{0,a,2a,\cdots,(p-1)a\}.

引理:s′s' 是一个新的关于模 pp 的完全剩余系.

假设 s′s' 中存在两个元素 aiai 和 ajaj,他们符合:ai≡aj(modp),i≠jai\equiv aj\pmod p,i\neq j

所以,

ai≡aj(modp)⇒p∣(ai−aj)⇒p∣a(i−j)\begin{aligned} ai\equiv aj\pmod p \Rightarrow p \mid (ai-aj) \Rightarrow p \mid a(i-j) \end{aligned}

由于 pp 与 aa 互质,所以 p∣i−jp \mid i-j,又因为 0≤i,j<p0\leq i,j\lt p

所以不存在这样的 i,ji,j 使得 p∣i−jp \mid i-j,这与假设矛盾.

得证.

我们现在将模 pp 为 0 的一项删去,即 ss 和 s′s' 中的 00.

我们可以知道,在删去 00 后,ss 的各项之积 TT 为:

T=1×2⋯×(p−1)=(p−1)!\begin{aligned} T &=1\times 2\cdots \times(p-1)\\ &=(p-1)! \end{aligned}

s′s' 的各项之积 T′T' 为:

T′=a⋅2a⋯(p−1)a=ap−1(p−1)!\begin{aligned} T'&=a\cdot 2a\cdots ({p-1})a\\ &=a^{p-1}(p-1)! \end{aligned}

可推得:

T mod p=(p−1)! mod pT′ mod p=(a mod p)(2a mod p)⋯[(p−1)a mod p] mod p=k1k2k3⋯kp−1 mod pki∈Z,0<ki<p\begin{aligned} T \bmod p&=(p-1)!\bmod p\\ T'\bmod p&=(a\bmod p)(2a\bmod p)\cdots[(p-1)a\bmod p]\bmod p\\ &=k_1k_2k_3\cdots k_{p-1}\bmod p\\ k_i\in\mathbb{Z},&0\lt k_i\lt p \end{aligned}

又由于 s′s' 是模 pp 的完全剩余系,所以每一个 kik_i 都是一个 [1,p−1][1,p-1] 之间的值(注意,kik_i 的值不一定是 ii),且两两互不相同.

所以,

T′ mod p=k1k2k3⋯kp−1 mod p=1×2×⋯×(p−1) mod p=(p−1)! mod p=T mod p\begin{aligned} T'\bmod p&=k_1k_2k_3\cdots k_{p-1}\bmod p\\ &=1\times 2\times\cdots\times (p-1)\bmod p\\ &=(p-1)!\bmod p\\ &=T\bmod p \end{aligned}

由此可得,T′≡T(modp)T'\equiv T\pmod p

所以:

T′≡T(modp)ap−1(p−1)!≡(p−1)!(modp)\begin{aligned} T'&\equiv T\pmod p\\ a^{p-1}(p-1)!&\equiv (p-1)!\pmod p \end{aligned}

令 (p−1)!(p-1)! 的逆元为 nn,所以:

ap−1(p−1)!≡(p−1)!(modp)ap−1(p−1)!n≡(p−1)!n(modp)ap−1≡1(modp)\begin{aligned} a^{p-1}(p-1)!&\equiv (p-1)!\pmod p\\ a^{p-1}(p-1)!n&\equiv (p-1)!n\pmod p\\ a^{p-1}&\equiv 1\pmod p\\ \end{aligned}

得证.

利用费马小定理求逆元#

ap−1≡1(modp)a⋅ap−2≡1(modp)\begin{aligned} a^{p-1}&\equiv 1\pmod p\\ a\cdot a^{p-2}&\equiv 1\pmod p\\ \end{aligned}

所以,aa 的逆元是 ap−2a^{p-2}.在实战中,可以使用快速幂在 O(log⁡p)O(\log p) 的时间复杂度之内解决.

线性求逆元#

费马小定理固然可以求解逆元,但如果现在想要知道从 1 开始到 n 中每个数的逆元,就需要 O(nlog⁡p)O(n\log p) 的时间复杂度.能不能在 O(n)O(n) 中解决呢?

假设我们现在要求解 ii 在模 pp 意义下的逆元.

必然存在正整数 k,rk, r 满足 p=k×i+rp = k\times i + r,且 0<r<i0\lt r \lt i.

则此时,k=⌊pi⌋k = \lfloor \frac{p}{i} \rfloor,r=p mod ir=p \bmod i.

p=k×i+rk×i+r≡0(modp)\begin{aligned} p&=k\times i+r\\ k\times i + r &\equiv 0 \pmod p\\ \end{aligned}

两边同时乘 inv[i]×inv[r]inv[i] \times inv[r],得

k×inv[r]+inv[i]≡0(modp)inv[i]≡−k×inv[r](modp)\begin{aligned} k\times inv[r] + inv[i] &\equiv 0 \pmod p\\ inv[i] &\equiv -k\times inv[r] \pmod p\\ \end{aligned}

由于 k=⌊pi⌋k = \lfloor \frac{p}{i} \rfloor,r=p mod ir=p \bmod i,且负数取模可化为正数,最终得到常用形式(取模运算优先级和乘除同级):

inv[i]≡p−⌊pi⌋×inv[p mod i](modp)inv[i]=p−⌊pi⌋×inv[p mod i] mod p\begin{aligned} inv[i] &\equiv p -\lfloor \frac{p}{i} \rfloor\times inv[p \bmod i] \pmod p\\ inv[i] &= p -\lfloor \frac{p}{i} \rfloor\times inv[p \bmod i] \bmod p\\ \end{aligned}

口诀:商乘余逆,主模相减(上秤鱼腻,煮馍想剪)

想象你正在制作鱼汤泡馍,你将一条鱼抱到秤上,想称一称这条鱼有多重,可是鱼滑腻,你拿不起来.拿起鱼来,放进锅中,你又把馍放到锅里去煮,馍煮得太烫了,于是你想用剪刀把它夹出来剪开.

关键代码:

const int p = 1000000007; // 一个常见的大质数
int n = 10; // 求 1...n 的逆元
vector<long long> inv(n + 1);
inv[1] = 1; // 1 的逆元是 1
for (int i = 2; i <= n; ++i) {
inv[i] = p - (p / i) * inv[p % i] % p;
}

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

取模与逆元
https://blog.jerrylab.top/posts/math/mod/
作者
Jerry
发布于
2026-03-04
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Jerry
Hello, I'm Jerry.
公告
欢迎来到我的博客!这是一则示例公告。
分类
标签
最新动态
站点统计
文章
80
分类
3
标签
35
总字数
89,198
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Cloudflare Pages
博客版本
Firefly v6.16.5
文章许可
CC BY-NC-SA 4.0