MathLabs

组合数学与离散数学

容斥原理

计算集合并集大小的公式,通过修正重复计数的部分。

直观想法:当各部分互相重叠时,并集有多大?

如果一个班级有喜欢数学的学生和喜欢美术的学生,只把"喜欢数学"和"喜欢美术"的人数相加,会把两者都喜欢的学生重复计算一次。要得到真正至少喜欢一门的学生人数,必须把重叠部分减去一次:这正是容斥原理的核心思想,并且可以从两个集合干净地推广到任意多个集合。

三个重叠集合的网络图,展示容斥原理中使用的两两交集与三重交集。
三个相交集合 A,B,CA, B, C:计算 ∣A∪B∪C∣|A\cup B\cup C| 时,先加三个圆,再减去三个两两交集,最后加回正中央的三重交集。

中学两个与三个集合

∣A∪B∣=∣A∣+∣B∣−∣A∩B∣|A\cup B|=|A|+|B|-|A\cap B|

这里 ∣A∣|A| 表示有限集合 AA 的元素个数;A∪BA\cup B 是属于 AA 或 BB(或两者)的元素之集,而 A∩BA\cap B 是同时属于两者的元素之集。减去 ∣A∩B∣|A\cap B| 就消除了对同时属于两个集合的元素的重复计数。

∣A∪B∪C∣=∣A∣+∣B∣+∣C∣−∣A∩B∣−∣A∩C∣−∣B∩C∣+∣A∩B∩C∣|A\cup B\cup C|=|A|+|B|+|C|-|A\cap B|-|A\cap C|-|B\cap C|+|A\cap B\cap C|
从两个集合到n个集合
集合个数公式求和的项数
22∣A∪B∣=∣A∣+∣B∣−∣A∩B∣|A\cup B|=|A|+|B|-|A\cap B|33
33∣A∪B∪C∣=∣A∣+∣B∣+∣C∣−∣A∩B∣−∣A∩C∣−∣B∩C∣+∣A∩B∩C∣|A\cup B\cup C|=|A|+|B|+|C|-|A\cap B|-|A\cap C|-|B\cap C|+|A\cap B\cap C|77
nn∣⋃i=1nAi∣=∑k=1n(−1)k+1∑1≤i1<⋯<ik≤n∣Ai1∩⋯∩Aik∣\left|\bigcup_{i=1}^n A_i\right|=\sum_{k=1}^n(-1)^{k+1}\sum_{1\le i_1<\cdots<i_k\le n}\left|A_{i_1}\cap\cdots\cap A_{i_k}\right|2n−12^n-1

大学两集合的证明与一般n集合公式

对有限集合 AA、BB:∣A∪B∣=∣A∣+∣B∣−∣A∩B∣|A\cup B|=|A|+|B|-|A\cap B|

为什么成立?

A∪BA\cup B 中的每个元素恰好属于三个互不相交的组之一:只属于 AA、只属于 BB、或两者都属于;相加 ∣A∣+∣B∣|A|+|B| 会把"两者都属于"这一组计数两次,因此必须去掉一次。

证明

把 A∪BA\cup B 分成三个两两不相交的部分:A∖BA\setminus B(只属于 AA)、B∖AB\setminus A(只属于 BB)、以及 A∩BA\cap B(两者都属于)。由于这些部分互不相交且覆盖了 A∪BA\cup B,所以 ∣A∪B∣=∣A∖B∣+∣B∖A∣+∣A∩B∣|A\cup B|=|A\setminus B|+|B\setminus A|+|A\cap B|。

再注意到 AA 本身分成不相交的 A∖BA\setminus B 与 A∩BA\cap B,于是 ∣A∣=∣A∖B∣+∣A∩B∣|A|=|A\setminus B|+|A\cap B|,即 ∣A∖B∣=∣A∣−∣A∩B∣|A\setminus B|=|A|-|A\cap B|。同理 ∣B∖A∣=∣B∣−∣A∩B∣|B\setminus A|=|B|-|A\cap B|。

