1. Введение
В математике и информатике мы часто сталкиваемся с ситуациями, когда нам нужно подсчитать количество элементов, удовлетворяющих нескольким условиям. Однако, когда существует несколько условий, множества элементов, удовлетворяющих каждому условию, часто перекрываются (имеют пересечения). Простое сложение приведет к многократному подсчету элементов.
Мощный метод для точного устранения этих перекрытий и получения правильного количества элементов — это Формула включений-исключений (Принцип включений-исключений).
В этой статье мы подробно объясним формулу включений-исключений, от ее базовых концепций до обобщенных математических формул, математических доказательств и конкретных примеров применения (таких как функция Эйлера и беспорядки). Кроме того, мы представим примеры реализации в программировании, чтобы углубить ваше понимание как с теоретической, так и с практической точек зрения.
2. Основы множеств и мощности
Прежде чем изучать формулу включений-исключений, давайте вспомним основные обозначения теории множеств.
- $A, B$ : Множества
- $|A|$ : Количество элементов (мощность) множества $A$
- $A \cup B$ : Объединение множества $A$ и множества $B$ (элементы, принадлежащие хотя бы одному из них)
- $A \cap B$ : Пересечение множества $A$ и множества $B$ (элементы, принадлежащие обоим)
То, что мы хотим найти, — это мощность объединения нескольких множеств, а именно $|A \cup B \cup \dots|$.
3. Формула включений-исключений для 2 множеств
Рассмотрим простейший случай с двумя множествами, $A$ и $B$.
3.1 Формула
$$ |A \cup B| = |A| + |B| - |A \cap B| $$3.2 Интуитивное понимание
Когда вы складываете количество элементов в множестве $A$ ($|A|$) и множестве $B$ ($|B|$), элементы, принадлежащие обоим множествам, то есть элементы в пересечении $A \cap B$, прибавляются дважды. Поэтому, вычитая дважды подсчитанную часть $|A \cap B|$ ровно один раз, вы получаете правильную мощность объединения $|A \cup B|$.
flowchart TD
U["Универсальное множество U"]
A["Множество A"]
B["Множество B"]
AandB["A ∩ B (Пересечение)"]
U -->|"Содержит"| A
U -->|"Содержит"| B
A -->|"Перекрытие"| AandB
B -->|"Перекрытие"| AandB
4. Формула включений-исключений для 3 множеств
Когда есть три множества, все становится немного сложнее. Рассмотрим множества $A, B, C$.
4.1 Формула
$$ |A \cup B \cup C| = |A| + |B| + |C| - |A \cap B| - |B \cap C| - |C \cap A| + |A \cap B \cap C| $$4.2 Интуитивное понимание и доказательство
- Сначала сложите все индивидуальные мощности: $|A| + |B| + |C|$
- При этом пересечения любых двух множеств складываются дважды, поэтому вычтите их: $- |A \cap B| - |B \cap C| - |C \cap A|$
- Наконец, рассмотрим пересечение всех трех множеств $A \cap B \cap C$. Оно было прибавлено 3 раза на шаге 1 и вычтено 3 раза на шаге 2, в результате чего его текущий счетчик равен $0$. Поэтому мы прибавляем его обратно один раз в конце: $+ |A \cap B \cap C|$
4.3 Конкретный пример: Количество целых чисел от 1 до 100, делящихся на 2, 3 или 5
- Универсальное множество: $U = \{1, 2, \dots, 100\}$
- Множество кратных 2: $A$
- Множество кратных 3: $B$
- Множество кратных 5: $C$
Давайте найдем каждую мощность (где $\lfloor x \rfloor$ означает округление вниз).
- $|A| = \lfloor 100 / 2 \rfloor = 50$
- $|B| = \lfloor 100 / 3 \rfloor = 33$
- $|C| = \lfloor 100 / 5 \rfloor = 20$
- $|A \cap B|$ (Кратные 6) $= \lfloor 100 / 6 \rfloor = 16$
- $|B \cap C|$ (Кратные 15) $= \lfloor 100 / 15 \rfloor = 6$
- $|C \cap A|$ (Кратные 10) $= \lfloor 100 / 10 \rfloor = 10$
- $|A \cap B \cap C|$ (Кратные 30) $= \lfloor 100 / 30 \rfloor = 3$
Таким образом, существует 74 числа, делящихся на 2, 3 или 5.
5. Общая формула включений-исключений для $n$ множеств
Обобщение этого на $n$ множеств $A_1, A_2, \dots, A_n$ дает следующую красивую формулу.
5.1 Формула
$$ \left| \bigcup_{i=1}^n A_i \right| = \sum_{k=1}^n (-1)^{k-1} \left( \sum_{1 \le i_1 < i_2 < \dots < i_k \le n} \left| A_{i_1} \cap A_{i_2} \cap \dots \cap A_{i_k} \right| \right) $$На словах операция повторяет «прибавление мощностей пересечений нечетного количества множеств и вычитание мощностей пересечений четного количества множеств».
5.2 Краткое изложение математического доказательства
Мы покажем, что любой элемент $x \in \bigcup_{i=1}^n A_i$ учитывается ровно один раз в вычислениях в правой части.
Предположим, некоторый элемент $x$ содержится ровно в $m$ множествах ($1 \le m \le n$). То, сколько раз $x$ подсчитывается в правой части, можно выразить с помощью биномиальных коэффициентов следующим образом:
$$ \text{Количество раз} = \binom{m}{1} - \binom{m}{2} + \binom{m}{3} - \dots + (-1)^{m-1} \binom{m}{m} $$По биному Ньютона известно, что $(1 - 1)^m = \binom{m}{0} - \binom{m}{1} + \binom{m}{2} - \dots + (-1)^m \binom{m}{m} = 0$. Преобразуя это:
$$ \binom{m}{0} - \left( \binom{m}{1} - \binom{m}{2} + \dots + (-1)^{m-1} \binom{m}{m} \right) = 0 $$Поскольку $\binom{m}{0} = 1$, выражение в скобках (которое и есть количество раз, когда учитывается $x$) равно ровно $1$. Это доказывает, что каждый элемент учитывается ровно один раз без дублирования.
6. Пример применения 1: Функция Эйлера
Функция Эйлера $\varphi(N)$ представляет количество целых чисел от $1$ до $N$, взаимно простых с $N$. Это также можно вычислить с помощью формулы включений-исключений.
Пусть простые множители числа $N$ равны $p_1, p_2, \dots, p_k$. Пусть универсальное множество $U = \{1, 2, \dots, N\}$, а $A_i$ — «множество кратных $p_i$». То, что мы хотим найти, — это количество элементов, не принадлежащих ни одному $A_i$.
$$ \varphi(N) = N - \left| \bigcup_{i=1}^k A_i \right| $$Применение формулы включений-исключений и упрощение приводит к этой знаменитой формуле:
$$ \varphi(N) = N \left(1 - \frac{1}{p_1}\right) \left(1 - \frac{1}{p_2}\right) \dots \left(1 - \frac{1}{p_k}\right) $$7. Пример применения 2: Беспорядки
Беспорядок — это перестановка чисел от $1$ до $n$, такая, что ни одно $i$-е число не находится на $i$-й позиции. Например, это эквивалентно общему количеству способов распределить подарки при обмене подарками так, чтобы никто не получил свой собственный подарок.
Пусть $A_i$ — «множество перестановок, где $i$ находится на $i$-й позиции». Мощность универсального множества равна $n!$. Мы хотим найти $n! - |A_1 \cup A_2 \cup \dots \cup A_n|$.
Мощность пересечения любых $k$ множеств равна $(n-k)!$, и есть $\binom{n}{k}$ способов выбрать такие $k$ множеств. Применяя формулу включений-исключений, количество беспорядков $D_n$ вычисляется следующим образом:
$$ D_n = n! \sum_{k=0}^n \frac{(-1)^k}{k!} $$8. Вычисление и реализация с помощью программирования
Формула включений-исключений чрезвычайно полезна в программировании. Особенно в сочетании с побитовым полным перебором, принцип для $n$ условий может быть реализован лаконично.
Ниже приведен код Python для нахождения «количества целых чисел от 1 до $M$, которые делятся на любое из простых чисел в заданном списке».
| |
Временная сложность этого алгоритма составляет $O(n \cdot 2^n)$, что работает достаточно быстро, если $n$ составляет примерно до 20.
9. Заключение
Формула включений-исключений — это волшебная математическая формула, которая разбивает на первый взгляд сложные перекрытия множеств на простое и механическое повторение сложения и вычитания.
Ее диапазон применения исключительно широк: от базовых задач вероятности до продвинутого спортивного программирования и вычисления функции Эйлера, связанной с криптографией. Овладение этим мощным методом значительно улучшит ваши навыки решения задач в математике и алгоритмах. Обязательно попробуйте применить его к различным проблемам и ощутите его силу.
