本文
包除原理 (inclusion-exclusion principle) は、「集合の元の数」を計算する方法として説明されることが多いようですが、現実の問題に適用するときには「条件 (命題) を満たす場合の数」として考えることもあると思います。
そこで本稿では、「条件」という言葉を使って包除原理を記述することを試みます。本質的にはどちらで説明しても内容は変わりません。
基礎
条件が真であるときの場合の数をで表すことにします。
また、条件が一つも設定されていない状態をで表すことにします。これはつまり、全事象を指します。
条件は「制約」と言い表してもよく、条件の設定を増やすことで場合の数は減っていきます。
すなわち、次が成り立ちます。
任意の条件に対して、実際にはとのうちいずれか一方が成り立っています。
しかし、部分的な条件の組合せを考えるときには、一部の条件の真理値が不問になることもあることに注意します。
例えば、3つの条件 があるとき、 はが真であり、については真偽が不問であることを指します。
包除原理で何ができるか
個の条件 の部分集合は個あります。
これらのすべての部分集合について、そのすべての元 (条件) の論理積を満たす場合の数が既知である (与えられる) とき、
- 個の条件を一つも満たさない場合の数
- 個の条件のうち少なくとも一つ満たす場合の数
を求めることができます。
「部分集合のすべての元 (条件) の論理積」とは、ある部分集合が と表されるとき、 を指します。
例えば、 の部分集合 には が対応します。
条件を一つも満たさない場合の数
個の条件 があり、それらのうち一つも満たさない場合 () の数を本節で求めます。
また、それらのうち少なくとも一つ満たす場合 () の数を求めるには、上記の否定を考えればよいです。
まず、のときの を考えます。
のとき、
のとき、
のとき、
このように、右辺の個の項が与えられれば、左辺が求められます。
では、一般のに拡張しましょう。
包除原理
条件の集合 の部分集合を整数 と同一視する。
すべての部分集合に対し、そのすべての元の論理積を満たす場合の数がで与えられるとする。
このとき、
が成り立つ。
ここで、 はを進数で表したときのの出現数とする。
概略
についての数学的帰納法により、のみ示せばよい。
任意の条件に対して、
が成り立つことを利用する (で表される領域を2分割する)。
とくに、は全事象の数を表します。
また、 は、部分集合の元の数と言い換えられます。
例えばのとき、
です。
の計算量オーダーをとすると、全体の時間計算量はとなります。
条件をすべて満たす場合の数
個の条件 があり、それらをすべて満たす場合 () の数を求めるには、の代わりにで考えればよいです。
すなわち、個の条件 を一つも満たさない場合の数と見なし、このすべての部分集合について、そのすべての元 (条件) の論理積を満たす場合の数が与えられれば、定理 1 から求めることができます。
また、 のうち少なくとも一つ満たさない場合 () の数を求めるには、上記の否定を考えればよいです。
実例 (全射の個数)
包除原理を実例で考えてみましょう。
全射の個数
個の区別できる球を個の区別できる箱に入れる方法のうち、すべての箱に個以上の球が入る場合の数を求めよ。
箱の番号をとします。
すると、求める数は、個の条件「箱には個以上の球が入る」をすべて満たす場合の数です。
さらに、これらの否定である個の条件「箱に球は入らない」を一つも満たさない場合の数、と言い換えられます。
これらの個の条件の任意の部分集合の論理積となる場合の数は簡単に得られます。
実際、部分集合の元の個数をとすると、各球に対して個の箱を自由に選べるためです。
したがって、包除原理を適用して、
これを部分集合の元の個数ごとに整理すると、として、
が得られます。
実例 (Euler の totient 関数)
Euler の totient 関数
を正の整数とする。
個の整数のうち、と互いに素なものの個数を求めよ。
の素因数の種類 (重複なし) が と表せたとします。
すると、求める数は、個の条件「と互いに素」をすべて満たす場合の数です。
さらに、これらの否定である個の条件「の倍数」を一つも満たさない場合の数、と言い換えられます。
これらの個の条件の任意の部分集合の論理積となる場合の数は簡単に得られます。
例えば、「の倍数」かつ「の倍数」は「の倍数」です。
したがって、包除原理を適用して求めることができます。
例えば、のとき、
です。
これは
Euler の totient 関数
と呼ばれますが、実はこれをさらに簡潔に計算することができます。
上の定理の証明の中で「で表される領域を2分割する」と書きましたが、このときに「の倍数」でない数の割合がであることが示せます。
したがって、に対してこれを乗算していけばよく、
が成り立ちます。
この等式を使えば、全体では素因数分解がボトルネックとなり、時間計算量はで済みます。
改訂履歴