把这两个式子代回第一个等式,得到 ∣A∪B∣=(∣A∣−∣A∩B∣)+(∣B∣−∣A∩B∣)+∣A∩B∣=∣A∣+∣B∣−∣A∩B∣|A\cup B|=(|A|-|A\cap B|)+(|B|-|A\cap B|)+|A\cap B|=|A|+|B|-|A\cap B|,这正是 ∣A∪B∣=∣A∣+∣B∣−∣A∩B∣|A\cup B|=|A|+|B|-|A\cap B|。

对有限集合 A1,…,AnA_1,\ldots,A_n:∣⋃i=1nAi∣=∑k=1n(−1)k+1∑1≤i1<⋯<ik≤n∣Ai1∩⋯∩Aik∣\left|\bigcup_{i=1}^n A_i\right|=\sum_{k=1}^n(-1)^{k+1}\sum_{1\le i_1<\cdots<i_k\le n}\left|A_{i_1}\cap\cdots\cap A_{i_k}\right|

为什么成立?

属于多个集合的每个元素,会因每个单独的集合被加一次、因每一对被减一次、因每一个三元组又被加回来,如此交替;这种交替模式正是把它的总计数恰好拉回到 11 所需要的。

证明

固定任意一个元素 xx。若 xx 不属于 A1,…,AnA_1,\ldots,A_n 中的任何一个,它对两边的贡献都是 00,因此设 xx 恰好属于 m≥1m\ge 1 个集合。

对每个 kk,包含 xx 的 kk 重交集 Ai1∩⋯∩AikA_{i_1}\cap\cdots\cap A_{i_k} 的个数等于从含 xx 的 mm 个集合中选出 kk 个的方法数,即 (mk)\binom{m}{k}。因此 xx 对右边的总贡献为 ∑k=1n(−1)k+1(mk)=∑k=1m(−1)k+1(mk)\sum_{k=1}^n(-1)^{k+1}\binom{m}{k}=\sum_{k=1}^m(-1)^{k+1}\binom{m}{k}(k>mk>m 的项因 (mk)=0\binom{m}{k}=0 而消失)。

由二项定理,∑k=0m(−1)k(mk)=(1−1)m=0\sum_{k=0}^m(-1)^k\binom{m}{k}=(1-1)^m=0,于是 ∑k=1m(−1)k(mk)=−1\sum_{k=1}^m(-1)^k\binom{m}{k}=-1,乘以 −1-1 恰好得到 ∑k=1m(−1)k+1(mk)=1\sum_{k=1}^m(-1)^{k+1}\binom{m}{k}=1。

因此至少属于一个集合的每个元素对右边的贡献恰为 11,与它对 ∣⋃i=1nAi∣\left|\bigcup_{i=1}^n A_i\right| 的贡献 11 相符;不属于任何集合的元素对两边的贡献都是 00。由于每个元素对两边的贡献相同,两边相等。

定义: 错位排列

nn 个物体的错位排列是指没有任何物体停留在原始位置的排列。设 AiA_i 为固定位置 ii(物体 ii 不动)的 nn 个物体的排列集合,那么错位排列数为 Dn=n!−∣⋃i=1nAi∣D_n=n!-\left|\bigcup_{i=1}^n A_i\right|,即去掉所有至少固定一个位置的排列后剩下的排列数。

Dn=n!∑k=0n(−1)kk!D_n=n!\sum_{k=0}^n\dfrac{(-1)^k}{k!}

把一般公式应用到这些集合上,∣Ai1∩⋯∩Aik∣=(n−k)!\left|A_{i_1}\cap\cdots\cap A_{i_k}\right|=(n-k)!(剩下的 n−kn-k 个物体可以自由排列),于是容斥和在每个层级 kk 上有 (nk)\binom{n}{k} 个大小为 (n−k)!(n-k)! 的相同项,除以 n!n! 并整理后化简为 Dn=n!∑k=0n(−1)kk!D_n=n!\sum_{k=0}^n\dfrac{(-1)^k}{k!}——本页的第二个定理模块给出了一般情形的完整推导。

大学实际应用与典型例题

容斥原理是计算机科学(计数时筛掉不需要的情形)、数论(计算倍数个数)以及可靠性工程(组合重叠的故障事件)中常用的工具,只要需要精确计数"多个条件中至少有一个成立"的情形就会用到。

