MathLabs

組合せ論と離散数学

包除原理

重複して数えられた部分を補正する、集合の和集合の大きさを求める公式。

直観アイデア:部分同士が重なっているとき、和集合はどれくらいの大きさか?

あるクラスに数学が好きな生徒と美術が好きな生徒がいるとき、「数学が好き」と「美術が好き」を単純に足すと、両方好きな生徒は二重に数えられてしまう。少なくとも一方が好きな生徒の本当の数を得るには、重なった部分を一度引かなければならない。これが包除原理の核心的な考え方であり、二つの集合から任意の個数の集合へと綺麗に一般化される。

包除原理で使われる、対ごとの共通部分と三重の共通部分を示す三集合の重なりのネットワーク図。
重なり合う3つの集合 A,B,CA, B, C:∣A∪B∪C∣|A\cup B\cup C| を数えるには、3つの円の和から2つずつの共通部分を引き、中央の3重共通部分を足し戻す。

中高二つと三つの集合

∣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 で大きさ (n−k)!(n-k)! の同一項が (nk)\binom{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 という三つのサブシステムがあり、独立な1年間の故障確率はそれぞれ 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 となる。

したがって1年間に少なくとも一つのサブシステムが故障する確率は約 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