← 戻る ライブラリ › 組合せ論と離散数学 › 数え上げ 組合せ論と離散数学
包除原理 重複して数えられた部分を補正する、集合の和集合の大きさを求める公式。
直観 アイデア:部分同士が重なっているとき、和集合はどれくらいの大きさか? あるクラスに数学が好きな生徒と美術が好きな生徒がいるとき、「数学が好き」と「美術が好き」を単純に足すと、両方好きな生徒は二重に数えられてしまう。少なくとも一方が好きな生徒の本当の数を得るには、重なった部分を一度引かなければならない。これが包除原理の核心的な考え方であり、二つの集合から任意の個数の集合へと綺麗に一般化される。
重なり合う3つの集合 A , B , C A, B, C A , B , C :∣ A ∪ B ∪ C ∣ |A\cup B\cup C| ∣ A ∪ B ∪ C ∣ を数えるには、3つの円の和から2つずつの共通部分を引き、中央の3重共通部分を足し戻す。 中高 二つと三つの集合 ∣ A ∪ B ∣ = ∣ A ∣ + ∣ B ∣ − ∣ A ∩ B ∣ |A\cup B|=|A|+|B|-|A\cap B| ∣ A ∪ B ∣ = ∣ A ∣ + ∣ B ∣ − ∣ A ∩ B ∣ ここで ∣ A ∣ |A| ∣ A ∣ は有限集合 A A A の要素数を表す。A ∪ B A\cup B A ∪ B は A A A または B B B (あるいは両方)に属する要素の集合であり、A ∩ B A\cap B A ∩ B は両方に属する要素の集合である。∣ A ∩ B ∣ |A\cap B| ∣ A ∩ 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| ∣ A ∪ B ∪ C ∣ = ∣ A ∣ + ∣ B ∣ + ∣ C ∣ − ∣ A ∩ B ∣ − ∣ A ∩ C ∣ − ∣ B ∩ C ∣ + ∣ A ∩ B ∩ C ∣ 二集合からn集合へ 集合の個数 公式 和の項数 2 2 2 ∣ A ∪ B ∣ = ∣ A ∣ + ∣ B ∣ − ∣ A ∩ B ∣ |A\cup B|=|A|+|B|-|A\cap B| ∣ A ∪ B ∣ = ∣ A ∣ + ∣ B ∣ − ∣ A ∩ B ∣ 3 3 3 3 3 3 ∣ 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| ∣ A ∪ B ∪ C ∣ = ∣ A ∣ + ∣ B ∣ + ∣ C ∣ − ∣ A ∩ B ∣ − ∣ A ∩ C ∣ − ∣ B ∩ C ∣ + ∣ A ∩ B ∩ C ∣ 7 7 7 n n n ∣ ⋃ i = 1 n A i ∣ = ∑ k = 1 n ( − 1 ) k + 1 ∑ 1 ≤ i 1 < ⋯ < i k ≤ n ∣ A i 1 ∩ ⋯ ∩ A i k ∣ \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| ∣ ⋃ i = 1 n A i ∣ = ∑ k = 1 n ( − 1 ) k + 1 ∑ 1 ≤ i 1 < ⋯ < i k ≤ n ∣ A i 1 ∩ ⋯ ∩ A i k ∣ 2 n − 1 2^n-1 2 n − 1
大学 二集合の証明と一般のn集合の公式 有限集合 A A A 、B B B について:∣ A ∪ B ∣ = ∣ A ∣ + ∣ B ∣ − ∣ A ∩ B ∣ |A\cup B|=|A|+|B|-|A\cap B| ∣ A ∪ B ∣ = ∣ A ∣ + ∣ B ∣ − ∣ A ∩ B ∣
なぜ正しいのか? A ∪ B A\cup B A ∪ B のすべての要素は、A A A のみに属する、B B B のみに属する、両方に属する、という三つの互いに素なグループのちょうど一つに入る。∣ A ∣ + ∣ B ∣ |A|+|B| ∣ A ∣ + ∣ B ∣ を足すと「両方」のグループが二回数えられるので、一回分を取り除く必要がある。
証明 A ∪ B A\cup B A ∪ B を互いに素な三つの部分に分割する:A ∖ B A\setminus B A ∖ B (A A A のみ)、B ∖ A B\setminus A B ∖ A (B B B のみ)、A ∩ B A\cap B A ∩ B (両方)。これらは互いに素で A ∪ B A\cup B A ∪ B を覆うので、∣ A ∪ B ∣ = ∣ A ∖ B ∣ + ∣ B ∖ A ∣ + ∣ A ∩ B ∣ |A\cup B|=|A\setminus B|+|B\setminus A|+|A\cap B| ∣ A ∪ B ∣ = ∣ A ∖ B ∣ + ∣ B ∖ A ∣ + ∣ A ∩ B ∣ となる。
次に、A A A 自体が互いに素な A ∖ B A\setminus B A ∖ B と A ∩ B A\cap B A ∩ B に分かれることに注目すると、∣ A ∣ = ∣ A ∖ B ∣ + ∣ A ∩ B ∣ |A|=|A\setminus B|+|A\cap B| ∣ A ∣ = ∣ A ∖ B ∣ + ∣ A ∩ B ∣ となり、∣ A ∖ B ∣ = ∣ A ∣ − ∣ A ∩ B ∣ |A\setminus B|=|A|-|A\cap B| ∣ A ∖ B ∣ = ∣ A ∣ − ∣ A ∩ B ∣ を得る。同様に ∣ B ∖ A ∣ = ∣ B ∣ − ∣ A ∩ B ∣ |B\setminus A|=|B|-|A\cap B| ∣ B ∖ A ∣ = ∣ B ∣ − ∣ A ∩ 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 ∣ − ∣ A ∩ B ∣ ) + ( ∣ B ∣ − ∣ A ∩ B ∣ ) + ∣ A ∩ B ∣ = ∣ A ∣ + ∣ B ∣ − ∣ A ∩ B ∣ となり、これはまさに ∣ A ∪ B ∣ = ∣ A ∣ + ∣ B ∣ − ∣ A ∩ B ∣ |A\cup B|=|A|+|B|-|A\cap B| ∣ A ∪ B ∣ = ∣ A ∣ + ∣ B ∣ − ∣ A ∩ B ∣ である。
有限集合 A 1 , … , A n A_1,\ldots,A_n A 1 , … , A n について:∣ ⋃ i = 1 n A i ∣ = ∑ k = 1 n ( − 1 ) k + 1 ∑ 1 ≤ i 1 < ⋯ < i k ≤ n ∣ A i 1 ∩ ⋯ ∩ A i k ∣ \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| ∣ ⋃ i = 1 n A i ∣ = ∑ k = 1 n ( − 1 ) k + 1 ∑ 1 ≤ i 1 < ⋯ < i k ≤ n ∣ A i 1 ∩ ⋯ ∩ A i k ∣
なぜ正しいのか? 複数の集合に属する各要素は、単独の集合ごとに一回加算され、各ペアごとに一回減算され、各三つ組ごとにまた加算される、というように続く。この交代パターンこそが、その要素の合計カウントをちょうど 1 1 1 に戻すために必要なものである。
証明 任意の要素 x x x を固定する。x x x が A 1 , … , A n A_1,\ldots,A_n A 1 , … , A n のどれにも属さなければ、両辺への寄与は 0 0 0 なので、x x x がちょうど m ≥ 1 m\ge 1 m ≥ 1 個の集合に属すると仮定する。
各 k k k について、x x x を含む k k k 重共通部分 A i 1 ∩ ⋯ ∩ A i k A_{i_1}\cap\cdots\cap A_{i_k} A i 1 ∩ ⋯ ∩ A i k の個数は、x x x を含む m m m 個の集合から k k k 個を選ぶ方法の数、すなわち ( m k ) \binom{m}{k} ( k m ) に等しい。したがって x x x の右辺への総寄与は ∑ k = 1 n ( − 1 ) k + 1 ( m k ) = ∑ k = 1 m ( − 1 ) k + 1 ( m k ) \sum_{k=1}^n(-1)^{k+1}\binom{m}{k}=\sum_{k=1}^m(-1)^{k+1}\binom{m}{k} ∑ k = 1 n ( − 1 ) k + 1 ( k m ) = ∑ k = 1 m ( − 1 ) k + 1 ( k m ) である(k > m k>m k > m の項は ( m k ) = 0 \binom{m}{k}=0 ( k m ) = 0 のため消える)。
二項定理により ∑ k = 0 m ( − 1 ) k ( m k ) = ( 1 − 1 ) m = 0 \sum_{k=0}^m(-1)^k\binom{m}{k}=(1-1)^m=0 ∑ k = 0 m ( − 1 ) k ( k m ) = ( 1 − 1 ) m = 0 なので ∑ k = 1 m ( − 1 ) k ( m k ) = − 1 \sum_{k=1}^m(-1)^k\binom{m}{k}=-1 ∑ k = 1 m ( − 1 ) k ( k m ) = − 1 となり、− 1 -1 − 1 を掛けるとちょうど ∑ k = 1 m ( − 1 ) k + 1 ( m k ) = 1 \sum_{k=1}^m(-1)^{k+1}\binom{m}{k}=1 ∑ k = 1 m ( − 1 ) k + 1 ( k m ) = 1 が得られる。
したがって少なくとも一つの集合に属する各要素は右辺にちょうど 1 1 1 を寄与し、これは ∣ ⋃ i = 1 n A i ∣ \left|\bigcup_{i=1}^n A_i\right| ∣ ⋃ i = 1 n A i ∣ への 1 1 1 の寄与と一致する。どの集合にも属さない要素は両辺に 0 0 0 を寄与する。すべての要素が両辺に等しく寄与するので、両辺は等しい。
定義: 完全順列(撹乱順列)
n n n 個の対象の完全順列(撹乱順列)とは、どの対象も元の位置に留まらない順列である。A i A_i A i を、位置 i i i を固定する(対象 i i i がそのまま留まる)n n n 個の対象の順列の集合とすると、完全順列の個数は D n = n ! − ∣ ⋃ i = 1 n A i ∣ D_n=n!-\left|\bigcup_{i=1}^n A_i\right| D n = n ! − ∣ ⋃ i = 1 n A i ∣ 、すなわち少なくとも一つの位置を固定するすべての順列を取り除いた後に残る順列の数である。
D n = n ! ∑ k = 0 n ( − 1 ) k k ! D_n=n!\sum_{k=0}^n\dfrac{(-1)^k}{k!} D n = n ! k = 0 ∑ n k ! ( − 1 ) k この一般公式をこれらの集合に適用すると、∣ A i 1 ∩ ⋯ ∩ A i k ∣ = ( n − k ) ! \left|A_{i_1}\cap\cdots\cap A_{i_k}\right|=(n-k)! ∣ A i 1 ∩ ⋯ ∩ A i k ∣ = ( n − k )! となる(残りの n − k n-k n − k 個の対象は自由に並べられる)。したがって包除原理の和は、各レベル k k k で大きさ ( n − k ) ! (n-k)! ( n − k )! の同一項が ( n k ) \binom{n}{k} ( k n ) 個あることになり、n ! n! n ! で割って整理すると D n = n ! ∑ k = 0 n ( − 1 ) k k ! D_n=n!\sum_{k=0}^n\dfrac{(-1)^k}{k!} D n = n ! ∑ k = 0 n k ! ( − 1 ) k に簡約される——このページの二番目の定理ブロックで一般の場合を完全に導出している。
大学 実世界での応用と具体例 包除原理は、計算機科学(数え上げの際に不要な場合をふるい落とす)、数論(倍数を数える)、信頼性工学(重なり合う故障事象を組み合わせる)など、「複数の条件のうち少なくとも一つが成り立つ」を正確に数える必要があるあらゆる場面で日常的に使われる道具である。
例: 篩を使って倍数を数える
あるプログラマーは、1 1 1 から 100 100 100 までの整数のうち、2 2 2 、3 3 3 、または 5 5 5 で割り切れるものがいくつあるかを数える必要がある——これは素数を事前計算したり、暗号コードで有効な鍵をふるいにかけたりするのと同じ篩の考え方である。
解答 { 1 , … , 100 } \{1,\ldots,100\} { 1 , … , 100 } 中设 A A A 为 2 2 2 的倍数、B B B 为 3 3 3 的倍数、C C C 为 5 5 5 的倍数。用除法数到 100 100 100 为止的倍数:∣ A ∣ = 50 |A|=50 ∣ A ∣ = 50 、∣ B ∣ = 33 |B|=33 ∣ B ∣ = 33 、∣ C ∣ = 20 |C|=20 ∣ C ∣ = 20 。
两两重叠是乘积的倍数:∣ A ∩ B ∣ = ⌊ 100 / 6 ⌋ = 16 |A\cap B|=\lfloor 100/6\rfloor=16 ∣ A ∩ B ∣ = ⌊ 100/6 ⌋ = 16 、∣ A ∩ C ∣ = ⌊ 100 / 10 ⌋ = 10 |A\cap C|=\lfloor 100/10\rfloor=10 ∣ A ∩ C ∣ = ⌊ 100/10 ⌋ = 10 、∣ B ∩ C ∣ = ⌊ 100 / 15 ⌋ = 6 |B\cap C|=\lfloor 100/15\rfloor=6 ∣ B ∩ C ∣ = ⌊ 100/15 ⌋ = 6 。
三重重叠是 30 30 30 的倍数:∣ A ∩ B ∩ C ∣ = ⌊ 100 / 30 ⌋ = 3 |A\cap B\cap C|=\lfloor 100/30\rfloor=3 ∣ A ∩ B ∩ C ∣ = ⌊ 100/30 ⌋ = 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 ∣ A ∪ B ∪ C ∣ = 50 + 33 + 20 − 16 − 10 − 6 + 3 = 74 ,因此前 100 100 100 个整数中有 74 74 74 个能被 2 2 2 、3 3 3 或 5 5 5 整除,筛法避免了逐个列出这些数。
例: 衛星の冗長サブシステム
ある衛星には A A A 、B B B 、C C C という三つのサブシステムがあり、独立な1年間の故障確率はそれぞれ P ( A ) = 0.02 P(A)=0.02 P ( A ) = 0.02 、P ( B ) = 0.03 P(B)=0.03 P ( B ) = 0.03 、P ( C ) = 0.01 P(C)=0.01 P ( C ) = 0.01 であるが、共有部品のためいくつかの故障ペアには相関がある:P ( A ∩ B ) = 0.004 P(A\cap B)=0.004 P ( A ∩ B ) = 0.004 、P ( A ∩ C ) = 0.001 P(A\cap C)=0.001 P ( A ∩ C ) = 0.001 、P ( B ∩ C ) = 0.0006 P(B\cap C)=0.0006 P ( B ∩ C ) = 0.0006 、P ( A ∩ B ∩ C ) = 0.0002 P(A\cap B\cap C)=0.0002 P ( A ∩ B ∩ 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 ) = P ( A ) + P ( B ) + P ( C ) − P ( A ∩ B ) − P ( A ∩ C ) − P ( B ∩ C ) + P ( A ∩ B ∩ C ) 。
与えられた値を代入する:P ( A ∪ B ∪ C ) = 0.02 + 0.03 + 0.01 − 0.004 − 0.001 − 0.0006 + 0.0002 P(A\cup B\cup C)=0.02+0.03+0.01-0.004-0.001-0.0006+0.0002 P ( A ∪ B ∪ C ) = 0.02 + 0.03 + 0.01 − 0.004 − 0.001 − 0.0006 + 0.0002 。
単独のサブシステムの項を足すと 0.06 0.06 0.06 、ペアの項を引くと 0.06 − 0.0056 = 0.0544 0.06-0.0056=0.0544 0.06 − 0.0056 = 0.0544 、三重の重なりを足し戻すと 0.0544 + 0.0002 = 0.0546 0.0544+0.0002=0.0546 0.0544 + 0.0002 = 0.0546 となる。
したがって1年間に少なくとも一つのサブシステムが故障する確率は約 5.46 % 5.46\% 5.46% である。相関する故障を補正しない場合(すなわち単に 0.02 + 0.03 + 0.01 = 0.06 0.02+0.03+0.01=0.06 0.02 + 0.03 + 0.01 = 0.06 を足すだけの場合)、エンジニアはリスクを過大評価し、冗長性を過剰に設計してしまう可能性がある。
よくある誤り. 三つ以上の集合でよくある誤り:すべての対ごとの共通部分を引いた後、学生は三重の共通部分を足し戻すのを忘れ、正しい ∣ 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| ∣ A ∪ B ∪ C ∣ = ∣ A ∣ + ∣ B ∣ + ∣ C ∣ − ∣ A ∩ B ∣ − ∣ A ∩ C ∣ − ∣ B ∩ C ∣ + ∣ A ∩ B ∩ C ∣ の代わりに ∣ A ∣ + ∣ B ∣ + ∣ C ∣ − ∣ A ∩ B ∣ − ∣ A ∩ C ∣ − ∣ B ∩ C ∣ |A|+|B|+|C|-|A\cap B|-|A\cap C|-|B\cap C| ∣ A ∣ + ∣ B ∣ + ∣ C ∣ − ∣ A ∩ B ∣ − ∣ A ∩ C ∣ − ∣ B ∩ C ∣ を使ってしまう——三つすべての集合に属する要素が一回多く引かれてしまう。 研究の最前線 2026年時点
包除原理は解析的整数論における現代の篩法の祖先である:重なりを正確に補正する代わりに、篩法(ルジャンドル、ブラン、セルバーグ)は交代和を打ち切って誤差を評価し、正確さを犠牲にして巨大な n n n に対しても計算可能な公式を得る。これらの技法は、ジェームズ・メイナードが2015年に行った素数の有界なギャップに関する改良(イータン・チャンの2013年の突破的成果に基づく)の中心であり、そのような限界をさらに下げるために篩の重みを洗練させることは2026年時点でも活発な研究方向である。
∣ A ∣ = 10 |A|=10 ∣ A ∣ = 10 、∣ B ∣ = 7 |B|=7 ∣ B ∣ = 7 、∣ A ∩ B ∣ = 3 |A\cap B|=3 ∣ A ∩ B ∣ = 3 のとき、∣ A ∪ B ∣ |A\cup B| ∣ A ∪ B ∣ はいくつか?
∣ A ∣ = 30 |A|=30 ∣ A ∣ = 30 、∣ B ∣ = 20 |B|=20 ∣ B ∣ = 20 、∣ C ∣ = 15 |C|=15 ∣ C ∣ = 15 、∣ A ∩ B ∣ = 10 |A\cap B|=10 ∣ A ∩ B ∣ = 10 、∣ A ∩ C ∣ = 8 |A\cap C|=8 ∣ A ∩ C ∣ = 8 、∣ B ∩ C ∣ = 5 |B\cap C|=5 ∣ B ∩ C ∣ = 5 、∣ A ∩ B ∩ C ∣ = 3 |A\cap B\cap C|=3 ∣ A ∩ B ∩ C ∣ = 3 のとき、∣ A ∪ B ∪ C ∣ |A\cup B\cup C| ∣ A ∪ B ∪ C ∣ はいくつか?
4通の手紙を4通の宛名付き封筒に、どの手紙も正しい封筒に入らないように入れる方法は何通りあるか?
1から30までの整数のうち、2でも3でも割り切れないものはいくつあるか?