例题: 用筛法计算倍数个数

一位程序员需要计算从 11 到 100100 的整数中,能被 22、33 或 55 整除的有多少个——这与预先筛出素数或在加密代码中过滤有效密钥所用的筛法思想相同。

解答

在 {1,…,100}\{1,\ldots,100\} 中设 AA 为 22 的倍数、BB 为 33 的倍数、CC 为 55 的倍数。用除法数到 100100 为止的倍数:∣A∣=50|A|=50、∣B∣=33|B|=33、∣C∣=20|C|=20。

两两重叠是乘积的倍数:∣A∩B∣=⌊100/6⌋=16|A\cap B|=\lfloor 100/6\rfloor=16、∣A∩C∣=⌊100/10⌋=10|A\cap C|=\lfloor 100/10\rfloor=10、∣B∩C∣=⌊100/15⌋=6|B\cap C|=\lfloor 100/15\rfloor=6。

三重重叠是 3030 的倍数:∣A∩B∩C∣=⌊100/30⌋=3|A\cap B\cap C|=\lfloor 100/30\rfloor=3。

由三集合公式,∣A∪B∪C∣=50+33+20−16−10−6+3=74|A\cup B\cup C|=50+33+20-16-10-6+3=74,因此前 100100 个整数中有 7474 个能被 22、33 或 55 整除,筛法避免了逐个列出这些数。

例题: 卫星冗余子系统

某卫星有三个子系统 AA、BB、CC,独立的一年故障概率分别为 P(A)=0.02P(A)=0.02、P(B)=0.03P(B)=0.03、P(C)=0.01P(C)=0.01,但共用部件使某些故障对存在相关性:P(A∩B)=0.004P(A\cap B)=0.004、P(A∩C)=0.001P(A\cap C)=0.001、P(B∩C)=0.0006P(B\cap C)=0.0006、P(A∩B∩C)=0.0002P(A\cap B\cap C)=0.0002。可靠性工程师需要求出至少一个子系统故障的概率,以决定是否需要更多冗余。

解答

概率的表现类似于总体中的比例,因此同样的三集合公式适用:P(A∪B∪C)=P(A)+P(B)+P(C)−P(A∩B)−P(A∩C)−P(B∩C)+P(A∩B∩C)P(A\cup B\cup C)=P(A)+P(B)+P(C)-P(A\cap B)-P(A\cap C)-P(B\cap C)+P(A\cap B\cap C)。

代入给定的值:P(A∪B∪C)=0.02+0.03+0.01−0.004−0.001−0.0006+0.0002P(A\cup B\cup C)=0.02+0.03+0.01-0.004-0.001-0.0006+0.0002。

把单个子系统的项相加得 0.060.06,减去两两相交的项得 0.06−0.0056=0.05440.06-0.0056=0.0544,再加回三重重叠部分得 0.0544+0.0002=0.05460.0544+0.0002=0.0546。

因此一年内至少一个子系统故障的概率约为 5.46%5.46\%;如果不修正相关故障(即只是简单相加 0.02+0.03+0.01=0.060.02+0.03+0.01=0.06),工程师就会高估风险,可能造成冗余设计过度。

若 ∣A∣=10|A|=10、∣B∣=7|B|=7、∣A∩B∣=3|A\cap B|=3,则 ∣A∪B∣|A\cup B| 等于多少?

已知 ∣A∣=30|A|=30、∣B∣=20|B|=20、∣C∣=15|C|=15、∣A∩B∣=10|A\cap B|=10、∣A∩C∣=8|A\cap C|=8、∣B∩C∣=5|B\cap C|=5、∣A∩B∩C∣=3|A\cap B\cap C|=3,求 ∣A∪B∪C∣|A\cup B\cup C|。

把4封信放进4个已写好地址的信封,使得没有一封信放进自己对应的信封,有多少种方法?

从1到30的整数中,有多少个既不能被2整除也不能被3整除?

参考文献

  1. Wikipedia contributors (2024). Inclusion–exclusion principle
  2. James Maynard (2015). Small gaps between primes · arXiv:1311.4600
  3. Richard A. Brualdi (2017). Introductory Combinatorics (Classic Version), 5th edition