Вы находитесь на странице: 1из 907

Дискретная математика.

Конспект лекций

Ф. А. Новиков
fedornovikov51@gmail.com

Санкт-Петербург, 2020

1 / 907
Содержание
1.2.3. Линейное представление наибольше-
го общего делителя
1. Теория чисел 1.2.4. Обобщённый алгоритм Евклида
1.2.5. Анализ алгоритма Евклида
1.1. Разложение на множители 1.2.6. Свойства чисел Фибоначчи
1.1.1. Деление с остатком
1.2.7. Диофантовы уравнения
1.1.2. Отношение делимости чисел
1.1.3. Наибольший общий делитель 1.3. Цепные дроби
1.1.4. Простые числа 1.3.1. Разложение рационального числа в
1.1.5. Решето Эратосфена цепную дробь
1.1.6. Вычисление целой части квадратного 1.3.2. Подходящие дроби
корня 1.3.3. Бесконечные цепные дроби
1.1.7. Метод пробных делителей 1.3.4. Наилучшие приближения
1.1.8. Метод Ферма
1.4. Арифметика остатков
1.1.9. Позиционные системы счисления
1.4.1. Сравнения
1.2. Алгоритм Евклида 1.4.2. Системы вычетов
1.2.1. Алгоритм взаимного вычитания 1.4.3. Линейные сравнения
1.2.2. Бинарный алгоритм Евклида 1.4.4. Китайская теорема об остатках
2 / 907
1.4.5. Вычисления в остаточных классах 2.1.2. Размещения
2.1.3. Размещения без повторений
1.5. Функция Эйлера 2.1.4. Перестановки
1.5.1. Аддитивные и мультипликативные
2.1.5. Сочетания
функции
2.1.6. Сочетания с повторениями
1.5.2. Вычисление функция Эйлера
2.1.7. Дискретная вероятность
1.5.3. Теорема Эйлера–Ферма
1.6. Операции с полиномами 2.2. Перестановки
2.2.1. Циклы в перестановках
1.6.1. Сложение и умножение полиномов
2.2.2. Инверсии
1.6.2. Деление полиномов
2.2.3. Генерация перестановок
1.6.3. Теорема Безу и схема Горнера
2.2.4. Двойные факториалы
1.6.4. Алгоритм Евклида для полиномов
1.6.5. Интерполяционная формула 2.3. Биномиальные коэффициен-
Лагранжа
1.6.6. Разложение полиномов на неприво-
ты
2.3.1. Свойства биномиальных коэффициен-
димые множители
тов
2.3.2. Бином Ньютона
2. Комбинаторный анализ
2.3.3. Треугольник Паскаля
2.1. Комбинаторные задачи 2.3.4. Применение рекуррентного соотно-
2.1.1. Комбинаторные конфигурации
3 / 907
шения 2.6. Формулы обращения
2.3.5. Генерация подмножеств 2.6.1. Теорема обращения
2.3.6. Расширенные биномиальные коэффи- 2.6.2. Формулы обращения
циенты 2.6.3. Формулы для чисел Стирлинга и
2.3.7. Мультимножества и последовательно- Моргана
сти 2.6.4. Полиномы с рациональными коэффи-
2.3.8. Мультиномиальные коэффициенты циентами
2.3.9. Биномиальная система счисления
2.7. Производящие функции
2.4. Разбиения 2.7.1. Формальные степенные ряды
2.4.1. Числа Стирлинга 2.7.2. Метод неопределённых коэффициен-
2.4.2. Числа Моргана тов
2.4.3. Вычисление чисел Стирлинга 2.7.3. Числа Фибоначчи
2.4.4. Числа Белла 2.7.4. Числа Каталана
2.4.5. Треугольник Белла
2.5. Включения и исключения 3. Кодирование
2.5.1. Объединение конфигураций
3.1. Алфавитное кодирование
2.5.2. Формула включений и исключений
3.1.1. Таблица кодов
2.5.3. Комбинации свойств
3.1.2. Разделимые схемы
2.5.4. Беспорядки и субфакториал
3.1.3. Префиксные схемы
4 / 907
3.1.4. Неравенство Макмиллана общений
3.3.8. Коды Хэмминга
3.2. Кодирование с минималь- 3.3.9. Исправление одного замещения
ной избыточностью 3.4. Криптография
3.2.1. Минимизация длины кода сообщения
3.4.1. Шифрование с помощью случайных
3.2.2. Цена кодирования
чисел
3.2.3. Алгоритм Фано
3.4.2. Криптостойкость
3.2.4. Оптимальное кодирование
3.4.3. Односторонние функции
3.2.5. Алгоритм Хаффмена
3.4.4. Шифрование с открытым ключом
3.3. Помехоустойчивое кодиро- 3.4.5. Простейшие атаки на шифр с откры-
тым ключом
вание 3.4.6. Цифровая подпись
3.3.1. Кодирование с исправлением ошибок
3.3.2. Возможность исправления всех оши-
бок 4. Множества и отношения
3.3.3. Расстояния Левенштейна и Хэмминга
4.1. Множества
3.3.4. Кодовое расстояние схемы
4.1.1. Элементы и множества
3.3.5. Мощность кодирования
4.1.2. Задание множеств
3.3.6. Виды кодирования
4.1.3. Парадокс Рассела
3.3.7. Систематическая форма кодовых со-
4.1.4. Мультимножества
5 / 907
4.1.5. Конечные последовательности 4.4. Замыкание и сокращение от-
4.2. Алгебра подмножеств ношений
4.2.1. Сравнение множеств 4.4.1. Транзитивное и рефлексивное замы-
4.2.2. Равномощные множества кание
4.2.3. Конечные и бесконечные множества 4.4.2. Алгоритм Уоршалла
4.2.4. Счётные и несчётные множества 4.4.3. Транзитивное сокращение
4.2.5. Мощность конечного множества 4.4.4. Диаграммы Хассе
4.2.6. Операции над множествами
4.2.7. Разбиения и покрытия
4.5. Отношения эквивалентности
4.5.1. Классы эквивалентности
4.2.8. Булеан
4.5.2. Ядро функционального отношения
4.2.9. Свойства операций над множествами
4.5.3. Фактормножество
4.3. Отношения 4.5.4. Множества уровня
4.3.1. Упорядоченные пары и наборы 4.5.5. Толерантность
4.3.2. Прямое произведение множеств 4.5.6. Гомоморфизмы и изоморфизмы
4.3.3. Бинарные отношения
4.3.4. Композиция отношений
4.6. Отношения порядка
4.6.1. Предпорядок
4.3.5. Свойства отношений
4.6.2. Частичный и линейный порядок
4.3.6. Степень отношения и циклы
4.6.3. Минимальные и наименьшие элемен-
4.3.7. Ядро отношения
6 / 907
ты 5.2.2. Обходы графов
4.6.4. Алгоритм топологической сортировки 5.2.3. Орграфы и бинарные отношения
4.6.5. Верхние и нижние границы 5.2.4. Свойства отношений и достижимость
4.6.6. Монотонные функции в орграфах
4.6.7. Вполне упорядоченные множества 5.2.5. Граф инциденций
4.6.8. Индукция
5.3. Деревья
5.3.1. Свободные деревья
5. Теория графов 5.3.2. Ориентированные, упорядоченные
и бинарные деревья
5.1. Определения графов
5.3.3. Представление свободных деревьев в
5.1.1. История теории графов
программах
5.1.2. Основные определения
5.3.4. Представление упорядоченных кор-
5.1.3. Изоморфизм графов
невых деревьев
5.1.4. Элементы графов
5.3.5. Представление бинарных деревьев
5.1.5. Инварианты графов
5.3.6. Кратчайший остов
5.1.6. Степенные последовательности
5.1.7. Виды графов 5.4. Связность в графах и оргра-
5.1.8. Операции над графами
фах
5.2. Представления графов 5.4.1. Компоненты связности
5.2.1. Представление графов в компьютере
7 / 907
5.4.2. Точки сочленения, мосты и блоки 5.7. Циклы
5.4.3. Вершинная и рёберная связность 5.7.1. Фундаментальные циклы и разрезы
5.4.4. Теорема Менгера 5.7.3. Эйлеровы циклы
5.4.5. Связность в орграфах 5.7.4. Гамильтоновы циклы
5.5. Паросочетания 5.8. Независимые и покрываю-
5.5.1. Теорема Холла
5.5.2. Устойчивые паросочетания
щие множества
5.8.1. Независимые и покрывающие множе-
5.5.3. Наибольшее паросочетание
ства вершин и рёбер
5.6. Кратчайшие пути 5.8.2. Оценка числа вершинной независи-
5.6.1. Взвешенные орграфы мости
5.6.2. Кратчайшие пути в бесконтурном ор- 5.8.3 Построение независимых множеств
графе вершин
5.6.3. Алгоритм Беллмана–Форда 5.8.4. Улучшенный перебор
5.6.4. Алгоритм Дейкстры 5.8.5. Доминирующие множества
5.6.5. Область применимости алгоритма 5.8.6. Задача о наименьшем покрытии
Дейкстры
5.6.6. Анализ алгоритма Дейкстры
5.9. Раскраска и планарность
5.6.7. Алгоритм Флойда–Уоршалла графов
5.6.8. Алгоритмы с предобработкой 5.9.1. Хроматическое число графа и его
8 / 907
оценки 6.1.5. Функции k -значной логики
5.9.2. Хроматические числа графа и его до-
полнения
6.2. Формулы
6.2.1. Реализация функций формулами
5.9.3. Точный алгоритм раскрашивания
6.2.2. Равносильные формулы
5.9.4. Приближённые алгоритмы раскраши-
6.2.3. Подстановка и замена
вания
6.2.4. Алгебра булевых функций
5.9.5. Хроматический полином
5.9.6. Укладка графов 6.3. Двойственность и симмет-
5.9.7. Эйлерова характеристика
5.9.8. Теорема о пяти красках
рия
6.3.1. Двойственные и самодвойственные
функции
6. Булевы функции 6.3.2. Реализация двойственной функции
6.3.3. Принцип двойственности
6.1. Элементарные булевы функ-
6.3.4. Симметрические функции
ции
6.1.1. Функции алгебры логики
6.4. Нормальные формы
6.4.1. Разложение булевых функций по пе-
6.1.2. Существенные и несущественные пе-
ременным
ременные
6.4.2. Минимальные термы
6.1.3. Булевы функции одной переменной
6.4.3. Совершенные нормальные формы
6.1.4. Булевы функции двух переменных
9 / 907
6.4.4. Эквивалентные преобразования арифметическими полиномами
6.4.5. Минимальные дизъюнктивные формы 6.5.5. Карты Карно и матрицы минтермов
6.4.6. Геометрическая интерпретация 6.5.6. Булевы функции и карты Карно
6.4.7. Сокращённые дизъюнктивные формы 6.5.7. Минимизация формул картами Карно
6.5.8. Деревья решений
6.5. Представление булевых
функций в программах 6.6. Полные системы булевых
6.5.1. Табличные представления функций
6.5.2. Строковые представления 6.6.1. Замкнутые классы
6.5.3. Алгоритм вычисления значения буле- 6.6.2. Полные системы функций
вой функции 6.6.3. Полнота двойственной системы
6.5.4. Представление булевых функций 6.6.4. Теорема Поста

10 / 907
Часть I. Целочисленные алгоритмы

11 / 907
1. Теория чисел
Во всех предметных областях и языках программирования используются целые числа и
операции с ними (то есть, арифметика).
Раздел математики, изучающий числа и операции с ними, называется теорией чисел или
высшей арифметикой.
Та часть теории чисел, в которой целые числа изучаются без использования методов дру-
гих разделов математики, называется элементарной теорией чисел. В этом разделе рас-
сматривается элементарная теория чисел, вводятся обозначения и устанавливаются ос-
новные факты и алгоритмы, необходимые в приложениях.
Замечание. В изложении рассматриваются натуральные числа N и ноль (используется
Def
обозначение N0 = N + 0) только ради упрощения формулировок и доказательств. Все
определения, утверждения и алгоритмы этого раздела распространяются на множество
целых чисел Z за счёт учёта знака числа.
В соответствии с традициями, в теории чисел знак операции умножения ∗ опускается, а
запись x + (−y) упрощается до x − y .
12 / 907
1.1. Разложение на множители

Традиционно в арифметике используют четыре операции: сложение, умножение, вычи-


тание и деление. При этом операция сложения и обратная к ней операция вычитания,
а также операция умножения всегда выполнимы, а операция, обратная к умножению —
деление, выполнима не всегда (в целых числах), поэтому является в некотором смысле
особенной и требует специфического рассмотрения.
Первым вопрос, на который необходимо дать ответ: как узнать, в каких случаях операция
деления выполнима, то есть на какие числа делится данное число? Ответ всем известен
ещё из школьного курса математики: достаточно разложить данное число на простые
множители. Эта на первый взгляд несложная задача оказывается вычислительно весьма
трудоёмкой, пока неизвестны эффективные алгоритмы её решения, и именно данное об-
стоятельство лежит в основе многих современных методов защиты информации.

13 / 907
1.1.1. Деление с остатком
Теорема. ∀ a, b ∈ N (∃ q ∈ N0 , r ∈ N0 (a = bq + r & 0 6 r < b)).
Число q называется неполным частным, а число r называется остатком от деления числа
a на число b.
Доказательство. (Разбор случаев)
[ a < b ] q ← 0; r ← a.
[ a = b ] q ← 1; r ← 0
[ a > b ] ∃ q ∈ N (bq 6 a < (q + 1)b); r ← a − bq .
Доказательство. (Программное) q ← 0; r ← 0;
while a > b do a ← a − b; q ← q + 1 end while; r ← a.
Доказательство. (Геометрическое). Пусть заданы два отрезка: длины a и длины b. Отложим
отрезок b на отрезке a столько раз, сколько это возможно. Тогда количество откладыва-
ний — это неполное частное q , а оставшийся отрезок — это остаток r.
Следствие. Если a = bq + r & 0 6 r < b, то числа q и r единственны.
Доказательство. Пусть a = bq1 + r1 , 0 6 r1 < b, a = bq2 + r2 , 0 6 r2 < b.
Тогда 0 = (bq1 + r1 ) − (bq2 + r2 ) = b(q1 − q2 ) + (r1 − r2 ). Если q1 6= q2 , то |b(q1 − q2 )| > b,
но |r1 − r2 | < b, противоречие. 14 / 907
1.1.2. Отношение делимости чисел (1/3)
.
Число a ∈ N делится на число b ∈ N (обозначение a .. b), или, что то же самое, число b ∈ N
делит число a ∈ N (обозначение b|a), если ∃ q ∈ N (a = bq), то есть r = 0 в разложении
a = bq + r. Число a называется кратным числу b, число b называется делителем числа a,
а число q называется частным от деления a на b.
Теорема. Отношение делимости
1. рефлексивно: ∀ a ∈ N (a|a);
2. транзитивно: ∀ a, b, c ∈ N (a|b & b|c =⇒ a|c);
3. антисимметрично: ∀ a, b ∈ N (a|b & b|a =⇒ a = b).
Доказательство.
[ ∀ a ∈ N (a|a) ] q = 1.
[ ∀ a, b, c ∈ N (a|b & b|c =⇒ a|c) ] b = q1 a & c = q2 b =⇒ c = (q1 q2 )a.
[ ∀ a, b ∈ N (a|b & b|a =⇒ a = b) ] b = q1 a & a = q2 b =⇒ a = (q1 q2 )a =⇒ q1 = q2 = 1.

Следствие. a|b & a|c =⇒ a|(b + c).


Доказательство. c = q1 a & b = q2 a =⇒ b + c = (q1 + q2 )a
15 / 907
1.1.2. Отношение делимости чисел (2/3)
В терминах теории множеств и отношений можно сказать, что, делимость чисел — это
нестрогий частичный порядок на множестве N.
Пример. На рисунке представлена диаграмма Хассе отношения делимости для чисел от
1 до 12. Хорошо видно, что делимость имеет «нерегулярный» характер.

16 / 907
1.1.2. Отношение делимости чисел (3/3)
Отступление. С отношением делимости связано множество любопытных и поучительных число-
вых казусов и фокусов. Например, ещё в древности были обнаружены так называемые совершен-
ные числа, то есть числа, равные сумме своих делителей, считая 1, но не считая само число. Первые
совершенные числа: 6 = 1+2+3, 28 = 1+2+4+7+14, 496 = 1+2+4+8+16+31+62+124+248,
... Все обнаруженные совершенные числа являются чётными. До сих пор неизвестно, конечно ли
множество совершенных чисел и существуют ли нечётные совершенные числа.
Замечание.Все обнаруженные совершенные числа P являются треугольными числами T (k),
k
вычисляемыми по формуле T (k) = k(k + 1)/2 = i=1 i = T (k − 1) + k. Почему числа
T (n) называются треугольными, объяснено на рисунке.

17 / 907
1.1.3. Наибольший общий делитель (1/3)
Def
Множество делителей числа a ∈ N обозначается D(a) = {b ∈ N | b|a} . Очевидно, что
любое число делится на 1 и на себя. Эти делители называются тривиальными. Прочие
делители, если они есть, называются нетривиальными, или собственными.
Натуральное число c такое, что c|a и c|b, называется общим делителем чисел a и b. Мно-
жество общих делителей чисел a и b обозначим D(a, b). Наибольшее из таких чисел на-
зывается наибольшим общим делителем чисел a и b. Обозначение: gcd(a, b).
Если gcd(a, b) = 1, то числа a и b называются взаимно простыми. Обозначение: a ⊥ b.
Лемма. Если b|a, то множество общих делителей чисел a и b совпадает с множеством
делителей b:
b|a =⇒ D(a, b) = D(b).
.
Доказательство. Любой общий делитель чисел a и b, очевидно, является делителем b.
Любой делитель b делит a в силу транзитивности.
Следствие. b|a =⇒ gcd(a, b) = b.
18 / 907
1.1.3. Наибольший общий делитель (2/3)
Лемма. Если a = bq + r, то множество общих делителей чисел a и b совпадает с множе-
ством общих делителей b и r:

a = bq + r =⇒ D(a, b) = D(b, r).


Доказательство. Пусть x ∈ D(a, b). Тогда ∃ k, l (a = kx & b = lx) и kx = lxq + r,
r = (k − lq)x, следовательно x|r, x ∈ D(b, r). Пусть y ∈ D(b, r). Тогда
∃ m, n (b = my & r = ny) и a = myq + ny = (mq + n)y , следовательно, y|a, y ∈ D(a, b).
Таким образом, D(a, b) = D(b, r).
Следствие. a = bq + r =⇒ gcd(a, b) = gcd(b, r).
Пример. 60 = 7 · 8 + 4, gcd(60, 8) = gcd(8, 4) = 4,
gcd(60, 7) = gcd(7, 4) = 1.
Число d называется общим кратным чисел a и b, если a|d и b|d.
Def
Множество общих кратных M (a, b) = {d ∈ N | a|d & b|d} . Наименьшее из таких чисел
называется наименьшим общим кратным a и b. Обозначение: lcm(a, b).
19 / 907
1.1.3. Наибольший общий делитель (3/3)
Замечание. В отличие от конечного множества D(a, b), множество M (a, b) является бес-
конечным. Однако M (a, b) ⊂ N, поэтому M (a, b) имеет наименьший элемент и опреде-
ление наименьшего общего кратного корректно.
Теорема. Для любых натуральных чисел a, b и m справедливо:
1) a|m & b|m =⇒ lcm(a, b)|m;
2) gcd(a, b) lcm(a, b) = ab.
Доказательство. Пусть d = gcd(a, b), тогда a = a1 d, b = b1 d. Заметим, что a1 ⊥ b1 .
Действительно, от противного. Пусть для определенности a1 |b1 , то есть существует такое
число q , что qa1 = b1 . Значит, b = b1 , d = qa1 , d = qa. Очевидно, что a > d, значит d — не
НОД. Противоречие.
Пусть теперь m = ak . Тогда ak/b = a1 k/b1 ∈ N, следовательно b1 |k , т.е. ∃ t ∈ N (k = b1 t).
Отсюда m = ak = ab1 t = abt/d. С другой стороны, любое число вида abt/d ∈ M (a, b).
Наименьшее общее кратное достигается при t = 1, т.е. равно ab/d.

20 / 907
1.1.4. Простые числа (1/2)
Натуральное число a > 1 называется простым, если оно не имеет собственных делите-
лей. В противном случае число a называется составным.
Замечание. Число 1 имеет только один делитель, поэтому его не относят ни к простым,
ни к составным.
Множество простых чисел обозначается P.
Теорема. Для любого натурального числа a > 1 его наименьший делитель, отличный от
1, является простым числом.
Доказательство. От противного. Пусть этот делитель составной, тогда у него тоже есть
делитель, меньший его и отличный от 1. Но тогда он делит и a, а значит, исходный делитель
не был наименьшим.
Следствие. Для составного числа a > 1 его наименьший делитель, отличный от 1, не

превосходит a.
Доказательство. Пусть p > 1 — наименьший делитель a. Тогда a = pq , где q > p.
Следовательно, a > p2 .
21 / 907
1.1.4. Простые числа (2/3)
Теорема. Простых чисел бесконечно много.
Доказательство. От противного. Пусть |P| = n. Тогда P = {p1 , . . . , pn }. Cоставим число
p ← p1 p2 . . . pn + 1. Это число не делится ни на одно из чисел p1 , . . . , pn , так как даёт оста-
ток 1 при делении на каждое из них, и не совпадает ни с одним из них. Следовательно,
число p само простое. Противоречие.
Лемма. ∀ a, b, c ∈ N (b ⊥ c =⇒ gcd(ac, b) = gcd(a, b)).
Доказательство. Рассмотрим gcd(ac, b). Так как b ⊥ c, то gcd(ac, b) не имеет общих дели-
телей с c, отсюда gcd(ac, b) = gcd(a, b)
Следствие. ∀ a, b, c ∈ N (b ⊥ c & b|ac =⇒ b|a).
Лемма. [Евклида] ∀ a, b ∈ N, p ∈ P (p|ab =⇒ p|a ∨ p|b).
Доказательство. От противного. Пусть ни a, ни b не делятся на p. Тогда из простоты p
следует, что a ⊥ p, b ⊥ p. По лемме gcd(ab, p) = gcd(a, p) = 1, ab ⊥ p — противоречие.

Следствие. ∀ a1 , a2 , . . . , an ∈ N, p ∈ P (p|a1 a2 . . . an =⇒ ∃ i (p|ai )).


22 / 907
1.1.4. Простые числа (3/3)
Теорема. [Основная теорема арифметики] Любое натуральное число, большее 1, можно
представить в виде произведения простых множителей, причём единственным образом.
Доказательство.
[ Существование ] От противного. Пусть 1 < n ∈ N — наименьшее натуральное число,
не представимое в виде произведения нескольких простых чисел. Тогда если число n —
простое, то оно является своим разложением. Если же число n — составное, то n = n1 n2 ,
где n1 < n, n2 < n, причём каждое из n1 , n2 имеет разложение, а значит, можно разло-
жить и исходное число n. Противоречие.
[ Единственность ] Пусть n имеет два различных разложения на простые множители. Рас-
смотрим любое число p в одном из разложений. Тогда произведение чисел второго раз-
ложения делится на p и по следствию из леммы Евклида одно из простых чисел второ-
го разложения совпадает с p. Сократим оба разложения на p и применим к оставшим-
ся разложениям такое же рассуждение. Так по одному сократим все числа в первом раз-
ложении, найдя и сократив равные им во втором. Процесс закончится ввиду конечности
разложений.
23 / 907
1.1.5. Решето Эратосфена (1/2)
Вход: натуральное число n > 1.
Выход: множество простых чисел, не превосходящих n.
B ← {2, 3, 4, 5 . . . , n}
while B 6= ∅ do
x ← min(B) //наименьший элемент B
yield x //выдать x
B ← B − x //удалить x из B
y ← x2
while y 6 n do
B ← B − y ; y ← y + x //удалить из B все числа, кратные x
end while
end while
Обоснование. На каждом шаге алгоритма минимальный элемент x ∈ B — простое число.
В противном случае у него был бы простой делитель p < x, и x был бы удалён из B ранее,
как кратный p. Для простого x достаточно удалить из B все кратные ему, начиная с x2 ,
т.к. все меньшие составные, кратные x, были удалены из B ранее. 24 / 907
1.1.5. Решето Эратосфена (2/2)
Пример. Найдём с помощью этого алгоритма все простые числа, не превосходящие 100.
В правой нижней ячейке список простых чисел.
i Вычеркнутые составные числа Оставшиеся числа
2 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 2, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29,
24, 26, 28, 30, 32, 34, 36, 38, 40, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57,
42, 44, 46, 48, 50, 52, 54, 56, 58, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85,
60, 62, 64, 66, 68, 70, 72, 74, 76, 87, 89, 91, 93, 95, 97, 99
78, 80, 82, 84, 86, 88, 90, 92, 94,
96, 98, 100
3 9, 15, 21, 27, 33, 39, 45, 51, 57, 2, 3, 5, 7, 11, 13, 17, 19, 23, 25, 29, 31, 35, 37, 41,
63, 69, 75, 81, 87, 93, 99 43, 47, 49, 53, 55, 59, 61, 65, 67, 71, 73, 77, 79, 83,
85, 89, 91, 95, 97
5 25, 35, 55, 65, 85, 95 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47,
49, 53, 59, 61, 67, 71, 73, 77, 79, 83, 89, 91, 97
7 49, 77, 91 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47,
53, 59, 61, 67, 71, 73, 79, 83, 89, 97 25 / 907
1.1.6. Вычисление целой части квадратного корня (1/2)
В целом ряде случаев необходимо найти для данного числа a такое целое число h, что

h2 6 a < (h + 1)2 .

Это возможно сделать с помощью следующего алгоритма.


Вход: число a > 1.
Выход: число h ∈ N, такое, что h2 6 a < (h + 1)2 .
h←a
while true do
b ←(h + a/h)/2 //уменьшаем h
if b < h then
h ← b //продолжаем
else
return h //завершить процесс
end if
end while
26 / 907
1.1.6. Вычисление целой части квадратного корня (2/2)
Обоснование. Заметим, что
√ √
(h2 − a)2 > 0 =⇒ (h2 + a)2 > 4h2 a =⇒ h2 + a > 2h a =⇒ (h + a/h)/2 > a.

Заметим также, что h 6 a =⇒ (h+a/h)/2 6 h. Стало быть, последовательность значений



h при выполнении алгоритма монотонно убывает и ограничена снизу величиной a. При
этом процесс закончится при условии b > h, то есть (h + a/h)/2 > h, значит h2 + a > 2h2
и h2 6 a < (h + 1)2 .
Замечание. Вычисления можно вести в целых числах. В частности, деление на двойку
выполнять просто сдвигом двоичного представления числа на один разряд вправо.
Пример. Рассмотрим применение алгоритма для нахождения целой части квадратного
корня из числа 221.
Номер шага 1 2 3 4 5 6
h 221 112 29 18 15 14
b 111 56 18 15 14 14
27 / 907
1.1.7. Метод пробных делителей
Наиболее прямолинейный подход k ← 0; i ← 0 //номер простого и номер делителя
к разложению числа на множите- while a > 1 do
ли состоит в том, чтобы пробовать q, r ← a/÷ pk //a = qpk + r
делить данное число g на про- if r = 0 then
стые числа 2, 3, 5, . . . по порядку. di ← pk //нашли делитель
При этом достаточно ограничить- i ← i + 1 //номер следующего делителя
ся простыми числами, не превос-
√ a ← q //следующее число
ходящими a. else
if q > pk then
Вход: число a > 1.
k ← k + 1 //следующий делитель
Выход: массив d0 , . . . , dk — дели-
else
тели числа a.
di ← a //простое число
return //завершить процесс
end if
end if
end while 28 / 907
1.1.8. Метод Ферма (1/3)
Метод пробных делителей прост, но трудоёмок, поскольку требует выполнения большого
числа «холостых» делений с остатком.
Метод Ферма использует только операции сложения и вычитания, а потому намного эф-
фективнее.
Метод основан на следующих наблюдениях.
1. Проверка числа a на чётность и выделение простого множителя 2 выполняются лег-
ко, с помощью проверки последнего бита и сдвига двоичного представления числа
вправо на один разряд, так что, не умаляя общности, число a можно считать нечёт-
ным.
2. Вычисление h — целой части квадратного корня из числа a (h2 6 a < (h + 1)2 ) вы-
полняется эффективно, так что, не умаляя общности, если h2 = a, то можно полагать
a ← h и считать, что число a уже не является полным квадратом.
3. В таких предположениях, если число a составное, то существует разложение
a = bc = (x − y)(x + y) = x2 − y 2 , где x = (b + c)/2, y = (c − b)/2, причём числа x
и y — натуральные, поскольку числа b и c — нечётные.
29 / 907
1.1.8. Метод Ферма (2/3)
Введём функцию R(x, y) = (x−y)(x+y)−a. Это функция «невязки» — если R(x, y) = 0,
то разложение найдено. Заметим, что

R(x + 1, y) = (x − y + 1)(x + y + 1) − a = R(x, y) + 2x + 1,

R(x, y + 1) = (x − y − 1)(x + y + 1) − a = R(x, y) − (2y + 1).


Обозначим Rxy = R(x, y), Rx = 2x + 1, Ry = 2y + 1.
Тогда R(x+1, y) = Rxy +Rx , R(x, y+1) = Rxy −Ry . При этом, когда значения аргументов
R(x, y) увеличиваются на 1, значения величин Rx и Ry увеличиваются на 2.
Идея алгоритма в том, чтобы, увеличивая значения величин x и y на 1, подобрать их так,
что R(x, y) = 0.
С помощью алгоритма извлечения целой части квадратного корня найдём число h такое,
что h2 6 a < (h + 1)2 . Тогда в качестве начального приближения можно взять x = h и
y = 0, поскольку меньший из искомых сомножителей не может быть больше квадратного
корня из числа a. Если число a составное, то 1 < b < h < c < a.
30 / 907
1.1.8. Метод Ферма (3/3)
Rx ← 2h + 1; Ry ← 1; Rxy ← h2 − a //начальное приближение x = h, y = 0
while Rxy 6= 0 do
if Rxy > 0 then
Rxy ← Rxy − Ry ; Ry ← Ry + 2 //невязка положительная — уменьшаем
else
Rxy ← Rxy + Rx ; Rx ← Rx + 2 //невязка отрицательная — увеличиваем
end if
end while
√ √
Обоснование. Заметим, что a = bc 6 b+c 2
, поскольку среднее геометрическое не
превосходит среднего арифметического. Заметим также, что b+c 2
< a+1
2
, поскольку
1 < c =⇒ b − 1 < bc − c =⇒ b − 1 + c + 1 < bc − c + c + 1 =⇒ b + c < a + 1.
Алгоритм закончит работу, потому что x только увеличивается, и поэтому сначала достиг-
нет величины (b + c)/2, если число составное, или позже   величины(a + 1)/2,
 достигнет
Rx −Ry Rx +Ry
если число простое. В обоих случаях R(x, y) = 0 и a = 2 2
−1 .
31 / 907
1.1.9. Позиционные системы счисления (1/3)
Теорема.
∀ a, b, k ∈ N a < bk =⇒ ∃ a0 , . . . , ak−1 ∈ 0..(b−1) a = a0 + a1 b + · · · + ak−1 bk−1 .

Pk−1
Разложение a = a0 + a1 b + · · · + ak−1 bk−1 = i=0 ai bi называется записью числа a в по-
зиционной системе счисления, числа a0 , . . . , ak−1 называются цифрами, число b называ-
ется основанием системы счисления.
Доказательство. Следующий алгоритм вычисляет цифры числа.
while a > 0 do
q, r ← a ÷
/ b //a = qb + r & r < b
k ← k + 1 //номер цифры
ak ← r //очередная цифра
a ← q //следующее число
end while
Процесс закончится, поскольку a уменьшается на каждом шаге.
Замечание. Цифры в любой системе счисления определяются однозначно, поскольку де-
ление с остатком однозначно. 32 / 907
1.1.9. Позиционные системы счисления (2/3)
Представление
k−1
X
a= ai bi = a0 + a1 b + · · · + ak−1 bk−1 = a0 + b(a1 + b(a2 + b(a3 + . . . )) . . . )
i=0

называется схемой Горнера. Эта схема позволяет, зная последовательность цифр и осно-
вание системы счисления, вычислить значение числа наиболее эффективным способом,
выполнив k сложений и умножений, без возведения в степень.
Вход: последовательность
Pk−1 цифр ak−1 , . . . , a0 , основание системы счисления b.
i
Выход: число a = i=0 ai b .
a ← 0 //вычисляемое число
for i from k − 1 downto 0 do
a ← a ∗ b + ai //очередная цифра
end for
33 / 907
1.1.9. Позиционные системы счисления (3/3)

Схема Горнера применяется во многих ситуациях, в частности, при вычислении адреса


элемента многомерного массива
Рассмотрим в качестве примера алгоритм эффективного вычисления b = am , если задано
двоичное представление показателя степени m = (bk−1 . . . b0 )2 .
b ← 1 //вычисляемое число
for i from k − 1 downto 0 do
b ← b ∗ b //возведение в квадрат
if bi = 1 then
b ← b ∗ a //умножение
end if
end for
2
Обоснование. Алгоритм основан на том факте, что am = a2m1 +b0 = (am1 ) ab0 .

34 / 907
1.2. Алгоритм Евклида

Доказанные утверждения лежат в основе алгоритма нахождения наибольшего общего


делителя двух натуральных чисел a и b, известного как алгоритм Евклида. В силу симмет-
ричности gcd(a, b), не ограничивая общности, можно считать, что a > b.

35 / 907
1.2.1. Алгоритм взаимного вычитания (1/2)
Наиболее прямолинейная реализация алгоритма Евклида называется алгоритмом взаим-
ного вычитания.
Вход: a, b — натуральные числа, a > b.
Выход: значение gcd(a, b) в переменной a.
while b > 0 do
r ← a mod b; a ← b; b ← r
end while
return a
Обоснование. На каждом шаге алгоритма пара (a, b) замещается парой (b, r), где r —
остаток от деления a на b. Согласно следствию п. 1.1.3, после каждой итерации цикла
искомый наибольший общий делитель остаётся неизменным, т. е. является инвариантом
алгоритма. Когда a станет кратно b, r будет равно нулю. Это означает, что искомый наи-
больший общий делитель найден. Цикл обязательно завершится, потому что числа a и b
не могут уменьшаться бесконечно.
Пример. gcd(616, 286) = gcd(286, 44) = gcd(44, 22) = 22.
36 / 907
1.2.1. Алгоритм взаимного вычитания (2/2)
Отступление. Алгоритм Евклида даёт повод сделать некоторые замечания относительно стиля
программирования, то есть набора необязательных правил и соглашений, направленных на улуч-
шение кода. В эту категорию входят использование дисциплины имён, отступов, комментариев и
множества других полезных приёмов. Важно понимать, что использование того или иного стиля
программирования улучшает код не абсолютно, а относительно тех целей, которые преследуют
выбранные правила. Рассмотрим в качестве примера ещё одну реализацию алгоритма Евклида.
Вход: a, b — натуральные числа.
Выход: значение gcd(a, b) есть сумма a + b.
while a 6= 0 & b 6= 0 do
if a > b then a ← a mod b else b ← b mod a end if
end while
С одной стороны, этот вариант несколько эффективнее по времени, поскольку на каждом шаге
цикла выполняется одно присваивание вместо трёх, и по памяти, поскольку используются две пе-
ременные вместо трёх. С другой стороны, этот код чуть длиннее, значительно дальше от доказан-
ных математических формул и потому требует существенного дополнительного обоснования, а
самое главное, в этом варианте нарушается «правило хорошего тона», гласящее, что каждая пе-
ременная в программе при изменении значения не должна менять свою «ответственность». 37 / 907
1.2.2. Бинарный алгоритм Евклида (1/2)
В этом параграфе описан алгоритм, который был известен в Китае еще в I-ом веке, но
опубликован Джозефом Стайном только в 1967 году. Алгоритм является более эффектив-
ным, по сравнению с алгоритмом взаимного вычитания, поскольку использует только три
операции: проверку двоичного числа на чётность (обозначение even(a)), деление чётно-
го числа пополам (сдвигом двоичного представления на один разряд вправо, обозначе-
ние >>) и вычитание (знак −). Каждая из этих операций выполняется намного быстрее,
нежели операция деления с остатком в разобранном выше алгоритме Евклида.
Заметим следующее:
1. если числа a и b оба чётные, то gcd(a, b) = 2 ∗ gcd(a/2, b/2);
2. если числа a и b имеют разную чётность (не теряя общности, пусть a чётное),
то gcd(a, b) = gcd(a/2, b);
3. если числа a и b оба нечётные, то разность a − b — чётное число и
gcd(a, b) = gcd(a − b, b) = gcd((a − b)/2, b);
4. в любом случае |a − b| < max{a, b}.
38 / 907
1.2.2. Бинарный алгоритм Евклида (2/2)
Вход: a, b — натуральные числа, a > b.
Выход: значение gcd(a, b).
k ← 0 //счётчик степени 2
while even(a) & even(b) do
k ← k + 1; a ← a >>; b ← b >> //выдавливаем общую степень 2
end while
while a 6= b do
if even(a) then a ← a >> endif //убираем 2
if even(b) then b ← b >> endif //убираем 2
max(a, b) ← |a − b| >> //уменьшаем большее число
end while
return a
Пример. gcd(616, 286) = 2 ∗ gcd(308, 143) = 2 ∗ gcd(154, 143) = 2 ∗ gcd(77, 143) =
= 2 ∗ gcd(77, 66) = 2 ∗ gcd(77, 33) = 2 ∗ gcd(44, 33) = 2 ∗ gcd(22, 33) = 2 ∗ gcd(11, 33) =
= 2 ∗ gcd(22, 11) = 2 ∗ gcd(11, 11) = 2 ∗ 11 = 22.
39 / 907
1.2.3. Линейное представление наибольшего общего делителя (1/3)
Рассмотрим протокол применения простейшего алгоритма Евклида в двух эквивалент-
ных формах.
a = bq0 + r1 r1 = a − bq0
b = r1 q1 + r2 r2 = b − r1 q 1
r1 = r2 q2 + r3 r3 = r1 − r2 q2
... ...
rn−2 = rn−1 qn−1 + rn rn = rn−2 − rn−1 qn−1
При этом rn является последним ненулевым остатком, то есть rn−1 = rn qn .
Подставляя полученные равенства снизу вверх, получаем
gcd(a, b) = rn = rn−2 − rn−1 qn−1 = rn−2 − (rn−3 − rn−2 qn−2 )qn−1 = · · · = ax + by.
Эти наблюдения позволяют сформулировать теорему.
Теорема. ∀ a, b ∈ N (∃ x, y ∈ Z (gcd(a, b) = ax + by)) .
Такое представление наибольшего общего делителя называется соотношением Безу, а
числа x и y называются коэффициентами Безу
40 / 907
1.2.3. Линейное представление наибольшего общего делителя (2/3)
Как найти коэффициенты Безу?
Алгоритм Евклида строит последовательность чисел a > b > r1 > r2 > · · · > rn > 0.
Оказывается, не только последний остаток rn = gcd(a, b), но и все числа в этой последо-
вательности выражаются в виде линейных комбинаций чисел a и b, то есть rk = axk +byk .
Коэффициенты разложения некоторого числа в линейную комбинацию чисел a, b, то есть
выражение ax + by , запишем в векторной форме (x, y). В таких обозначениях a = (1, 0),
b = (0, 1). Операции с векторами, как обычно, выполняются покомпонентно.
Рассмотрим ещё раз протокол работы алгоритма Евклида, подставляя формулы сверху
вниз и в векторной форме:
r1 = a · 1 + b(−q0 ) (1, −q0 ) = (1, 0) − q0 (0, 1)
r2 = a(−q1 ) + b(1 + q0 q1 ) (−q1 , 1 + q0 q1 ) = (0, 1) − q1 (1, −q0 )
r3 = a(1 + q1 q2 ) + b(−q0 − q2 + q0 q1 q2 ) (1 + q1 q2 , −q0 − q2 − q0 q1 q2 ) =
... = (1, −q0 ) − q2 (−q1 , 1 + q0 q1 )
...
41 / 907
1.2.3. Линейное представление наибольшего общего делителя (3/3)
Лемма. В указанных обозначениях (xk , yk ) = (xk−2 , yk−2 ) − qk−1 (xk−1 , yk−1 ).
Доказательство. По индукции. База индукции проверена выше. Индукционный переход.
Пусть утверждение верно для всех чисел, меньших k . Рассмотрим (xk , yk ). Имеем

rk = axk + byk = rk−2 − qk−1 rk−1 =


= axk−2 + byk−2 − qk−1 (axk−1 + byk−1 ) =
= a(xk−2 − qk−1 xk−1 ) + b(yk−2 − qk−1 yk−1 ).

и значит xk = xk−2 − qk−1 xk−1 , yk = yk−2 − qk−1 yk−1 .

Пример. Найдём линейное представле- i −1 0 1 2


ние наибольшего общего делителя чи- r 616 286 44 22
сел 616 и 286. Получаем q 2 6 2
22 = −6 · 616 + 13 · 286 x 1 0 1 −6
y 0 1 −2 13
42 / 907
1.2.4. Обобщённый алгоритм Евклида

Естественная идея: вычислять сразу и наибольший общий делитель и коэффициенты его


линейного представления.
Вход: a, b — натуральные числа, a > b.
Выход: значение gcd(a, b) и коэффициенты Безу x, y .
(xa , ya ) ←(1, 0); (xb , yb ) ←(0, 1) //начальные значения
while b 6= 0 do
t ← a; T ←(xa , ya ) //временные переменные
q ← t ÷ b //неполное частное
a ← b; (xa , ya ) ←(xb , yb ) //новое делимое
b ← t − qb; (xb , yb ) ← T − q(xb , yb ) //остаток = новый делитель
end while
return a, xa , ya

43 / 907
1.2.5. Анализ алгоритма Евклида (1/2)
Сколько шагов потребуется алгоритму Евклида для нахождения наибольшего общего де-
лителя двух чисел?
Алгоритм должен построить последовательность a > b > r1 > r2 > · · · > rn > 0.
Представляется интуитивно очевидным, что наиболее длинной эта последовательность
окажется при q0 = q1 = q2 = · · · = qn−1 = 1. При этом протокол работы выглядит так:
a = b + r1 , b = r1 + r2 , r1 = r2 + r3 , ... Этим интуитивным наблюдениям нетрудно придать
строгую форму.
Последовательность чисел φi называется последовательностью чисел Фибоначчи, если
φi+1 = φi + φi−1 , то есть каждое число в последовательности является суммой двух
предыдущих, за исключением двух начальных чисел, у которых нет двух предыдущих.
По традиции полагаем φ0 ← 1, φ1 ← 1. Тогда последовательность Фибоначчи имеет вид
1, 1, 2, 3, 5, 8, 13, . . .
Числа Фибоначчи обладают множеством замечательных свойств и применяются в самых
разных областях науки и техники.
44 / 907
1.2.5. Анализ алгоритма Евклида (2/2)
Теорема. [Ламе] Если a > b > 0 и a — наименьшее число, такое, что алгоритм Евклида
нашёл наибольший общий делитель gcd(a, b) за n шагов, то a = φn+2 и b = φn+1 .
Доказательство. Индукция по n. База индукции: n = 1 =⇒ b|a. Число a минимально и
при этом a > b > 0 =⇒ a = 2 = φ2 & b = 1 = φ1 . Индукционный переход: пусть утвер-
ждение теоремы справедливо для всех чисел, меньших n. Первый шаг алгоритма вычис-
лит a = bq + r и после этого алгоритм найдёт gcd(b, r) за n − 1 шаг. По индукционно-
му предположению b = φn−1+2 , r = φn−1+1 и a = qφn+1 + φn . Предположение q > 1
противоречит минимальности числа a, значит a = φn+1 + φn = φn+2 .
Отступление. Доказанная теорема характеризует «худший случай» для алгоритма Евклида. Однако
из доказанной теоремы вовсе не следует, что найдены какие-то формулы и характеристики, поз-
воляющие прямо предсказать или оценить число шагов алгоритма по значениям a и b. Алгоритм
может работать быстро, даже если a и b велики. Например, если a кратно b, то алгоритм найдёт
решение за один шаг, хотя a и b, при этом, могут быть очень большими числами. Нет прямой за-
висимости между величиной наибольшего общего делителя и временем работы алгоритма. Хотя
наибольший общий делитель взаимно простых чисел φn+1 и φn алгоритм ищет максимально дол-
го, но взаимную простоту чисел a + 1 и a алгоритм установит за один шаг. 45 / 907
1.2.6. Свойства чисел Фибоначчи
Теорема. [Соотношение Кассини] φn−1 φn+1 − φ2n = (−1)n .
Доказательство. Обозначим dn = φn−1 φn+1 − φ2n . Имеем
dn+1 = φn+2 φn − φ2n+1 = (φn+1 + φn )φn − (φn + φn−1 )2 =
= φn+1 φn + φ2n − φ2n − 2φn−1 φn − φ2n−1 = φn+1 φn − 2φn−1 φn − φ2n−1 =
= (φn + φn−1 )φn − 2φn−1 φn − φ2n−1 = φ2n − φn−1 φn − φ2n−1 =
= φ2n − (φn + φn−1 )φn−1 = φ2n − φn+1 φn−1 = −dn .
Учитывая, что d2 = 1, получаем требуемое.
Теорема. [Цекендорфа]
∀ a ∈ N (∃ k1 , . . . , kn ∈ N (a = φk1 + φk2 + · · · + φkn & ∀ i ∈ 1..n − 1 (ki > ki+1 + 1))) .
Доказательство. Индукция по a. База: a = 1 = φ1 . Пусть теорема верна для всех чисел,
меньших числа a, рассмотрим число a. Ясно, что ∀ a ∈ N (∃ k1 ∈ N (φk1 6 a < φk1 +1 )).
Положим b ← a − φk1 . Тогда по индукционному предположению, для числа b существует
разложение b = φk2 + · · · + φkn , причём это разложение не может содержать число φk1 −1 ,
так что k1 > k2 + 1.
46 / 907
1.2.7. Диофантовы уравнения
Линейные уравнения, в которых все числа целые, как известные коэффициенты, так и
неизвестные величины, называются диофантовыми.
Мы уже установили, что уравнение ax + by = gcd(a, b) всегда разрешимо в целых числах
и решениями оказываются коэффициенты Безу.
Теорема. Уравнение с целыми коэффициентами ax + by = c разрешимо в целых числах
тогда и только тогда, когда gcd(a, b)|c.
Доказательство. Обозначим d = gcd(a, b). Левая часть ax + by делится на d, значит
уравнение разрешимо тогда и только тогда, когда d|c. Пусть c = de. Уже доказано, что
уравнение ax + by = d всегда имеет решение. Обозначим это решение x0 , y0 . Тогда
x1 = x0 e, y1 = y0 e — решение уравнения ax + by = c.
Замечание. Решения уравнения ax + by = c описываются формулами
b a
x = x1 − k, y = y1 + k, k ∈ Z,
d d
где x1 , y1 — любое частное решение.
47 / 907
1.3. Цепные дроби

В этом разделе кратко рассматривается своеобразный и поучительный способ представ-


ления чисел.

48 / 907
1.3.1. Разложение рационального числа в цепную дробь
Выражение вида
1
q0 + 1 = q0 + 1/(q1 + 1/(q2 + 1/(· · · + 1/qn+1 ))) = [q0 , q1 , q2 , . . . , qn+1 ]
q1 + q2 + 1
···+ q 1
n+1

называется цепной или непрерывной дробью. Числа qi ∈ N называются звеньями цепной


дроби.
Теорема. ∀ a, b ∈ N (∃ ! q0 , . . . , qn+1 ∈ N (a/b = [q0 , . . . , qn+1 ])).
Доказательство. Рассмотрим протокол применения алгоритма Евклида к числам a и b:
a = bq0 + r1 , b = r1 q1 + r2 , . . . , rn−1 = rn qn . Получаем
a r1 1 1
= q0 + = q0 + b = q0 + r2 = · · · = [q0 , q1 , q2 , . . . , qn+1 ].
b b r1
q1 + r1

Разложение единственно, поскольку алгоритм Евклида определяет неполные частные од-


нозначно.
49 / 907
1.3.2. Подходящие дроби (1/2)
Пусть задана цепная дробь [q0 , . . . , qn+1 ]. Последовательность
1 1 + q0 q1 1 q0 + q2 + q0 q1 q2
q0 , q0 + = , q0 + 1 = , . . . , [q0 , . . . , qn+1 ]
q1 q1 q1 + q2
1 + q 1 q2
называется последовательностью подходящих дробей. Обозначим k -ю дробь ak /bk .
Теорема. Числители и знаменатели подходящих дробей связаны рекуррентными соотно-
шениями: ak = qk ak−1 + ak−2 , bk = qk bk−1 + bk−2 .
Доказательство. Индукция по числу звеньев цепной дроби. Полагая a−1 = 1, b−1 = 0,
a0 = q0 , b0 = 1 имеем a1 = q1 q0 + 1, b1 = q1 и база индукции выполнена. Пусть
ak qk ak−1 + ak−2 ak+1
[q0 , . . . , qk ] = = . Рассмотрим = [q0 , q1 , . . . , qk , qk+1 ]. Заметим, что
bk qk bk−1 + bk−2 bk+1
[q0 , q1 , . . . , qk , qk+1 ] = [q0 , q1 , . . . , qk + 1/qk+1 ], и при этом выполняются условия индукци-
ak+1 (qk + 1/qk+1 )ak−1 + ak−2
онного предположения. Значит = =
bk+1 (qk + 1/qk+1 )bk−1 + bk−2
(qk qk+1 + 1)ak−1 + ak−2 qk+1 qk+1 (qk ak−1 + ak−2 ) + ak−1 qk+1 ak + ak−1
= = = .
(qk qk+1 + 1)bk−1 + bk−2 qk+1 qk+1 (qk bk−1 + bk−2 ) + bk−1 qk+1 bk + bk−1
50 / 907
1.3.2. Подходящие
  дроби (2/2)
n+1
ak ak ak−1 (−1)k+1
Теорема. Если — подходящие цепные дроби, то − = .
bk k=1 bk bk−1 bk bk−1
ak ak−1 ak bk−1 − ak−1 bk hk
Доказательство. − = = . Но hk = ak bk−1 − ak−1 bk =
bk bk−1 bk bk−1 bk bk−1
= (qk ak−1 + ak−2 )bk−1 − ak−1 (qk bk−1 − bk−2 ) = ak−2 bk−1 − ak−1 bk−2 = −hk−1 . Учитывая,
что h0 = a0 b−1 − a−1 b0 = −1, имеем требуемое.
Следствие. Подходящие дроби несократимы.
Доказательство. ak bk−1 − ak−1 bk = (−1)k+1 =⇒ gcd(ak , bk ) = 1.
616 616 1
Пример. Рассмотрим . Имеем =2+ .
286 286 6 + 12
a0
По определению b0
= q0 = 2 и далее по рекуррентным формулам получаем:

a1 q1 a0 + a−1 6·2+1 13 a2 q 2 a1 + a0 2 · 13 + 2 28 616


= = = , = = = = .
b1 q1 b0 + b−1 6·1+0 6 b2 q 2 b1 + b0 2·6+1 13 286

51 / 907
1.3.3. Бесконечные цепные дроби (1/3)
Цепные дроби можно использовать для представления любых вещественных чисел, не
только рациональных. Пусть α ∈ R+ — некоторое число. Рассмотрим следующий процесс:
α = q0 + ρ1 = q0 + α11 , q0 ∈ N, ρ1 < 1, α1 > 1,
α1 = q1 + ρ2 = q0 + α12 , q1 ∈ N, ρ2 < 1, α2 > 1,
...
1
αk−2 = qk−2 + ρk−1 = qk−2 + αk−2 , qk−2 ∈ N, ρk−1 < 1, αk−2 > 1,
αk−1 = qk−1 + ρk , qk−1 ∈ N, ρk < 1,
Если α ∈ Q, то процесс завершится при некотором ρk = 0 и образуется цепная дробь
[q0 , . . . , qk−1 ], если же α 6∈ Q, то процесс можно продолжать сколь угодно долго.
√ √
2+1
Пример. Пусть α = 2. Тогда α = q0 + α11 = 1 + α11 , α1 = α−q 1
= √1
2−1
= 2−1
=
√ √
2+1
√ 0

= 2 + 1 = q1 + α12 = 2 + α12 , α2 = α1 −q 1
1
1
= √2−1 = 2−1 = 2 + 1 = q2 + α13 = 2 + α13
...
Мы видим, что начиная со второго шага неполные частные начинают повторяться, поэто-
му
√ корень из двух представляется бесконечной периодической цепной дробью
2 = [1, 2, 2, 2, . . . ] = [1, (2)].
52 / 907
1.3.3. Бесконечные цепные дроби (2/3)
Для любого вещественного числа α ∈ R с помощью указанного процесса всегда можно
построить последовательность подходящих дробей, конечную или бесконечную, перио-
дическую или непериодическую.
Теорема. Последовательность подходящих дробей abkk для вещественного числа α ∈ R
такова, что ab2k 2k
6 α 6 ab2k+12k+1
.
Доказательство. Оборвём процесс построения подходящих дробей на шаге k ,
α = [q0 , . . . , qk−1 , ρk ] так что последний полученный остаток ρk не раскладывается. Тогда
само число α можно считать k -й подходящей дробью. По рекуррентному соотношению
a ρk +ak−2
для подходящих дробей имеем α = bk−1 k−1 ρk +bk−2
.
Следовательноα(bk−1 ρk+bk−2 ) =ak−1 ρk +a k−2 и далее ρk (αbk−1 −ak−1 ) = ak−2 −αbk−2 ,
ak−1 ak−2
откуда ρk bk−1 α − bk−1
= bk−2 bk−2
− α . Таким образом, разности α− abk−1
k−1 ak−2
и bk−2 −α
имеют одинаковые знаки, и остаётся заметить, что a0 /b0 = q0 < α.
1
Следствие. |α − ak /bk | 6 |ak /bk − ak+1 /bk+1 | 6 .
bk bk+1
53 / 907
1.3.3. Бесконечные цепные дроби (3/3)
Рассмотрим теперь бесконечные цепные дроби, то есть бесконечные последовательности
подходящих дробей.
Теорема. Подходящие дроби с чётными номерами возрастают, а подходящие дроби с
нечётными номерами убывают.
Доказательство. Применяя уже доказанные теоремы и оценки, имеем:
a2k−1 a2k 1 a2k+1 a2k 1 a2k+1 a2k+2
− = > − = > − > 0,
b2k−1 b2k b2k−1 b2k b2k+1 b2k b2k b2k+1 b2k+1 b2k+2
поскольку знаменатели подходящих дробей возрастают.
Следствие. Последовательность подходящих дробей имеет предел.
Доказательство. Последовательность чётных подходящих дробей возрастает и ограни-
чена сверху, а значит имеет предел, аналогично последовательность нечётных подходя-
щих дробей убывает и ограничена снизу, а значит имеет предел. Эти пределы совпадают,
поскольку разность между соседними подходящими дробями стремится к нулю.
Таким образом, значением бесконечной цепной дроби является предел последователь-
ности подходящих дробей. Значение любой бесконечной цепной дроби может быть вы-
числено с любой наперёд заданной степенью точности. 54 / 907
1.3.4. Наилучшие приближения
Дробь a/b называют наилучшим приближением к числу α, если не существует такой дроби
x/y , что y 6 b и при этом |α − x/y| < |α − a/b|.
Наилучшее приближение существует всегда, при это оно не всегда единственно,
а у иррациональных чисел бесконечно много наилучших приближений.
Теорема. Если bc − ad = 1, то ∀ x/y (a/b < x/y < c/d =⇒ y > b & y > d).
Доказательство. Рассмотрим разность x/y − a/b.

1 xb − ay x a c a bc − ad
6 = − < − = .
by by y b d b bd
Следовательно, y > d. Аналогично y > b.
Следствие. Все подходящие дроби, начиная со второй, являются наилучшими приближени-
ями.
Доказательство. В последовательности подходящих дробей любые две соседние, взятые
в нужно порядке, являются концами промежутка, о котором речь идёт в теореме.
55 / 907
1.4. Арифметика остатков
Целые числа в компьютере представляются конечными последовательностями битов, при-
чём эти последовательности зачастую имеют не очень большую длину: 16 бит, 32 бита,
64 бита и т. д. Это означает, что диапазон представимых чисел ограничен: −215 .. + 215 и
тому подобное.
Возникает чрезвычайно важный с практической точки зрения вопрос: как при этом про-
изводить арифметические операции в компьютере? Если результат операции помещает-
ся в разрядную сетку компьютера, то всё в порядке. Если же результат выходит за грани-
цы представимого диапазона, то возможны три варианта. Можно диагностировать «пе-
реполнение» и считать операцию невыполнимой, можно программным путём выйти за
пределы разрядной сетки компьютера (реализовать так называемую «длинную арифме-
тику»), или же возможно так переопределить сами арифметические операции, что ре-
зультат всегда представим в заданном диапазоне. Так возникает арифметика остатков
или модулярная арифметика, которая имеет удивительно широкое, можно сказать осно-
вополагающее применение в современных информационных технологиях.
56 / 907
1.4.1. Сравнения (1/3)
Пусть числа a, b, m ∈ N. Говорят, что число a сравнимо по модулю m c числом b, если оба
числа a и b имеют одинаковый остаток при делении на m, то есть a = pm + r, b = qm + r.
Обозначение: a ≡ b (mod m) или в краткой форме a ≡ b (m).
Теорема. Пусть a, b ∈ N, a > b. Число a сравнимо с числом b по модулю m тогда и только
тогда, когда m является делителем a − b: a ≡ b (m) ⇐⇒ m|(a − b).
Доказательство.
[ a ≡ b (m) =⇒ m|(a − b) ] Пусть a = pm + r , b = qm + r .
Тогда a − b = (p − q)m + (r − r) = km и m|(a − b).
[ m|(a − b) =⇒ a ≡ b (m) ] Пусть a − b = km.
Тогда ∃ p, q, ra , rb ∈ N0 (a = pm + ra & b = qm + rb & ra < m & rb < m).
Имеем a − b = (p − q)m + (ra − rb ), откуда ra − rb = 0 и ra = rb = r.
Теорема. Отношение сравнения обладает следующими свойствами:
1. ∀ a, m ∈ N (a ≡ a (m)) рефлексивность;
2. ∀ a, b, m ∈ N (a ≡ b (m) =⇒ b ≡ a (m)) симметричность;
3. ∀ a, b, c, m ∈ N (a ≡ b (m) & b ≡ c (m) =⇒ a ≡ c (m)) транзитивность.
Доказательство. Очевидно из определения. 57 / 907
1.4.1. Сравнения (2/3)
Замечание. Рефлексивное, симметричное и транзитивное отношение называют отноше-
нием эквивалентности и обычно обозначают знаком ≡. Поэтому введённое обозначе-
ние сравнимости чисел вполне оправдано.
Рассмотрим основные свойства введённого отношения сравнимости.
Лемма. [1] Пусть a ≡ b (m) и c ≡ d (m). Тогда (a + c) ≡ (b + d) (m).
Доказательство. Пусть a = qa m + r1 , b = qb m + r1 , c = qc m + r2 , d = qd m + r2 . Тогда
a + c = qa m + r1 + qc m + r2 = qac m + r и b + d = qb m + r1 + qd m + r2 = qbd m + r. Если
r = r1 + r2 > m, то положим r ← r − m, qac ← qac + 1, qbd ← qbd + 1.
Лемма. [2] Пусть a ≡ b (m) и c ≡ d (m). Тогда ac ≡ bd (m).
Доказательство. Не ограничивая общности, можно считать, что a > b, c > d. Так как
m|(a − b) и m|(c − d), то a − b = km, c − d = lm для некоторых целых k, l. Имеем
ac = (km + b)(lm + d) = (klm + bl + dk)m + bd. Из этого равенства следует, что остатки
ac и bd при делении на m равны, а значит, ac ≡ bd (m).
Лемма. [3] Если a ≡ b (m), n ∈ N, то an ≡ bn (m).
Доказательство. Индукция по n. База при n = 1 верна по условию леммы. Индукционный
переход по лемме 2. 58 / 907
1.4.1. Сравнения (3/3)
Из доказанных лемм непосредственно следует теорема.
Теорема. Пусть f (x) = an xn + an−1 xn−1 + . . . + a0 — многочлен с натуральными коэф-
фициентами. Тогда если a ≡ b (m), то f (a) ≡ f (b) (m).
Отношение сравнимости тесно связано с отношением делимости.
Теорема. Имеют место следующие свойства:
1. a ≡ b (m) & k|m =⇒ a ≡ b (k);
2. a ≡ b (m1 ) & a ≡ b (m2 ) =⇒ a ≡ b (lcm(m1 , m2 ));
3. a ≡ b (m) =⇒ ac ≡ bc (m);
4. a ≡ b (m1 ) & a ≡ b (m2 ) & gcd(m1 , m2 ) = 1 =⇒ a ≡ b (m1 m2 );
Доказательство.
[ 1 ] Если m|(a − b), то k|(a − b).
[ 2 ] a − b кратно m1 и m2 , любое общее кратное делится на наименьшее общее кратное.
[ 3 ] (ac − bc)/(mc) = (a − b)/m.
[ 4 ] Поскольку m1 ⊥ m2 , имеем m1 |(a − b) & m2 |(a − b) =⇒ m1 m2 |(a − b).
59 / 907
1.4.2. Системы вычетов (1/4)
Замечание. Поскольку деление с остатком определено для всех целых чисел, отношение
сравнения по модулю легко может быть определено не только для натуральных, но и для
всех целых чисел. Это обстоятельство используется нами в случае необходимости без
дополнительных оговорок.
Классом вычетов по модулю m для числа a (обозначение [a]m ) называется множество
чисел, сравнимых с a:
Def
[a]m = {b ∈ Z | b ≡ a (m)} , a ∈ Z, m ∈ N.
Замечание. Слово «вычет» употребляется как синоним слова «остаток». Всего классов
вычетов по модулю m ровно m и один класс вычетов составляют все числа, дающие
один и тот же остаток при делении на m.
Определим над классами вычетов операции сложения +m и умножения ∗m :
Def Def
[x]m +m [y]m = [(x + y)]m , [x]m ∗m [y]m = [(xy)]m .
Поскольку сложение и умножение чисел однозначны, введённые операции сложения и
умножения по модулю также однозначны. 60 / 907
1.4.2. Системы вычетов (2/4)
Множество классов вычетов с введёнными операциями сложения и умножения по моду-
лю m обозначается Zm .
Полной системой вычетов по модулю m называют множество целых чисел, содержащее
ровно по одному элементу из каждого класса вычетов по модулю m.
Пример. {7, 10, −1, 3, 101} — полная система вычетов по модулю 5.
Множество {0, 1, 2, . . . , m − 1} называется системой наименьших неотрицательных вы-
четов по модулю m. По принципу Дирихле эта система полна.
Используя систему наименьших неотрицательных вычетов удобно задавать операции
сложения и умножения по модулю в виде таблиц.
Пример. Таблицы сложения и умножения для Z3 и Z4 .
+4 0 1 2 3 ∗4 0 1 2 3
+3 0 1 2 ∗3 0 1 2
0 0 1 2 3 0 0 0 0 0
0 0 1 2 0 0 0 0
1 1 2 3 0 1 0 1 2 3
1 1 2 0 1 0 1 2
2 2 3 0 1 2 0 2 0 2
2 2 0 1 2 0 2 1
3 3 0 1 2 3 0 3 2 1 61 / 907
1.4.2. Системы вычетов (3/4)
Теорема. [О полных системах вычетов] Пусть {a1 , . . . , am } — полная система вычетов
по модулю m, x, y — целые числа, x ⊥ m. Тогда {y + xa1 , . . . , y + xam } — полная система
вычетов по модулю m.
Доказательство. Покажем, что числа y + xa1 , . . . , y + xam дают различные остатки при
делении на число m. Тогда, поскольку чисел ровно m, они образуют полную систему вы-
четов. Предположим противное, пусть y + xai и y + xaj дают одинаковые остатки при
делении на m. Тогда xai + y ≡ xaj + y (m) или m|x(ai − aj ). Так как x ⊥ m, m|(ai − aj )
или ai ≡ aj (m), что противоречит тому, что исходная система вычетов {a1 , . . . , am } яв-
ляется полной системой вычетов по модулю m.
Следствие. Если число p ∈ P — простое, то ∀ x ∈ Zp \ {0} (∃ y ∈ Zp (xy ≡ 1 (p))).
Другими словами, если число p ∈ P — простое, то любой элемент Zp , кроме нуля, имеет
обратный.
Доказательство. Рассмотрим любую полную систему вычетов {a1 , . . . , ap }, умноженную
на x, {xa1 , . . . , xap }. По теореме это будет полная система вычетов, то есть,
∃ z ∈ {xa1 , . . . , xap } (z ≡ 1 (p)), где z = xai . Класс [ai ]p и будет искомым обратным
элементом для [x]p . 62 / 907
1.4.2. Системы вычетов (4/4)
Рассмотрим теперь деление сравнений.
Лемма. Если a ≡ b (m), то gcd(a, m) = gcd(b, m).
Доказательство. a ≡ b (m) =⇒ b = a + mk , k ∈ Z =⇒ gcd(a, m) = gcd(b, m).
Теорема. Если ac ≡ bc (m) и d = gcd(c, m), то a ≡ b m

d
.
Доказательство. Пусть c = c1 d и m = m1 d. Тогда ac − bc = km и
ac − bc (a − b)c1
k= = .
m m1
Следовательно, m1 |(a − b)c1 , но c1 ⊥ m1 и значит m1 |(a − b) то есть a ≡ b m

d
.
Из теоремы следуют два важных частных случая.
Следствие. ac ≡ bc (m) & m = cd =⇒ a ≡ b (d).
Другими словами, сравнения можно сокращать на общий множитель.
Следствие. ac ≡ bc (m) & m ⊥ c =⇒ a ≡ b (m).
Другими словами, сравнения можно сокращать на множитель, взаимно простой с моду-
лем.
63 / 907
1.4.3. Линейные сравнения
Уравнение ax ≡ b (m) называется линейным сравнением, по аналогии с линейным урав-
нением в алгебре.
Теорема. Сравнение ax ≡ b (m) разрешимо тогда и только тогда, когда gcd(a, m)|b.
Доказательство. Сравнение ax ≡ b (m) разрешимо тогда и только тогда, когда разреши-
мо диофантово уравнение ax − my = b. Действительно,
ax ≡ b (m) ⇐⇒ m|(ax − b) ⇐⇒ ax − b = my ⇐⇒ ax − my = b. Далее по теореме
п. 1.2.7 получаем ровно d классов решений x0 , x0 + md
, . . . , x0 + (d − 1) md , где x0 —
любое частное решение диофантова уравнения.
Пример. Решим сравнение 25x ≡ 20 (15). Здесь a = 25, b = 20, m = 15, d = 5.
Во-первых, всё сравнение можно сократить на d. Получаем сравнение 5x ≡ 4 (3).
Во-вторых, диофантово уравнение 5x − 3y = 4, как нетрудно проверить, имеет частное
решение x0 = 2, y0 = 2. Таким образом, в-третьих, исходное сравнение имеет пять
решений: x0 = 2, x1 = 2+1·3 = 5, x2 = 2+2·3 = 8, x3 = 2+3·3 = 11, x4 = 2+4·3 = 14.
Следствие. Если p — простое число, то сравнение ax ≡ b (p) имеет единственное реше-
ние за исключением случая p|a.
64 / 907
1.4.4. Китайская теорема об остатках
Замечание. Китайская теорема об остатках была сформулирована в Китае, предполо-
жительно, в 3 веке н.э., китайским математиком Сунь Цзы, откуда и получила свое назва-
ние.
Теорема. Для любых попарно взаимно простых натуральных чисел a1 , . . . , an и для любых
целых чисел r1 , . . . , rn таких, что ∀ i ∈ 1..n (0 6 ri < ai ) существует такое число s, что
деление его на каждое из чисел ai даёт в остатке число ri .
Доказательство. Индукция по n. База: при n = 1 возьмём s ← r1 . Индукционный пере-
ход. Пусть ∃ t ∈ N (∀ i ∈ 1..(n − 1) (t = qi ai + ri )). Рассмотрим систему наименьших
неотрицательных вычетов {0, . . . , an − 1} по модулю an и применим теорему о пол-
ных системах вычетов, полагая x ← a1 a2 . . . an−1 и y ← t. Тогда система чисел s1 = t,
s2 = t + x, . . . , san = t + (an − 1)x является полной системой вычетов по модулю an ,
причём ∀ i ∈ 1..(n − 1) (∀ j ∈ 1..an (sj ≡ t (ai ))) по построению. Ввиду полноты систе-
мы среди чисел s1 , . . . , san существует такое число s, которое при делении на an даст в
остатке rn .
Следствие. Пусть m ← m1 m2 . . . mn , ∀ i, j ∈ 1..n, i 6= j (mi ⊥ mj ), x, a ∈ Z.
Тогда x ≡ a (m) ⇐⇒ ∀ i ∈ 1..n (x ≡ a (mi )). 65 / 907
1.4.5. Вычисления в остаточных классах (1/3)
Замечание. Пусть M = m1 m2 . . . mk , причём числа m1 , m2 . . . mk — попарно взаимно
просты. Тогда китайская теорема об остатках позволяет ввести взаимно однозначное
соответствие между остатками при делении на M и наборами остатков от деления на
m1 , m2 . . . mk .
Пусть m ← m1 m2 . . . mn , ∀ i, j ∈ 1..n, i 6= j (mi ⊥ mj ). По следствию к китайской теоре-
ме об остатках любое число a ∈ 0..(m−1) однозначно определяется остатками a1 , . . . , an
от деления числа a на числа m1 , . . . , mn . Такая непозиционная система счисления назы-
вается системой остаточных классов, или модулярной арифметикой.
Набор чисел m1 , . . . , mn называется основанием системы остаточных классов.
Обозначение: a = (a1 , . . . , an ).
В системе остаточных классов операции сложения и умножения выполняются покомпо-
нентно, то есть, если a = (a1 , . . . , an ), b = (b1 , . . . , bn ), a+b = c, ab = d, то c = (c1 , . . . , cn ),
d = (d1 , . . . , dn ), где ci ←(ai + bi ) mod m и di ←(ai bi ) mod m соответственно.

66 / 907
1.4.5. Вычисления в остаточных классах (2/3)

Пример. Пусть система остаточных классов задана своим основанием (3, 4, 5). Вычислим
в этой системе сумму и произведение чисел 7 и 8.
Имеем: 7 = (7 mod 3, 7 mod 4, 7 mod 5) = (1, 3, 2), 8 = (2, 0, 3).
Тогда сложение:
7 + 8 = ((1 + 2) mod 3, (3 + 0) mod 4, (2 + 3) mod 5) = (0, 3, 0) и
15 = (15 mod 3, 15 mod 4, 15 mod 5) = (0, 3, 0).
Умножение:
7 · 8 = ((1 · 2) mod 3, (3 · 0) mod 4, (2 · 3) mod 5) = (2, 0, 1) и
56 = (56 mod 3, 56 mod 4, 56 mod 5) = (2, 0, 1).

67 / 907
1.4.5. Вычисления в остаточных классах (3/3)
Отступление. Вычисления в остаточных классах в некоторых специальных применениях исполь-
зуются наряду или даже вместо вычислений в обычной позиционной двоичной системе счисле-
ния.
Одним из главных преимуществ вычислений в системах остаточных классов является отсутствие
переноса разрядов при сложении и умножении, поскольку достаточно сложить или умножить
представляющие векторы поэлементно. В специализированном процессоре это можно сделать
параллельно, а поэтому время выполнения обеих операций не зависит от количества чисел в ос-
новании системы остаточных классов. Сами числа в основании системы остаточных классов мож-
но выбирать небольшими, и аппаратные операции с ними можно выполнять очень быстро.
Ограничение диапазона представления чисел не является существенным. Например, если взять
основания 3, 5, 7, 11, 13, то для хранения остатков потребуется 2 + 3 + 3 + 4 + 4 = 16 бит. При
этом диапазон представления составит 0..15014, что вполне сопоставимо с диапазоном 0..65535
для 16-битных двоичных чисел.
Действительно существенным недостатком вычислений в остаточных классах являются медлен-
ные алгоритмы перевода из позиционной системы счисления в систему остаточных классов и об-
ратно, а также деления с остатком. Эффективные алгоритмы для этих операций неизвестны.
68 / 907
1.5. Функция Эйлера

Функция и теорема Эйлера обобщают знаменитую теорему Ферма, которая является од-
ной из ключевых теорем в теории чисел, и поэтому занимают одно из центральных мест
в этой области математики.
Функцией Эйлера от натурального аргумента n называется количество чисел меньших n
и взаимно простых с n. Стандартным обозначением для функции Эйлера является ϕ(n).
Из определения ясно, что n > 1 =⇒ 1 6 ϕ(n) < n. По определению ϕ(1) = 1.
Пример. ϕ(1) = 1, ϕ(2) = 1, ϕ(3) = 2, ϕ(4) = 2, ϕ(5) = 4, ϕ(6) = 2.

69 / 907
1.5.1. Аддитивные и мультипликативные функции (1/2)
Вообще говоря, числовая функция f называется аддитивной, если она уважает сложе-
ние, т. е. f (x + y) = f (x) + f (y), и называется мультипликативной, если она уважает
умножение, т. е. f (xy) = f (x)f (y).
В теории чисел используются несколько отличающиеся определения этих понятий.
Функция f : N → N называется аддитивной, если
∀ x, y ∈ N (x ⊥ y =⇒ f (x + y) = f (x) + f (y))
и называется мультипликативной, если
∀ x, y ∈ N (x ⊥ y =⇒ f (xy) = f (x)f (y)) .
Примеры. Количество множителей в разложении числа n на простые без учета кратно-
сти Ω(n) — аддитивная функция. Число делителей числа n (обозначается d(n)) и сумма
делителей числа n (обозначается σ(n)) — мультипликативные функции.
Также в теории чисел выделяют вполне аддитивные и вполне мультипликативные функ-
ции, пренебрегая взаимной простотой в соответствующих определениях.
Пример. Степенная функция f (n) = na , a > 0 вполне мультипликативна.
70 / 907
1.5.1. Аддитивные и мультипликативные функции (2/2)
Для подсчёта значения мультипликативной функцией f (n) для произвольного n доста-
точно уметь считать значения f (pa ), где p ∈ P, a ∈ N0 . Действительно, пусть n — про-
извольное натуральное число. Тогда по основной теореме арифметики число n можно
единственным образом разложить на простые множители n = pa11 pa22 . . . pakk , и из муль-
типликативности получим f (n) = f (pa11 pa22 . . . pakk ) = f (pa11 )f (pa22 ) . . . f (pakk ).
Теорема. Функция Эйлера мультипликативна.
Доказательство. Пусть a ⊥ b. Рассмотрим множество
U = {ax + by | x ∈ {1, 2, . . . , b}, y ∈ {1, 2, . . . , a}} ,
состоящее из ab чисел. Заметим, что все они дают разные остатки при делении на ab.
Действительно, пусть ax1 + by1 ≡ ax2 + by2 (ab). Тогда ax1 ≡ ax2 (b) и by1 ≡ by2 (a),
откуда x1 = x2 и y1 = y2 . Далее, ax + by ⊥ ab ⇐⇒ x ⊥ b & y ⊥ a. Действительно, ax +
by ⊥ ab ⇐⇒ ax+by ⊥ b & ax+by ⊥ a ⇐⇒ ax ⊥ b & by ⊥ a ⇐⇒ x ⊥ b & y ⊥ a. Таким
образом, множество элементов U , взаимно простых с ab, изоморфно множеству пар (x, y)
таких, что x ∈ 1..b & x ⊥ b, y ∈ 1..a & y ⊥ a. Но | {x, y | ax + by ⊥ ab} | = ϕ(ab),
| {x ∈ 1..b | x ⊥ a} | = ϕ(a), | {y ∈ 1..a | y ⊥ b} | = ϕ(b). Поэтому ϕ(ab) = ϕ(a)ϕ(b).
71 / 907
1.5.2. Вычисление функция Эйлера  
a 1 a a−1 a
Лемма. Если p ∈ P, a ∈ N, то ϕ(p ) = p − p =p 1− .
p
Доказательство. Всех рассматриваемых чисел pa − 1. из них числами, не взаимно про-
стыми со степенью простого числа, являются те и только те, которые на это простое число
делятся. Эти числа имеют вид 1p, 2p, 3p, . . . , pa−1 p, а их ровно pa−1 − 1.
Получаем ϕ(pa ) = (pa − 1) − (pa−1 − 1) = pa − pa−1 = pa (1 − 1/p).
Теорема. Если n = pa11 pa22 . . . pakk , pi ∈ P, то
k  
Y 1
pa11 pa11 −1 pa22 pa22 −1 pakk pakk −1
  
ϕ(n) = − − ... − =n 1− .
i=1
pi
Доказательство. В разложении числа на множители сомножители взаимно просты, функ-
ция Эйлера мультипликативна, отсюда ϕ(n) = ϕ(pa11 ) . . . ϕ(pakk ) и далее применяем лем-
му k раз.
Замечание. Значение функции Эйлера — натуральное число, хотя формула «не выглядит
целочисленной».
Пример. ϕ(36) = ϕ(22 32 ) = 36(1 − 1/2)(1 − 1/3) = 36 21 23 = 12. 72 / 907
1.5.3. Теорема Эйлера–Ферма (1/2)
Приведённой системой вычетов по модулю m называют множество целых чисел, содер-
жащее ровно по одному элементу из каждого класса вычетов по модулю m, взаимно про-
стого с m.
Теорема. Если {a1 , . . . , an } — приведённая система вычетов по модулю m, x ∈ Z, x ⊥ m,
то {xa1 , . . . , xan } — приведённая система вычетов по модулю m.
Доказательство. Аналогично случаю полной системы вычетов.
Замечание. Приведённая система вычетов по модулю n содержит ϕ(n) элементов.
Теорема. [Эйлера] Если a ⊥ n, то aϕ(n) ≡ 1 (n).
Доказательство. Рассмотрим приведённую систему вычетов {x1 , . . . , xϕ(n) } по модулю n.
В ней ровно ϕ(n) элементов. Домножим каждый элемент этой системы на a. Полученная
система тоже является приведённой системой вычетов по модулю n. Таким образом,
произведение всех полученных вычетов сравнимо с произведением всех исходных (по-
скольку новая система вычетов также приведённая, то она является некоторой пере-
становкой исходной системы). Отсюда ax1 ax2 . . . axϕ(n) ≡ x1 x2 . . . xϕ(n) (n). Поскольку
x1 x2 . . . xϕ(n) взаимно просто с n, то на это произведение можно поделить обе части срав-
нения. Получим aϕ(n) ≡ 1 (n). 73 / 907
1.5.3. Теорема Эйлера–Ферма (2/2)

Следствие. [малая теорема Ферма] Пусть p — простое число. Тогда ap−1 ≡ 1 (p) для
любого a, не делящегося на p.
Пример. Покажем, как теорему Эйлера можно применять в задаче, на первый взгляд ни-
чего общего с ней не имеющей. Пусть числа m и n взаимно просты, n не делится ни
на 2, ни на 5. Оценить длину периода дроби x = m n
. Решение. Существует t такое, что
(10t − 1)x = y , где y — целое число. Отсюда x = 10ty−1 . Поскольку m
n
— несократимая
t
дробь, имеем (10 − 1)|n. Заметим, что t = ϕ(n) подходит по теореме Эйлера, а длина
периода — минимальное такое t, значит, длина периода не превосходит ϕ(n).

74 / 907
1.6. Операции с полиномами
Выражение вида Pn (x) = an xn + an−1 xn−1 + · · · + a1 x + a0 называют полиномом или
многочленом. Здесь x — переменная, ai — коэффициенты, n — степень полинома.
Для указания степени полинома можно использовать нижний индекс или функцию deg:

deg Pn (x) = n.

В конкретных построениях указывается также, из какого множества берутся коэффици-


енты и значения переменной. Обычно это подходящее числовое множество, поскольку
необходимо, чтобы были определены операции сложения и умножения с нужными свой-
ствами, а также нейтральный элемент по сложению (ноль) и нейтральный элемент по
умножению (единица).
Примеры. Здесь рассматриваются полиномы над множествами R — вещественные числа,
Q — рациональные числа, Z — целые числа, Zm — классы вычетов по модулю m. Во всех
этих множествах операции сложения и умножения определены.
75 / 907
1.6.1. Сложение и умножение полиномов (1/2)
Полином Pn (x) = an xn + an−1 xn−1 + · · · + a1 x + a0 полностью определяется последова-
тельностью своих коэффициентов (an , . . . , a0 ), причём старший коэффициент не равен
нулю. По этой причине операции с полиномами могут и должны определяться как опе-
рации над векторами длины n + 1.
Замечание. Совершенно аналогично числа полностью определяются последовательно-
стью своих цифр в позиционной системе счисления с основанием b:
n = an bn + · · · + a1 b + a0 . Поэтому операции с числами сводятся к операциям с цифрами,
которые изучаются в начальной школе.
Отступление. Операции с полиномами в чём-то даже проще операций с числами, поскольку от-
сутствуют переносы из разряда в разряд.
Пусть Pn (x) = an xn +an−1 xn−1 +· · ·+a1 x+a0 и Qm (x) = bm xm +bm−1 xm−1 +· · ·+b1 x+b0 ,
причём n > m. Тогда сумма полиномов определяется по следующей формуле:
n
X m
X
n n−1 i
Pn (x) + Qm (x) = Sn (x) = can x + cn−1 x + · · · + c1 x + c0 = ai x + (ai + bi )xi ,
i=m+1 i=0

где ci ← if i 6 m then ai + bi else ai end if. 76 / 907


1.6.1. Сложение и умножение полиномов (2/2)
Пусть Pn (x) = an xn +an−1 xn−1 +· · ·+a1 x+a0 и Qm (x) = bm xm +bm−1 xm−1 +· · ·+b1 x+b0 ,
причём n > m. Тогда произведение полиномов определяется по следующей формуле:
n+m
!
X X
Pn (x)Qm (x) = Sn+m (x) = cn+m xn+m + + · · · + c1 x + c0 = ai b j xk ,
k=0 i+j=k

где коэффициенты ck определяются следующим алгоритмом:


ck ← 0; for i from 0 to k do ck ← ck + ai bk−i end for.
Полином, состоящий из одного слагаемого an xn , называется мономом. Умножение про-
извольного полинома Qm (x) на моном an xn выполняется очень просто:
for i from 0 to n − 1 do ci ← 0 end for; for i from 0 to m do cn+i ← an bi end for.
Отсюда получается алгоритм умножения полиномов «в столбик»: достаточно умножить
первый полином на все мономы второго полинома, а потом сложить полученные произ-
ведения.
Замечание. Если хотя бы один из полиномов разреженный, то есть содержит мало нену-
левых мономов, то такой приём может сократить количество выполняемых операций.77 / 907
1.6.2. Деление полиномов
Теорема. Если An (x), Bm (x) — полиномы, причём n > m > 0, то существуют единствен-
ные полиномы Qq (x), Rr (x) такие, что An (x) = Bm (x)Qq (x)+Rr (x), причём m > r > 0.
Доказательство. Обозначим (0) — нулевой полином, то есть полином с единственным
мономом нулевой степени и нулевым коэффициентом. Существование и единственность
указанного разложения обеспечено следующим алгоритмом деления «уголком».
R ← A //начальный остаток — это делимое
Q ←(0) //начальное частное — нулевой полином
α ← 1/bm //обратное значение старшего коэффициента делителя
while r > m do
T ← αxr−m //очередной моном в неполное частное
Q ← Q + T //пополняем неполное частное
R ← R − T B //уменьшаем остаток
end while
На каждом шаге работы алгоритма сохраняется инвариант цикла A = BQ + R.
Пример. Пусть A(x) = x2 + 2x + 3, B(x) = x + 1.
Тогда x2 + 2x + 3 = x(x + 1) + (x + 3) = (x + 1)(x + 1) + 2. 78 / 907
1.6.3. Теорема Безу и схема Горнера
Теорема. [Безу] P (x) = Q(x)(x − α) + P (α).
Доказательство. Степень делителя x−α равна 1, а значит степень остатка равна 0. Имеем
P (x) = Q(x)(x − α) + r, следовательно P (α) = r.
Следствие. Бином x − α является делителем полинома P (x) тогда и только тогда, когда
α является корнем, то есть P (α) = 0.
Теорема Безу позволяет обосновать алгоритм вычисления значения полинома, извест-
ный как схема Горнера, который не требует возведения в степень и вычисления значений
мономов, а потому более эффективен (см. параграф 1.1.9).
Идея заключается в том, чтобы последовательно делить многочлен на моном x:
P (x) = x(Q1 (x)) + a0 = x(x(Q2 (x) + a1 ) + a0 = · · · = a0 + x(a1 + . . . x(an−1 + xan ) . . . ).
Алгоритм вычисления по схеме Горнера значения полинома, заданного поcледователь-
ностью коэффициентов:
s ← 0 //начальное значение
for i from 0 to n do s ← sx + ai end for //по схеме Горнера
79 / 907
1.6.4. Алгоритм Евклида для полиномов
Из предыдущих параграфов видно, что деление с остатком для полиномов и для нату-
ральных чисел обладает сходными свойствами, неполное частное и остаток определя-
ются однозначно. Однако наибольший общий делитель для полиномов однозначно не
определяется. Дело в том, что множество общих делителей двух полиномов бесконечно:
если полиномы A(x) и B(x) без остатка делятся на полином C(x), то они без остатка де-
лятся и на полином αC(x) при любом α 6= 0. В частности, любые два полинома делятся
без остатка на любую константу, не равную нулю.
Наибольшим общим делителем двух ненулевых полиномов называется полином наи-
большей степени, на который данные полиномы делятся без остатка.
Замечание. Наибольший общий делитель ненулевых полиномов существует и определя-
ется с точностью до константы.
Найти наибольший общий делитель и его линейное представление можно разложением
на множители или с помощью обобщённого алгоритма Евклида.
Пример. gcd(x3 − 1, x2 − 1) = gcd(x2 − 1, x − 1) = x − 1,
1 · (x3 − 1) − x(x2 − 1) = x − 1.
80 / 907
1.6.5. Интерполяционная формула Лагранжа (1/2)
Подобно алгоритму Евклида, на полиномы переносится и китайская теорема об остатках.
Полиномы называются взаимно простыми, если у них нет общих делителей, отличных от
константы.
Замечание. В теoреме нижние индексы у полиномов означают не степени, а номера.
Теорема. Пусть P (x), R1 (x), . . . , Rn (x), M1 (x), . . . , Mn (x) — некоторые полиномы и
пусть выполнены сравнения P (x) ≡ R1 (x) (M1 (x)) , . . . , P (x) ≡ Rn (x) (Mn (x)).
Тогда если полиномы M1 (x), . . . , Mn (x) попарно взаимно просты, то
n
X
P (x) ≡ Ci (x)Di (x)Ri (x) ( mod M (x)) ,
i=1

n
Y M (x)
где M (x) = Mi (x), Ci (x) = , Di (x)Ci (x) ≡ 1 ( mod Mi (x)).
i=1
Mi (x)
Доказательство. Аналогично случаю для чисел.
81 / 907
1.6.5. Интерполяционная формула Лагранжа (2/2)
Теорема. Если deg P (x) = n и известны значения полинома в n + 1 различных точках
P (x0 ) = y0 , P (x1 ) = y1 , . . . , P (xn ) = yn , то
n
X (x − x0 ) . . . (x − xi−1 )(x − xi+1 ) . . . (x − xn )
P (x) = yi .
i=0
(x i − x 0 ) . . . (x i − x i−1 )(x i − x i+1 ) . . . (x i − x n )
Доказательство. По теореме Безу P (xi ) = yi ⇐⇒ P (x) ≡ yi ( mod (x − xi )). Положим
n
Y M (x) Y
Ri (x) = yi , M (x) = (x − xk ), Ci (x) = = (x − xk ), где полиномы
k=0
Mi (x) k6=i
Mi = x − xi попарно взаимно просты. Тогда gcd(Ci (x), Mi (x)) = 1 и существует по-
лином Di (x), который удовлетворяет уравнению Ci (x)Di (x) + Mi (x)B(x) = 1 (линей-
ное представление), где B(x) — какой-то полином. При этом deg Di < deg Mi = 1 и
значит deg Di (x) = 0 и Di = di . Подставив это в линейное представление, имеем:
Ci (xi )di + Mi (x)B(xi ) = 1, но Mi (xi ) = 0, значит di = 1/Ci (xi ). По китайской тео-
n n n Y x − xk
X X Ci (x) X
реме об остатках P (x) = Ci (x)Di (x)Ri (x) = yi = yi .
i=0 i=0
Ci (xi ) i=0 i6=k
xk − xi
82 / 907
1.6.6. Разложение полиномов на неприводимые множители (1/2)
Полином P (x) называется неприводимым (или примитивным) над заданным множеством,
если не существует полиномов P1 (x) и P2 (x) над этим же множеством таких,
что P (x) = P1 (x)P2 (x).
Замечание. Неприводимость полинома√ зависит
√ от множества.
2
Например, полином x − 2 = (x − 2)(x + 2) разлагается на множители над веще-
ственными числами R, но этот же полином неприводим над целыми числами Z и рацио-
нальными числами Q.
Отступление. Разложение числа на простые множители является вычислительно трудоёмкой за-
дачей. Это же справедливо и для полиномов.
Для приложений дискретной математики наибольший интерес представляет разложение
полиномов над множеством рациональных чисел Q
Бином x − α является простейшим неприводимым полиномом, поэтому естественный
первый вопрос такой: в каких случаях полином P (x) над множеством рациональных чи-
сел Q делится на бином x − α? По теореме Безу P (x) = (x − α)P1 (x) ⇐⇒ P (α) = 0.
83 / 907
1.6.6. Разложение полиномов на неприводимые множители (2/2)
Таким образом, возникает эквивалентный вопрос: в каких случаях полином с рациональ-
ными коэффициентами имеет рациональные корни? Прежде всего заметим, что можно
полином с рациональными коэффициентами умножить на наибольший общий знамена-
тель всех коэффициентов и получится эквивалентный с точки зрения разложения на мно-
жители полином с целыми коэффициентами.
Теорема. Если несократимая дробь p/q ∈ Q является корнем полинома с целыми коэффи-
циентами P (x) = an xn + · · · + a0 , то p|a0 & q|an .
Доказательство. Пусть p/q — корень, тогда an (p/q)n +an−1 (p/q)n−1 +· · ·+a1 (p/q)+a0 = 0
и an pn + an−1 pn−1 q + · · · + a1 pq n−1 + a0 q n = 0. В уравнении an pn + an−1 pn−1 q + · · · +
a1 pq n−1 = −a0 q n левая часть делится на число p, значит p|a0 . Аналогично в уравнении
−an p= an−1 pn−1 q + · · · + a1 pq n−1 + a0 q n правая часть делится на число q , значит q|an .
Доказанная теорема не даёт необходимого и достаточного условия выделения бинома
из полинома, но позволяет найти такой бином подбором, если он существует.
Пример. Полином 2x2 −x+1 неприводим над множеством рациональных чисел Q, потому
что все дроби, удовлетворяющие условиям теоремы, 1/1, −1/1, −1/2 и 1/2, не являются
корнями полинома. 84 / 907
2. Комбинаторный анализ
Предмету комбинаторного анализа или, короче, комбинаторике не так просто дать крат-
кое исчерпывающее определение. В некотором смысле слово «комбинаторика» можно
понимать как синоним термина «дискретная математика», то есть исследование дискрет-
ных конечных математических структур. На школьном уровне с термином «комбинато-
рика» связывают просто набор известных формул, служащих для вычисления так назы-
ваемых комбинаторных чисел, о которых идёт речь в первых разделах этой главы. Может
показаться, что эти формулы полезны только для решения олимпиадных задач и не име-
ют отношения к практическому программированию. На самом деле это далеко не так.
Вычисления на дискретных конечных математических структурах, которые часто назы-
вают комбинаторными вычислениями, требуют комбинаторного анализа для установле-
ния свойств и выявления оценки применимости используемых алгоритмов. Без проведе-
ния такого анализа, легко совершить ошибку, и предложить алгоритм, который упешно
работает на тестовых примерах, но неприменим на реальных данных из-за эффекта так
называемого «комбинаторного взрыва». В этой теме мы уделяем особое внимание ана-
лизу применимости алгоритмов.
85 / 907
2.1. Комбинаторные задачи

Во многих практических случаях возникает необходимость подсчитать количество воз-


можных комбинаций объектов, удовлетворяющих определённым условиям. Такие зада-
чи называются комбинаторными. Во всех случаях основным инструментом такого анали-
за оказываются формулы и методы, рассматриваемые в этой теме.
Разнообразие комбинаторных задач не поддаётся исчерпывающему описанию, но сре-
ди них есть целый ряд особенно часто встречающихся, для которых известны способы
подсчёта.

86 / 907
2.1.1. Комбинаторные конфигурации (1/4)
Для формулировки и решения комбинаторных задач используются различные модели
комбинаторных конфигураций. Рассмотрим следующие две наиболее популярные:
1. Дано n мячей. Их нужно разместить по m ящикам так, чтобы выполнялись заданные
ограничения. Сколькими способами это можно сделать?
2. Рассмотрим множество функций f : 1..n → 1..m. Сколько существует функций f ,
удовлетворяющих заданным ограничениям?
Замечание. Большей частью соответствие конфигураций, описанных на «языке мячей и
ящиков» и на «языке функций», очевидно, поэтому доказательство правильности спосо-
ба подсчёта (вывод формулы) можно провести на любом языке. Если сведе́ние одной мо-
дели к другой не очевидно, то оно включается в доказательство.
Отступление. Здесь рассматриваются именно функции, то есть однозначные отношения, посколь-
ку в большинстве случаев этого оказывается достаточно, а выводить формулы для функций про-
ще. Однако встречаются комбинаторные задачи, когда для построения адекватных конфигураций
приходится использовать многозначные отношения.
87 / 907
2.1.1. Комбинаторные конфигурации (2/4)

Таким образом, при решении комбинаторных задач требуется вычислять мощность неко-
торых множеств (множества функций, множества размещений мячей по ящикам). При
этом часто оказываются полезными следующие три наблюдения из теории множеств, ко-
торым даны специальные названия.
Неформально правило суммы (или правило сложения) формулируется следующим обра-
зом: если возможности построения комбинаторной конфигурации взаимно исключают
друг друга, то их количества следует складывать.
Пример. Сколько возможных ходов имеет ферзь, стоящий на одном из центральных по-
лей пустой шахматной доски? Решение: ферзь может пойти либо по горизонтали (7 хо-
дов), либо по вертикали (7 ходов), либо по главной диагонали (7 ходов), либо по ортого-
нальной диагонали (6 ходов). Ответ: 7 + 7 + 7 + 6 = 27.

88 / 907
2.1.1. Комбинаторные конфигурации (3/4)

Неформально правило произведения (или правило умножения) формулируется следующим


образом: если возможности построения комбинаторной конфигурации независимы, то их
количества следует умножать.
Пример. Сколькими способами можно на шахматной доске поставить две ладьи разного
цвета так, чтобы они не били друг друга? Решение: первую ладью можно поставить на
любое из 64 полей, при этом она будет бить 14 полей. Вторую ладью можно поставить на
любое из оставшихся 64 − 15 = 49 полей. Ответ: 64 · 49 = 3136 способов.
Правила суммы и произведения могут применяться совместно.
Пример. Сколькими способами можно на шахматной доске поставить два короля разного
цвета так, чтобы они не били друг друга? Решение: король может стоять либо в углу доски
(4 занятых поля), либо на краю доски (6 занятых полей), либо не на краю (9 занятых
полей). Ответ: 4 · (64 − 4) + 24 · (64 − 6) + 36 · (64 − 9) = 240 + 1392 + 1980 = 3612
способов.

89 / 907
2.1.1. Комбинаторные конфигурации (4/4)
Неформально принцип Дирихле часто излагают в следующей форме: если n 6= m, то n
кроликов невозможно рассадить в m клеток так, чтобы в каждой клетке было по одному
кролику.
Примеры.
1. Пусть в равностороннем треугольнике со стороной 1 расположены 5 точек. Тогда су-
ществует по крайней мере две точки, расстояние между которыми не больше 1/2 .
Действительно, средние линии треугольника разбивают его на четыре равносторон-
них треугольника со стороной 1/2 . По принципу Дирихле две точки попадут в один
из этих треугольников. Расстояние между ними будет не больше 1/2 .
2. Пусть грани куба окрашены в два цвета. Тогда найдутся соседние одноцветные грани.
Действительно, рассмотрим три грани куба, имеющие общую вершину. Назовём их
«кроликами», а данные цвета — «клетками». По принципу Дирихле, найдутся две
соседние грани, окрашенные в один цвет.

90 / 907
2.1.2. Размещения
Число всех функций f : 1..n → 1..m (при отсутствии ограничений), или число всех воз-
можных способов разместить n мячей по m ящикам, называется числом размещений и
обозначается U (m, n).
Теорема. U (m, n) = mn .
Доказательство. Поскольку ограничений нет, мячи размещаются независимо друг от дру-
га, то есть каждый из n мячей можно разместить m способами. Таким образом, по пра-
вилу произведения получаем mn возможных размещений.
Примеры.
1. Число всех возможных бинарных последовательностей длины n равно U (2, n) = 2n .
Действительно, на каждую из n позиций в последовательности приходится 2 вари-
анта (1 или 0), значения в разных позициях независимы.
2. У кодового замка пароль состоит из трёх позиций, на каждой из них может стоять
любая из цифр от 0 до 9. Сколько возможных паролей на данном замке? Решение:
U (10, 3) = 103 = 1000.
91 / 907
2.1.3. Размещения без повторений (1/2)
Число инъективных функций f : 1..n → 1..m, или число способов разместить n мячей по
m ящикам, не более чем по одному в ящик, называется числом размещений без повторе-
ний и обозначается A(m, n), или [m]n , или (m)n .
m!
Теорема. A(m, n) = .
(m − n)!
Доказательство. Ящик для первого мяча можно выбрать m способами, для второго мя-
ча — m − 1 способами и т. д. Имеем A(m, n) = m(m − 1) . . . (m − n + 1) = m!/(m − n)!.
Def Def
Из определению ясно, что A(m, n) = 0 при n > m и A(m, 0) = 1.
Пример. В некоторых видах спортивных соревнований исходом является определение
участников, занявших первое, второе и третье места. Сколько возможно различных ис-
ходов, если в соревновании участвуют n участников? Каждый возможный исход соответ-
ствует функции F : {1, 2, 3} → 1..n (аргумент — номер призового места, результат — но-
мер участника). Всего возможно A(n, 3) = n(n − 1)(n − 2) различных исходов.
Def Qn−1
Замечание. Функцию (x)n = x(x−1) . . . (x−n+1) = i=0 (x−(i)) называют убывающим
факториалом. Имеем (m)n = A(m, n). 92 / 907
2.1.3. Размещения без повторений (2/2)
Отступление. Простые формулы, выведенные для числа размещений без повторений, дают повод
поговорить об элементарных, но весьма важных вещах. Рассмотрим две формулы:

m!
A(m, n) = m · (m − 1) · . . . · (m − n + 1) и A(m, n) = .
(m − n)!

Формула слева выглядит сложной и незавершённой, формула справа — изящной и «математич-


ной». Но формула — это частный случай алгоритма. При практическом вычислении левая форму-
ла оказывается намного предпочтительнее правой. Во-первых, для вычисления по левой форму-
ле потребуется n умножений, а по правой — 2m − n − 2 умножений и одно деление. Поскольку
n < m, левая формула вычисляется существенно быстрее. Во-вторых, число A(m, n) растёт до-
вольно быстро и при больших m и n может не поместиться в разрядную сетку. Левая формула ра-
ботает правильно, если результат помещается в разрядную сетку. При вычислении же по правой
формуле переполнение может наступить «раньше времени» (то есть промежуточные результаты
не помещаются в разрядную сетку, в то время как окончательный результат мог бы поместиться),
поскольку факториал — очень быстро растущая функция.
93 / 907
2.1.4. Перестановки
Число взаимно-однозначных функций f : 1..n → 1..n, или число перестановок n пред-
метов, обозначается P (n).
Теорема. P (n) = n!.
Доказательство. P (n) = A(n, n) = n · (n−1) · . . . · (n−n+1) = n · (n−1) · . . . · 1 = n!.
В качестве примера, рассмотрим понятие цепочки: последовательность E = (E1 , . . . , Em )
непустых подмножеств множества E (E ⊂ 2E , Ei ⊂ E , Ei 6= ∅) называется цепочкой в E ,
если ∀ i ∈ 1..(m − 1) (Ei ⊂ Ei+1 & Ei 6= Ei+1 ) . Цепочка E называется полной цепочкой
в E , если |E| = |E|. Сколько существует полных цепочек?
Замечание. Полную цепочку иногда образно называют матрёшкой.
Очевидно, что в полной цепочке каждое следующее подмножество Ei+1 получено из
предыдущего подмножества Ei добавлением ровно одного элемента из E и таким об-
разом, |E1 | = 1, |E2 | = 2, . . . , |Em | = m. Следовательно, полная цепочка определяет-
ся порядком, в котором элементы E добавляются для образования очередного элемен-
та полной цепочки. Отсюда количество полных цепочек — это количество перестановок
элементов множества E , равное m!.
94 / 907
2.1.5. Сочетания (1/2)
Число строго монотонно возрастающих функций f : 1..n → 1..m, или число размещений
n неразличимых предметов по m ящикам не более чем по одному в ящик, то есть число
способов выбрать из m ящиков n ящиков с предметами, называется числом сочетаний и
n
обозначается C(m, n), или Cm , или m
n
.
Def
По определению C(m, n) = 0 при n > m.
m!
Теорема. C(m, n) = .
n!(m − n)!
Доказательство.
[ Обоснование формулы ] Сочетание является размещением без повторений неразличи-
мых предметов. Следовательно, число сочетаний определяется тем, какие ящики заняты
предметами, поскольку перестановка предметов при тех же занятых ящиках считается
A(m, n) m!
одним сочетанием. Таким образом, C(m, n) = = .
P (n) n!(m − n)!
Замечание. Для подсчёта числа сочетаний выделяют граничные случаи: C(m, 1) = m,
C(m, m − 1) = m, C(m, m) = 1, C(m, 0) = 1, каждый из которых очевидным образом
получается прямой подстановкой параметров в формулу. 95 / 907
2.1.5. Сочетания (2/2)
Доказательство. (Окончание)
[ Сведе́ние моделей ] Число сочетаний является количеством строго монотонно возрастаю-
щих функций, потому что любая строго монотонно возрастающая функция f : 1..n → 1..m
определяется набором своих значений, причём 1 6 f (1) < . . . < f (n) 6 m. Другими
словами, каждая строго монотонно возрастающая функция определяется выбором n чи-
сел из диапазона 1..m. Таким образом, число строго монотонно возрастающих функций
равно числу n-элементных подмножеств m-элементного множества, которое равно чис-
лу способов выбрать n ящиков с предметами из m ящиков.
Пример. В начале игры в домино каждому играющему выдаётся 7 костей из имеющихся
28 различных костей. Сколько существует различных комбинаций костей, которые игрок
может получить в начале игры? Очевидно, что искомое число равно числу 7-элементных
подмножеств 28-элементного множества. Имеем

28! 28 · 27 · 26 · 25 · 24 · 23 · 22
C(28, 7) = = = 1 184 040.
7!(28 − 7)! 7·6·5·4·3·2·1
96 / 907
2.1.6. Сочетания с повторениями (1/2)
Число монотонно возрастающих функций f : 1..n → 1..m, или число размещений n
неразличимых мячей по m ящикам, называется числом сочетаний с повторениями и обо-
значается V (m, n).
Теорема. V (m, n) = C(n + m − 1, n).
Доказательство. Монотонно возрастающей функции f : 1..n → 1..m однозначно соот-
ветствует строго монотонно возрастающая функция g : 1..n → 1..(n + m − 1). Это соот-
ветствие устанавливается следующей формулой: g(k) = f (k) + k − 1.
Замечание. V (0, n) = C(n − 1, n) = 0 при n > 0 по определению для C(m, n). Однако,
Def
обычно считают, что V (0, 0) = 1.
Пример. Сколькими способами можно рассадить n вновь прибывших гостей среди m го-
стей, уже сидящих за круглым столом? Очевидно, что имеется m промежутков, в которые
можно рассаживать вновь прибывших, и число способов равно
(m + n − 1)!
V (m, n) = C(m + n − 1, n) = .
n!(m − 1)!
97 / 907
2.1.6. Сочетания с повторениями (2/2)
Теорема. V (m, n) = V (n + 1, m − 1).
(m + n − 1)! (n + m − 1)!
Доказательство. V (m, n) = C(m + n − 1, n) = = =
n!(m − 1)! (m − 1)!n!
= C(n + m − 1, m − 1) = V (n + 1, m − 1).
Пример. Сколько существует способов записать натуральное число n в виде суммы m
натуральных чисел: a1 + a2 + . . . + am = n? Любое натуральное число можно предста-
вить в виде суммы единиц. Тогда решение задачи сводится к разделению n выстроен-
ных в ряд единиц на m непустых групп с помощью m − 1 перегородки. Для перегород-
ки существует n − 1 позиция между единицами. Таким образом, число способов расста-
вить перегородки: C(n − 1, m − 1). Рассмотрим теперь похожую задачу: сколько суще-
ствует способов записать натуральное число n в виде суммы m неотрицательных целых
чисел: a1 + a2 + . . . + am = n? Сведем задачу к предыдущей. Пусть yi = ai + 1. Тогда
y1 + y2 + . . . + ym = n + m. Ответ: C(m + n − 1, m − 1) = V (m, n).
n−1
Def
Замечание. Функцию x(n) = x(x+1) . . . (x+n−1) =
Q
(x+i) называют возрастающим
i=0
факториалом. Имеем m(n) = V (m, n)/n!. 98 / 907
2.1.7. Дискретная вероятность (1/7)
Пусть задано конечное множество X = {x1 , . . . , xn }, |X| = n, и тотальная функция
n
P
P : X → [0; 1], такая, что P(xi ) = 1. Тогда число pi ← P(xi ) называется вероятностью
i=1
элемента xi , а набор чисел PX = (p1 , . . . , pn ) называется распределением вероятности
на множестве X . Распределение вероятности PX , в котором ∀ i ∈ 1..n pi = n1 , назы-


вается равномерным.
Элементы множества X могут иметь произвольную природу: это могут быть результаты
измерения числового значения некоторой физической величины, способы разложить мя-
чи по ящикам в комбинаторной конфигурации, альтернативные события реального мира,
которые могут произойти в будущем и т. д.
Пример. Одновременно бросаются два игральных кубика. Какова вероятность того, что
на двух кубиках выпадут шестёрки? Всего возможно 36 различных комбинаций, рас-
пределение естественно считать равномерным (кубики «честные»), значит вероятность
1
двух шестёрок равна 36 .
99 / 907
2.1.7. Дискретная вероятность (2/7)
Отступление. Вероятность — весьма общее понятие, которое изучается в специальном разделе
математики — теории вероятности. Теория вероятности тесно связана с другими разделами ма-
тематики: математической статистикой, теорией игр, теорией меры и др. Также теория вероятно-
сти нашла множество приложений в физике, экономике и биологии. Здесь используется упрощён-
ное понятие вероятности, достаточное для проведения комбинаторных вычислений. В настоящее
время чаще употребляется термин теория вероятностей, подобный терминам теория множеств,
теория графов и так далее. Такое словоупотребление подчёркивает однородность класса объек-
тов, свойства которых изучаются в данной теории. Мы же используем несколько устаревший тер-
мин, чтобы подчеркнуть, что рассматриваем только одно свойство — вероятность, не претендуя
на охват всего класса объектов, могущих обладать этим свойством.
Рассмотрим множество A ⊆ X . Если на X задано распределение
P вероятности, то веро-
ятностью подмножества A называется число, равное P(a).
a∈A
Из определения ясно, что P(∅) = 0, P(X) = 1, ∀A 0 6 P(A) 6 1.
Пример. В игральной колоде 52 карты четырёх мастей, в каждой из которых по 13 карт
1 1 1 1 4 1
разного достоинства. Вероятность быть тузом равна 52 + 52 + 52 + 52 = 52 = 13 .
100 / 907
2.1.7. Дискретная вероятность (3/7)

Стоит заметить, что в случае равномерного распределения вычисление вероятности под-


|A|
множества A упрощается: P(A) = .
|X|
Пример. В игре «покер» комбинация из пяти карт одинаковой масти называется «флеш».
Используется обычная игровая колода из 52-ух карт. Какова вероятность комбинации
«флеш»? Множество X содержит в качестве элементов всевозможные комбинации из пя-
ти карт, порядок которых значения не имеет. Количество таких элементов равно C(52, 5).
В одной масти 13 карт, из которых в комбинацию входят пять любых. Мастей всего 4, зна-
чит количество элементов в множестве A равно 4 · C(13, 5). Таким образом, вероятность
4·C(13,5) 33
комбинации «флеш» равна C(52,5) = 16660 ≈ 0, 002.

101 / 907
2.1.7. Дискретная вероятность (4/7)
Случайная величина — это тотальная функция ϕ : X → R, причём на множестве X зада-
ны вероятности элементов. Математическим ожиданием случайной величины при рас-
пределении вероятности PX = (p1 , . . . , pn ) называется число
n
X
Eϕ = ϕ(xk )pk = ϕ(x1 )p1 + . . . + ϕ(xn )pn .
k=1

Легко видеть, что среднее арифметическое — частный случай математического ожида-


ния для равномерного распределения. Поэтому математическое ожидание можно на-
звать средним значением случайной величины ϕ(X).
Замечание. Если элементы множества X являются числами, то в качестве функции ϕ мо-
жет рассматриваться
Pn тождественная функция. Формула математического ожидания при-
мет вид k=1 xk pk .
P6X = {1, 12, 3, 4, 5, 6}. Математическое ожидание
Пример. При броске игрального кубика
1
числа очков на верхней грани E = 6 k=1 xk = 6 (1 + 2 + 3 + 4 + 5 + 6) = 3, 5. В среднем
при одном подбрасывании кубика выпадает 3,5 очка.
102 / 907
2.1.7. Дискретная вероятность (5/7)
Замечание. Математическое ожидание — одно из важнейших понятий в теории вероят-
ности. Имеет важное прикладное значение при оценке рисков, при торговле на финан-
совых рынках и во многих других областях.
Пример. В казино предлагают сыграть в игру: игрок ставит некоторую сумму на число от
1 до 6, а потом бросает три игральных кубика. Если загаданное число не выпадет ни разу,
то его ставка сгорает. Если выпадет — ставку возвращают, а казино платит поставленную
сумму столько раз, сколько раз выпало число. Рассмотрим средний выигрыш при ставке в
1 доллар. Игрок может потерять доллар или выиграть 1, 2 или 3 доллара. Тогда множество
X = {−1, 1, 2, 3}, а математическое ожидание:

125 C(3, 1) · 52 C(3, 2) · 5 1 17


− + +2· +3· =− ≈ −0, 08
216 216 216 216 216
В среднем при каждой ставке в один доллар игрок потеряет восемь центов.

103 / 907
2.1.7. Дискретная вероятность (6/7)
К подмножества множества X можно применять обычные операции: пересечение, объ-
единение и другие.
Теорема. Если A, B ⊂ X , то P(A ∪ B) = P(A) + P(B) − P(A ∩ B).
Доказательство. Вероятности тех элементов, которые входят в пересечение, надобно
включить в сумму только один раз.
Def P(A ∩ B)
По Колмогорову условная вероятность P(A|B) определяется так: P(A|B) = .
P(B)
Отступление. Существует и с успехом используется большое количество других определений, ин-
терпретаций и трактовок понятия условной вероятности и связанных с ним понятий априорной
и апостериорной вероятности. Все эти вариации оправданы и даже необходимы при использо-
вании вероятностных подходов в конкретных предметных областях. Здесь мы ограничиваемся
простейшей возможной интерпретацией, которой, однако, достаточно, чтобы вывести формулы,
необходимые для комбинаторных вычислений.
Замечание. Множества, входящие в определение операции условной вероятности,
равноправны: P(B|A) = P(A ∩ B)/P(A).
104 / 907
2.1.7. Дискретная вероятность (7/7)
Теорема. [формула Байеса] P(A|B)P(B) = P(B|A)P(A).
Доказательство. P(A|B)P(B) = P(A ∩ B) = P(B|A)P(A).
Замечание. Формулу Байеса часто записывают в несимметричной форме

P(B|A)P(A)
P(A|B) =
P(B)
и называют A событием, а B — гипотезой. На применение формулы для вычислений это
не влияет.
Теорема. [формула полной вероятности] Если семейство множеств B1 , . . . , Bn является
рабиением множества X , то есть, если B1 ∪ · · · ∪ Bn = X и i 6= j =⇒ Bi ∩ Bj = ∅, то
n
X
P(A) = P(A|Bi )P(Bi ).
i=1
Pn Pn
Доказательство. P(A) = i=1 P(A ∩ Bi ) = i=1 P(A|Bi )P(Bi ).
105 / 907
2.2. Перестановки
Для вычисления ко-
личества перестано-
вок в п. 2.1.4 установ-
лена очень простая
формула: P (n) = n!.
Применяя эту форму-
лу при решении прак-
тических задач, не
следует забывать, что
факториал — это быст-
ро растущая функция,
в частности, факто-
риал растёт быстрее
экспоненты.

106 / 907
2.2.1. Циклы в перестановках (1/3)
Взаимно-однозначные функции на отрезках натурального ряда (перестановки) удобно
задавать таблицами подстановки. В таблице подстановки нижняя строка (значения функ-
ции) является перестановкой элементов верхней строки (значения аргумента). Если при-
нять соглашение, что элементы верхней строки (аргументы) всегда располагаются в опре-
делённом порядке (например, по возрастанию), то верхнюю строку можно не указы-
вать — подстановка определяется одной нижней строкой. Таким образом, подстановки
(таблицы) взаимно-однозначно соответствуют перестановкам (функциям).
Перестановка f (и соответствующая ей подстановка) элементов 1, . . . , n обозначается
(a1 , . . . , an ), где ai = f (i) и a1 , . . . , an — все различные числа из диапазона 1..n. Если
f (i) = i, то i называется неподвижной точкой перестановки, если же f (i) 6= i, то i назы-
вается подвижной точкой перестановки.
Если задана перестановка f , то циклом называется последовательность элементов
x1 , . . . , xk , такая, что f (xi ) = xi+1 при 1 6 i < k и f (xk ) = x1 . Множество элементов,
входящих в цикл, называется орбитой.
107 / 907
2.2.1. Циклы в перестановках (2/3)
Количество элементов в цикле называется длиной цикла. Цикл длины 1 называется три-
виальным циклом или петлёй. Цикл длины 2 называется транспозицией. Иногда пере-
становки удобно представлять в графической форме, проводя стрелки от каждого эле-
мента x к элементу f (x).
Замечание. Из графического представления перестановки наглядно видно происхожде-
ние термина «цикл».
Перестановка длины n, которая содержит ровно один нетривиальный цикл длины k , на-
зывается циклической (перестановкой длины k ), k 6 n. В циклической перестановке все
элементы цикла — подвижные точки, а остальные элементы — неподвижные точки.
Пример. В перестановке (2, 3, 1, 4, 5) точки 1, 2, 3 — подвижные точки, и образуют цикл
(1, 2, 3), а точки 4 и 5 — неподвижные точки. Эта перестановка циклическая.
Перестановка может содержать несколько нетривиальных циклов.
Лемма. Орбиты различных циклов в перестановке не пересекаются.
Доказательство. От противного. Допустим, существует элемент x, который входит в два
цикла. Тогда «следующий» элемент f (x) также входит в оба цикла и т. д. Ввиду конечности
циклов, заключаем, что циклы совпадают. 108 / 907
2.2.1. Циклы в перестановках (3/3)
Теорема. Всякая неединичная перестановка представляется как суперпозиция цикличе-
ских перестановок с непересекающимися орбитами, причём представление единственно.
Доказательство. [ существование ] Построим требуемое разложение: возьмём произволь-
ный элемент и выделим орбиту, которой он принадлежит. Построим циклическую пере-
становку с циклом, соответствующим выделенной орбите. Затем возьмём любой элемент
из оставшихся (не вошедших в найденные орбиты), и повторим выделение орбиты, соот-
ветствующей элементу. Ввиду конечности перестановок процесс закончится.
[ единственность ] Допустим, что существует такая перестановка σ , что ее разложение на
суперпозицию непересекающихся циклов не единственно, т. е. σ = σ1 . . . σm = τ1 . . . τn .
Тогда выберем некоторые циклы σi , τj (i, j ∈ N, i 6 m, j 6 n) такие, что для любого x,
являющегося подвижной точкой, было выполнено σi (x) = τj (x) (такие i, j обязательно
существуют, иначе σ(x) 6= σ(x) — противоречие). Тогда σi (x) = τj (x), σi2 (x) = τj2 (x),
. . . , σis (x) = τjs (x) = x. Повторяя рассуждение для всех оставшихся циклов в разложе-
нии перестановки, убеждаемся, что m = n и разложение перестановки как суперпози-
цию непересекающихся циклических перестановок единственно вплоть до порядка при-
менения циклических перестановок. 109 / 907
2.2.2. Инверсии
Если в перестановке f = (a1 , . . . , an ) для элементов ai и aj имеет место неравенство
ai > aj при i < j , то пара (ai , aj ) называется инверсией. Обозначим I(f ) — число инвер-
сий в перестановке f .
Теорема. Произвольную перестановку f можно представить в виде суперпозиции I(f )
транспозиций соседних элементов.
Доказательство. Пусть f = (a1 , . . . , 1, . . . , an ). Переставим 1 на первое место, меняя её
местами с соседними слева элементами. Обозначим последовательность этих транспо-
зиций через t1 . При этом все инверсии (и только они), в которых участвовала 1, пропа-
дут. Затем переставим 2 на второе место и т. д. Таким образом, f ◦ t1 ◦ . . . ◦ tn = e и по
−1
свойству группы f = t−1n ◦ . . . ◦ t1 , причём |t1 | + |t2 | + . . . + |tn | = I(f ).

Рассмотрим входную последовательность, состоящую из n элементов: (a1 , a2 , . . . , an ).


Задача сортировки состоит в поиске такой перестановки (b1 , b2 , . . . , bn ) входной после-
довательности, что: ∀ i ∈ 1..n − 1 (bi 6 bi+1 ).
Следствие. Всякая сортировка может быть выполнена перестановкой соседних элемен-
тов.
110 / 907
2.2.3. Генерация перестановок (1/5)
На множестве перестановок естественным образом можно определить порядок на осно-
ве упорядоченности элементов. А именно, говорят, что перестановка (a1 , . . . , an ) лекси-
кографически предшествует перестановке (b1 , . . . , bn ), если

∃ k 6 n (ak < bk & ∀ i < k (ai = bi )) .


Аналогично, говорят, что перестановка (a1 , . . . , an ) антилексикографически предшеству-
ет перестановке (b1 , . . . , bn ), если ∃ k 6 n (ak > bk & ∀ i > k (ai = bi )).
Следующий алгоритм генерирует все перестановки элементов 1, . . . , n в антилексико-
графическом порядке, при этом массив P : array [1..n] of 1..n является глобальным и
предназначен для хранения перестановок.
Вход: n — количество элементов
Выход: последовательность перестановок элементов 1, . . . , n в антилексикографическом
порядке.
for i from 1 to n do P [i] ← i end for //инициализация
Antilex(n) //вызов рекурсивной процедуры Antilex
111 / 907
2.2.3. Генерация перестановок (2/5)
Генерация перестановок выполняется рекурсивной процедурой Antilex.
Вход: m — параметр процедуры — количество первых элементов массива P , для кото-
рых генерируются перестановки.
Выход: последовательность перестановок 1, . . . , m в антилексикографическом порядке.
if m = 1 then
yield P //очередная перестановка
else
for i from 1 to m do
Antilex(m − 1) //рекурсивный вызов
if i < m then
P [i] ↔ P [m] //следующий элемент
Reverse(m − 1) //изменение порядка элементов
end if
end for
end if
112 / 907
2.2.3. Генерация перестановок (3/5)
Вспомогательная процедура Reverse переставляет элементы заданного отрезка массива
P в обратном порядке.
Вход: k — номер элемента, задающий отрезок массива P , подлежащий перестановке
в обратном порядке.
Выход: первые k элементов массива P переставлены в обратном порядке
j ← 1 //нижняя граница обращаемого диапазона
while j < k do
P [j] ↔ P [k] //меняем местами элементы
j ← j + 1 //увеличиваем нижнюю границу
k ← k − 1 //уменьшаем верхнюю границу
end while
Пример. Последовательность перестановок в антилексикографическом порядке
для n = 3: (1, 2, 3), (2, 1, 3), (1, 3, 2), (3, 1, 2), (2, 3, 1), (3, 2, 1).

113 / 907
2.2.3. Генерация перестановок (4/5)

Обоснование. Заметим, что искомую последовательность перестановок n элементов мож-


но получить из последовательности перестановок n − 1 элементов следующим образом.
Нужно выписать n блоков по (n − 1)! перестановок в каждом, соответствующих после-
довательности перестановок n − 1 элементов в антилексикографическом порядке. Затем
ко всем перестановкам в первом блоке нужно приписать справа n, во втором — n − 1 и
т. д. в убывающем порядке. Затем в каждом из блоков (кроме первого), к перестановкам
которого справа приписан элемент i, нужно в перестановках блока заменить все вхож-
дения элемента i на элемент n. В полученной последовательности все перестановки раз-
личны, и их n(n − 1)! = n!, то есть перечислены все перестановки. При этом антилекси-
кографический порядок соблюдён для последовательностей внутри одного блока, пото-
му что этот порядок был соблюдён в исходной последовательности, а для последователь-
ностей на границах двух блоков — потому что происходит уменьшение самого правого
элемента.

114 / 907
2.2.3. Генерация перестановок (5/5)

Обоснование. (Окончание) Обратимся к процедуре Antilex — легко видеть, что в ней реа-
лизовано указанное построение. В основном цикле сначала строится очередной блок —
последовательность перестановок первых m − 1 элементов массива P (при этом эле-
менты P [m], . . . , P [n] остаются неизменными). Затем элемент P [m] меняется местами с
очередным элементом P [i]. Вызов вспомогательной процедуры Reverse необходим, по-
скольку последняя перестановка в блоке является обращением первой, а для генерации
следующего блока на очередном шаге цикла нужно восстановить исходный порядок.

115 / 907
2.2.4. Двойные факториалы (1/2)
Содержание этого параграфа не имеет отношения к основной теме раздела — переста-
новкам и включено в раздел по сходству обозначений и с целью привести две форму-
лы, которые иногда используются в практических комбинаторных расчётах и требуются
в последующих разделах.
Двойным факториалом натурального числа n (обозначается n!!) называется произведе-
ние числа n и всех меньших натуральных чисел той же чётности.
Пример. 10!! = 10 · 8 · 6 · 4 · 2 = 3840.
Теорема.
1. (2k)!! = 2k · k!.
(2k + 1)!
2. (2k + 1)!! = .
2k · k!
Доказательство.
[ 1 ] (2k)!! = 2 · 4 · · · · · (2k − 2) · 2k = (2 · 1) · (2 · 2) · · · · · (2 · (k − 1)) · (2 · k) =
= (2 · 2 · · · · · 2 · 2) ·(1 · 2 · · · · · ·(k − 1) · k) = 2k · k!.
| {z }
k раз
[ 2 ] Достаточно заметить, что (2k + 1)! = (2k + 1)!!(2k)!!.
116 / 907
2.2.4. Двойные факториалы (2/2)
Def
По определению 0!! = 1.
Перестановками Стирлинга называются перестановки набора чисел
{1, 1, 2, 2, . . . , k, k} такие, что между любыми двумя равными числами могут находиться
лишь бо́льшие по значению.
Пример. (1, 2, 3, 3, 2, 1, 4, 4).
Теорема.Число перестановок Стирлинга равно (2k − 1)!!.
Доказательство. База: при k = 1 существует единственная перестановка 1, 1, (2k−1)!! = 1.
Индукционный переход: пусть число перестановок Стирлинга 1, 1, 2, 2, . . . , k − 1, k − 1
равно (2(k − 1) − 1)!! = (2k − 3)!!. Так как в перестановке нет чисел бо́льших k , то
элементы k, k могут стоять только рядом. Мы можем их отбросить, получив перестановку
с числами 1..k − 1, учитывая, что у нас существует 2k − 1 место, куда можно поставить
пару k, k . Добавив k, k получим (2k − 3)!! · (2k − 1) = (2k − 1)!!.

117 / 907
2.3. Биномиальные коэффициенты

Число сочетаний C(m, n) — это число различных n-элементных подмножеств


m-элементного множества. Числа C(m, n) обладают целым рядом свойств, рассматри-
ваемых в этом разделе, которые оказываются очень полезными при решении различных
комбинаторных задач.

118 / 907
2.3.1. Свойства биномиальных коэффициентов (1/5)
Основная формула для числа сочетаний

m!
C(m, n) =
n!(m − n)!
позволяет получить следующие элементарные тождества.
Теорема. [1]
1. C(m, n) = C(m, m − n).
2. C(m, n) = C(m − 1, n) + C(m − 1, n − 1).
3. C(n, i)C(i, m) = C(n, m)C(n − m, i − m).
m
4. C(m, n) = n
C(m − 1, n − 1).
Доказательство.
m! m!
[ 1 ] C(m, m − n) = = = C(m, n).
(m − n)! (m − (m − n))! (m − n)! n!
119 / 907
2.3.1. Свойства биномиальных коэффициентов (2/5)
Доказательство.
[ 2 ] C(m − 1, n) + C(m − 1, n − 1) =
(m − 1)! (m − 1)!
= + =
n!(m − n − 1)! (n − 1)! (m − 1 − (n − 1))!
(m − 1)! (m − 1)!
= + =
n(n − 1)! (m − n − 1)! (n − 1)! (m − n)(m − n − 1)!
(m − n)(m − 1)! + n(m − 1)! (m − n + n)(m − 1)! m!
= = = = C(m, n).
n(n − 1)! (m − n)(m − n − 1)! n! (m − n)! n! (m − n)!
n! i! n!
[ 3 ] C(n, i)C(i, m) = = =
i!(n − i)! m!(i − m)! m!(i − m)!(n − i)!
n!(n − m)! n! (n − m)!
= = =
m!(i − m)!(n − i)!(n − m)! m!(n − m)! (i − m)!(n − i)!
= C(n, m)C(n − m, i − m).
m! m(m − 1)! m
[ 4 ] C(m, n) = = = C(m − 1, n − 1).
n!(m − n)! n(n − 1)!((m − 1) − (n − 1))! n
120 / 907
2.3.1. Свойства биномиальных коэффициентов (3/5)
Биномиальные коэффициенты обладают целым рядом других замечательных свойств.
m
nC(m, n) = m2m−1 .
P
Теорема. [2]
n=0
Доказательство. Рассмотрим следующую последовательность, составленную из чисел
1, . . . , m. Сначала выписаны все подмножества длины 0, потом все подмножества длины
1 и т. д. Имеется C(m, n) подмножеств мощности Pmn, и каждое из них имеет длину n, та-
ким образом, всего в этой последовательности n=0 nC(m, n) чисел. С другой стороны,
каждое число x входит в эту последовательность 2|{1,...,m}\{x}| = 2m−1 раз, а всего чисел
m.
k
P
Теорема. [3] C(m + n, k) = C(m, i)C(n, k − i).
i=0
Доказательство. C(n + m, k) — это число способов выбрать k шаров из m + n шаров.
Шары можно выбирать в два приема: сначала выбрать i шаров из первых m шаров, а
затем выбрать недостающие k − i шаров
Pk из оставшихся n шаров. Отсюда общее число
способов выбрать k шаров составляет i=0 C(m, i)C(n, k − i).
Замечание. Последнее свойство известно как тождество Коши.
121 / 907
2.3.1. Свойства
m
биномиальных коэффициентов (4/5)
(C(m, n))2 = C(2m, m).
P
Теорема. [4]
n=0
Доказательство. Рассмотрим множество из 2m объектов. Число способов выбрать из него
m объектов равно C(2m, m). Разобьём это множество на 2 равномощных подмножества.
Теперь применим тождество Коши при n = m, k = m. Тогда общее число способов
m
(C(m, n))2 в силу того, что C(m, n) = C(m, m − n).
P
выбрать m предметов будет
n=0
n
P
Теорема. [5] C(m, n) = C(m − (k + 1), n − k)).
k=0
Доказательство. Рассмотрим множество из m элементов и представление подмножеств
этого множества с помощью битовых шкал, п. 1.3.1. Число n-элементных подмножеств
равно C(m, n). При этом число битовых шкал, в которых первый слева ноль стоит в раз-
ряде k + 1, равно C(m − (k + 1), n − k), поскольку в таких шкалах все разряды определе-
ны до разряда k + 1 включительно, и остаётся выбрать n − k разрядов для размещения
единиц среди m − (k + 1) неопределённых разрядов. В битовой шкале для n-элемент-
ного подмножества ровно m − n нулей, значит первый слева ноль может находиться в
разряде с номером из диапазона 1..(n + 1). 122 / 907
2.3.1. Свойства биномиальных коэффициентов (5/5)
Отступление. Указанные свойства биномиальных коэффициентов нетрудно доказать, проводя ал-
гебраические выкладки обычным образом. Например, теорему 2 можно получить так:
m m m
X X nm! X m(m − 1)!
nC(m, n) = = =
(m − n)!n! (m − n)!(n − 1)!
n=0 n=1 n=1
m−1 m−1
X (m − 1)! X
=m =m C(m − 1, n) = m2m−1 .
(m − n − 1)!n!
n=0 n=0
В доказательстве использованы рассуждения «в комбинаторном духе», чтобы проиллюстрировать
«неалгебраические» способы решения комбинаторных задач.
Иногда наблюдается и обратный эффект: комбинаторные рассуждения оказываются короче да-
же простейших алгебраических выкладок. Например, теорему 1 пункт 2 можно получить следую-
щим рассуждением. Зафиксируем произвольный элемент x. Тогда количество способов выбрать
n элементов из m элементов, то есть число C(m, n), складывается из количества способов вы-
брать n элементов, включающих элемент x, то есть числа C(m − 1, n − 1), и количества способов
выбрать n элементов не включающих элемент x, то есть C(m − 1, n).
123 / 907
2.3.2. Бином Ньютона (1/2)
Числа сочетаний C(m, n) называются также биномиальными коэффициентами. Смысл
этого названия устанавливается следующей теоремой, известной также как формула би-
нома Ньютона.
m
X
m
Теорема. (x + y) = C(m, n)xn y m−n .
n=0
Доказательство. По индукции. База, m = 1: (x + y)1 = x + y = 1x1 y 0 + 1x0 y 1 =
1
= C(1, 1)x1 y 0 + C(1, 0)x0 y 1 = C(1, n)xn y 1−n .
P
n=0
Индукционный переход:
m−1
X
m m−1
(x + y) = (x + y)(x + y) = (x + y) C(m − 1, n)xn y m−n−1 =
n=0
m−1
X m−1
X
= xC(m − 1, n)xn y m−n−1 + yC(m − 1, n)xn y m−n−1 =
n=0 n=0

124 / 907
2.3.2. Бином Ньютона (2/2)
m−1
X m−1
X
n+1 m−n−1
= C(m − 1, n)x y + C(m − 1, n)xn y m−n =
n=0 n=0
Xm m−1
X
= C(m − 1, n − 1)xn y m−n + C(m − 1, n)xn y m−n =
n=1 n=0
m−1
X
= C(m − 1, 0)x0 y m + (C(m − 1, n − 1) + C(m − 1, n))xn y m−n +
n=1
m
X
m 0
+ C(m − 1, m − 1)x y = C(m, n)xn y m−n .
Pm n=0
Следствие. n=0 C(m, n) = 2m .
Доказательство.
Pm Достаточно взять x = y = 1.
n
Следствие. n=0 (−1) C(m, n) = 0.
Доказательство. Достаточно взять x = −1, y = 1.
125 / 907
2.3.3. Треугольник Паскаля (1/7)
Из второй формулы теоремы п. 2.3.1 вытекает эффективный способ рекуррентного вы-
числения значений биномиальных коэффициентов, который можно представить в гра-
фической форме, известной как треугольник Паскаля

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
. . . . . .

В этом равнобедренном треугольнике каждое число (кроме единиц на боковых сторонах)


является суммой двух чисел, стоящих над ним. Число сочетаний C(m, n) находится в
(m + 1)-м ряду на (n + 1)-м месте.

126 / 907
2.3.3. Треугольник Паскаля (2/7)

Рассмотрим вопрос реализации процесса вычислений биномиальных коэффициентов.


Если просто по рекуррентной формуле C(m, n) = C(m − 1, n) + C(m − 1, n − 1) со-
ставить рекурсивную процедуру, то можно столкнуться с переполнением стека вызовов
из-за большой глубины рекурсии. Кроме того, прямая рекурсивная реализация сугубо
неэффективна, поскольку при рекурсивной реализации один и тот же биномиальный ко-
эффициент будет вычисляться несколько раз. Например,

C(5, 3) = C(4, 3) + C(4, 2) = C(3, 3) + C(3, 2) + C(3, 2) + C(3, 1) = . . . .

Для случая рекурсивного вычисления C(m, n), получаем 2n сложений, так как на каждом
шаге рекурсии количество вычислений увеличивается в два раза, а всего шагов n. А для
нерекурсивного метода имеем n сложений, то есть рекурсивный метод экспоненциально
хуже нерекурсивного.

127 / 907
2.3.3. Треугольник Паскаля (3/7)

Замечательные свойства треугольника Паскаля позволяют организовать процесс вычис-


лений намного эффективнее. Представим треугольник в другой форме, повернув его на
45 градусов против часовой стрелки. Получится бесконечная матрица, в которой верх-
няя строка и левый столбец содержат единицы, а каждый внутренний элемент является
суммой двух элементов: соседнего слева и соседнего сверху.

1 1 1 1 1 1
1 2 3 4 5
1 3 6 10
1 4 10
1 5
1

128 / 907
2.3.3. Треугольник Паскаля (4/7)
Вход: целые неотрицательные числа m и n
Выход: число сочетаний C(m, n)
if n = 1 ∨ m = n + 1 then return m end if //граничные случаи
if n > m then return 0 end if //по определению
if n = m ∨ n = 0 then return 1 end if //граничные случаи
if n > m − n then n ← m − n end if //в силу симметрии
A : array[0..n] of int //рабочий массив
for i from 0 to n do
A[i] ← 1 //первая строка треугольника Паскаля
end for
for i from 1 to m − n do
for j from 1 to n do
A[j] ← A[j] + A[j − 1] //согласно рекуррентной формуле
end for
end for
return A[n] 129 / 907
2.3.3. Треугольник Паскаля (5/7)
Обоснование. Сначала в алгоритме проверяются граничные случаи, для которых значе-
ния известны заранее (п. 2.1.5). Значение C(m, n) находится в (m − n + 1)-ой строке на
(n + 1)-м месте. Весь треугольник хранить в памяти нет нужды, достаточно хранить толь-
ко одну строку. Первая строка содержит все единицы, а каждая следующая получается
перевычислением слева направо по формуле A[j] := A[j] + A[j − 1]. При этом в пра-
вой части оператора A[j] — это «старое» значение, то есть элемент из «верхней» стро-
ки, а A[j − 1] — только что вычисленное значение слева. Перевычислив таким образом
массив m − n раз, получаем C(m, n) = A[n].
Пример. Рассмотрим вычисление C(5, 2). Здесь m = 5, n = 2, m − n = 3.
i A
1 1 1
1 1 2 3
2 1 3 6
3 1 4 10

130 / 907
2.3.3. Треугольник Паскаля (6/7)

Замечание. В силу симметрии треугольника Паскаля можно было бы использовать массив


большей длины m − n + 1 и сократить количество повторений основного цикла по i.
Однако это не даёт сокращения вычислений: необходимое количество сложений остаётся
равным n(m − n).

131 / 907
2.3.3. Треугольник Паскаля (7/7)
Отступление. Для доказательства применимости и полезности приведённого алгоритма оценим
максимальные значения числа сочетаний, которые можно вычислить по основной формуле и по
алгоритму. Предположим, что используется 32-разрядная арифметика, беззнаковые целые числа,
максимально представимое число 232 − 1. При фиксированном m биномиальный коэффициент
C(m, n) имеет максимум для n = m/2. Найдём максимально допустимые C(m, n) и m, для
которых возможно вычисление. Для формулы это C(12, 6) = 924, поскольку вычислить m! уже не
представляется возможным при m > 12 для используемого представления чисел в компьютере.
Использование формулы

C(m, n) = ((m − n + 1) · (m − n + 2) · · · · · m)/(m − n)!

не приведёт к существенному расширению диапазона вычисляемых значений. A для приведён-


ного алгоритма максимальное m = 34, C(34, 17) = 2333606220. Если же варьировать n от 0 до
m, то получим максимальное значение C(222, 5) = 4294249674, что близко к 232 , то есть, к мак-
симальному представимому числу. Значит, алгоритм применим для гораздо более широкого на-
бора чисел m и n по сравнению с замкнутой формулой из параграфа 2.1.5, что делает его весьма
полезным.
132 / 907
2.3.4. Применение рекуррентного соотношения (1/5)
Использование рекуррентных соотношений является одним из основных приёмов орга-
низации эффективных вычислений как в комбинаторике, так и в других областях мате-
матики.
Замечание. Однопараметрическое рекуррентное соотношение ai = f (ai−1 ) позволяет
построить итеративный алгоритм вычисления чисел an без использования дополнитель-
ной памяти.
Построим однопараметрическое рекуррентное соотношение для вычисления биноми-
альных коэффициентов.
m−n+i
Положим a1 ← m − n + 1 и положим ai ← ai−1 , i = 2, 3, ..., n.
i
Лемма. В указанных обозначениях ai = C(m − n + i, i).
m−n+1
Доказательство. Действительно, a1 = m − n + 1 = = C(m − n + 1, 1),
1
m−n+2 m−n+2
a2 = a1 = C(m − n + 1, 1) = C(m − n + 2, 2) по пункту 4 теоре-
2 2
m m
мы п. 2.3.1, и так далее вплоть до an = an−1 = C(m − 1, n − 1) = C(m, n).
n n
133 / 907
2.3.4. Применение рекуррентного соотношения (2/5)
Замечание. Число ai при любом допустимом i — целое, поскольку является числом со-
четаний. Значит, мы можем в процессе вычислений смело осуществлять целочисленное
деление произведения величин (m − n + i)ai−1 на i.
Вход: целые неотрицательные числа m и n
Выход: число сочетаний C(m, n)
if n = 1 ∨ m = n + 1 then return m end if //граничные случаи
if n > m then return 0 end if //по определению
if n = m ∨ n = 0 then return 1 end if //граничные случаи
if n > m − n then n ← m − n end if //в силу симметрии
a ← m − n + 1 //первый элемент рекуррентной схемы
k ← m − n + 2 //для реализации рекуррентной схемы
for i from 2 to n do
a ← a div i ∗ k + a mod i ∗ k div i //рекуррентная схема
k←k + 1
end for
return a //последний элемент рекуррентной схемы: C(m, n) 134 / 907
2.3.4. Применение рекуррентного соотношения (3/5)
Обоснование. Формула a ← a div i ∗ k + a mod i ∗ k div i получается из следующих со-
ображений: представляем число ai−1 /i в виде неполного частного и остатка ai−1 = ti+r,
(ti + r)(m − n + i) r(m − n + i)
раскрываем скобки и получаем: ai = = t(m − n + i) + .
i i
В силу того, что числа ai целые, формула даёт правильный результат вне зависимости от
того, какая именно из величин произведения (m − n + i)ai−1 делится на i нацело.
Пример. Рассмотрим нахождение биномиального коэффициента C(6, 3).
Начальный элемент a1 = m − n + 1 = 4, k = 5, i = 2.
Первая итерация: a2 = 4 div 2 ∗ 5 + 4 mod 2 ∗ 5 div 2 = 2 ∗ 5 + 0 ∗ 2 = 10.
Вторая итерация: a3 = 10 div 3 ∗ 6 + 10 mod 3 ∗ 6 div 3 = 3 ∗ 6 + 1 ∗ 2 = 18 + 2 = 20.
Замечание. При вычислении числа ai растут, и промежуточные результаты их не превос-
ходят. Поэтому построенный алгоритм имеет такую же область определения и сохраняет
споcобность работать без переполнения, что и предыдущий алгоритм. Алгоритм содер-
жит один цикл и имеет трудоёмкость O(n).
На следующих двух слайдах проведено сравнение двух представленных алгоритмов вы-
числения биномиальных коэффициентов по области применения и по быстродействию.
135 / 907
2.3.4. Применение рекуррентного соотношения (4/5)

Области определения этих алгоритмов


совпадают. На рисунке представлена
область определения алгоритмов, то
есть множество пар (m, n) для кото-
рых величина C(m, n) может быть вы-
числена в 32-х разрядной арифметике.
На данном графике разными цветами,
в зависимости от величины, обозначе-
ны значения биномиальных коэффици-
ентов. В незакрашенной части значения
не могут быть вычислены. Участки, близ-
кие к границам (n = 0 или n = m), об-
резаны.

136 / 907
2.3.4. Применение рекуррентного соотношения (5/5)
Асимптотическая сложность первого алго-
ритма O(n ∗ (m − n)), а второго — O(n).
Но не стоит слепо доверять асимптотической
оценке — на реальное быстродействие алго-
ритмов влияют и другие факторы, в частно-
сти, скорость выполнения арифметических
операций. Известно, что, в сравнении со сло-
жением, операции умножения и особенно
деления являются более затратными по вре-
мени выполнения. График справа отража-
ет минимальное (из двух) время, затрачен-
ное для нахождения значений биномиаль-
ных коэффициентов. Черная кривая обозна-
чает границу, ниже которой квадратичный
алгоритм справляется с поставленной зада-
чей быстрее линейного!
137 / 907
2.3.5. Генерация подмножеств (1/4)

Элементы множества {1, . . . , m} естественным образом упорядочены. Поэтому каждое


n-элементное подмножество этого множества также можно рассматривать как упорядо-
ченную последовательность. На множестве таких последовательностей определяется лек-
сикографический порядок. Следующий простой алгоритм генерирует все n-элементные
подмножества m-элементного множества в лексикографическом порядке.
Вход: n — мощность подмножества, m — мощность множества, m > n > 0.
Выход: последовательность всех n-элементных подмножеств m-элементного множества
в лексикографическом порядке.
for i from 1 to m do
A[i] ← i //инициализация исходного множества
end for
if m = n return A[1..n] end if

138 / 907
2.3.5. Генерация подмножеств (2/4)
p ← n //p — номер первого изменяемого элемента
while p > 1 do
yield A[1..n] //очередное подмножество в первых n элементах массива A
if A[n] = m then
p ← p − 1 //нельзя увеличить последний элемент
else
p ← n //можно увеличить последний элемент
end if
if p > 1 then
for i from n downto p do
A[i] ← A[p] + i − p + 1 //увеличение элементов
end for
end if
end while
139 / 907
2.3.5. Генерация подмножеств (3/4)

Обоснование. Заметим, что в искомой последовательности n-элементных подмножеств


(каждое из которых является возрастающей последовательностью n чисел из диапазона
1..m) вслед за последовательностью (a1 , . . . , an ) следует последовательность
(b1 , . . . , bn ) = (a1 , . . . , ap−1 , ap + 1, ap + 2, . . . , ap + n − p + 1), где p — максимальный
индекс, для которого bn = ap + n − p + 1 6 m. Другими словами, следующая последова-
тельность получается из предыдущей заменой некоторого количества элементов в хво-
сте последовательности идущими подряд натуральными числами, но так, чтобы послед-
ний элемент не превосходил m, а первый изменяемый элемент был на 1 больше, чем
соответствующий элемент в предыдущей последовательности. Таким образом, индекс p,
начиная с которого следует изменить «хвост последовательности», определяется по зна-
чению элемента A[n]. Если A[n] < m, то следует изменять только A[n], и при этом p ← n.
Если же уже A[n] = m, то нужно уменьшать индекс p ← p − 1, увеличивая длину изменя-
емого хвоста.

140 / 907
2.3.5. Генерация подмножеств (4/4)

Пример. Последовательность n-элементных подмножеств m-элементного множества


в лексикографическом порядке для n = 3 и m = 4: (1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4).
Отступление. Часто встречаются задачи, в которых требуется найти в некотором множестве эле-
мент, обладающий определёнными свойствами. При этом исследуемое множество может быть ве-
лико, а его элементы устроены достаточно сложно. Если неизвестно заранее, как именно следу-
ет искать элемент, то остаётся перебирать все элементы, пока не попадётся нужный (поэтому та-
кие задачи называют переборными). При решении переборных задач совсем необязательно и, как
правило, нецелесообразно строить всё исследуемое множество (пространство поиска) в явном
виде. Достаточно иметь итератор, перебирающий элементы множества в подходящем порядке.
Многие рассмотренные алгоритмы являются примерами таких итераторов для некоторых типич-
ных пространств поиска. Чтобы использовать эти алгоритмы в качестве итераторов при перебо-
ре, достаточно вставить вместо оператора yield проверку того, что очередной элемент является
искомым.

141 / 907
2.3.6. Расширенные биномиальные коэффициенты (1/3)
Сократим множитель (m − n)! в формуле для числа сочетаний:
m(m − 1) . . . (m − n + 1)
C(m, n) = .
n!
При определении чисел C(m, n) по смыслу комбинаторной конфигурации параметры на-
туральны: m, n ∈ N. Однако данная формула сохраняет свою вычислимость и при отри-
цательных значениях m, что позволяет ввести в рассмотрение расширенные биномиаль-
ные коэффициенты для m ∈ Z и n ∈ N0 .
Замечание. В качестве области определения расширенных биномиальных коэффициен-
тов можно рассматривать также рациональные m ∈ Q и вещественные значения m ∈ R.
Def Def
Пусть m ∈ Z, n ∈ N0 . Положим C(m, n) = 0 при 0 < m < n, и положим C(m, 0) = 1
Def
при n = 0. В остальных случаях C(m, n) = (m(m − 1) . . . (m − n + 1))/n!.
Def
Замечание. Можно доопределить C(m, n) = 0 при n < 0. Тогда ∀ m ∈ Z (C(m, 0) = 1)
и ∀ n ∈ Z, n 6= 0 (C(0, n) = 0). Однако расширение области определения n не имеет
существенного вычислительного смысла.
142 / 907
2.3.6. Расширенные биномиальные коэффициенты (2/3)
Теорема. C(m, n) = (−1)n C(n − m − 1, n).
Доказательство. Заметим, что m(m − 1) . . . (m − n + 1) =
= (−1)n (−m)(−m + 1) . . . (−m + n − 1) = (−1)n (n − m − 1) . . . (n − m − 1 − (n − 1)).
Откуда C(m, n) = m . . . (m − n + 1)/n! = (−1)n (n − m − 1) . . . (−m)/n! =
= (−1)n C(n − m − 1, n).
Доказанное тождество можно использовать для вычисления биномиальных коэффици-
ентов с отрицательным первым параметром по уже вычисленным значениям коэффици-
ентов с положительными параметрами.
Замечание. В теореме п. 2.3.1 при доказательстве тождества
C(m, n) = C(m − 1, n − 1) + C(m − 1, n)
нигде не использовано то обстоятельство, что число m > 0, что позволяет организовать
рекуррентное вычисление биномиальных коэффициентов и для случая m < 0.
Используя эти тождества, можно построить расширенный треугольник Паскаля, в кото-
ром положительные значения m распространяются вправо, отрицательные значения m
распространяются влево, а n распространяется вниз.
143 / 907
2.3.6. Расширенные биномиальные коэффициенты (3/3)
Поскольку при m = 0 имеем C(m, n) = 0, средний столбец, обозначенный n, содержит
сами значения n, подобно тому, как верхняя строка содержит значения m.
m
−4 −3 −2 −1 n
0 1 2 3 4
1 1 1 1 0 1 1 1 1 1
−4 −3 −2 −1 1 0 1 2 3 4
10 6 3 1 2 0 0 1 3 6
−20 −10 −4 −1 3 0 0 0 1 4
35 15 5 1 4 0 0 0 0 1

Пример. Расширенные биномиальные коэффициенты применяются для разложения дро-


бей в ряд:
∞ ∞
1 −m
X
n
X
= (1 + x) = C(−m, n)x = (−1)n C(m + n − 1, n)xk .
(1 + x)m n=0 n=0

144 / 907
2.3.7. Мультимножества и последовательности (1/2)
В п. 2.1.5 показано, что число n-элементных подмножеств m-элементного множества
равно C(m, n). Поскольку n-элементные подмножества — это n-элементные индикато-
ры, ясно, что число n-элементных индикаторов над m-элементным множеством также
равно C(m, n).
Общее число n-элементных мультимножеств [xn1 1 , . . . , xnmm ], в которых n1 + · · · + nm = n,
над m-элементным множеством X = {x1 , . . . , xm } нетрудно определить, если заметить,
что это число способов разложить n мячей по m ящикам, то есть число сочетаний с по-
вторениями V (m, n) = C(n + m − 1, n).
Пусть задано множество X = {x1 , . . . , xm } и последовательность Y = (y1 , . . . , yn ), где
∀ i (yi ∈ X), причём в последовательности Y элемент xi встречается ni раз. Тогда муль-
тимножество X b = [xn1 1 , . . . , xnm ] называется составом последовательности Y . Ясно, что
m
состав любой последовательности определяется однозначно, но разные последователь-
ности могут иметь один и тот же состав.
Пример. Пусть X = {1, 2, 3}, Y1 = {1, 2, 3, 2, 1}, Y2 = {1, 1, 2, 2, 3}. Тогда последователь-
ности Y1 и Y2 имеют один и тот же состав X b = [12 , 22 , 31 ].
145 / 907
2.3.7. Мультимножества и последовательности (2/2)
Отступление. Из органической химии известно, что существуют различные вещества, имеющие
один и тот же химический состав. Они называются изомерами.
Очевидно, что все последовательности над множеством X = {x1 , . . . , xm }, имеющие
b = [xn1 1 , . . . , xnm ], имеют одну и ту же длину n = n1 + · · · + nm .
один и тот же состав X m
Обозначим число последовательностей одного состава C(n; n1 , . . . , nm ).
n!
Теорема. C(n; n1 , . . . , nm ) = .
n 1 ! . . . nm !
Доказательство. Рассмотрим мультимножество X b = [xn1 1 , . . . , xnmm ], которое можно за-
писать в форме последовательности x1 , . . . , x1 , x2 , . . . , x2 , . . . , xm , . . . , xm , где элемент
xi встречается ni раз. Ясно, что все последовательности одного состава X b получаются
из указанной последовательности перестановкой элементов. При этом если переставля-
ются одинаковые элементы, например, xi , то получается та же самая последовательность.
Таких перестановок ni !. Таким образом, общее число перестановок n1 ! . . . nm !C(n; n1 , . . . , n
С другой стороны, число перестановок n элементов равно n!.
146 / 907
2.3.8. Мультиномиальные коэффициенты (1/3)

Числа C(n; n1 , . . . , nm ) встречаются в практических задачах довольно часто, поскольку


обобщают случай индикаторов, которые описываются биномиальными коэффициентами,
на случай произвольных мультимножеств. В частности, справедлива формула, обобщаю-
щая формулу бинома Ньютона, в которой участвуют числа C(n; n1 , . . . , nm ), поэтому их
иногда называют мультиномиальными X коэффициентами.
Теорема. (x1 + . . . + xm ) = n
C(n; n1 , . . . , nm )xn1 1 · · · xnmm .
n1 +...+nm =n
Доказательство. Индукция по m. База: при m = 2 по формуле бинома Ньютона имеем
n n
X X n! X n! n1 n2
(x1 + x2 )n = C(n, i)xi1 xn−i
2 = xi1 xn−i
2 = x1 x2 . Пусть те-
i=0
i!(n − i)! n +n =n
n1 !n 2 !
Xi=0 1 2
n
перь (x1 + . . . + xm−1 ) =n
C(n; n1 , . . . , nm−1 )xn1 1 m−1
· · · xm−1 .
n1 +...+nm−1 =n

147 / 907
2.3.8. Мультиномиальные коэффициенты (2/3)

n
Доказательство. (Продолжение) Рассмотрим (x1 + . . . + xm ) . Имеем (x1 + . . . + xm )n =
n
X
= ((x1 + . . . + xm−1 ) + xm )n = C(n, i)(x1 + . . . + xm−1 )i xm n−i
=
 i=0 
n
X n! X i! nm−1  n−i
=  xn1 1 · · · xm−1 xm =
i=0
i!(n − i)! n +...+n =i
n 1 ! · · · n m−1 !
1 m−1
n
X X n!i! nm−1 n−i
= xn1 1 · · · xm−1 xm =
i=0 n1 +...+nm−1 =i
i!(n − i)!n1 ! · · · n m−1 !
X n! nm−1 nm
= xn1 1 · · · xm−1 xm ,
n1 +...+nm−1 +nm
n ! · · · nm−1 !nm !
=n 1
где nm ← n − i.

148 / 907
2.3.8. Мультиномиальные коэффициенты (3/3)
X n!
Следствие. = mn .
n1 +...+nm
n
=n 1
! · · ·!n m !
X n!
Доказательство. mn = (1 . . + 1})n =
| + .{z 1n1 . . . 1nm =
n1 +...+nm
n ! · · ·!nm !
=n 1
m раз
X n!
= .
n1 +···+nm =n
n 1 ! . . .!n m !
Пример. При игре в преферанс трём играющим сдаётся по 10 карт из 32 карт и 2 карты
остаются в «прикупе». Сколько существует различных раскладов?

32!
C(32; 10, 10, 10, 2) = = 2 7 5 3 2 9 4 4 0 8 5 0 4 6 4 0.
10!10!10!2!

149 / 907
2.3.9. Биномиальная система счисления (1/3)
k-биномиальной системой счисления называется непозиционная система счисления, где
каждое натуральное число n представляется в виде:
k
X
n = C(b1 , 1) + C(b2 , 2) + · · · + C(bk , k) = C(bi , i), k ∈ N, 0 6 b1 < b2 < · · · < bk .
i=1

Пример. Пусть k = 2.
1 = C(0, 1) + C(2, 2) = 0 + 1
2 = C(1, 1) + C(2, 2) = 1 + 1
3 = C(0, 1) + C(3, 2) = 0 + 3
4 = C(1, 1) + C(3, 2) = 1 + 3
5 = C(2, 1) + C(3, 2) = 2 + 3
6 = C(0, 1) + C(4, 2) = 0 + 6
и т. д.
Замечание. По определению, C(p, q) = 0 при целых p и q таких, что 0 6 p < q .
150 / 907
2.3.9. Биномиальная система счисления (2/3)
Покажем состоятельность данной системы счисления.
Теорема. При заданном натуральном значении k для любого натурального числа n суще-
ствуют и единственны натуральные числа b1 , . . . , bk , такие что 0 6 b1 < b2 < · · · < bk
k
P
и n = C(b1 , 1) + C(b2 , 2) + · · · + C(bk , k) = C(bi , i).
i=1
Доказательство.
[ Существование ] Всякой паре натуральных чисел n и k сопоставим набор
0 6 b1 < b2 < · · · < bk строго возрастающих натуральных чисел по следующему правилу.
Сначала выберем bk > 0 так, чтобы удовлетворялись неравенства
C(bk , k) 6 n < C(bk + 1, k). Такой выбор однозначен, потому что по основному рекур-
рентному соотношению C(bk + 1, k) = C(bk , k) + C(bk , k − 1) и существует единственное
число bk : C(bk , k) 6 n < C(bk , k) + C(bk , k − 1). Затем определим bk−1 :
C(bk−1 , k − 1) 6 n − C(bk , k) < C(bk−1 + 1, k − 1). При таких условиях обязательно
выполняется неравенство bk > bk−1 . Действительно, C(bk−1 , k − 1) 6 n − C(bk , k) <
< C(bk + 1, k) − C(bk , k) = C(bk , k − 1), откуда bk−1 < bk .
151 / 907
2.3.9. Биномиальная система счисления (3/3)
Доказательство. (Продолжение) Продолжая действовать подобным образом, определим
числа bk−2 , bk−3 , . . . , b1 . Имеем C(b1 , 1) 6 n − C(bk , k) − · · · − C(b2 , 2) < C(b1 + 1, 1).
Откуда n = C(b1 , 1) + C(b2 , 2) + · · · + C(bk , k). Таким образом, построили требуемый
набор чисел 0 6 b1 < b2 < · · · < bk , дающий искомое представление числа n.
[ Единственность ] Индукция по k . При k = 1 имеем C(n, 1) = n. Пусть для k − 1 пред-
ставление единственно и существует отличный от построенного набор натуральных чи-
сел 0 6 c1 < c2 < · · · < ck такой, что n = C(c1 , 1) + C(c2 , 2) + · · · + C(ck , k). В силу
условия на bk имеем ck 6 bk , причем равенство ck = bk противоречит предположению
индукции. Значит, ck 6 bk − 1, и имеем цепочку неравенств n − C(ck , k) >
> C(bk , k) − C(ck , k) > C(bk , k) − C(bk − 1, k) = C(bk − 1, k − 1) > C(ck , k − 1). С
другой стороны, в силу предположения индукции, представление числа n − C(bk , k) в
виде n = C(c1 , 1) + C(c2 , 2) + · · · + C(ck−1 , k − 1) единственно, причем n − C(ck , k) <
< C(ck−1 + 1, k − 1). Сравнивая два последних неравенства, приходим к противоречию
ck−1 + 1 > ck .

152 / 907
2.4. Разбиения

Разбиения не рассматривались среди типовых комбинаторных конфигураций в п. 2.1.1,


потому что получить для них явную формулу не так просто, как для остальных. В этом
разделе отмечаются основные свойства разбиений, а окончательные формулы приведе-
ны в п. 2.6.3.

153 / 907
2.4.1. Числа Стирлинга (1/3)
Пусть B = {B1 , . . . , Bn } — разбиение множества X из m элементов на n подмножеств:
n
[
Bi ⊂ X, Bi = X, Bi 6= ∅, Bi ∩ Bj = ∅ приi 6= j.
i=1

Подмножества Bi называются блоками разбиения.


Между разбиениями с непустыми блоками и отношениями эквивалентности существует
взаимно-однозначное соответствие (п. 1.7.1). Если E1 и E2 — два разбиения X , то говорят,
что разбиение E1 есть измельчение разбиения E2 , если каждый блок E2 есть объединение
блоков E1 . Измельчение является частичным порядком на множестве разбиений.
Число разбиений m-элементного множества на n блоков, или число способов разло-
жить m мячей по n неразличимым ящикам, называется числом Стирлинга и обознача-
Def Def
ется S(m, n). По определению положим S(m, m) = 1 при m > 0, S(m, 0) = 0 при
Def
m > 0, S(m, n) = 0 при n > m.
154 / 907
2.4.1. Числа Стирлинга (2/3)

Теорема. S(m, n) = S(m − 1, n − 1) + nS(m − 1, n).


Доказательство. Пусть B — множество всех разбиений множества M ←{1, . . . , m} на n
блоков. Положим

B1 ← {X ∈ B | ∃ B ∈ X (B = {m})} , B2 ← {X ∈ B | ¬∃ B ∈ X (B = {m})} ,

то есть в B1 входят разбиения, в которых элемент m образует отдельный блок, а в B2 —


все остальные разбиения. Заметим, что B2 = {X ∈ B | m ∈ X =⇒ |X| > 1}. Тогда
B = B1 ∪ B2 , B1 ∩ B2 = ∅. Имеем |B1 | = S(m − 1, n − 1), |B2 | = n S(m − 1, n), так
как все разбиения B2 получаются следующим образом: берём все разбиения множества
{1, . . . , m − 1} на n блоков (их S(m − 1, n)) и в каждый блок по очереди помещаем
элемент m. Следовательно, так как B1 ∩ B2 = ∅,
S(m, n) = |B| = |B1 | + |B2 | = S(m − 1, n − 1) + nS(m − 1, n).

155 / 907
2.4.1. Числа Стирлинга (3/3)

m−1
P
Теорема. S(m, n) = C(m − 1, i)S(i, n − 1).
i=n−1
Доказательство. Пусть B — множество разбиений множества M
 всех M S←{1, . . . , m} на n
блоков. Рассмотрим семейство B ← B ⊂ 2 | m ∈ B . Тогда B = B∈B BB ,
где BB ← {X | X ∈ B & B ∈ X}, причём BB 0 ∩ B B00 = ∅, если B 0 6= B 00 . Пусть B ∈ B и
b ← |B|. Тогда |BB | = S(m−b, n−1). Заметим, что B ∈ B | b = |B| = C(m−1, b−1).
Имеем
m−(n−1)
P S m−(n−1)
P
S(m, n) = |B| = BB = C(m − 1, b − 1)S(m − b, n − 1) =


b=1 B∈B & |B|=b b=1
n−1
P m−1
P
= C(m − 1, m − i − 1)S(i, n − 1) = C(m − 1, i)S(i, n − 1), где i ← m − b.
i=m−1 i=n−1

156 / 907
2.4.2. Числа Моргана (1/2)

Число сюръективных функций, то есть число размещений m мячей по n ящикам, таких,


что все ящики заняты, называется числом Моргана и обозначается M (m, n).
Замечание. Числа Стирлинга называют также числами Стирлинга второго рода, а числа
Моргана называют числами Стирлинга первого рода и обозначают s(m, n).
Теорема. [1] M (m, n) = n! S(m, n).
Доказательство. Каждое разбиение множества {1, . . . , m} соответствует семейству мно-
жеств уровня сюръективной функции и обратно. Таким образом, число различных се-
мейств множеств уровня сюръективных функций — это число Стирлинга S(m, n). Всего
сюръективных функций M (m, n) = n! S(m, n), так как число сюръективных функций с
заданным семейством множеств уровня равно числу перестановок множества значений
функции.

157 / 907
2.4.2. Числа Моргана (2/2)
Теорема. [2] M (m, n) = M (m − 1, n − 1) + (m − 1)M (m − 1, n).
Доказательство. Рассмотрим множество сюръективных функций из множества X в мно-
жество Y (|X| = m, |Y | = n). Зафиксируем элемент n ∈ Y . Разобьем множество сюръ-
екций из X в Y на два множества:
S1 = {f : X → Y | |f −1 (n)| = 1} S2 = {f : X → Y | |f −1 (n)| > 1}.
Тогда |S1 | = M (m − 1, n − 1) (в элемент n переходит только какой-то элемент X , все
остальные переходят «как хотят»), |S2 | = (m − 1)M (m − 1, n) (мы добавляем в f −1
какой-то из m − 1 оставшихся элементов X , всего m − 1 способ это сделать). Поскольку
S1 ∩ S2 = ∅, имеем M (m, n) = M (m − 1, n − 1) + (m − 1)M (m − 1, n).
Pm
Теорема. [3] k=1 M (m, k) = m!.
Доказательство. Индукция по m. Случай m = 1 тривиален. Пусть теорема верна для всех
натуральных
Pm P что 0 < n < m. Тогда, по предыдущей
n таких,
m m
P теореме имеем:
k=1 M (m, k) = k=1 M (m − 1, k − 1) + (m − 1) k=1 M (m − 1, k) =
P m−1
= k=1 M (m − 1, k)(1 + m − 1) = (m − 1)!m = m!.
158 / 907
2.4.3. Вычисление чисел Стирлинга (1/4)
В п. 2.4.1 выведены две формулы для вычисления чисел Стирлинга. Вторая формула
m−1
X
S(m, n) = C(m − 1, i)S(i, n − 1)
i=n−1

требует вcпомогательного вычисления биномиальных коэффициентов и выполнения боль-


шого количества сложений и умножений.
При использовании первой рекуррентной формулы

S(m, n) = S(m − 1, n − 1) + nS(m − 1, n)

встаёт вопрос о хранении уже посчитанных чисел Стирлинга, необходимых для проме-
жуточных вычислений, а также многократного перевычисления одних и тех же чисел в
случае прямого использования рекурсии.

159 / 907
2.4.3. Вычисление чисел Стирлинга (2/4)
Пример. Вычислим S(7, 3). Для этого построим таблицу начальных значений
чисел Стирлинга, пользуясь первой рекуррентной формулой.

m\n 0 1 2 3 4 5 6 7
0 1
1 0 1
2 0 1 1
3 0 1 3 1
4 0 1 7 6 1
5 0 1 15 25 10 1
6 0 1 31 90 65 15 1
7 0 1 63 301 350 140 21 1

Значения, которые необходимые для вычисления числа S(7, 3), обведены прямоуголь-
никами.
160 / 907
2.4.3. Вычисление чисел Стирлинга (3/4)
Вход: неотрицательные целые числа m и n
Выход: число Стирлинга S(m, n)
if m = n then return 1 end if //можем сразу вернуть известные значения
if n = 0 then return 0 end if
if n > m then return 0 end if
if n = 1 then return 1 end if
d ← min(n, m − n + 1) //длина рабочего массива
D : array[1..d] of integer //рабочий массив
s ← max(n, m − n + 1) //количество повторений
for i from 1 to d do D[i] ← 1 end for //инициализация
for i from 2 to s do
for j from 2 to d do
D[j] ← if d = n then D[j − 1] + j ∗ D[j] else D[j] + i ∗ D[j − 1] end if
end for
end for
return D[d] //число Стирлинга
161 / 907
2.4.3. Вычисление чисел Стирлинга (4/4)
Обоснование. Чтобы вычислить число Стирлинга, необходимо вычислить все значения,
показанные в «параллелограмме» предыдущего примера. При этом хранить достаточно
лишь рабочий массив, равный длине более короткой стороны «параллелограмма». При
этом количество повторений соответствует более длинной стороне «параллелограмма».
Таким образом, рабочий массив соответствует либо диагонали, которая на каждой итера-
ции опускается вниз, либо столбцу, который на каждой итерации сдвигается вправо-вниз.
В любом случае вначале рабочий массив инициализируется значениями 1. Далее на каж-
дом шаге цикла по i перевычисляется рабочий массив. Таким образом, вычисляются толь-
ко необходимые промежуточные элементы, причём по одному разу.
В любом случае перевычисляется (n − 1)(m − n) элементов.
Замечание. При оценке области применимости алгоритма следует обратить внимание на
то, что числа Стирлинга для фиксированного m с ростом n сначала возрастают, а потом
убывают.

162 / 907
2.4.4. Числа Белла
Число всех разбиений m-элементного множества называется числом Белла и обознача-
ется B(m),
m
Def Def
X
B(m) = S(m, n), B(0) = 1.
n=0
m
P
Теорема. B(m + 1) = C(m, i)B(i).
i=0
Доказательство. Пусть B — множество всех разбиений множества M1 = 1..(m + 1).
Рассмотрим
 множество
подмножеств
множества M1 , содержащих элемент m + 1:
B ← B ⊂ 2M1 m + 1 ∈ B . Тогда B =
S
BB , где BB ← {X ∈ B | B ∈ X}.
B∈B 
Пусть B ∈ B и b = |B|. Тогда |BB | = B(m + 1 − b). Заметим, что | B ∈ B | |B| = b | =
= C(m, b − 1). Следовательно, B(m + 1) = |B| = m+1
P
b=1 C(m, b − 1)B(m − b + 1) =
P0 m
P
= i=m C(m, m − i)B(i) = C(m, i)B(i), где i ← m − b + 1.
i=0

163 / 907
2.4.5. Треугольник Белла (1/4)
Вычисление числа Белла по рекуррентной формуле, выведенной в предыдущем парагра-
фе, даже при условии хранения всех предыдущих вычисленных значений чисел Белла,
имеет трудоёмкость O(n3 ). Рассмотрим алгоритм, использующий специальную структуру
данных, который в неявном виде хранит все предыдущие вычисленные значения для би-
номиальных коэффициентов и имеет трудоёмкость O(n2 ). Треугольник Белла — это беско-
нечная треугольная матрица, где каждое число (кроме чисел на левой боковой стороне)
является суммой двух чисел: стоящего слева от него в этой же строке и слева над ним.
Первое число в каждой строке (кроме первой) является последним числом из предыду-
щей строки. Число в первой строке — единица.

1
1 2
2 3 5
5 7 10 15
15 20 27 37 52
. . . . . .
164 / 907
2.4.5. Треугольник Белла (2/4)
Для вычислений треугольник Белла удобнее хранить в виде бесконечной нижней тре-
угольной матрицы:
1
1 2
2 3 5
5 7 10 15
15 20 27 37 52
. . . . . .
Обозначим An,k — k -ый элемент в n-ой строке треугольника Белла. По построению тре-
угольника An,k = An,k−1 + An−1,k−1 при k > 1, n > 1, An,1 = An−1,n−1 при n > 1 и
A1,1 = 1.
n
P
Лемма. An,k = C(k − 1, i − n + k − 1)Ai,1 .
i=n−k+1 Pn
Доказательство. Индукция по k . База. An,1 = i=n C(0, i − n)Ai,1 = C(0, 0)An,1 = An,1 .
165 / 907
2.4.5. Треугольник Белла (3/4)
Доказательство. (Продолжение) Индукционный переход. An,k = An,k−1 + An−1,k−1 =
n
P n−1
P
= C(k − 2, i − n + k − 2)Ai,1 + C(k − 2, i − n + k − 1)Ai,1 =
i=n−k+2 i=n−k+1
n−1
P
= (C(k − 2, i − n + k − 2) + C(k − 2, i − n + k − 1)) Ai,1 +
i=n−k+2
+ C(k − 2, k − 2)An,1 + C(k − 2, 0)An−k+1,1 =
n−1
P
= C(k − 1, i − n + k − 1)Ai,1 + C(k − 1, k − 1)An,1 + C(k − 1, 0)An−k+1,1 =
i=n−k+2
Pn
= C(k − 1, i − n + k − 1)Ai,1 .
i=n−k+1
Теорема. B(m) = Am+1,1 = Am,m .
Доказательство. Индукция по m. База B(0) = 1 = A1,1 по построению треугольника.
m
P
Пусть B(m) = Am+1,1 . Тогда по лемме Am+2,1 = Am+1,m+1 = C(m, i)Ai+1,1 =
i=0
m
P
= C(m, i)B(i) = B(m + 1).
i=0
166 / 907
2.4.5. Треугольник Белла (4/4)
Из теоремы непосредственно следует алгоритм.
Вход: число m
Выход: число Белла B(m)
if m = 0 then return 1 end if //по определению
A : array [1..m] of integer //рабочий массив, A[k] хранит An,k
A[1] := 1 //A1,1 = B(1) = 1
for n from 2 to m do
t ← A[1] //переменная t хранит An−1,k−1
A[1] ← A[n − 1] //An,1 = An−1,n−1
for k from 2 to n do
s ← A[k] //переменная s хранит An−1,k
A[k] ← A[k − 1] + t //An,k = An,k−1 + An−1,k−1
t ← s //k ← k + 1
end for
end for
return A[m] //число Белла 167 / 907
2.5. Включения и исключения

Приведённые в предыдущих четырёх разделах формулы и алгоритмы дают способы вы-


числения комбинаторных чисел для некоторых распространённых комбинаторных кон-
фигураций. Практические задачи не всегда прямо сводятся к известным комбинаторным
конфигурациям. В этом случае используются различные методы сведе́ния одних комби-
наторных конфигураций к другим. В этом и двух следующих разделах рассматриваются
три наиболее часто используемых метода.
Мы начинаем с самого простого и прямолинейного, но имеющего ограниченную область
применения метода включений и исключений.

168 / 907
2.5.1. Объединение конфигураций (1/2)

Часто комбинаторная конфигурация является объединением других, число комбинаций в


которых вычислить проще. В таком случае требуется уметь вычислять число комбинаций
в объединении. В простых случаях формулы для вычисления очевидны:

|A ∪ B| = |A| + |B| − |A ∩ B|,


|A ∪ B ∪ C| = |A| + |B| + |C| − |A ∩ B| − |B ∩ C| − |A ∩ C| + |A ∩ B ∩ C|.

169 / 907
2.5.1. Объединение конфигураций(2/2)

Пример. Сколько существует натуральных чисел, меньших 1000, которые не делятся ни


на 3, ни на 5, ни на 7? Всего чисел, меньших тысячи, 999. Из них:
999 : 3 = 333 делятся на 3,
999 : 5 = 199 делятся на 5,
999 : 7 = 142 делятся на 7,
999 : (3 ∗ 5) = 66 делятся на 3 и на 5,
999 : (3 ∗ 7) = 47 делятся на 3 и на 7,
999 : (5 ∗ 7) = 28 делятся на 5 и на 7,
999 : (3 ∗ 5 ∗ 7) = 9 делятся на 3, на 5 и на 7.
Имеем: 999 − (333 + 199 + 142 − 66 − 47 − 28 + 9) = 457.

170 / 907
2.5.2. Формула включений и исключений (1/3)
Следующая формула, известная как формула включений и исключений, позволяет вычис-
лить мощность объединения нескольких множеств, если известны их мощности и мощ-
ности всех возможных пересечений.
Теорема.
n n
[ X X X
Ai = |Ai | − |Ai ∩ Aj | + |Ai ∩ Aj ∩ Ak | − . . .


i=1 i=1 16i<j6n 16i<j<k6n

+ (−1)n−1 |A1 ∩ . . . ∩ An |.
Доказательство. Индукция по n. Для n = 2, 3 теорема проверена в предыдущем пара-
графе. Пусть

n−1 n−1
[ X X
Ai = |Ai | − |Ai ∩ Aj | + . . . + (−1)n−2 |A1 ∩ . . . ∩ An−1 |.

i=1 i=1 16i<j6n−1

171 / 907
2.5.2. Формула включений и исключений
 (2/3) n−1
S n−1
S
Доказательство. (Продолжение) Заметим, что Ai ∩ An = (Ai ∩ An ), и по ин-
i=1 i=1
дукционному предположению

n−1
[ X n−1 X
(Ai ∩ An ) = |Ai ∩ An | − |Ai ∩ Aj ∩ An | + · · · +


i=1 i=1 16i<j6n−1
n−2
+ (−1) |A1 ∩ . . . ∩ An−1 ∩ An |.
Тогда
! !
[n n−1
[ n−1[ n−1
[
Ai = Ai ∪ An = Ai + |An | − Ai ∩ An =


i=1 i=1 i=1 i=1
n
X X
= |Ai | − |Ai ∩ Aj | + . . . + (−1)n−1 |A1 ∩ . . . ∩ An |.
i=1 16i<j6n

172 / 907
2.5.2. Формула включений и исключений (3/3)

Пример. Докажем формулу для функции Эйлера ϕ(n) (см. п. 1.5.1) с помощью метода
включений и исключений.
Пусть n = pα1 1 pα2 2 . . . pαk k и ϕ(n) — количество чисел, меньших n и взаимно простых с ним.
Пусть Ai — множество чисел, не превосходящих n и делящихся на pi . Тогда
k
n n
S
ϕ(n) = n − | Ai |. Заметим, что |Ai | = pi
и |Ai1 ∩ Ai2 ∩ · · · ∩ Ais | = pi1 pi2 ...pis
, где
i=1
деление подразумевается нацело. Отсюда получаем
ϕ(n) = n − ( pn1 + pn2 + · · · + pnk ) + ( p1np2 + p2np3 + · · · + pk−1
n
pk
) − · · · + (−1)k p1 p2n...pk =
= n(1 − p11 )(1 − p12 ) . . . (1 − p1k ), что согласуется с формулой, выведенной в п. 1.5.2.
Замечание. Обозначения сумм с неравенствами в пределах суммирования, использо-
ванные в формулировке и доказательстве P
теоремы, являются не
Pболее чем сокращённой
n−1 Pn
формой записи кратных сумм. Например, 16i<j6n означает i=1 j=i+1 .

173 / 907
2.5.3. Комбинации свойств
Достаточно часто комбинаторная задача формулируется как задача подсчёта количества
объектов, обладающих или не обладающих определёнными свойствами.
Уточним постановку задачи. Пусть имеется множество объектов M , |M | = m, и мно-
жество свойств a1 , . . . , an , то есть одноместных предикатов ai : M → 0..1. Обозначим
N (ai1 , . . . , ais ) — количество элементов, обладающих свойствами ai1 , . . . , ais ,
N (aj1 , . . . , ajt ) — количество элементов, не обладающих свойствами aj1 , . . . , ajt .
n
N (ai , aj ) + . . . + (−1)n N (a1 , . . . , an ).
P P
Теорема. N (a1 , . . . , an ) = m − N (ai ) +
i=1 16i<j6n
Доказательство. Каждый одноместный предикат является характеристическим предика-
том подмножества Mi = {x ∈ M | ai (x)}. Поэтому
n n
\ [
N (a1 , . . . , an ) = Mi = |M | − Mi


i=1 i=1

и далее по формуле включений и исключений.


174 / 907
2.5.4. Беспорядки и субфакториал (1/3)

Перестановка без неподвижных точек называется беспорядком. Количество всех беспо-


рядков n предметов называется субфакториалом числа n и обозначается !n.
n
(−1)k /k!.
P
Теорема. !n = n!
k=0
Доказательство. Обозначим через D(n, k) — количество перестановок из n элементов,
в которых k элементов — неподвижные точки. Существует P (n − k) перестановок, в ко-
торых k элементов остаются на своей позиции. Выбрать k неподвижных элементов из n
можно C(n, k) способами. Окончательно получаем D(n, k) = C(n, k)P (n − k). Общее
количество перестановок равняется n!. Воспользуемся формулой включений и исключе-
ний. Имеем: !n =
= n!−C(n, 1)P (n−1)+C(n, 2)P (n−2)−...+(−1)k C(n, k)P (n−k)+· · ·+(−1)n C(n, n) =
1)! + n!(n − 2)!/(n − 2)!2! − . . . +(−1)k n!(n − k)!/(n − k)!k! − . . .
= n! − n!(n − 1)!/(n −P
+(−1)n n!/(0! · n!) = nk=0 (−1)k n!/k!.

175 / 907
2.5.5. Беспорядки и субфакториал (2/3) Pn (−1)k
Замечание. Cумма в правой части формулы !n = n! k=0 k! является частичной сум-
мой разложения e−1 = 1 − 1/1! + 1/2! − . . . + (−1)n /n! + . . . . Поэтому субфакториал
является ближайшим целым числом к числу n!/e.
Теорема. !n = (n − 1)(!(n − 1)+!(n − 2)).
Доказательство.
 (n − 1) (!(n − 1)+!(n − 2)) = 
n−1
P (−1)k n−2
P (−1)k
= (n − 1) (n − 1)! k!
+ (n − 2)! k!
=
 k=0 n−1
k=0 
P (−1)k n−2 P (−1)k
= (n − 1)(n − 2)! (n − 1) k!
+ k!
=
 n−1 k=0 k=0 
P (−1)k n−1 P (−1)k n−2 P (−1)k
= (n − 1)! n k!
− k!
+ k!
=
k=0
 n−1 k=0  k=0
P (−1)k (−1)n−1
= (n − 1)! n k!
− (n−1)! =
k=0
 n−1 
P (−1)k n
n(−1)n P (−1)k
= (n − 1)! n k!
+ n(n−1)! = n(n − 1)! k!
= !n.
k=0 k=0
176 / 907
2.5.5. Беспорядки и субфакториал (3/3)
Следствие. !n =!(n − 1) · n + (−1)n .
Доказательство. По индукции. База: !1 = 0. Пусть !(n − 1) =!(n − 2) · (n − 1) + (−1)n−1 .
Тогда !n = (n − 1) (!(n − 1)+!(n − 2)) =!(n − 1) · n−!(n − 1)+!(n − 2) · n−!(n − 2) =
=!(n − 1) · n − (!(n − 2) · (n − 1) + (−1)n−1 )+!(n − 2) · n−!(n − 2) =
=!(n − 1) · n−!(n − 2) · n+!(n − 2) + (−1)n +!(n − 2) · n−!(n − 2) =
=!(n − 1) · n + (−1)n .
Пример. Профессор собирается поручить четырём студентам A, B, C, D проверить друг у
друга контрольную работу. Ни один студент не должен проверять свою работу. Сколько у
профессора вариантов раздать работы на проверку? Из всех P (4) = 4! = 24 перестано-
вок, подходят только !4 = 9 : BADC , BCDA, BDAC , CADB , CDAB , CDBA, DABC ,
DCAB , DCBA. Любая другая перестановка будет иметь как минимум одну неподвиж-
ную точку.
Для справки: !1 = 0, !2 = 1, !3 = 2, !4 = 9, !5 = 44, !6 = 265, !7 = 1 854, !8 = 14 833,
!9 = 133 496.
177 / 907
2.6. Формулы обращения

Полезную, но очень специфическую группу приёмов образуют различные способы пре-


образования уже полученных комбинаторных выражений. В этом разделе рассматрива-
ется один частный, но важный случай.

178 / 907
2.6.1. Теорема обращения
Пусть an,k и bn,k — некоторые (комбинаторные) числа, зависящие от параметров n и k ,
причём 0 6 k 6 n. Если известно выражение чисел an,k через числа bn,k , то в некоторых
случаях можно найти и выражение чисел bn,k через числа an,k , то есть решить комбина-
торное уравнение.   
n
P
Теорема. Пусть ∀ n ∀k 6 n an,k = λn,k,i bn,i и пусть
i=0 ( !!!
Pn 1, m = k,
∃ µn,k,i ∀ k 6 n ∀ m 6 n µn,k,i λn,i,m = .
i=0 0, m 6= k
 n

P
Тогда ∀ k 6 n bn,k = µn,k,i an,i .
i=0  n 
Pn Pn P
Доказательство. µn,k,i an,i = µn,k,i λn,i,m bn,m =
 i=0  i=0 m=0
Pn n
P
= µn,k,i λn,i,m bn,m = bn,k .
m=0 i=0
179 / 907
2.6.2. Формулы обращения (1/3)
Применение теоремы обращения предполагает отыскание для заданных чисел λn,k,i (ко-
эффициентов комбинаторного уравнения) соответствующих чисел µn,k,i , удовлетворяю-
щих условию теоремы обращения. Особенно часто числами λn,k,i являются биномиаль-
ные коэффициенты. (
n
X 1, m = n,
Лемма. (−1)i−m C(n, i)C(i, m) =
i=0
0, m < n.
Доказательство. Используя формулу 3 из п. 2.3.1 и тот факт, что C(n − m, i − m) = 0 при
i < m, имеем
n
X n
X
(−1)i−m C(n, i)C(i, m) = (−1)i−m C(n, m)C(n − m, i − m) =
i=0 i=0
n
X
= (−1)i−m C(n, m)C(n − m, i − m) =
i=m
n
X
= C(n, m) (−1)i−m C(n − m, i − m).
i=m
180 / 907
2.6.2. Формулы обращения (2/3)
Доказательство. (Продолжение) Но при m < n имеем
n
X n−m
X
(−1)i−m C(n − m, i − m) = (−1)j C(n − m, j) = 0,
i=m j=0
n
(−1)i−m C(n−m, i−m) =
P
где j ← i−m. С другой стороны, при m = n имеем C(n, m)
i=m
= C(n, n)(−1)n−n C(0, 0) = 1.
k k
C(k, i)bn,i , то bn,k = (−1)k−i C(k, i)an,i .
P P
Теорема. Если an,k =
i=0 i=0
Доказательство. Здесь λn,k,i = C(k, i) и µn,k,i = (−1)k−i C(k, i). При k 6 n, m 6 n
n n
(−1)k−i C(k, i)C(i, m) = (так как C(k, i) = 0 при i > k )
P P
имеем: µn,k,i λn,i,m =
i=0 i=0
k k
(−1)k−i+m−m C(k, i)C(i, m) = (−1)k−m (−1)i−m C(k, i)C(i, m) =
P P
=
i=0 i=0
= if k = m then 1 else 0 end if.
181 / 907
2.6.2. Формулы обращения (3/3)
n n
(−1)i−k C(i, k)an,i .
P P
Теорема. Если an,k = C(i, k)bn,i , то bn,k =
i=k i=k
Доказательство. Здесь λn,k,i = C(i, k) и µn,k,i = (−1)i−k C(i, k). При k 6 n, m 6 n
n n
(−1)i−k C(i, k)C(m, i) =
P P
имеем: µn,k,i λn,i,m =
i=0 i=0
n
i−k
P
= (−1) C(m, i)C(i, k) = if k = n then 1 else 0 end if.
i=0
Отступление. Вообще говоря, формулы, подобные приведённым формулам обращения, имеют
широкое использование в области алгебры,анализа и теории чисел (например, формулы обраще-
ния Мёбиуса), но такие применения выходят за рамки этого курса, поэтому здесь мы ограничива-
емся примерами, результаты которых можно было бы получить и более элементарными способа-
ми. Разбирая приведённые примеры, следует иметь в виду, что этими примерами область приме-
нения формул обращения отнюдь не исчерпывается.

182 / 907
2.6.3. Формулы для чисел Стирлинга и Моргана
В качестве примера использования формул обращения рассмотрим получение явных
формул для чисел Стирлинга и Моргана. Рассмотрим множество функций f : A → B ,
где |A| = n и |B| = k . Число всех таких функций равно k n . С другой стороны, число
функций f , таких, что |f (A)| = i, равно M (n, i), поскольку M (n, i) — это число сюръек-
тивных функций f : 1..n → 1..i. Но множество значений функции (при заданном i) мож-
k
но выбрать C(k, i) способами. Поэтому k n =
P
C(k, i)M (n, i).
i=0
Обозначив an,k ← k n и bn,i ← M (n, i), имеем по первой теореме п. 2.6.2
k
X
M (n, k) = (−1)k−i C(k, i)in .
i=0
Учитывая связь чисел Стирлинга и Моргана, окончательно имеем
k
1 X
S(n, k) = (−1)k−i C(k, i)in .
n! i=0
183 / 907
2.6.4. Полиномы с рациональными коэффициентами (1/2)
Комбинаторные числа — это целые числа по определению. Заметим, что формулы, кото-
рыми выражаются комбинарные комбинаторные числа, зачастую остаются вычислимы-
ми и при других, не обязательно целых значениях аргумента.
x(x − 1) . . . (x − n + 1)
Def
Пример. Функция C(x, n) = определена для любых веществен-
n!
ных x и выражается полиномом степени n с рациональными коэффициентами.
Любой полином с целыми коэффициентами принимает целые значения при целых зна-
чениях аргумента — это очевидно. Если же коэффициенты не целые, то значения поли-
нома при целых аргументах не обязаны быть целыми.
Пример. Полином 1/2x принимает целые значения только при чётных целых x, а при
нечётных — не принимает.
В тоже время существуют полиномы с нецелыми коэффициентами, которые принимают
целые значения при целых аргументах.
Пример. Рассмотренная функция C(x, n) для любых целых x принимает целые значения
(п. 2.3.6).
184 / 907
2.6.4. Полиномы с рациональными коэффициентами (2/2)
Теорема. Пусть f (x) — полином степени не более n с рациональным коэффициентами.
Тогда
∀ a ∈ Z (f (a) ∈ Z) ⇐⇒ f (0) ∈ Z & f (1) ∈ Z & . . . f (n) ∈ Z.
Доказательство.
[ ⇒ ] Очевидно.
[ ⇐ ] Заметим, что любой полином f (x) степени не больше n с рациональными коэффи-
циентами можно представить в виде
n n
X X x(x − 1) . . . (x − i + 1)
f (x) = gi C(x, i) = gi .
i=0 i=0
i!
Pm
Тогда ∀P
m ∈ 0..n (f (m) = i=0 gi C(m, i)), и по теореме обращения
m m−i
gm = i=0 (−1) f (i)C(m, i) — целое число (т. к. это линейная
Pn комбинация целых
чисел).Поскольку ∀ x ∈ Z (C(x, i) ∈ Z) и gi ∈ Z, имеем f (x) = i=0 gi C(x, i) ∈ Z для
любого целого x.
185 / 907
2.7. Производящие функции

Для решения комбинаторных задач в некоторых случаях можно использовать методы


математического анализа. Разнообразие применяемых здесь приёмов весьма велико и
не может быть в полном объёме рассмотрено в рамках этого курса. В данном разделе
рассматривается только основная идея метода производящих функций, применение ко-
торой иллюстрируется несколькими простыми примерами.

186 / 907
2.7.1. Формальные степенные ряды (1/4)
Пусть есть последовательность комбинаторных чисел ai и последовательность функций
ϕi (x). Рассмотрим формальный ряд
Def
X
F(x) = ai ϕi (x).
i

Выражение F(x) называется производящей функцией (для заданной последовательности


комбинаторных чисел ai относительно заданной последовательности функций ϕi (x)).
Def Def
Обычно используют ϕi (x) = xi или ϕi (x) = xi /i!.
Пример. Из формулы бинома Ньютона при y = 1 имеем
n
X
(1 + x)n = C(n, i)xi .
i=0

Таким образом, (1 + x)n является производящей функцией для биномиальных коэффи-


циентов.
187 / 907
2.7.1. Формальные степенные ряды (2/4)
Лемма. V (m, n) = V (m − 1, n) + V (m, n − 1).
Доказательство. V (m, n) = C(n + m − 1, n) = C(n + m − 2, n) + C(n + m − 2, n − 1) =
= V (m − 1, n) + V (m, n − 1).
Пример. Производящая P V (m, n) при заданном m.
функция для
ϕm (x) = ∞ V (m, n)xn = 1 + ∞ n
P
P∞ n=0 n=1 V (m, n)x =
= 1 + n=1 V (m − 1, n)xn + ∞ n
P
n=1 V (m, n − 1)x =
= 1 + n=1 V (m − 1, n)xn + x ∞
P∞ P n−1
P∞ n=1 V (m, n − 1)x =
n
P ∞ n
= n=0 V (m − 1, n)x + x n=0 V (m, n)x = ϕm−1 (x) + xϕm (x).
Получили, что ϕm (x) = 1/(1 − x)ϕm−1 (x) =
= 1/(1 − x)2 ϕm−2 (x) = . . . = 1/(1 − x)m ϕ0 (x) = 1/(1 − x)m так как
ϕ0 (x) = ∞
P n
P∞ n
n=0 V (0, n)x = V (0, 0) + n=1 V (0, n)x = 1 + 0 = 1.
В итоге, ϕm (x) = 1/(1 − x)m .

188 / 907
2.7.1. Формальные степенные ряды (3/4)
Степенные ряды рассматриваются здесь именно как формальные суммы, как конечные,
так и бесконечные, причём вопросы сходимости рядов и аналитичности функций не ста-
вятся. P∞
Пример. Пусть F(x) = 1 + x + x2 + · · · = i=0 xi . Тогда F(x) = 1 + x + x2 + · · · =
= 1 + x(1 + x + x2 + . . . ) = 1 + xF(x). Решая полученное функциональное уравнение от-

2
X 1
носительно F заключаем, что F(x) = 1 + x + x + · · · = xi = . В полученное
i=0
1−x
выражение бессмысленно подставлять числовые значения — это не числовое равенство!
Производящие функции используются как удобный «контейнер», хранящий информацию
о комбинаторных числах в их совокупности.
Пример. Определим
P∞ производящую функцию натурального
P∞ ряда.PПусть F(x)P = 1 + 2x+
2 i i ∞ i ∞ i
+3x + · · · = P i=0 (i + 1)xP . Тогда F(x) P = i=0 (i + 1)x = i=0 ix + i=0 x . Но
P ∞ i 1 ∞ i ∞ i ∞ i−1
P ∞ i
i=0 x = 1−x , а i=0 ix = i=1 ix = x i=1 ix = x i=0 (i + 1)x , поэтому
F(x) = xF(x) + 1/(1 − x), и значит 1 + 2x + 3x + · · · = 1/(1 − x)2 .
2

189 / 907
2.7.1. Формальные степенные ряды (4/4)
Производящие функции для последовательности единиц (или любых других констант) и
натурального ряда найдены составлением и решением функциональных уравнений от-
носительно неизвестной производящей функции. Составление и решение функциональ-
ных уравнений — это отнюдь не единственный способ нахождения производящих функ-
ций. Не возбраняется использовать любые средства математического анализа.

X 1 n
Пример. Определим производящую функцию гармонического ряда F(x) = x .
n=1
n
∞ ∞
X 1 n X 1
Очевидно, что x = xn+1 . Заметим, что функция n+1
1
xn+1 является перво-
n=1
n n=0
n + 1
образной функции xn . Напомним, что производящая функция суммы определяется сле-
X∞
дующим образом: степеней xn = 1/(1 − x). Поэтому
n=0
∞ ∞ ∞
Z Z ! Z
X 1 X X dx 1
F(x) = xn+1 = n
x dx = x n
dx = = ln .
n=0
n+1 n=0 n=0
1−x 1−x
190 / 907
2.7.2. Метод неопределённых коэффициентов (1/2)
Из математического анализа известно, что если
X X
F(x) = ai ϕi (x) и F(x) = bi ϕi (x),
i i

то ∀ i (ai = bi ) (для рассматриваемых здесь систем функций ϕi ).


В качестве примера применения производящих функций докажем теорему 4 из п. 2.3.1.
n
X
Теорема. C(2n, n) = C(n, k)2 .
k=0
Доказательство. Имеем: (1 + x)2n = (1 + x)n (1 + x)n . Следовательно,
2n
X n
X n
X
i i
C(2n, i)x = C(n, i)x · C(n, i)xi .
i=0 i=0 i=0
n
Приравняем коэффициент при x :
n
X n
X
C(2n, n) = C(n, k)C(n, n − k) = C(n, k)2 .
k=0 k=0 191 / 907
2.7.2. Метод неопределённых коэффициентов (2/2)
Пример. Какие числа можно представить суммой степеней числа 2 и сколькими способа-
ми? Для решения этой задачи рассмотрим произведение
k
n k
Y
G(x) = (1 + x2 ) = (1 + x)(1 + x2 ) . . . (1 + x2 ).
n=0

После раскрытия скобок и приведения подобных G(x) представляется в виде суммы


P k+1
G(x) = 2n=0 −1 gn xn , в которой xn получается как произведение каких-то одночленов
m
x2 , то есть коэффициент gn — это количество различных представлений числа n в ви-
де суммы некоторых степеней 2 (не исключая случая gn = 0). Умножим теперь G(x) на
k
(1−x). По формуле для разности квадратов получаем (1−x)(1+x)(1+x2 ) . . . (1+x2 ) =
k k+1 k+1
= (1−x2 )(1+x2 ) . . . (1+x2 ) = ... = 1−x2 . Имеем G(x) = (1−x2 )/(1−x). Cумма
k+1 k+1
геометрической прогрессии: 1 + x + x2 + · · · + x2 −1 = (1 − x2 )/(1 − x) = G(x) =
P k+1
= 2n=0 −1 gn xn . По методу неопределённых коэффициентов, получаем ∀ n (gn = 1), что
означает, любое число n можно представить в виде линейной комбинации степеней чис-
ла 2 и притом единственным образом.
192 / 907
2.7.3. Числа Фибоначчи (1/4)
Числа Фибоначчи F (n) определяются следующим образом:
Def Def Def
F (0) = 1, F (1) = 1, F (n + 2) = F (n + 1) + F (n).
Найдём выражение для F (n) через n. Для этого найдём производящую функцию ϕ(x)
для последовательности чисел F (n). Имеем

X ∞
X
n 0 1
ϕ(x) = F (n)x = F (0)x + F (1)x + (F (n − 2) + F (n − 1)) xn =
n=0 n=2

X ∞
X
=1+x+ F (n − 2)xn + F (n − 1)xn =
n=2 n=2

X ∞
X
= 1 + x + x2 F (n − 2)xn−2 + x F (n − 1)xn−1 =
n=2 n=2
∞ ∞
!
X X
= 1+x+x2 F (n)xn + x F (n)xn − F (0) = 1+x+x2 ϕ(x) + x (ϕ(x) − 1) .
n=0 n=0
193 / 907
2.7.3. Числа Фибоначчи (2/4)
Решая это функциональное уравнение относительно ϕ(x), получаем, что

1
ϕ(x) = .
1 − x − x2

2
√ по степеням x. Действительно,
Последнее выражение нетрудно разложить в ряд √ уравне-
ние 1 − x − x = 0 имеет корни x1 = −(1 + 5)/2 и x2 = −(1 − 5)/2, причём, как
нетрудно убедиться,
√ √
2 1+ 5 1− 5
1 − x − x = (1 − ax)(1 − bx), где a = , b= .
2 2
Далее,

1 α β a −b
= + , где α = , β= .
(1 − ax)(1 − bx) 1 − ax 1 − bx a−b a−b

194 / 907
2.7.3. Числа Фибоначчи (3/4)
Из математического анализа известно, что для малых x

1 X
= γ n xn .
1 − γx n=0
Таким образом,
∞ ∞
α β X
n n
X
ϕ(x) = + =α a x +β bn x n =
1 − ax 1 − bx n=0 n=0
∞ ∞ ∞
X a n n X b n n X an+1 − bn+1 n
= a x − b x = x .
n=0
a−b n=0
a−b n=0
a−b
Окончательно получаем соотношение, известное как формула Бине
√ !n+1 √ !n+1
 
n+1 n+1
a −b 1 1+ 5 1− 5
F (n) = =√  − .
a−b 5 2 2

195 / 907
2.7.3. Числа Фибоначчи (4/4)

Пример. Число Fn+2 = Fn+1 + Fn является количеством двоичных последовательностей


длины n, в которых нет двух 1, находящихся на соседних позициях. Доказательство по
индукции. База: n = 1, F3 = 2, последовательности 0 и 1; n = 2, F4 = 3, последователь-
ности 00, 01, 10. Индукционный переход: пусть Fn+2 — число способов построить требу-
емые последовательности длины n. Построим последовательность длины n + 1: возьмем
все такие последовательности длины n и допишем к ним 0 слева, не нарушая условие.
Также мы можем взять все последовательности длины n − 1 и дописать к ним 10 сле-
ва. Таким образом, количество способов получить последовательность длины n + 1 будет
равно Fn+2 + Fn+1 = Fn+3 .
Def √
Отступление. Число Φ = (1 + 5)/2 ≈ 1, 618 принято называть золотым сечением, поскольку
a b
оно является решением пропорции = — меньшее так относится к большему, как большее
b a+b
к сумме. Это число известно ещё с древних времен и занимает важное место в науке и искусстве.

196 / 907
2.7.4. Числа Каталана (1/4)
Числа Каталана C(n) можно определить следующим образом:
n−1
Def Def
X
C(0) = 1, C(n) = C(k)C(n − k − 1).
k=0
Числа Каталана используются при решении различных комбинаторных задач.
Пример. Пусть нужно вычислить элемент s0 ∗ · · · ∗ sn . Сколькими способами это можно
сделать? То есть сколькими способами можно расставить скобки, определяющие порядок
вычисления выражения? Обозначим число способов C(n). Ясно, что C(0) = 1. При любой
схеме вычислений на каждом шаге выполняется некоторое вхождение операции ∗ над
соседними элементами и результат ставится на их место. Пусть последним выполняется
то вхождение операции ∗, которое имеет номер k в исходном выражении. При этом слева
от выбранного вхождения знака ∗ находилось и было выполнено k − 1 знаков операции
∗, а справа,
Pn соответственно, (n − 1) P
− (k − 1) = n − k знаков операции ∗. Тогда ясно, что
C(n) = k=1 C(k − 1)C(n − k) = n−1 k=0 C(k)C(n − k − 1), и ответом на поставленный
вопрос является число Каталана C(n).
197 / 907
2.7.4. Числа Каталана (2/4)
Числа Каталана выражаются через биномиальные коэффициенты. Получим это выраже-
ние, используя метод производящих функций.
C(2n, n)
Теорема. C(n) = .
n+1

C(n)xn ,
P
Доказательство. Найдём производящую функцию для чисел Каталана ϕ(x) =
n=0
x 6= 0. Для этого рассмотрим квадрат этой функции:

!2 ∞ ∞
X X X
2 n m
ϕ (x) = C(n)x = C(m)x · C(n)xn =
n=0 m=0 n=0

X ∞ X
X n ∞
X
m+n n
= C(m)C(n)x = C(k)C(n − k)x = C(n + 1)xn =
m,n=0 n=0 k=0 n=0
∞ ∞
!
n+1
X x 1 X 1
= C(n + 1) = C(n)xn − C(0) = (ϕ(x) − 1) .
n=0
x x n=0
x
198 / 907
2.7.4. Числа Каталана (3/4)
Доказательство. (продолжение) Решая уравнение ϕ(x) = xϕ2 (x) + 1 относительно функ-
ции ϕ(x), имеем √
1± 1 − 4x
ϕ(x) = .
√ 2x
Обозначим f (x) ← 1 − 4x и разложим f (x) в ряд по формуле Тейлора:

X f (k) (0) k
f (x) = f (0) + x .
k=1
k!
dk
   
1 1 1 1 1
Имеем k (1 − 4x) 2 = · − 1 · ··· · − k + 1 · (1 − 4x) 2 −k · (−4)k =
dx 2 2 2
1 1
−k
k
= −2 · 1 · 3 · · · · · (2k − 3) · (1 − 4x) 2 = −2k · (2k − 3)!! · (1 − 4x) 2 −k =
(2k − 3)! 1 (2k − 2)!(k − 1)(k − 1)! 1
= −2k k−2 (1 − 4x) 2 −k = −22 (1 − 4x) 2 −k =
2 (k − 2)! (2k − 2)(k − 1)!(k − 1)!
(2k − 2)! 1 1
= −2(k − 1)! (1 − 4x) 2 −k = − 2(k − 1)!C(2k − 2, k − 1)(1 − 4x) 2 −k .
(k − 1)!(k − 1)!
199 / 907
2.7.4. Числа Каталана (4/4)
Доказательство. (продолжение) Таким образом,

X 1
f (k) (0) = −2(k − 1)!C(2k − 2, k − 1), f (x) = 1 − 2 C(2k − 2, k − 1)xk .
k=1
k

Подставляя выражение f (x) в формулу для ϕ(x), следует выбрать знак «минус» перед
корнем, чтобы удовлетворить условию C(0) = 1. Окончательно имеем
∞ P∞ 1
X
n 1 − f (x) 1−1+2 n=1 n C(2n − 2, n − 1)xn
C(n)x = ϕ(x) = = =
n=0
2x 2x
∞ ∞
X 1 n−1
X C(2n, n) n
= C(2(n − 1), n − 1)x = x ,
n=1
n n=0
n+1

и по методу неопределённых коэффициентов C(n) = C(2n, n)/(n + 1).


200 / 907
3. Кодирование (1/4)
Вопросы кодирования издавна играли заметную роль в математике.
Примеры.
1. Десятичная позиционная система счисления — это универсальный способ кодиро-
вания чисел, в том числе натуральных.
2. Римские цифры — другой способ кодирования небольших натуральных чисел, при-
чём гораздо более наглядный и естественный: палец — I, пятерня — V, две пятерни —
X.
Однако при этом способе кодирования трудно выполнять арифметические опера-
ции над большими числами, поэтому он был вытеснен десятичной позиционной си-
стемой.
3. Декартовы координаты — способ кодирования геометрических объектов числами.
Ранее средства кодирования играли вспомогательную роль и не рассматривались как от-
дельный предмет математического изучения, но с появлением компьютеров ситуация ра-
дикально изменилась. Кодирование буквально пронизывает информационные техноло-
гии и является центральным вопросом при решении самых разных задач программиро-
вания. 201 / 907
3. Кодирование (2/4)
Примеры. 1) Представление данных произвольной природы (например чисел, текста,
графики) в памяти компьютера; 2) защита информации от несанкционированного досту-
па; 3) обеспечение помехоустойчивости при передаче данных по каналам связи; 4) сжа-
тие информации в базах данных.
Замечание. Само составление текста программы часто и совершенно справедливо назы-
вают кодированием.
Не ограничивая общности, задачу кодирования можно сформулировать следующим об-
разом.
Пусть заданы алфавиты A = {a1 , . . . , an }, B = {b1 , . . . , bm } и функция F : A∗ → B ∗ ,
причём Dom F = S , где S — некоторое множество слов в алфавите A, S ⊂ A∗ . Тогда
функция F называется кодированием, элементы множества S — сообщениями, а элемен-
ты β = F (α), α ∈ S , β ∈ B ∗ — кодами (соответствующих сообщений). Обратная функ-
ция F −1 (если она существует!) называется декодированием. Если |B| = m, то F назы-
вается m-ичным кодированием. Наиболее распространенный случай B = {0, 1} — двоич-
ное кодирование. Именно этот случай рассматривается в последующих разделах; слово
«двоичное» опускается. 202 / 907
3. Кодирование (3/4)
Типичная задача теории кодирования формулируется следующим образом: при задан-
ных алфавитах A, B и множестве сообщений S найти кодирование F , которое облада-
ет определёнными свойствами (то есть удовлетворяет заданным ограничениям) и опти-
мально в некотором смысле. Критерий оптимальности, как правило, связан с минимиза-
цией длин кодов. Свойства, которые требуются от кодирования, бывают самой разнооб-
разной природы.
I Существование декодирования, или однозначность кодирования: функция кодиро-
вания F обладает тем свойством, что α1 6= α2 =⇒ F (α1 ) 6= F (α2 ). Это очень есте-
ственное свойство, однако даже оно требуется не всегда. Например, трансляция про-
граммы на языке высокого уровня в машинные команды — это кодирование, для ко-
торого не требуется однозначного декодирования.
I Помехоустойчивость, или исправление ошибок: продолжение функции декодиро-
вания F −1 обладает тем свойством, что F −1 (β) = F −1 (β 0 ), где β ∈ Im F ,
β 0 ∈ B ∗ \ Im F , если β 0 в определённом смысле близко к β (см. раздел 3.3).
203 / 907
3. Кодирование (4/4)
I Заданная сложность (или простота) кодирования и декодирования. Например, в крип-
тографии изучаются такие способы кодирования, при которых функция F вычисля-
ется просто, но определение значения функции F −1 требует очень сложных вычис-
лений (см. п. 3.4.3).
Большое значение для задач кодирования имеет природа множества сообщений S . При
одних и тех же алфавитах A, B и требуемых свойствах кодирования F оптимальные
решения для разных S могут кардинально различаться. Для описания множества S (как
правило, очень большого или бесконечного) применяются различные методы:
I теоретико-множественное описание, например S = {α | α ∈ A∗ & |α| = n};
I вероятностное описание, например S = A∗ , и заданы вероятности pi появления
Pn
букв ai в сообщении, i=1 pi = 1;
I логико-комбинаторное описание, например S задано порождающей формальной
грамматикой.
В этой главе рассматривается несколько наиболее важных задач теории кодирования и
демонстрируется применение большей части вышеупомянутых методов.
204 / 907
3.1. Алфавитное кодирование

Кодирование F может сопоставлять код всему сообщению из множества S как единому


целому или же строить код сообщения из кодов его частей. Элементарной частью сооб-
щения является одна буква алфавита A. Этот простейший случай рассматривается в этом
и следующих двух разделах.

205 / 907
3.1.1. Таблица кодов
Алфавитное (или побуквенное) кодирование задается схемой (или таблицей кодов) σ :
Def
σ = ha1 → β1 , . . . , an → βn i, ai ∈ A, βi ∈ B ∗ .
Def
Множество кодов букв V = {βi } называется множеством элементарных кодов (множе-
ством кодовых слов).
Алфавитное кодирование пригодно для любого множества сообщений,
Def
поскольку F : A∗ → B ∗ , и если ai1 . . . aik = α ∈ A∗ , то F (α) = βi1 . . . βik .
Пример. Рассмотрим алфавиты A ←{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, B ←{0, 1} и схему
σ1 ←h0 → 0, 1 → 1, 2 → 10, 3 → 11, 4 → 100, 5 → 101, 6 → 110, 7 → 111,
8 → 1000, 9 → 1001i. Эта схема однозначна, но кодирование не является взаимно-одно-
значным: Fσ1 (333) = 111111 = Fσ1 (77), а значит, декодирование невозможно. С другой
стороны, схема σ2 ←h0 → 0000, 1 → 0001, 2 → 0010, 3 → 0011, 4 → 0100,
5 → 0101, 6 → 0110, 7 → 0111, 8 → 1000, 9 → 1001i, известная под названием
«двоично-десятичное кодирование», допускает однозначное декодирование.
206 / 907
3.1.2. Разделимые схемы
Рассмотрим схему алфавитного кодирования σ и различные слова, составленные из эле-
ментарных кодов. Схема σ называется разделимой, если

βi1 . . . βik = βj1 . . . βjl =⇒ k = l & ∀ t ∈ 1..k (it = jt ) ,

то есть любое слово, составленное из элементарных кодов, единственным образом раз-


лагается на элементарные коды. Алфавитное кодирование с разделимой схемой допус-
кает декодирование.
Если таблица кодов содержит одинаковые элементарные коды, то есть если

∃ i, j (i 6= j & βi = βj ) ,

где βi , βj ∈ V , то схема заведомо не является разделимой. Такие схемы далее не рас-


сматриваются, то есть
∀ i 6= j (βi , βj ∈ V =⇒ βi 6= βj ) .

207 / 907
3.1.3. Префиксные схемы
Схема σ называется префиксной, если элементарный код одной буквы не является пре-
фиксом элементарного кода другой буквы:
∀ i 6= j (βi , βj ∈ V ) =⇒ ∀ β ∈ B ∗ (βi 6= βj β) .¬∃ βi , βj ∈ V, β ∈ B ∗ (i 6= j & βi = βj β) .
Теорема. Префиксная схема является разделимой.
Доказательство. От противного. Пусть кодирование с префиксной схемой σ не является
разделимым. Тогда существует такое слово β ∈ Fσ (A∗ ), что
β = βi1 . . . βik = βj1 . . . βjl & ∃ t (∀ s < t (βis = βjs & βit 6= βjt )) .
Поскольку βit . . . βik = βjt . . . βjl , значит, ∃ β 0 (βit = βjt β 0 ∨ βjt = βit β 0 ), но это противо-
речит тому, что схема префиксная.
Замечание. Свойство быть префиксной достаточно, но не необходимо для разделимости
схемы.
Пример. Разделимая, но не префиксная схема:
A = {a, b}, B = {0, 1}, σ = ha → 0, b → 01i.
208 / 907
3.1.4. Неравенство Макмиллана (1/6)
Чтобы схема алфавитного кодирования была разделимой, необходимо, чтобы длины эле-
ментарных кодов удовлетворяли определённому соотношению, известному как неравен-
ство Макмиллана.
n
n
2−|βi | 6 1.
P
Теорема. Если схема σ = hai → βi ii=1 разделима, то
i=1
Доказательство. Обозначим li ← |βi |, l ← max li . Рассмотрим некоторую k -ю степень ле-
i∈1..n
 n
k
2−li (2li1 +...+lik )−1 ,
P P
вой части неравенства . Раскрывая скобки, имеем сумму
i=1 (i1 ,...,ik )
где i1 , . . . , ik — различные наборы номеров элементарных кодов. Обозначим через ν(k, t)
количество входящих в эту сумму слагаемых вида 1/2t , где t = li1 + . . . + lik . Для
kl
P ν(k,t)
некоторых t может быть, что ν(k, t) = 0. Приводя подобные, имеем сумму 2t
.
t=1
Каждому слагаемому вида (2li1 +...+lik )−1 можно сопоставить код (слово в алфавите B )
вида βi1 . . . βik . Это слово состоит из k элементарных кодов и имеет длину t.
209 / 907
3.1.4. Неравенство Макмиллана (2/6)
Доказательство. (Продолжение) Таким образом, ν(k, t) — это число некоторых слов вида
βi1 . . . βik , таких, что |βi1 . . . βik | = t. В силу разделимости схемы ν(k, t) 6 2t , в против-
ном случае заведомо существовали бы два одинаковых слова βi1 . . . βik = βj1 . . . βjk ,
kl kl
ν(k,t) 2t
P P
допускающих различное разложение. Имеем 2t
6 2t
= kl. Следовательно,
! t=1 t=1
k
√ √
 n
 n
 n
−li
2−li 6 k
2−li 6 lim k
P P P
∀k 2 6 kl , и, значит, ∀ k kl , откуда kl = 1.
i=1 i=1 i=1 k→∞

Неравенство Макмиллана является не только необходимым, но и в некотором смысле


достаточным условием разделимости схемы алфавитного кодирования.
n
2−li 6 1, то существует
P
Теорема. Если числа l1 , . . . , ln удовлетворяют неравенству
i=1
n
такая разделимая (даже префиксная) схема алфавитного кодирования σ = hai → βi ii=1 ,
что ∀ i (|βi | = li ).
210 / 907
3.1.4. Неравенство Макмиллана (3/6)
Доказательство. Без ограничения общности можно считать, что l1 6 l2 6 · · · 6 ln .
Разобьем множество {l1 , . . . , ln } на классы эквивалентности по равенству {L1 , . . . , Lm },
m
P
m 6 n. Пусть λi ∈ Li , µi ← |Li |. Тогда µi = n, λ1 < λ2 < · · · < λm . В этих обозна-
i=1
m
P µi
чениях неравенство Макмиллана можно записать так: 2λi
6 1. Из этого неравенства
i=1
следуют m неравенств для частичных сумм:
µ1
2λ1
6 1 =⇒ µ1 6 2λ1 ,
µ1
2λ1
+ 2µλ22 6 1 =⇒ µ2 6 2λ2 − µ1 2λ2 −λ1 ,
...
µ1 µ2 µm
2λ1
+ 2λ2
+ ... + 2λm
6 1 =⇒ µm 6 2λm − µ1 2λm −λ1 − µ2 2λm −λ2 − . . . − µm−1 2λm −λm−1 .
Рассмотрим слова длины λ1 в алфавите B . Поскольку µ1 6 2λ1 , из этих слов можно вы-
брать µ1 различных слов β1 , . . . , βµ1 длины λ1 . Исключим из дальнейшего рассмотрения
все слова из B ∗ , начинающиеся со слов β1 , . . . , βµ1 .

211 / 907
3.1.4. Неравенство Макмиллана (4/6)
Доказательство. (Продолжение) Далее рассмотрим множество слов в алфавите B длиной
λ2 и не начинающихся со слов β1 , . . . , βµ1 . Таких слов будет 2λ2 − µ1 2λ2 −λ1 .
Но µ2 6 2λ2 − µ1 2λ2 −λ1 , значит, можно выбрать µ2 различных слов. Обозначим их
βµ1 +1 , . . . , βµ1 +µ2 . Исключим слова, начинающиеся с βµ1 +1 , . . . , βµ1 +µ2 , из дальнейшего
рассмотрения. И далее, используя неравенства для частичных сумм, мы будем на i-м ша-
ге выбирать µi слов длины λi , βµ1 +µ2 +...+µi−1+1 , . . . , βµ1 +µ2 +...+µi−1 +µi , причём эти слова
не будут начинаться с тех слов, которые были выбраны раньше. В то же время длины
этих слов всё время растут (так как λ1 < λ2 < . . . < λm ), поэтому они не могут быть
префиксами тех слов, которые выбраны раньше. Итак, в конце имеем набор из n слов
β1 , . . . , βµ1 +...+µm = βn , |β1 | = l1 , . . . , |βn | = ln , коды β1 , . . . , βn не являются префиксами
друг друга, а значит, схема σ = hai → βi ini=1 будет префиксной и, по теореме предыду-
щего подраздела, разделимой.
Замечание. Неравенство Макмиллана справедливо не только для двоичного, но и для
m-ичного кодирования.
212 / 907
3.1.4. Неравенство Макмиллана (5/6)
Пример. Азбука Морзе — это схема алфавитного кодирования
hA → 01, B → 1000, C → 1010, D → 100, E → 0,
F → 0010, G → 110, H → 0000, I → 00, J → 0111,
K → 101, L → 0100, M → 11, N → 10, O → 111,
P → 0110, Q → 1101, R → 010, S → 000, T → 1,
U → 001, V → 0001, W → 011, X → 1001, Y → 1011,
Z → 1100i,
где по историческим и техническим причинам 0 называется точкой и обозначается зна-
ком «·», а 1 называется тире и обозначается знаком «—». Имеем
1/4 + 1/16 + 1/16 + 1/8 + 1/2 +
+ 1/16 + 1/8 + 1/16 + 1/4 + 1/16 +
+ 1/8 + 1/16 + 1/4 + 1/4 + 1/8 +
+ 1/16 + 1/16 + 1/8 + 1/8 + 1/2 +
+ 1/8 + 1/16 + 1/8 + 1/16 + 1/16 +
+ 1/16 = 2/2 + 4/4 + 8/8 + 12/16 =
= 3 + 3/4 > 1.
213 / 907
3.1.4. Неравенство Макмиллана (6/6)

Таким образом, неравенство Макмиллана для азбуки Морзе не выполнено, и эта схема
не является разделимой. Более того, в азбуке Морзе многие кодовые слова являются
префиксами других слов, а потому некоторые комбинации букв неразличимы.
Примеры. AM = 0111 = J, T O = 1111 = M M, W M W = 01111011 = JY .
На самом деле в азбуке Морзе имеются дополнительные элементы — паузы между буква-
ми (и словами), которые позволяют декодировать сообщения. Эти дополнительные эле-
менты определены неформально, поэтому приём и передача сообщений с помощью аз-
буки Морзе, особенно с высокой скоростью, являлись некоторым искусством, а не про-
стой технической процедурой.
n
Следствие. Если схема алфавитного кодирования σ = hai → βi ii=1 разделима, то суще-
n
ствует префиксная схема σ 0 = hai → βi0 ii=1 , причём ∀ i (|βi | = |βi0 |).
Пример. Схема ha → 0, b → 01i — разделимая, но не префиксная, а схема ha → 0, b → 10i —
префиксная (и разделимая).

214 / 907
3.2. Кодирование с минимальной избыточностью

Для практики важно, чтобы коды сообщений имели по возможности наименьшую дли-
ну. Алфавитное кодирование пригодно для любых сообщений, то есть для S = A∗ . Если
больше про множество S ничего не известно, то точно сформулировать задачу оптими-
зации затруднительно. Однако на практике часто доступна дополнительная информация.
Например, для текстов на естественных языках известно распределение вероятности по-
явления букв в сообщении. Использование такой информации позволяет строго поста-
вить и решить задачу построения оптимального алфавитного кодирования.

215 / 907
3.2.1. Минимизация длины кода сообщения (1/2)
n
Если задана разделимая схема алфавитного кодирования σ = hai → βi ii=1 , то любая
n
схема σ 0 = hai → βi 0 ii=1 , где последовательность hβ 0 1 , . . . , β 0 n i является перестановкой
последовательности hβ1 , . . . , βn i, также будет разделимой. Если длины элементарных ко-
дов равны, то перестановка элементарных кодов в схеме не влияет на длину кода сооб-
щения. Но если длины элементарных кодов различны, то длина кода сообщения зависит
от состава букв в сообщении и от того, какие элементарные коды каким буквам назна-
чены. Если заданы конкретное сообщение и конкретная схема кодирования, то нетрудно
подобрать такую перестановку элементарных кодов, при которой длина кода сообщения
будет минимальна. Пусть k1 , . . . , kn — количества вхождений букв a1 , . . . , an в сообще-
ние s ∈ S , а l1 , . . . , ln — длины элементарных кодов β1 , . . . , βn соответственно. Тогда, ес-
ли ki 6 kj и li > lj , то ki li + kj lj 6 ki lj + kj li . Действительно, пусть kj = k + a, ki = k и
lj = l, li = l + b, где a, b > 0. Тогда (ki lj + kj li ) − (ki li + kj lj ) = (kl + (k + a)(l + b))−
−(k(l + b) + l(k + a)) = (kl + al + bk + ab + kl) − (kl + al + kl + bk) = ab > 0.

216 / 907
3.2.1.Минимизация длины кода сообщения (2/2)

Отсюда вытекает алгоритм назначения элементарных кодов, при котором длина кода
конкретного сообщения s ∈ S будет минимальна: нужно отсортировать буквы сообщения
s в порядке убывания количества вхождений, элементарные коды отсортировать в поряд-
ке возрастания длины и назначить коды буквам в этом порядке.
Пример. Для алфавита из трёх букв кратчайшая разделимая схема имеет вид
hx → 0, y → 10, z → 11i (или hx → 1, y → 01, z → 00i), поскольку схемы с более ко-
роткими кодовыми словами не удовлетворяют неравенству Макмиллана. Если необход-
мо передать сообщение «SOS SOS SOS», то самой выгодной является схема
hS → 0, O → 10, → 11i.
Замечание. Этот простой метод решает задачу минимизации длины кода только для фик-
сированного сообщения s ∈ S и фиксированной схемы σ .

217 / 907
3.2.2. Цена кодирования (1/3)
Пусть заданы алфавит A = {a1 , . . . , an } и вероятности появления букв в сообщении
P = hp1 , . . . , pn i (pi — вероятность появления буквы ai ). Не ограничивая общности, мож-
но считать, что pi + . . . + pn = 1 и p1 > . . . > pn > 0 (то есть можно сразу исключить
буквы, которые не могут появиться в сообщении, и упорядочить буквы по убыванию ве-
n
роятности их появления). Для каждой (разделимой) схемы σ = hai → βi ii=1 алфавитно-
го кодирования математическое ожидание коэффициента увеличения длины сообщения
при кодировании σ (обозначается lσ ) определяется следующим образом:
n
Def Def
X
lσ (P ) = pi li , где li = |βi |,
i=1

и называется средней ценой (или длиной) кодирования σ при распределении вероятно-


стей P .
Пример. Для разделимой схемы A = {a, b}, B = {0, 1}, σ = ha → 0, b → 01i при рас-
пределении вероятностей h0, 5; 0, 5i цена кодирования составляет 0, 5 ∗ 1+0, 5 ∗ 2 = 1, 5,
а при распределении вероятностей h0, 9; 0, 1i она равна 0, 9 ∗ 1 + 0, 1 ∗ 2 = 1, 1.
218 / 907
3.2.2. Цена кодирования (2/3)
Введём обозначения:
Def Def Def
l∗ (P ) = inf lσ (P ), p∗ = min pi , L = blog(n − 1)c + 1.
σ i∈1..n
n
Очевидно, что всегда существует разделимая схема σ = hai → βi ii=1 , такая, что
∀ i (|βi | = L). Такая схема называется схемой равномерного кодирования. Следовательно,
1 6 l∗ (P ) 6 L, и достаточно учитывать только такие схемы, для которых ∀ i (pi li 6 L),
где li — целое и li 6 L/p∗ . Таким образом, имеется лишь конечное число схем σ , для ко-
торых l∗ (P ) 6 lσ (P ) 6 L. Значит, существует схема σ∗ , на которой инфимум достигается:
lσ∗ (P ) = l∗ (P ).
Алфавитное (разделимое) кодирование σ∗ , для которого lσ∗ (P ) = l∗ (P ), называется ко-
дированием с минимальной избыточностью, или оптимальным кодированием, для рас-
пределения вероятностей P .
Пример. Пусть в алфавите 8 букв. Рассмотрим цену равномерного кодирования C1 и
«наиболее неравномерного» кодирования C2 , при равномерном P1 и неравномерном
P2 распределении вероятностей.
219 / 907
3.2.2. Цена кодирования (3/3)
C1 l1 P1 L11 P2 L12 C2 l2 P1 L21 P2 L22
000 3 0,125 0,375 0,31 0,93 0 1 0,125 0,125 0,31 0,31
001 3 0,125 0,375 0,24 0,72 10 2 0,125 0,25 0,24 0,48
010 3 0,125 0,375 0,17 0,51 110 3 0,125 0,375 0,17 0,51
011 3 0,125 0,375 0,11 0,33 1110 4 0,125 0,5 0,11 0,44
100 3 0,125 0,375 0,09 0,27 11110 5 0,125 0,625 0,09 0,45
101 3 0,125 0,375 0,05 0,15 111110 6 0,125 0,75 0,05 0,3
110 3 0,125 0,375 0,02 0,06 1111110 7 0,125 0,875 0,02 0,14
111 3 0,125 0,375 0,01 0,03 11111110 8 0,125 1 0,01 0,08
1 3 1 3 1 4,5 1 2,71
Из таблицы видно, что при равномерном кодировании распределение вероятностей не
влияет на цену кодирования, в то время как неравномерное кодирование по сравнению
с равномерным кодированием существенно проигрывает при равномерном распределе-
нии вероятностей и несколько выигрывает при неравномерном распределении вероят-
ностей.
220 / 907
3.2.3. Алгоритм Фано (1/4)

Рекурсивный алгоритм Фано строит разделимую префиксную схему алфавитного коди-


рования, близкого к оптимальному.
Вход: P : array [1..n] of real — массив вероятностей появления букв в сообщении, упо-
рядоченный по невозрастанию;
Выход: C : array [1..n, 1..L] of 0..1 — массив элементарных кодов.
Fano(1, n, 0) // вызов рекурсивной процедуры Fano
Алгоритм Фано использует функцию Med, которая находит медиану указанной части мас-
сива P [b..e], то есть определяет такой индекс m (b 6 m < e), что сумма
элементов P [b..m]

Xm e
X
наиболее близка к сумме элементов P [(m+1)..e], то есть min P [i] − P [i] .

m∈b..(e−1)
i=b i=m+1

221 / 907
3.2.3. Алгоритм Фано (2/4)
Рекурсивная процедура Fano описана на этом слайде.
Вход: b — индекс начала обрабатываемой части массива P , e — индекс конца обрабаты-
ваемой части массива P , k — длина уже построенных кодов в обрабатываемой части
массива C .
Выход: заполненный массив C .
if e > b then
k ← k + 1 //место для очередного разряда в коде
m ← Med(b, e) //деление массива на две части
for i from b to e do
C[i, k] ← i > m //в первой части добавляем 0, во второй — 1
end for
Fano(b, m, k) //обработка первой части
Fano(m + 1, e, k) //обработка второй части
end if
Функция Med описана на следующем слайде.
222 / 907
3.2.3. Алгоритм Фано (3/4)
Вход: b — индекс начала обрабатываемой части массива P , e — индекс конца обраба-
тываемой части массива P .
Выход: m — индекс медианы
Sb ← 0 //сумма элементов первой части
for i from b to e − 1 do
Sb ← Sb + P [i] //вначале все, кроме последнего
end for
Se ← P [e] //сумма элементов второй части
m ← e //начинаем искать медиану с конца
repeat
d ← |Sb − Se | //разность сумм первой и второй частей
m ← m − 1 //сдвигаем границу медианы вниз
Sb ← Sb − P [m]; Se ← Se + P [m] //перевычисляем суммы
until |Sb − Se | > d
return m
223 / 907
3.2.3. Алгоритм Фано (4/4)
Обоснование. При каждом удлинении кодов в одной части коды удлиняются нулями, а
в другой — единицами. Таким образом, коды одной части не могут быть префиксами
другой. Удлинение кода заканчивается тогда и только тогда, когда длина части равна 1,
то есть остается единственный код. Таким образом, схема по построению префиксная, а
потому разделимая.
Пример. Коды, построенные алгоритмом Фано для заданного неравномерного распре-
деления вероятностей (n = 8).
pi li pi li
0,31 0,31 0 1 0,31
0,24 0,69 0,24 100 3 0,72
0,17 0,41 0,17 101 3 0,51
0,11 0,28 0,11 110 3 0,33
0,09 0,17 0,09 1110 4 0,36
0,05 0,08 0,05 11110 5 0,25
0,02 0,03 0,02 111110 6 0,12
0,01 0,01 111111 6 0,06
2,66
224 / 907
3.2.4. Оптимальное кодирование (1/5)
Оптимальные схемы алфавитного кодирования обладают определёнными структурны-
ми свойствами, устанавливаемыми в следующих леммах. Нарушение этих свойств для
какой-либо схемы означает, что схема не оптимальна.
n
Лемма. [1] Пусть σ = hai → βi ii=1 — схема оптимального кодирования для распределения
вероятностей P = p1 > . . . > pn > 0. Тогда если pi > pj , то li 6 lj .
Доказательство. От противного. Пусть i < j , pi > pj и li > lj . Тогда рассмотрим схему
σ 0 = {a1 → β1 , . . . , ai → βj , . . . , aj → βi , . . . , an → βn }. Имеем

lσ − lσ0 = (pi li + pj lj ) − (pi lj + pj li ) = (pi − pj )(li − lj ) > 0,

что противоречит тому, что схема σ — оптимальна.


Таким образом, не ограничивая общности, можно считать, что l1 6 . . . 6 ln .
Замечание. Фактически, лемма 1 повторяет для вероятностей то, что было обнаружено
для частот в п. 3.2.1.

225 / 907
3.2.4. Оптимальное кодирование (2/5)

n
Лемма. [2] Если σ = hai → βi ii=1 — схема оптимального префиксного кодирования для
распределения вероятностей P = p1 > . . . > pn > 0, то среди элементарных кодов име-
ются два кода максимальной длины, которые различаются только в последнем разряде.
Доказательство. По предыдущей лемме кодовые слова максимальной длины являются
последними в схеме. Далее от противного.
[ 1 ] Пусть кодовое слово максимальной длины одно и имеет вид βn = βb,
где b = 0 ∨ b = 1. Имеем ∀ i ∈ 1..n − 1 (li 6 |β|). Так как схема префиксная, то слова
β1 , . . . , βn−1 не являются префиксами β . С другой стороны, β не является префиксом слов
β1 , . . . , βn−1 , иначе было бы β = βj , а значит, βj было бы префиксом βn . Тогда схема
σ 0 ←ha1 → β1 , . . . , an → βi тоже префиксная, причём lσ0 (P ) = lσ (P ) − pn , что противо-
речит оптимальности σ .

226 / 907
3.2.4. Оптимальное кодирование (3/5)

Доказательство. (Окончание)
[ 2 ] Пусть теперь два кодовых слова βn−1 и βn максимальной длины различаются не в
последнем разряде, то есть βn−1 = β 0 b0 , βn = β 00 b00 , β 0 6= β 00 , причём β 0 , β 00 не являются
префиксами для β1 , . . . , βn−2 и наоборот. Тогда схема
σ 0 ← ha1 → β1 , . . . , an−2 → βn−2 , an−1 → β 0 b0 , an → β 00 i также является префиксной, при-
чём lσ0 (P ) = lσ (P ) − pn , что противоречит оптимальности σ .
[ 3 ] Пусть кодовых слов максимальной длины больше двух. Тогда среди них найдутся
два, которые различаются не только в последнем разряде, что противоречит уже дока-
занному пункту 2.
Замечание. В примере п. 3.2.3 имеется два элементарных кода максимальной длины,
различающиеся в последнем разряде, но в примере п. 3.2.5 показано, что кодирование
Фано не оптимально. Это говорит о том, что условие леммы 2 необходимо, но не доста-
точно для оптимальности.

227 / 907
3.2.4. Оптимальное кодирование (4/5)
n−1
Теорема. Если σn−1 = hai → βi ii=1 — схема оптимального префиксного кодирования для
распределения вероятностей P = p1 > . . . > pn−1 > 0 и pj = q 0 + q 00 ,
причём p1 > . . . > pj−1 > pj+1 > . . . > pn−1 > q 0 > q 00 > 0, то кодирование со схемой

σn = ha1 → β1 , . . . , aj−1 → βj−1 , aj+1 → βj+1 , . . . ,


an−1 → βn−1 , aj → βj 0, an → βj 1i

является оптимальным префиксным кодированием для распределения вероятностей


Pn = p1 , . . . , pj−1 , pj+1 , . . . , pn−1 , q 0 , q 00 .
Доказательство. Заметим следующее.
[ 1 ] Если σn−1 было префиксным, то σn тоже будет префиксным по построению.
[ 2 ] Цена кодирования для схемы σn больше цены кодирования для схемы σn−1 на ве-
личину pj : lσn (Pn ) = p1 l1 + p2 l2 + . . . + pj−1 lj−1 + pj+1 lj+1 + . . . + pn−1 ln−1 +
+q 0 (lj + 1) + q 00 (lj + 1) = p1 l1 + . . . + pn−1 ln−1 + lj (q 0 + q 00 ) + (q 0 + q 00 ) =
= p1 l1 + . . . + pn−1 ln−1 + lj pj + pj = lσn−1 (Pn−1 ) + pj .
228 / 907
3.2.4. Оптимальное кодирование (5/5)
Доказательство. (Продолжение)
[ 3 ] Пусть некоторая схема σn0 ←hai → βi ini=1 оптимальна для Pn . Тогда по лемме 2 два
кода максимальной длины различаются в последнем разряде:
σn0 = ha1 → β10 , . . . , an−2 → βn−2
0
, an−1 → β0, an → β1i. Положим l0 ← |β| и рассмотрим
0
схему σn−1 ←ha1 → β10 , . . . , aj → β, . . . , an−2 → βn−2
0
i, где j определено так, чтобы
0 00 0
pj−1 > q + q > pj+1 . Цена кодирования для схемы σn больше цены кодирования для
0
схемы σn−1 также на величину pj :

lσn0 (Pn ) = l1 p1 + . . . + ln−2 pn−2 + (l0 + 1)q 0 + (l0 + 1)q 00 =


= l1 p1 + . . . + ln−2 pn−2 + l0 (q 0 + q 00 ) + (q 0 + q 00 ) = lσn−1
0 (Pn−1 ) + pj .

[ 4 ] Схема σn0 — префиксная, значит, схема σn−1


0
— тоже префиксная.
[ 5 ] Схема σn−1 — оптимальна, значит, lσn−1
0 (Pn−1 ) > lσn−1 (Pn−1 ).
[ 6 ] Имеем lσn (Pn ) = lσn−1 (Pn−1 ) + pj 6 lσn−1
0 (Pn−1 ) + pj = lσn0 (Pn ). Но схема σn0
оптимальна, значит, схема σn также оптимальна.
229 / 907
3.2.5. Алгоритм Хаффмена (1/5)
Рекурсивный алгоритм Хаффмена строит схему оптимального префиксного алфавитного
кодирования для заданного распределения вероятностей появления букв.
Вход: n > 1 — количество букв, P : array [1..n] of real — глобальный массив вероятностей
букв, упорядоченный по убыванию.
Выход: C : array [1..n, 1..L] of 0..1 — глобальный массив элементарных кодов,
` : array [1..n] of 1..L — глобальный массив длин элементарных кодов
if n = 2 then
C[1, 1] ← 0; `[1] ← 1 //первый элемент
C[2, 1] ← 1; `[2] ← 1 //второй элемент
else
q ← P [n − 1] + P [n] //сумма двух последних вероятностей
j ← Up(n, q) //поиск места и вставка суммы
Huffman(n − 1) //рекурсивный вызов
Down(n, j) //достраивание кодов
end if
230 / 907
3.2.5. Алгоритм Хаффмена (2/5)
Функция Up находит в массиве P место, в котором должно находиться число q (см. пре-
дыдущую теорему), и вставляет это число, сдвигая вниз остальные элементы.
Вход: n — длина обрабатываемой части массива P , q — вставляемая сумма.
Выход: измененный массив P .
j ← 1 //место вставляемого элемента
for i from n − 1 downto 2 do
if P [i − 1] < q then
P [i] ← P [i − 1] //сдвиг элемента массива
else
j ← i //определение места вставляемого элемента
exit for i //всё сделано — цикл не нужно продолжать
end if
end for
P [j] ← q //запись вставляемого элемента
return j

231 / 907
3.2.5. Алгоритм Хаффмена (3/5)
Процедура Down строит оптимальный код для n букв на основе построенного оптималь-
ного кода для n − 1 буквы. Для этого код буквы с номером j временно исключается из
массива C путем сдвига вверх кодов букв с номерами, большими j , а затем в конец об-
рабатываемой части массива C добавляется пара кодов, полученных из кода буквы с но-
мером j удлинением на 0 и 1 соответственно. Здесь C[i, ∗] означает вырезку из массива,
то есть i-ю строку массива C .
Вход: n — длина обрабатываемой части массива P , j — номер «разделяемой» буквы.
Выход: оптимальные коды в первых n элементах массивов C и `.
c ← C[j, ∗], l ← `[j] //запоминание кода буквы j и длины этого кода
for i from j to n − 2 do
C[i, ∗] ← C[i + 1, ∗] //сдвиг кода
`[i] ← `[i + 1] //и его длины
end for
C[n − 1, ∗] ← c; C[n, ∗] ← c //копирование кода буквы j
C[n − 1, l + 1] ← 0; C[n, l + 1] ← 1 //наращивание кодов
`[n − 1] ← l + 1; `[n] ← l + 1 //и увеличение длин
232 / 907
3.2.5. Алгоритм Хаффмена (4/5)
Обоснование. Для пары букв при любом распределении вероятностей оптимальное ко-
дирование очевидно: первой букве нужно назначить код 0, а второй — 1. Именно это и
делается в первой части оператора if основной процедуры Huffman. Рекурсивная часть
алгоритма в точности следует доказательству теоремы предыдущего подраздела. С по-
мощью функции Up в исходном упорядоченном массиве P отбрасываются две послед-
ние (наименьшие) вероятности, и их сумма вставляется в массив P так, чтобы массив (на
единицу меньшей длины) остался упорядоченным. Заметим, что при этом место встав-
ки сохраняется в локальной переменной j . Так происходит до тех пор, пока не останется
массив из двух элементов, для которого оптимальный код известен. После этого в обрат-
ном порядке строятся оптимальные коды для трёх, четырёх и т. д. элементов. Заметим,
что при этом массив вероятностей P уже не нужен — нужна только последовательность
номеров кодов, которые должны быть изъяты из массива кодов и продублированы в кон-
це с добавлением разряда. А эта последовательность хранится в экземплярах локальной
переменной j , соответствующих рекурсивным вызовам процедуры Huffman.

233 / 907
3.2.5. Алгоритм Хаффмена (5/5)
Пример. Построение оптимального кода Хаффмена для n = 8. В левой части таблицы
показано изменение массива P , а в правой части — массива C . Позиция, соответствую-
щая текущему значению переменной j , выделена полужирным начертанием шрифта.
pi C li pi li
0,31 0,31 0,31 0,31 0,31 0,41 0,59 0 1 1 00 00 00 00 2 0,62
0,24 0,24 0,24 0,24 0,28 0,31 0,41 1 00 01 10 10 10 10 2 0,48
0,17 0,17 0,17 0,17 0,24 0,28 01 000 11 11 11 11 2 0,34
0,11 0,11 0,11 0,17 0,17 001 010 011 011 011 3 0,33
0,09 0,09 0,09 0,11 011 0100 0100 0100 4 0,36
0,05 0,05 0,08 0101 01010 01010 5 0,25
0,02 0,03 01011 010110 6 0,12
0,01 010111 6 0,06
2,56

Цена кодирования составляет 2, 56, что несколько лучше, чем в кодировании, полученном
алгоритмом Фано.
234 / 907
3.3. Помехоустойчивое кодирование

Надёжность электронных устройств по мере их совершенствования всё время возраста-


ет, но тем не менее в их работе возможны как систематические, так и случайные ошиб-
ки. Сигнал в канале связи может быть искажён помехой, поверхность магнитного носите-
ля может быть повреждена, в разъёме может быть потерян контакт и т. п. Ошибки аппа-
ратуры ведут к искажению или потере передаваемых или хранимых данных. При опре-
делённых условиях, некоторые из которых рассматриваются в этом разделе, можно при-
менять методы кодирования, позволяющие правильно декодировать исходное сообще-
ние, несмотря на ошибки в данных кода. В качестве исследуемой модели достаточно рас-
смотреть канал связи с помехами, потому что к этому случаю легко сводятся остальные.
Например, запись на диск можно рассматривать как передачу данных в канал, а чтение
с диска — как приём данных из канала.

235 / 907
3.3.1. Кодирование с исправлением ошибок (1/4)
Пусть имеется канал связи, содержащий источник помех. Помехи проявляются в том,
что принятое сообщение может отличаться от переданного, то есть имеется отношение
C ⊂ K × K 0 , K, K 0 ⊂ B ∗ , где K — множество переданных, а K 0 — соответствующее
множество принятых по каналу сообщений. Используя запись s0 = C(s), s ∈ K , s0 ∈ K 0
подразумеваем, что разные «вызовы» отношения C с одним и тем же аргументом могут
возвращать различные результаты. Кодирование F : A∗ → B ∗ (вместе с декодировани-
ем F −1 : B ∗ → A∗ ), обладающее тем свойством, что

F C F −1
S −→ K −→ K 0 −→ S, ∀ s ∈ S ⊂ A∗ F −1 (C(F (s))) = s ,


называется помехоустойчивым, или самокорректирующимся, или кодированием с исправ-


лением ошибок. Без ограничения общности можно считать, что A = B = {0, 1}. Кроме
того, естественно предположить, что содержательное кодирование (вычисление F и F −1 )
выполняется на устройстве, свободном от помех, то есть F и F −1 являются функциями в
обычном смысле.
236 / 907
3.3.1. Кодирование с исправлением ошибок (2/4)
Замечание. Функция F −1 является декодированием для кодирования F , но она не явля-
ется обратной функцией для функции F в смысле определений пп. 1.4.4, 1.6.2.
Вообще говоря, ошибки в канале могут быть следующих типов:
I 0 7→ 1, 1 7→ 0 — ошибка типа замещения разряда;
I 0 7→ ε, 1 7→ ε — ошибка типа выпадения разряда;
I ε 7→ 1, ε 7→ 0 — ошибка типа вставки разряда.
Если про источник помех C ничего не известно, то функции F и F −1 не могут быть опре-
делены, за исключением тривиального случая S = ∅.
Пример. Если канал физически разорвать, то все разряды выпадут, и никакое декодиро-
вание невозможно.
Таким образом, для решения поставленной задачи необходимо иметь описание возмож-
ных ошибок (проявлений помех). Вообще говоря, помехи могут иметь различные харак-
теристики в зависимости от физической природы канала:
I ошибки могут зависеть от самого передаваемого сообщения;
I ошибки могут случайно возникать с некоторой вероятностью;
I ошибки могут определяться физическим устройством канала.
237 / 907
3.3.1. Кодирование с исправлением ошибок (3/4)
Здесь рассматривается простейшая математическая модель канала, практически не за-
висящая от его физической природы. Предполагается, что:
I сообщения передаются блоками определённой длины n, причём ошибки в различ-
ных блоках независимы;
I значения разрядов 0 и 1 равноправны: если возможна ошибка 0 7→ 1, то возможна
и ошибка 1 7→ 0;
I для каждого типа ошибок известна верхняя граница количества ошибок в блоке дли-
ны n.
Общая характеристика ошибок канала (то есть их количество и типы) обозначается
δ = hδ1 , δ2 , δ3 i, где δ1 , δ2 , δ3 — верхние оценки количества ошибок замещения, выпаде-
ния, вставки разряда, соответственно.
Пример. Допустим, что имеется канал с характеристикой δ = h1, 0, 0i, то есть в канале
возможно не более одной ошибки типа замещения разряда при передаче блока длины n.
Кодирование: F (a) ← aaa (то есть каждый разряд в сообщении утраивается) и декоди-
рование F −1 (abc) ← a + b + c > 1 (то есть разряд восстанавливается методом «голосо-
вания») кажется помехоустойчивым для данного канала.
238 / 907
3.3.1. Кодирование с исправлением ошибок (4/4)
Пример. (Продолжение) Однако метод голосования очень расточителен (потребуется пе-
редать три блока вместо одного) и не вполне надёжен — если длина блока n не кратна
трём, то граница блоков пройдёт по коду одного разряда, и если ошибка произойдёт в
последнем разряде первого блока и в соседнем первом разряде второго блока, то вос-
становление пройдёт неверно.
Таким образом, при построении помехоустойчивого кодирования необходимо найти ба-
ланс между надёжностью и эффективностью.
Отступление. Следует различать обнаружение ошибок и исправление ошибок. Например, ранее
при передаче данных широко использовался бит чётности, то есть дополнительный разряд, ко-
торый добавлялся к каждому блоку так, чтобы общее количество разрядов, имеющих значение 1,
было чётным (или нечётным). Очевидно, что этот простой метод позволяет обнаружить одиноч-
ную ошибку типа замещения, но не позволяет её исправить. В настоящее время бит чётности при-
меняется реже, поскольку имеет невысокую помехоустойчивость: если в одном блоке произойдут
две ошибки типа замещения, то они не будут обнаружены.

239 / 907
3.3.2. Возможность исправления всех ошибок (1/6)

Рассмотрим множество сообщений S ⊂ {0, 1}∗ , некоторое кодирование


F : {0, 1}∗ → {0, 1}∗ и канал C с характеристикой δ . Пусть EFδ (s) — множество слов,
которые могут быть получены из сообщения s ∈ S в результате кодирования F и всех
возможных комбинаций допустимых в канале ошибок типа δ . Возможность исправления
ошибок определяется свойствами семейства множеств EFδ (s).
Пример. Пусть S = {00, 11}, кодирование F добавляет к сообщению третий разряд (бит
чётности), а δ = h1, 0, 0i для блоков длины 3. Тогда F (00) = 000 и EFδ (00) = {000, 001,
010, 100}, F (11) = 110 и EFδ (11) = {110, 111, 100, 010}. Имеем EFδ (00) ∩ EFδ (11) =
= {100, 010}, и если из канала получен один из кодов 100 или 010, то однозначно опре-
делить исходное сообщение невозможно.
Если же в качестве третьего разряда при кодировании взять конъюнкцию, то F (00) = 000
и EFδ (00) = {000, 001, 010, 100}, F (11) = 111 и EFδ (11) = {111, 110, 101, 011}. При этом
EFδ (00) ∩ EFδ (11) = ∅ и исходное сообщение определяется однозначно.

240 / 907
3.3.2. Возможность исправления всех ошибок (2/6)
Замечание. Множество сообщений S является существенным фактором. Например, если
в условиях предыдущего примера множество сообщений S = {01, 10}, то, как нетрудно
проверить, никакое добавление третьего разряда не является помехоустойчивым коди-
рованием.
Теорема. Чтобы существовало помехоустойчивое кодирование F с исправлением всех 
ошибок типа δ , необходимо и достаточно, чтобы ∀ s1 , s2 ∈ S EFδ (s1 ) ∩ EFδ (s2 ) = ∅ .
Доказательство.
[ =⇒ ] Если кодирование помехоустойчивое, то EFδ (s1 ) ∩ EFδ (s2 ) = ∅, иначе F −1 невоз-
можно было бы определить как функцию. 
[ ⇐= ] Из условия ∀ s1 , s2 ∈ S EFδ (s1 ) ∩ EFδ (s2 ) = ∅ по теореме п. 1.7.1 следует, что
существует разбиение B = {Bs }s∈S множества {0, 1}∗ , причём ∀ s ∈ S EFδ (s) ⊂ Bs .


По разбиению B требуемая функция F −1 : {0, 1}∗ → S строится следующим образом:


if s0 ∈ Bs then F −1 (s0 ) ← s end if.

241 / 907
3.3.2. Возможность исправления всех ошибок (3/6)

Таким образом, сама возможность исправления ошибок зависит от трёх факторов: мно-
жества сообщений, применяемого кодирования и характеристики канала. Как правило,
множество сообщений и характеристика канала считаются заданными, и задача состоит
в том, чтобы подобрать по возможности эффективное помехоустойчивое кодирование.
Однако в некоторых практических случаях исправление всех ошибок невозможно.
Пример. Рассмотрим канал, в котором в любом передаваемом разряде может происхо-
дить ошибка типа замещения с вероятностью p, причём замещения различных разря-
дов статистически независимы. Такой канал называется двоичным симметричным. В этом
случае любое слово может быть преобразовано в любое другое слово той же длины за-
мещениями разрядов. Таким образом, исправить все ошибки в двоичном симметричном
канале невозможно даже при сколь угодно малом p > 0.

242 / 907
3.3.2. Возможность исправления всех ошибок (4/6)

Отступление. Для различных моделей со случайными ошибками (в том числе для двоичного сим-
метричного канала) средствами теории вероятностей рассматривается и решаются, в частности,
такие задачи как:

I определение максимального количества информации, которая может быть передана через


канал при наличии помех (пропускная способность канала);
I определение математического ожидания вероятности исправления ошибок в канале (досто-
верность декодирования);
I определение минимального количества информации, которую необходимо передать через
канал с сохранением возможности последующего использования данных (сжатие с поте-
рями).

Все эти вопросы являются предметом теории информации, которая здесь не рассматривается.

243 / 907
3.3.2. Возможность исправления всех ошибок (5/6)
Рассмотрим возможность исправления всех ошибок с практической точки зрения. Пусть
в канале возможны только ошибки замещения разрядов (выпадение и вставка разрядов
исключены), сообщения передаются блоками длины n и в каждом разряде возможна
ошибка с вероятностью p. Это допущение соответствует устройству шины передачи дан-
ных в современном компьютере. Тогда вероятность того, что произойдёт ровно k ошибок
равна v = pk (1 − p)n−k . Рассмотрим численное значение этой величины при некоторых
типичных значениях величин n, k и p.

n k p v n k p v
−03 −04 −03 −04
32 1 10 9, 695 · 10 64 1 10 9, 389 · 10
32 1 10−06 1, 000 · 10−06 64 1 10−06 9, 999 · 10−07
32 2 10−03 9, 704 · 10−07 64 2 10−03 9, 399 · 10−07
32 3 10−03 9, 714 · 10−10 64 3 10−03 9, 408 · 10−10
32 2 10−06 1, 000 · 10−12 64 2 10−06 9, 999 · 10−13
32 3 10−06 1, 000 · 10−18 64 3 10−06 9, 999 · 10−19
244 / 907
3.3.2. Возможность исправления всех ошибок (6/6)

Таким образом, возможностью одновременного возникновения ошибок большой кратно-


сти можно пренебречь, и достаточно рассматривать только каналы с ограниченной ха-
рактеристикой δ << n, для которых задача исправления всех ошибок оказывается раз-
решимой.
Окончательно приходим к следующему определению. F является кодированием с ис-
правлением p ошибок типа δ , если существует декодирование F −1 такое, что

∀ s ∈ S ∀ s0 ∈ EFδ (s) |E δ hF (s), s0 i| 6 p =⇒ F −1 (s0 ) = s



.

245 / 907
3.3.3. Расстояния Левенштейна и Хэмминга (1/4)
Неотрицательная функция d(x, y) : M × M → R+ называется расстоянием (или метри-
кой) на множестве M , если выполнены три условия, которые называются аксиомами мет-
рики.
1. Аксиома тождества: d(x, y) = 0 ⇐⇒ x = y .
2. Аксиома симметрии: d(x, y) = d(y, x).
3. Неравенство треугольника:
p d(x, y) 6 d(x, z) + d(y, z).
Пример. Функция (x1 − x2 )2 + (y1 − y2 )2 + (z1 − z2 )2 является метрикой и называет-
ся евклидовым расстоянием между точками (x1 , y1 , z1 ) и (x2 , y2 , z2 ) в трёхмерном про-
странстве R3 .
Множество {y | d(x, y) 6 p} называется шаром, или метрической окрестностью, с цен-
тром в x и радиусом p.
Ошибки замещения, выпадения и вставки символов можно рассматривать как операции
с двоичными словами. Применяя эти операции, возможно одно слово α ∈ {0, 1}∗ пре-
образовать в другое слово β ∈ {0, 1}∗ .
07→1 17→0 07→ε ε7→0 ε7→0 07→ε
Пример. 01 −→ 11 −→ 10; 01 −→ 1 −→ 10; 01 −→ 010 −→ 10.
246 / 907
3.3.3. Расстояния Левенштейна и Хэмминга (2/4)
Минимальное число операций, переводящее слово α в слово β называется расстоянием
Левенштейна и обозначается L(α, β).
Пример. L(01, 10) = 2.
Лемма. Расстояние Левенштейна L является метрикой.
Доказательство.
[ 1 ] L(α, β) = 0 ⇐⇒ α = β , поскольку преобразование отсутствует тогда и только тогда,
когда слова совпадают.
[ 2 ] L(α, β) = L(β, α), поскольку ошибки симметричны и, значит, преобразования слов
обратимы.
[ 3 ] L(α, β) 6 L(α, γ) + L(β, γ), поскольку конкатенация последовательностей преоб-
разования α 7→ γ и γ 7→ β является некоторой последовательностью, преобразующей α
в β , а L(α, β) является длиной кратчайшей из таких последовательностей.
Замечание. Расстояние Левенштейна нетрудно определить для слов в произвольном ал-
фавите, а не только в алфавите {0, 1}. В таком случае это расстояние часто называют ди-
станцией редактирования.
247 / 907
3.3.3. Расстояния Левенштейна и Хэмминга (3/4)

Отступление. На операции редактирования могут быть наложены различные ограничения. При


этом, если преобразования слов остаются обратимыми, а конкатенация преобразований являет-
ся преобразованием, то расстояние Левенштейна остаётся метрикой. Например, в популярной
интеллектуальной игре требуется преобразовать одно слово в другое, заменяя по одной букве. В
этой игре 3 6 L(коза, волк) 6 5, поскольку
коза7→поза7→пола7→полк7→волк.
Пусть некоторый канал имеет характеристику δ = hδ1 , δ2 , δ3 i. Пусть E δ (α) — множество
слов, которые могут быть получены из слова α в результате всех возможных комбинаций
допустимых в канале ошибок типа δ . Поскольку рассматриваются симметричные ошибки,
ясно что β ∈ E δ (α) ⇐⇒ α ∈ E δ (β).

248 / 907
3.3.3. Расстояния Левенштейна и Хэмминга (4/4)
Положим H δ (α, β) ← if α ∈ E δ (β) then L(α, β) else +∞ end if.
Функция H δ называется расстоянием Хэмминга. Расстояние Хэмминга является метрикой
по тем же причинам, что и расстояние Левенштейна, а потому множество E δ (α) уместно
называть δ -окрестностью слова α.
Пример. Расстояние Хэмминга в E2n . Пусть δ = hn, 0, 0i, то есть допускаются только ошиб-
ки типа замещения разрядов. Рассмотрим слова α = a1 . . . an и β = b1 . . . bn . Тогда
n
Def
X
δ
H (α, β) = (ai 6= bi ).
i=1

То есть расстоянием Хэмминга между битовыми шкалами одной длины является чис-
ло несовпадающих разрядов. Именно этот частный случай часто называют расстояни-
ем Хэмминга в E2n и обозначают H n .
Замечание. В последней формуле, так же как и в других местах этого конспекта, исполь-
зуется неявное приведение false 7→ 0, true 7→ 1.
249 / 907
3.3.4. Кодовое расстояние схемы (1/3)
Рассмотрим применение введённых понятий к простейшему случаю алфавитного коди-
n
рования. Пусть σ = hai → βi ii=1 — схема алфавитного кодирования, а d — некоторая
метрика на B ∗ . Тогда минимальное расстояние между элементарными кодами
Def
d(σ) = min d(βi , βj )
16i<j6n

называется кодовым расстоянием схемы σ в метрике d.


n
Теорема. Алфавитное кодирование со схемой σ = hai → βi ii=1 и с кодовым расстоянием
Хэмминга H(σ) = 0min 00
H δ (β 0 , β 00 ) является кодированием с исправлением h ошибок
β ,β ∈V
типа δ тогда и только тогда, когда H(σ) > 2h.
Доказательство. Если можно исправить ошибки в каждом из кодовых слов, то можно ис-
править ошибки и во всем сообщении. Поэтому достаточно рассматривать только кодо-
вые слова. Заметим, что множество E δ (α) — это шар радиуса h с центром в α. Таким об-
разом, E δ (βi ) ∩ E δ (βj ) = ∅ ⇐⇒ H(σ) > 2h.
По теореме п. 3.3.2 условие E δ (βi ) ∩ E δ (βj ) = ∅ равносильно существованию декоди-
рования.
250 / 907
3.3.4. Кодовое расстояние схемы (2/3)

Другими словами, исправление ошибок типа δ возможно тогда и только тогда, когда ко-
довые слова схемы не лежат в δ -окрестностях друг друга.
Следствие. Рассмотрим схему равномерного кодирования σ = hai → βi ini=1 ,
где ∀ i (|βi | = m), m > blog(n − 1)c + 1. Такая схема   h ошибок типа
может исправлять
m
P
замещения в m разрядах, если, и только если min βi [k] 6= βj [k] > 2h, то есть
16i<j6n k=1
если, и только если любые два кодовых слова различаются не менее чем в 2h разрядах.

251 / 907
3.3.4. Кодовое расстояние схемы (3/3)

Пример. На рисунке представлен гиперкуб для про-


странства E23 и две 1-окрестности точек 101 и 010
(то есть два шара радиуса 1 с центрами в точках 101
и 010). Очевидно, что можно взять два любых ин-
версных кода, и шары с центрами в этих кодах не
пересекаются, но все другие шары радиуса 1 с цен-
трами в других точках пересекаются с обоими вы-
деленными шарами. Из этого наблюдения и теоре-
мы следует, что трёхразрядный код может исправ-
лять одну ошибку типа замещения для алфавитно-
го кодирования только двухбуквенного алфавита.

252 / 907
3.3.5. Мощность кодирования (1/4)
Мощностью кодирования называется мощность множества сообщений S , которые удаёт-
ся закодировать с выполнением заданных условий. Чем мощнее кодирование, тем боль-
ше различных сообщений возможно закодировать с его помощью.
Из теоремы п. 3.3.2 следует, что помехоустойчивое кодирование максимальной мощно-
сти достигается в том случае, когда разбиение множества принятых сообщений имеет
максимальную мощность.
Пример. Помехоустойчивое кодирование с исправлением не более одной ошибки типа
замещения в блоке длины 3 имеет мощность не более 2.
Рассмотрим случай канала, в котором возможно не более h ошибок замещения разря-
дов в блоках длины n. Какова максимальная возможная мощность помехоустойчивого
кодирования? В рассматриваемом случае в метрическом пространстве E2n с расстояни-
ем Хэмминга H n множество возможных ошибок в сообщении s определяется как шар
радиуса h с центром в коде сообщения F (s):

hh,0,0i Def
EF (s) = V n (F (s), h), где V n (x, h) = {y ∈ E2n | H n (x, y) 6 h} .
253 / 907
3.3.5. Мощность кодирования
 (2/4) 
h
E2n n
P
Лемма. ∀ x ∈ ∀h > 0 |V (x, h)| = C(n, i) .
i=0
h
Доказательство. V n (x, h) = {y ∈ E2n | H n (x, y) 6 h} = {y ∈ E2n | H n (x, y) = i},
S
i=0
| {y ∈ E2n | H n (x, y) = i} | = C(n, i).
Замечание. Доказанную лемму можно обобщить для любого дискретного метрическо-
го пространства, в частности, пространства слов над любым алфавитом с расстоянием
Левенштейна.
Теорема. Мощность помехоустойчивого кодирования для канала, в котором возможно не
более h ошибок замещения разрядов в блоках длины n, не превосходит числа шаров, ко-
2n
торые можно уложить в пространстве E2n без пересечений: |S| 6 h
.
P
C(n, i)
i=0
Доказательство. Для каждого сообщения множество возможных ошибок является шаром
радиуса h, для помехоустойчивости шары не должны пересекаться, а всего в простран-
стве 2n точек.
254 / 907
3.3.5. Мощность кодирования (3/4)
Пример. В следующей таблице показаны верхние оценки для мощности помехоустойчи-
вовго кодирования в зависимости от h и n.
n
h\ 2 3 4 5 6 7 8 9 10 11 12
0 4 8 16 32 64 128 256 512 1024 2048 4096
1 1 2 3 5 9 16 28 51 93 170 315
2 1 1 1 2 2 4 6 11 18 30 51
3 1 1 1 2 2 2 3 5 7 11 17
Замечание. Случай h = 0 соответствует максимальной мощности кодирования при отсут-
ствии ограничений. Такое кодирование называется безызбыточным.
Специфические особенности множества сообщений S можно использовать при постро-
ении кодирования, однако это требует специальных ухищрений и не является универ-
сальным решением. Для практики наиболее важен случай S = E2m , |S| = 2m , то есть со-
общением может быть любое слово длины m.
Следствие. Если S = E2m и существует помехоустойчивое кодирование для канала, в ко-
тором возможно не более одной ошибки замещения в блоке длины n, то 2m 6 2n /(n + 1).
Доказательство. По формуле теоремы C(n, 0) + C(n, 1) = 1 + n. 255 / 907
3.3.5. Мощность кодирования (4/4)
Помехоустойчивое кодирование не может быть безызбыточным. Обозначим k ← n−m —
минимальное количество контрольных разрядов, то есть избыточных разрядов, необхо-
димых для помехоустойчивости.
Пример. В следующей таблице показано соотношение для m, n и k при h = 1. Здесь
n0 ←b2n /(n + 1)c. Для n = 1, 2 помехоустойчивого кодирования не существует.
n 3 4 5 6 7 8 9 10 11 12 13 14 15 16
n0 2 3 5 9 16 28 51 93 170 315 585 1092 2048 3855
2m 2 2 4 8 16 16 32 64 128 256 512 1024 2048 2048
m 1 1 2 3 4 4 5 6 7 8 9 10 11 11
k 2 3 3 3 3 4 4 4 4 4 4 4 4 5
Можно заметить, например, что 7-разрядные блоки передают столько же информации и
с такой же надёжностью, что и 8-разрядные, аналогичная ситуация для 15-разрядных и
16-разрядных кодов и т. д. Доля контрольных разрядов, необходимых для существова-
ния помехоустойчивого кодирования, начиная с n = 6 не превышает половины всех раз-
рядов блока и с ростом n постепенно уменьшается. В частности, при n ∈ 27..57 имеем
k = 6, а при n = 64 имеем k = 7.
256 / 907
3.3.6. Виды кодирования (1/5)
Предложено множество разнообразных способов помехоустойчивого кодирования. Все
эти способы подчиняются выведенным количественным ограничениям, но отличаются ис-
пользуемым математическим аппаратом, удобством применения, наглядностью и други-
ми качественными характеристиками.
Пример. Пусть m = 2, h = 1. Тогда минимально n = 5, k = 3. Можно подобрать подходя-
щие четыре пятиразрядных кода так, чтобы их 1-окрестности в метрике Хэмминга не пе-
ресекались. В частности, с помощью карты Карно, как показано на рисунке. Выбранные
коды (центры шаров) выделены полужирным начертанием и подчёркнуты, сами шары
выделены различной штриховкой.

257 / 907
3.3.6. Виды кодирования (2/5)
Пример. (Продолжение) Затем можно произвольно назначить коды сообщениям:
00 7→ 00001, 01 7→ 01010, 11 7→ 11111, 10 7→ 10100. Декодирование можно реализовать
с помощью дерева решений, как показано на рисунке.

Варианты с пометкой «err» означают появление ошибки, при которой произошло более
одного замещения разряда. Такую ошибку данное кодирование исправить не может, но
может обнаружить.
Замечание. Выбор системы непересекающихся шаров в E2n , назначения кодов словам из
E m является произвольным. Если сохранить этот выбор в тайне, то кодирование, наряду
с помехоустойчивостью, станет обладать и свойствами тайнописи.
258 / 907
3.3.6. Виды кодирования (3/5)

Среди пестроты методов помехоустойчивого кодирования своей простотой и ясностью


выделяется группа методов, основанных на применении математического аппарата и
обозначений линейной алгебры.
Замечание. В контексте этого раздела знак + означает сложение по модулю 2, а знак
умножения опускается, что позволяет использовать обычные обозначения линейной ал-
гебры, имея в виду, что все векторы и матрицы — булевы, и операции выполняются по со-
ответствующим правилам. Размеры матриц и векторов, если нужно, указываются в ниж-
нем индексе.
Введём обозначения: 0m означает вектор из m нулей, 0m×n означает матрицу размера
m × n из нулей, а Im означает единичную матрицу размера m × m.

259 / 907
3.3.6. Виды кодирования (4/5)
Рассмотрим простейший случай кодирования, когда исходными сообщениями являются
все слова длины m, а кодами являются блоки длины n, n > m.
Пусть α = a1 . . . am ∈ E2m — исходное сообщение, а β = b1 . . . bn ∈ E2n — кодовый блок.
Рассмотрим случай, когда каждый разряд β можно представить в виде линейной функции
от разрядов α. ТогдаPmкодирование записывается следующим образом:
∀ j ∈ 1..n (bj = i=1 ai gi,j ). Используя обозначения линейной алгебры, код β можно
представить в виде произведения вектора α и булевой матрицы Gm×n , составленной из
коэффициентов gi,j , или β = αG. Матрица G называется порождающей матрицей кода.

 1 0 0 1 0
Пример. Рассмотрим сообщение α = 0 1 1 . Пусть матрица G = 0 1 0 0 1.

  0 0 1 1 1
 1 0 0 1 0 
Тогда β = 0 1 1 0 1 0 0 1 = 0 1 1 1 0 . Здесь m = 3, k = 2, n = 5.
0 0 1 1 1
260 / 907
3.3.6. Виды кодирования (5/5)
Если ∃ G−1
n×m (GG
−1
= Im ), то βG−1 = (αG)G−1 = α(GG−1 ) = αIm = α, и декодиро-
вание выполняется умножением кода на матрицу G−1 .

Теорема. Если ∃ Hk×n GH T = 0m×k , то β = αG ⇐⇒ βH T = 0k .
Доказательство. β = αG ⇐⇒ βH T = αGH T = α0m×k = 0k .
Матрица H называется проверочной, поскольку с помощью равенства βH T = 0k позво-
ляет проверить, является ли принятый через канал код β действительно кодом некото-
рого сообщения α при кодировании
 G. 
0 1 1 1 0
Пример. Матрица H = является проверочной для матрицы G преды-
1 0 1 0 1
 
 1 0  
1 0 0 1 0 0
 1 0 0
дущего примера: GH T = 0 1 0 0 1 
1 1= 0 0 .
 
0 0 1 1 1 1 0  0 0
0 1
261 / 907
3.3.7. Систематическая форма кодовых сообщений (1/3)
Известен очень простой способ определения матриц G, G−1 и H , который из-за сво-
ей формы называется систематическим кодированием. При систематическом кодирова-
нии блок из n разрядов состоит из m информационных разрядов, за которыми следуют
k = n − m проверочных (или контрольных) разрядов, причём информационные разря-
ды копируются в код без изменения, а проверочные разряды вычисляются как линей-
ные функции от информационных разрядов. В этих соглашениях порождающая матрица
имеет вид G = [Im |Pm×k ], где Im — единичная матрица, формирующая информацион-
ные разряды, а Pm×k — матрица, определяющая проверочную часть.
Отступление. В терминах линейной алгебры, если строки порождающей матрицы G линейно
независимы, то коды различных сообщений образуют линейное подпространство векторного про-
странства E2n . В этом случае проверочная матрица H задаёт ортогональное дополнение вектор-
ного пространства, заданного матрицей G. Все положения распространяются на случай вектор-
ных пространств над любым конечным полем, а не только E2 . Использование понятий линейной
алгебры (в том числе понятий, выходящих за рамки изложенных в главе 2) позволяет сделать опи-
сание кодирования лаконичным и общим, но не меняет алгоритмической сути дела.
262 / 907
3.3.7. Систематическая форма кодовых сообщений (2/3)
Теорема. Если G = [Im |Pm×k ], то:
−1 T
1) Gn×m ← [Im |0m×k ] и при этом GG−1 = Im ;
 T 
2) Hk×n ← Pk×m |Ik и при этом GH T = 0m×k .
Доказательство.
[ 1 ] Положим Cm×m ← GG−1 . Имеем Gi,l = if i = l then 1 else 0 end if или, короче,
n
Gi,l = (i = l) при 1 6 i, l 6 m, и также G−1 Gi,l G−1
P
l,j = (l = j). Тогда Ci,j = l,j = (i = j),
l=1
то есть C = Im .
[ 2 ] Положим Cm×k ← GH T . Имеем Gi,l = (i = l) при 1 6 i, l 6 m, Hl,j
T
= (l − m = j)
T
при m + 1 6 l 6 m + k, 1 6 j 6 k , а также Gi,l = Pi,l−m при l > m и Hl,j = Pl,j при
n m n
T T T
P P P
1 6 l 6 m. Тогда Ci,j = Gi,l Hl,j = Gi,l Hl,j + Gi,l Hl,j = Pi,j + Pi,j = 0.
l=1 l=1 l=m+1
Замечание. Напомним, что матрицы булевы, и в операциях с матрицами знак + означает
сложение по модулю 2.
263 / 907
3.3.7. Систематическая форма кодовых сообщений (3/3)
Систематическая форма кодовых сообщений позволяет удобно кодировать и декодиро-
вать сообщения, и позволяет обнаруживать некоторые ошибки, но не гарантирует ис-
 
правления ошибок. 1 0 0 1 0  
0 1 1 1 0
Пример. В условиях примеров G = 0 1 0 0 1 , H = .
1 0 1 0 1
 0 0 1 1 1 
Пусть α = 0 1 1 . Тогда β = αG = 0 1 1 1 0 . Пусть теперь  произошла ошибка
0
в третьем разряде и из канала принято слово β = 0 1 0 1 0 .
0 −1

Тогда β G = 0 1 0 и сообщение декодировано неверно,
 
1 0
 0 1 
 
0 T

но β H = 0 1 0 1 0 1 1 
 = 1 1 и ошибка обнаружена.
1 0 
0 1
Замечание. По теореме п. 3.3.5 кодирование с параметрами m = 3, k = 2, n = 5, не
может быть помехоустойчивым. Если m = 3, то необходимо k > 3.
264 / 907
3.3.8. Коды Хэмминга (1/4)
При помехоустойчивом кодировании основная задача состоит в том, чтобы определить,
какую дополнительную информацию надо передать, чтобы её объём был минимальным,
а декодирование по возможности несложным.
Видимо, наиболее известным систематическим самокорректирующимся кодом в настоя-
щее время является код Хэмминга.
Введём обозначения. Пусть α ∈ E2m — исходный блок, β ∈ E2n — кодовый блок, получен-
ный с помощью порождающей матрицы Gm×n , для которой известна проверочная мат-
рица Hk×n , такая, что GH T = 0m×k . Пусть β 0 ∈ E2n — блок с возможной ошибкой, полу-
ченный через канал, а  ∈ E2n — битовая шкала ошибок, которая содержит 1 там, где про-
изошла ошибка, и 0 в остальных разрядах. Результат применения проверочной матрицы
к блоку с ошибкой называется синдромом и обозначается ζ ← β 0 H T .
Теорема. Синдром зависит только от битовой шкалы ошибок: ζ = H T .
Доказательство. По определению β 0 = β + , где + означает поразрядное сложение
битовых шкал по модулю 2. Далее ζ = β 0 H T = (β + )H T = βH T + H T = H T ,
поскольку βH T = 0.
265 / 907
3.3.8. Коды Хэмминга (2/4)
Отсюда вытекает метод кодирования и декодирования с исправлением одиночной ошиб-
ки замещения разряда в блоке длины n.
1. По формулам или таблицам п. 3.3.5 подобрать число m так, чтобы 2m 6 2n /(n + 1)
и положить k ← n − m.
2. Определить булевы матрицы: порождающую матрицу Gm×n , строки которой линей-
но независимы; матрицу декодирования G−1 n×m , такую что GG
−1
= Im ; провероч-
T
ную матрицу Hk×n , такую что GH = 0m×k . Все эти матрицы определяются неод-
нозначно.
3. Разбить исходное сообщение на блоки длины m.
4. Каждый блок α длины m независимо умножить на порождающую матрицу, получая
блок β ← αG длины n.
5. Блок β передать через канал, получая блок β 0 = b1 . . . bn , возможно содержащий
одну ошибку замещения.
6. Вычислить синдром ζ ← β 0 H T .
7. Если синдром ζ = 0k , то ошибок нет, а если ζ 6= 0k , то определить j — номер
того столбца проверочной матрицы, который совпадает с синдромом, после чего
инвертировать j -й разряд: bj ← 1 + bj .
8. Декодировать блок α0 ← β 0 G−1 .
266 / 907
3.3.8. Коды Хэмминга (3/4)
Теорема. В указанных обозначениях α = α0 .
Доказательство. Если ошибок не случилось, и β 0 = β , то α0 = α по свойству матриц G
и G−1 . Пусть произошла ошибка в разряде j . Известно, что ζ = H T . Поскольку битовая
шкала  содержит 1 в j -м разряде и 0 во всех остальных разрядах, синдром равен j -му
столбцу матрицы H . Инверсия j -го разряда устраняет ошибку в коде и позволяет произ-
вести обычное декодирование.
Замечание. Шаги 1 и 2 выполняются только один раз, и их трудоёмкость некритична.
Прочие шаги выполняются для каждого блока, и скорость их выполнения важна. Особого
внимания заслуживают шаги 6 и 7, поскольку это «накладные расходы» ради помехо-
устойчивости на кодирование и декодирования.
Основная идея кода Хэмминга состоит в том, чтобы в проверочной матрице H исполь-
зовать к качестве j -го столбца двоичную запись номера этого столбца. Тогда вычисление
синдрома сразу даёт номер разряда, в котором произошла ошибка. Если синдром равен
нулю, то ошибки нет. Соотношение между n и k таково, что k разрядов как раз достаточ-
но для записи чисел в диапазоне 1..n.
267 / 907
3.3.8. Коды Хэмминга (4/4)  
0 0 0 1 1 1 1
Пример. Пусть m = 4, тогда k = 3 и n = 7. Матрица H = 0 1 1 0 0 1 1
1 0 1 0 1 0 1
является проверочной. Пусть α = 1100 и используется систематическое кодирование.
Тогда β = 1100b5 b6 b7 . Соотношения
P для проверочных
 символов получаем из условия
T n
βH = 0k , то есть ∀ i ∈ 1..k j=1 bj Hj,i = 0 . Имеем b5 + b6 + b7 = 0, 1 + b6 + b7 = 0,
1 + b5 + b7 = 0. Получаем b5 = 1, b6 = 1, b7 = 0. Значит β = 1100110. Пусть во время
0
прохождения через канал произошла ошибка в третьем  символе: β = 1110110. Найдём
0 0 1
0 1 0
   
0 1 1 0
 
синдром в данном случае: ζ = 1 1 1 0 1 1 0   1 0 0  = 1. Имеем j = 3,

1 0 1 1
 
1 1 0
1 1 1
в этом разряде как раз и произошла ошибка. 268 / 907
3.3.9. Исправление одного замещения (1/3)
Существуют другие способы линейного кодирования, отличные от систематических ко-
дов, при которых проверочные разряды находятся на позициях, облегчающих кодиро-
вание. Рассмотрим в качестве примера случай одного замещения.
Определим последовательности натуральных чисел в соответствии с их представлениями
в двоичной системе счисления следующим образом:
V1 ← 1, 3, 5, 7, 9, 11, . . . — все числа, у которых разряд 1 равен 1;
V2 ← 2, 3, 6, 7, 10, . . . — все числа, у которых разряд 2 равен 1;
V3 ← 4, 5, 6, 7, 12, . . . — все числа, у которых разряд 3 равен 1,
и т. д. По определению последовательность Vk начинается с числа 2k−1 . Также рассмотрим
последовательности Vk0 , где Vk0 получается из Vk отбрасыванием первого элемента. Эти
последовательности определены статически и могут быть вычислены заранее.
Пусть заданы числа n, m, причём 2m 6 2n /(n + 1) и k = n − m. Рассмотрим k разрядов
с номерами 20 = 1, 21 = 2, 22 = 4, . . . 2k−1 в слове b1 . . . bn . Эти разряды считаются кон-
трольными. Остальные разряды, а их ровно m, считаются информационными. Поместим
в информационные разряды все разряды слова a1 . . . am как они есть.
269 / 907
3.3.9. Исправление одного замещения (2/3)
Контрольные разряды определим следующим образом:
b1 ← b3 + b5 + b7 + . . . , то есть сумма всех разрядов с номерами из V10 ;
b2 ← b3 + b6 + b7 + . . . , то есть сумма всех разрядов с номерами из V20 ;
. . . , то есть сумма всех разрядов с номерами из V30 ;
b4 ← b5 + b6 + b7 + P
и вообще, b2j−1 ← bi , причём сложение выполняется по модулю 2. Пусть после про-
i∈Vj0
хождения через канал получен код c1 . . . cn и пусть I — номер разряда, в котором, воз-
можно, произошла ошибка замещения. Пусть это число имеет следующее двоичное пред-
ставление: I = il . . . i1 . Определим число J = jl . . . j1 следующим образом:
j1 ← c1 + c3 + c5 + c7 + . . . , то есть сумма всех разрядов с номерами из V1 ;
j2 ← c2 + c3 + c6 + c7 + . . . , то есть сумма всех разрядов с номерами из V2 ;
j3 ← c4 + c5 + c6P+ c7 + . . . , то есть сумма всех разрядов с номерами из V3 ;
и вообще, jp ← cq , где сложение выполняется по модулю 2.
q∈Vp

270 / 907
3.3.9. Исправление одного замещения (3/3)

Теорема. В указанных обозначениях I = J .


Доказательство. Эти числа равны, потому что поразрядно равны их двоичные представ-
ления. Действительно, пусть i1 = 0. Тогда I ∈
/ V1 и, значит,

j1 = c1 + c3 + c5 + . . . = b1 + b3 + b5 + . . . = 0

по определению разряда b1 . Пусть теперь i1 = 1. Тогда I ∈ V1 и, значит,

j1 = c1 + c3 + c5 + . . . = b1 + b3 + b5 + . . . + bx + . . . = 1,

так как если в сумме по модулю 2 изменить ровно один разряд, то изменится и значение
всей суммы. Итак, i1 = j1 . Аналогично (используя последовательности V2 и т. д.) имеем
i2 = j2 и т. д. Таким образом, I = J .

271 / 907
3.4. Криптография (1/3)
Защита информации, хранящейся в компьютере, от несанкционированного доступа, ис-
кажения и уничтожения в настоящее время является серьёзной социальной проблемой.
Применяются различные подходы к решению этой проблемы.
[1] Поставить между злоумышленником и данными в компьютере непреодолимый «фи-
зический» барьер, то есть исключить саму возможность доступа к данным путем изоля-
ции компьютера с данными в охраняемом помещении, применения аппаратных ключей
защиты и т. п. Такой подход надёжен, но он затрудняет доступ к данным для законных
пользователей, а потому постепенно уходит в прошлое.
[2] Поставить между злоумышленником и данными в компьютере «логический» барьер,
то есть проверять наличие прав на доступ к данным и блокировать доступ при отсут-
ствии таких прав. Для этого применяются различные системы паролей, регистрация и
идентификация пользователей, разграничение прав доступа и т. п. Практика показывает,
что борьба между «хакерами» и разработчиками модулей защиты операционных систем
идёт с переменным успехом.
272 / 907
3.4. Криптография (2/3)
[3] Хранить данные таким образом, чтобы они могли «сами за себя постоять». Другими
словами, так закодировать данные, чтобы, даже получив к ним доступ, злоумышленник
не смог бы нанести ущерба.
Этот раздел посвящён обсуждению методов кодирования, применяемых в последнем
случае.
Шифрование — это кодирование данных с целью защиты от несанкционированного до-
ступа. Процесс кодирования сообщения называется шифрованием (или зашифровкой), а
процесс декодирования — расшифровыванием (или расшифровкой). Само кодированное
сообщение называется шифрованным (или просто шифровкой), а применяемый метод на-
зывается шифром.
Основное требование к шифру состоит в том, чтобы расшифровка (и, может быть, зашиф-
ровка) была возможна только при наличии санкции, то есть некоторой дополнительной
информации (или устройства), которая называется ключом шифра. Процесс декодирова-
ния шифровки без ключа называется дешифрованием (или дешифрацией, или просто рас-
крытием шифра).
273 / 907
3.4. Криптография (3/3)
Область знаний о методах создания и раскрытия шифров называется криптографией
(или тайнописью). Свойство шифра противостоять раскрытию называется криптостой-
костью (или надёжностью) и обычно оценивается сложностью алгоритма дешифрации.
Отступление. В практической криптографии криптостойкость шифра оценивается из экономиче-
ских соображений. Если раскрытие шифра стоит (в денежном выражении, включая необходимые
компьютерные ресурсы, специальные устройства, услуги специалистов и т. п.) больше, чем сама
зашифрованная информация, то шифр считается достаточно надёжным.
Криптография известна с глубокой древности и использует самые разнообразные шиф-
ры, как чисто информационные, так и механические.
Среди современных информационных шифров различают симметричные шифры, в ко-
торых для зашифровки и расшифровки применяется один и тот же ключ, и асимметрич-
ные шифры, в которых для зашифровки и расшифровки применяются разные ключи.
В настоящее время наибольшее практическое значение имеет защита данных в компью-
тере, поэтому далее рассматриваются программные шифры для сообщений в алфавите
{0, 1}. 274 / 907
3.4.1. Шифрование с помощью случайных чисел (1/2)
Пусть имеется датчик псевдослучайных чисел, работающий по некоторому определённо-
му алгоритму. Часто используют следующий алгоритм: Ti+1 ←(a · Ti + b) mod c, где Ti —
предыдущее псевдослучайное число, Ti+1 — следующее псевдослучайное число, а коэф-
фициенты a, b, c постоянны и хорошо известны. Обычно c = 2n , где n — разрядность про-
цессора, a ≡ 1 (4), а b — нечётное. В этом случае последовательность псевдослучайных
чисел имеет период c.
Процесс шифрования определяется следующим образом. Шифруемое сообщение пред-
ставляется в виде последовательности слов S0 , S1 , . . . , каждое длины n, которые по-
разрядно складываются по модулю 2 со словами последовательности T0 , T1 , . . . , то есть
Ci ← Si +2 Ti .
Замечание. Последовательность T0 , T1 , . . . называется гаммой шифра.
Процесс расшифровывания заключается в том, чтобы ещё раз сложить шифрованную по-
следовательность с той же самой гаммой шифра: Si ← Ci +2 Ti . Ключом шифра являет-
ся начальное значение T0 , которое является секретным и должно быть известно только
отправителю и получателю шифрованного сообщения.
275 / 907
3.4.1. Шифрование с помощью случайных чисел (2/2)

Замечание. Шифрование с помощью случайных чисел является примером симметрично-


го шифра.
Если период последовательности псевдослучайных чисел достаточно велик, чтобы гамма
шифра была длиннее сообщения, то дешифровать сообщение можно только подбором
ключа. При увеличении n экспоненциально увеличивается криптостойкость шифра.
Отступление. Этот очень простой и эффективный метод часто применяют «внутри» программных
систем, например, для защиты данных на локальном диске. Для защиты данных, передаваемых по
открытым каналам связи, особенно в случае многостороннего обмена сообщениями, этот метод
применяют не так часто, поскольку возникают трудности с надёжной передачей секретного ключа
многим пользователям.

276 / 907
3.4.2. Криптостойкость (1/2)

Описанный в предыдущем параграфе метод шифрования обладает существенным недо-


статком. Если известна хотя бы часть исходного сообщения, то всё сообщение может быть
легко дешифровано. Действительно, пусть известно одно исходное слово Si . Тогда

Ti ← Ci +2 Si ,

и далее вся правая часть гаммы шифра определяется по указанной формуле датчика
псевдослучайных чисел.
Замечание. На практике часть сообщения вполне может быть известна злоумышленнику.
Например, многие текстовые редакторы помещают в начало файла документа одну и ту
же служебную информацию. Если злоумышленнику известно, что исходное сообщение
подготовлено в данном редакторе, то он сможет легко дешифровать сообщение.

277 / 907
3.4.2. Криптостойкость (2/2)

Для повышения криптостойкости симметричных шифров применяют различные приёмы:

1) вычисление гаммы шифра по ключу более сложным (или секретным) способом;


2) применение вместо +2 более сложной (но обратимой) операции для вычисления
шифровки;
3) предварительное перемешивание битов исходного сообщения по фиксированному
алгоритму.

Наиболее надёжным симметричным шифром считается DES (Data Encryption Standard), в


котором используется сразу несколько методов повышения криптостойкости.

278 / 907
3.4.3. Односторонние функции
Функция f называется односторонней функцией, если есть эффективный алгоритм вы-
числения y = f (x) для любого x, но для вычисления x = f −1 (y) эффективного алгорит-
ма нет.
Отступление. Важно уточнить, какой смысл придаётся терминам в этом определении. В настоящее
время обычно считают, что эффективный алгоритм — это алгоритм, имеющий асимптотически по-
линомиальную верхнюю оценку трудоёмкости, а выражение «алгоритма нет» означает, что либо
такой алгоритм принципиально невозможен, либо он пока не найден. В таком понимании, напри-
мер, функция f (x) = xe mod m, где e, m ∈ N, — односторонняя функция, поскольку для возви-
дения натурального числа в натуральную степень эффективный алгоритм известен, а для реше-
ния сравнения xe ≡ a (m) эффективного алгоритма (предположительно!) не существует. Однако
если считать, что эффективный алгоритм — это такой алгоритм, который может быть выполнен
за допустимое время на специализированном оборудовании, а выражение «алгоритма нет» под-
разумевает строгое математическое доказательство того, что алгоритма с заданными свойствами
не существует, то в этом случае приходится признать, что существование односторонних функций
пока строго не доказано.
279 / 907
3.4.4. Шифрование с открытым ключом (1/5)

В настоящее время широкое распространение получили шифры с открытым ключом.


Эти шифры не являются симметричными — для зашифровки и расшифровки использу-
ются разные ключи. При этом ключ, используемый для зашифровки, является открытым
(не секретным) и может быть сообщен всем желающим отправить шифрованное сообще-
ние, а ключ, используемый для расшифровки, является закрытым и хранится в секрете
получателем шифрованных сообщений. Даже знание всего зашифрованного сообщения
и открытого ключа, с помощью которого оно было зашифровано, не позволяет дешиф-
ровать сообщение (без знания закрытого ключа).
Шифров с открытым ключом предложено множество, здесь рассматривается алгоритм
RSA опубликованный Rivest, Shamir, Adleman в 1976 году. Этот конкретный алгоритм вы-
бран потому, что в нём в качестве односторонней функции используется возведение в
степень по модулю, разобранное нами ранее.

280 / 907
3.4.4 Шифрование с открытым ключом (2/5)
Шифрование с открытым ключом производится следующим образом.
1. Получателем сообщений производится генерация открытого ключа (пара чисел n и
e) и закрытого ключа (число d). Для этого:
I выбираются два простых числа, p и q ;

I вычисляется первая часть открытого ключа n ← pq ;

I определяется вторая часть открытого ключа — выбирается небольшое нечётное число


e, взаимно простое с числом (p − 1)(q − 1) (заметим, что
(p − 1)(q − 1) = pq(1 − 1/p)(1 − 1/q) = ϕ(n));
I определяется закрытый ключ: d ← e−1 mod (p − 1)(q − 1).
После чего открытый ключ (числа n и e) сообщается всем отправителям сообщений.
2. Отправитель шифрует сообщение (разбивая его, если нужно, на слова Si длиной
менее log n разрядов):
Ci ←(Si )e mod n, и отправляет получателю.
3. Получатель расшифровывает сообщение с помощью закрытого ключа d:
Pi ←(Ci )d mod n.
281 / 907
3.4.4. Шифрование с открытым ключом (3/5)
Теорема. Шифрование с открытым ключом корректно, то есть в предыдущих обозначе-
ниях Pi = Si .
Доказательство. Легко видеть, что Pi = (Si )ed mod n. Покажем, что
∀ M < n M ed ≡ M mod n .


Действительно, числа d и e взаимно обратны по модулю (p − 1)(q − 1), то есть


ed = 1 + k(p − 1)(q − 1)
при некотором k . Если M 6≡ 0 mod p, то по малой теореме Ферма имеем
k(q−1)
M ed ≡ M M (p−1) ≡ M · 1k(q−1) ≡ M mod p.
Если M ≡ 0 mod p, то сравнение M ed ≡ M mod p, очевидно, выполняется. Таким обра-
зом, ∀ 0 6 M < n M ed ≡ M mod  p . Совершенно аналогично имеем
∀ 0 6 M < n M ed ≡ M mod  q и по следствию из китайской теоремы об остатках
ed
∀ M < n M ≡ M mod n . Поскольку Si < n и Pi < n, заключаем, что ∀ i (Pi = Si ).
282 / 907
3.4.4. Шифрование с открытым ключом (4/5)
Пример. Генерация ключей:
1. p ← 3, q ← 11.
2. n ← pq = 3 ∗ 11 = 33.
3. (p − 1)(q − 1) = 2 ∗ 10 = 20, e ← 7.
4. d ← 7−1 mod 20 = 3, (7 ∗ 3 mod 20 = 1).
Пусть S1 ← 3, S2 ← 1, S3 ← 2 (S1 , S2 , S3 < n = 33). Тогда код определяется следующим
образом:
1. C1 ← 37 mod 33 = 2187 mod 33 = 9.
2. C2 ← 17 mod 33 = 1 mod 33 = 1.
3. C3 ← 27 mod 33 = 128 mod 33 = 29.
При расшифровке имеем
1. P1 ← 93 mod 33 = 729 mod 33 = 3.
2. P2 ← 13 mod 33 = 1 mod 33 = 1.
3. P3 ← 293 mod 33 = 24389 mod 33 = 2.
283 / 907
3.4.4. Шифрование с открытым ключом (5/5)
Отступление. Шифры с открытым ключом сравнительно просты в реализации, очень практичны
(поскольку нет необходимости пересылать по каналам связи закрытый ключ и можно безопасно
хранить его в одном месте) и в то же время обладают высочайшей криптостойкостью. Кажется, что
дешифровать сообщение несложно: достаточно разложить открыто опубликованное число n на
множители, восстановив числа p и q , и далее можно легко вычислить секретный ключ d. Однако
дело заключается в следующем. В настоящее время известны эффективные алгоритмы определе-
ния простоты чисел, которые позволяют за несколько минут подобрать пару очень больших про-
стых чисел (по 100 и больше цифр в десятичной записи). В то же время неизвестны эффектив-
ные алгоритмы разложения очень больших чисел на множители. Разложение на множители чис-
ла в 200 и больше цифр потребовало бы сотен лет работы самого лучшего суперкомпьютера. При
практическом применении шифров с открытым ключом используют действительно большие про-
стые числа (не менее 100 цифр в десятичной записи, а обычно значительно больше). В резуль-
тате вскрыть этот шифр оказывается невозможно, если не существует эффективных алгоритмов
разложения на множители (что очень вероятно, хотя и не доказано строго).

284 / 907
3.4.5. Простейшие атаки на шифр с открытым ключом
Появление новой системы шифрование вызвало многочисленные попытки взломать её.
Пока эти попытки не увенчались успехом.
Рассмотрим так называемую циклическую атаку. Считаем, что злоумышленнику известна
открытая часть ключа n, e и кодированное сообщение C = S e mod n. Цель злоумыш-
ленника — восстановить сообщение S . Метод заключается в том, чтобы подобрать число
j
j так, чтобы C e mod n = C . Другими словами, злоумышленник j раз проводит шифро-
вание перехваченного сообщения C известным ему открытым ключом.
j−1
Если такое число j злоумышленниксумеетподобрать, то C e = S и сообщение дешиф-
e
ei ej−1
ровано, потому что C mod n = C mod n = C и C = S e mod n.
Атака выглядит опасно, однако это не так. Известно, что асимптотическая трудоёмкость
этого подбора не меньше, чем разложение числа n на множители.
Метод RSA считается достаточно надёжным, если число n имеет не менее 1024 бит в
двоичной записи.
285 / 907
3.4.6. Цифровая подпись (1/3)
Шифр с открытым ключом позволяет выполнять и многие другие полезные операции,
помимо шифрования и посылки сообщений в одну сторону. Прежде всего, для организа-
ции многосторонней секретной связи каждому из участников достаточно сгенерировать
свою пару ключей (открытый и закрытый), а затем сообщить всем партнёрам свой откры-
тый ключ.
Заметим, что операции зашифровки и расшифровки, по существу, одинаковы, и разли-
чаются только показателем степени, а потому коммутируют:

M = (M e )d mod n = M ed mod n = M de mod n = (M d )e mod n = M.

Это обстоятельство позволяет применять различные приёмы, известные как цифровая


(или электронная) подпись.
Рассмотрим следующую схему взаимодействия корреспондентов X и Y . Отправитель X
кодирует сообщение S своим закрытым ключом (C ← S d mod n) и посылает получателю
Y пару hS, Ci, то есть подписанное сообщение. Получатель Y , получив такое сообщение,
кодирует подпись сообщения открытым ключом отправителя X .
286 / 907
3.4.6. Цифровая подпись (2/3)

То есть вычисляет S 0 ← C e mod n. Если оказывается, что S = S 0 , то это означает, что


(нешифрованное!) сообщение S действительно было отправлено корреспондентом X .
Если же S 6= S 0 , то сообщение было искажено при передаче или фальсифицировано.
Отступление. В подобного рода схемах возможны различные проблемы, которые носят уже не
математический, а социальный характер. Например, допустим, что злоумышленник Z имеет тех-
ническую возможность контролировать всю входящую корреспонденцию получателя Y незамет-
но для последнего. Тогда, перехватив сообщение отправителя X , в котором сообщался открытый
ключ e, злоумышленник Z может подменить открытый ключ отправителя X своим собственным
открытым ключом. После этого злоумышленник сможет фальсифицировать все сообщения отпра-
вителя X , подписывая их своей цифровой подписью, и, таким образом, действовать от имени от-
правителя X . Другими словами, цифровая подпись удостоверяет, что сообщение S пришло из то-
го же источника, из которого был получен открытый ключ e, но не более того.

287 / 907
3.4.6. Цифровая подпись (3/3)

Можно подписывать и шифрованные сообщения. Для этого отправитель X сначала ко-


дирует своим закрытым ключом сообщение S , получая цифровую подпись C , а затем ко-
дирует полученную пару hS, Ci открытым ключом получателя Y . Получив такое сообще-
ние, получатель Y сначала расшифровывает сообщение своим закрытым ключом, а по-
том убеждается в подлинности полученного сообщения, сравнив его с результатом при-
менения открытого ключа отправителя X к подписи C .
Замечание. К сожалению, даже эти меры не смогут защитить от злоумышленника Z , су-
мевшего подменить открытый ключ отправителя X . Конечно, в этом случае злоумышлен-
ник не сможет дешифровать исходное сообщение, но он сможет подменить исходное со-
общение фальсифицированным, а получатель не сможет обнаружить подмену сообще-
ния.

288 / 907
Часть II. Графы и отношения

289 / 907
4. Множества и отношения

Понятия «множество», «отношение», «функция» и близкие к ним составляют основной


словарь дискретной (равно как и «непрерывной») математики. Именно эти базовые по-
нятия кратко рассматриваются здесь, тем самым закладывается необходимая основа для
дальнейших построений. Особенность изложения состоит в том, что здесь рассматрива-
ются почти исключительно конечные множества, а тонкие и сложные вопросы, связанные
с рассмотрением бесконечных множеств, излагаются с «программистской» точки зрения.
С другой стороны, значительное внимание уделяется «представлению» множеств в про-
граммах. Эти вопросы не имеют прямого отношения к собственно теории множеств в её
классическом виде, но очень важны для практикующего программиста.

290 / 907
4.1. Множества

При построении доступной для рационального анализа картины мира часто используется
термин «объект» для обозначения некой сущности, отделимой от остальных. Выделение
объектов — это не более чем произвольный акт нашего сознания. В одной и той же си-
туации объекты могут быть выделены по-разному, в зависимости от точки зрения, целей
анализа и других обстоятельств. Но как бы то ни было, выделение объектов и их совокуп-
ностей — естественный (или даже единственно возможный) способ организации нашего
мышления, поэтому неудивительно, что он лежит в основе главного инструмента описа-
ния точного знания — математики.

291 / 907
4.1.1. Элементы и множества (1/2)
Множество — это любая определённая совокупность объектов. Объекты, из которых со-
ставлено множество, называются его элементами. Элементы множества различны и от-
личимы друг от друга. Как множествам, так и элементам можно давать имена или при-
сваивать символьные обозначения.
Примеры. Множество S слайдов в данной презентации. Множество N натуральных чисел
{1, 2, 3, . . . }. Множество P простых чисел {2, 3, 5, 7, 11, . . . }. Множество Z целых чисел
{. . . , −2, −1, 0, 1, 2, . . . }. Множество R вещественных чисел. Множество A различных
символов на этом слайде.
Принадлежность элемента множеству: x ∈ M ( x ∈
/ M ).
Множество, не содержащее элементов, называется пустым: ∅.
Множества как объекты могут быть элементами других множеств. Множество, элемента-
ми которого являются множества, иногда называют семейством. Обычно семейства обо-
значают «рукописными» буквами (M), множества — прописными буквами (M ), а элемен-
ты — строчными буквами (m).
292 / 907
4.1.1. Элементы и множества (2/2)
Отступление. Понятия множества, элемента и принадлежности, которые на первый взгляд представ-
ляются интуитивно ясными, при ближайшем рассмотрении такую ясность утрачивают. Во-первых,
даже возможность различить элементы при более глубоком рассмотрении представляет некото-
рую проблему. Например, символы «а» и «а», которые встречаются на предыдущем слайде, — это
один элемент множества A или два разных элемента? Или же, например, два вхождения симво-
ла «о» в слово «множество» — графически они неразличимы невооружённым глазом, но это сим-
волы букв, которые обозначают звуки, а читаются эти две гласные по-разному: первая под ударе-
нием, а вторая — безударная. Во-вторых, проблематична возможность (без дополнительных уси-
лий) указать, принадлежит ли данный элемент данному множеству. Например, является ли число
86958476921537485067857663 простым?
Совокупность объектов, которая не является множеством, называется классом (со срав-
нительно меньшей ответственностью за определённость, отличимость и бесповторность
элементов).

293 / 907
4.1.2. Задание множеств (1/2)
Способы задания множеств:
перечисление элементов: M ←{a, b, c, . . . , z};
характеристический предикат: M ← {x | P (x)} ;
порождающая процедура: M ← {x | x ← f }.
Примеры.
M9 ←{1, 2, 3, 4, 5, 6, 7, 8, 9}.
M9 ← {n | n ∈ N & n < 10}.
M9 ← {n | for n from 1 to 9 do yield n end for}.
При задании множеств перечислением обозначения элементов иногда снабжают индек-
k
сами и указывают множество, из которого берутся индексы. В частности, запись {ai }i=1
означает то же, что {a1 , . . . , ak }.
Знак многоточия (. . . ), который употребляется при задании множеств, является сокра-
щённой формой записи, в которой порождающая процедура для множества индексов
считается очевидной.

Пример. {a1 , a2 , a3 , . . . } = {ai }i=1 .
294 / 907
4.1.2. Задание множеств (2/2)
Def
Множество целых чисел в диапазоне от m до n: m..n = {k ∈ Z | m 6 k & k 6 n} =
= {k ∈ Z | for k from m to n do yield k end for} .
Перечислением элементов можно задавать только конечные множества. Бесконечные мно-
жества задаются характеристическим предикатом или порождающей процедурой.
Def
Пример. N = {n | n ← 0; while true do n ← n + 1; yield n end while}.
Если x ∈
/ A, то элемент x можно добавить в множество A:
Def
A + x = {y | y ∈ A ∨ y = x} .

Если x ∈ A, то элемент x можно удалить из множества A:


Def
A − x = {y | y ∈ A & y 6= x} .

Примеры. M9 ← ∅ + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9.
Def
Множество натуральных чисел с нулём: N0 = N + 0.
295 / 907
4.1.3. Парадокс Рассела(1/2)
Возможность задания множеств характеристическим предикатом зависит от предиката.
Использование некоторых предикатов для этой цели может приводить к противоречиям.
Например, все рассмотренные в примерах множества не содержат себя в качестве эле-
мента, то есть множества, не содержащие себя в качестве элемента, заведомо существу-
ют. Рассмотрим множество Y всех множеств, не содержащих себя в качестве элемента:
Def
Y = {X | X ∈
/ X} .

Если множество Y существует, то мы должны иметь возможность ответить на следующий


вопрос: Y ∈ Y ? Пусть Y ∈ Y , тогда Y 6∈ Y . Пусть Y 6∈ Y , тогда Y ∈ Y . Имеем неустрани-
мое логическое противоречие — парадокс. Три способа избежать этого парадокса.
1. Ограничить используемые характеристические предикаты видом
P (x) = x ∈ A & Q(x), где A — известное, заведомо существующее множество (уни-
версум). Обычно при этом используют обозначение {x ∈ A | Q(x)}. Для Y универ-
сум не указан, а потому Y множеством не является.
296 / 907
4.1.3. Парадокс Рассела (2/2)
2. Теория типов. Объекты имеют тип 0, множества элементов типа 0 имеют тип 1, мно-
жества элементов типа 0 и 1 — тип 2 и т. д. Класс Y не имеет типа и потому множе-
ством не является.
3. Явный запрет принадлежности множества самому себе: X ∈ X — недопустимый
предикат. При аксиоматическом построении теории множеств соответствующая ак-
сиома называется аксиомой регулярности.

При этом, однако, нет полной уверенности в том, что не обнаружатся другие противоре-
чия. Полноценным выходом из ситуации являлось бы аксиоматическое построение тео-
рии множеств и доказательство непротиворечивости построенной формальной теории.
Однако исследование парадоксов и непротиворечивости систем аксиом является техни-
чески трудной задачей и уводит далеко в сторону от программистской практики, для ко-
торой важнейшими являются конечные множества. Поэтому здесь мы ограничиваемся
наивной теорией множеств.
297 / 907
4.1.4. Мультимножества
Мультимножеством X b называется совокупность элементов множества X , в которую эле-
мент xi входит ai раз, ai > 0. Мультимножество обозначается одним из следующих спо-
собов:

b = [xa11 , . . . , xan ] = hx1 , . . . , x1 ; . . . ; xn , . . . , xn i = ha1 (x1 ), . . . , an (xn )i.


X n

b = [a0 , b3 , c4 ] = hb, b, b; c, c, c, ci = h0(a), 3(b), 4(c)i.


Пример. Пусть X = {a, b, c}. Тогда X
Пусть Xb = ha1 (x1 ), . . . , an (xn )i — мультимножество над множеством X = {x1 , . . . , xn }.
Тогда число ai называется показателем элемента xi , множество X — носителем, число
m = a1 + . . . + an — мощностью, а X b = {xi ∈ X | ai > 0} называется составом мульти-
множества X b.
Пример. Пусть X b = [a0 , b3 , c4 ] — мультимножество над множеством X = {a, b, c}. Тогда
Xb = {b, c}.
Мультимножество X b = ha1 (x1 ), . . . , an (xn )i над множеством X = {x1 , . . . , xn } называ-
ется индикатором, если ∀ i ∈ 1..n (ai = 0 ∨ ai = 1).
298 / 907
4.1.5. Конечные последовательности (1/3)
К понятию мультимножества тесно примыкает широко используемое понятие (конечной)
последовательности.
Пусть задано множество X = {x1 , . . . , xn }. Рассмотрим мультимножество
b = ha1 (x1 ), . . . , an (xn )i
X
Pn
над X , i=1 ai = m. Элементы мультимножества можно пронумеровать, назначив им но-
мера из отрезка 1..m. Это можно сделать многими различными способами. Мультимно-
жество с конкретной нумерацией называется последовательностью длины m над мно-
жеством элементов X . Другими словами, если задана последовательность, то всегда мож-
но сказать, какой элемент стоит на i-м месте в последовательности. Отсюда вытекает об-
щепринятый способ записи последовательностей: выписать элементы мультимножества
слева направо в порядке возрастания номеров.
Пример. Пусть X = {a, b} — исходное множество элементов, X b = h2(a), 2(b)i — мульти-
множество, тогда aabb, abab, abba, baab, baba, bbaa — все 6 возможных в данном случае
последовательностей.
Замечание. Конечную последовательность чисел часто называют вектором. 299 / 907
4.1.5. Конечные последовательности (2/3)
Отступление. Одномерный массив A : array [1..n] of X является программным представлением
последовательности длины n над множеством X . При этом множество X называется типом (эле-
ментов) массива, а выражение A[i] доставляет i-й элемент последовательности. Выражение A[i]
вычисляется очень эффективно, при условии, что все элементы массива (последовательности) за-
нимают одинаковый объём памяти компьютера.
Пусть теперь элементами исходного множества являются буквы, или символы. В таком
случае множество букв называется алфавитом и обычно обозначается A.
Последовательность букв называется словом, или цепочкой, в данном алфавите A. Одна
буква может входить в слово несколько раз, каждый отдельный экземпляр буквы в слове
называется вхождением буквы в слово.
Если слово α = a1 . . . ak , ai ∈ A, то количество букв в слове называется длиной слова:
Def
|α| = |a1 . . . ak | = k . Пустое слово обозначается ε; |ε| = 0.
Множество слов в алфавите A, включая пустое слово, обозначается A∗ . Пустое слово не
содержит букв алфавита, но считается словом: ε 6∈ A, но ε ∈ A∗ . Если пустое слово
исключается из рассмотрения, то множество слов в алфавите A обозначается A+ .
300 / 907
4.1.5. Конечные последовательности (3/3)
Для слов определена операция конкатенации, или сцепления. Обычно операция конка-
тенации никак не обозначается, а сцепляемые слова просто записываются подряд.
Пример. Конкатенация слов «пара» и «план» образует слово «параплан».
Если α = α1 α2 , то α1 называется началом, или префиксом, слова α, а α2 — окончанием,
или постфиксом, слова α.
Пример. Слова «д» и «до» являются префиксами, а слова «ом» и «м» являются постфик-
сами слова «дом».
Замечание. Каждое слово является своим постфиксом и префиксом.
Слова α и β могут пересекаться. При пересечении либо одно слово является частью дру-
гого, α = γβδ , либо постфикс одного слова является префиксом другого, α = δγ, β = γζ .
Для пары слов α и β тройка слов γ , δ , ζ определяется однозначно, если выбирать наи-
большее пересечение.
Пример. Пусть α = abb, β = bbc. Тогда можно взять γ ← b, δ ← ab, ζ ← bc. Однако наи-
большее пересечение даёт единственная тройка γ ← bb, δ ← a, ζ ← c.
Произвольное множество L слов в некотором алфавите называется языком в этом алфа-
вите; L ⊂ A∗ . 301 / 907
4.2. Алгебра подмножеств
Самого по себе понятия множества ещё недостаточно — нужно определить способы кон-
струирования новых множеств из уже имеющихся, то есть определить операции над мно-
жествами. Рассматриваемый совместно набор операций, определённых на некотором
множестве, образует алгебру. При этом рассматриваемое множество объектов называ-
ют носителем алгебры.
Пример. Арифметика, изучаемая в начальной школе, — это алгебра, включающая опера-
ции сложения (+), умножения (×), вычитания (−) и деления с остатком (/), причём носи-
телем является множество натуральных чисел и ноль.
Наряду с операциями, результаты которых принадлежат носителю, часто бывают необ-
ходимы и такие операции, результаты которых не принадлежат носителю.
Примеры. В арифметике, наряду с арифметическими операциями, используются опера-
ции сравнения: больше (>), меньше (<) и другие. Аргументами этих операций являются
натуральные числа, а результатами — истинностные значения. Операция вычитания мо-
жет дать отрицательное число, которое не считается натуральным.
Мы начинаем с операций сравнения множеств, затем рассматриваем понятие мощности
множества, и заканчиваем рассмотрение операциями над множествами. 302 / 907
4.2.1. Сравнение множеств (1/2)
Множество A содержится в множестве B (множество B включает множество A), если
Def
каждый элемент множества A есть элемент множества B : A ⊂ B = x ∈ A =⇒ x ∈ B.
При этом говорят, что A — подмножество B , B — надмножество A.
По определению ∀ M (∅ ⊂ M ).
Два множества равны, если они являются подмножествами друг друга:
Def
A = B = A ⊂ B & B ⊂ A.
Теорема. Включение множеств обладает следующими свойствами:
1) ∀ A (A ⊂ A);
2) ∀ A, B (A ⊂ B & B ⊂ A =⇒ A = B);
3) ∀ A, B, C (A ⊂ B & B ⊂ C =⇒ A ⊂ C).
Доказательство.
[ 1) ] Имеем x ∈ A =⇒ x ∈ A и, значит, A ⊂ A.
[ 2) ] По определению.
[ 3) ] Если x ∈ A =⇒ x ∈ B и x ∈ B =⇒ x ∈ C , то x ∈ A =⇒ x ∈ C и A ⊂ C .
303 / 907
4.2.1. Сравнение множеств (2/2)
Если A ⊂ B и A 6= B , A 6= ∅, то A называется собственным подмножеством B , а B —
собственным надмножеством A. Таким образом, само множество и пустое множество
считаются несобственными подмножествами.
Пример. Любое одноэлементное множество имеет два различных несобственных под-
множества и не имеет собственных подмножеств.
Замечание. В этом курсе для обозначения включения собственных подмножеств исполь-
зуется знак , а для несобственных — ⊆. В других источниках иногда для обозначения
собственного включения используют знак ⊂, оставляя знак ⊆ для обозначения общего
случая включения, которое может быть несобственным.
Следствие. A B ⊆ C =⇒ A C .
Замечание. Нетрудно видеть, что понятие подмножества множества X равнообъёмно по-
нятию индикатора над множеством X . Действительно, если X = {x1 , . . . , xn } — множе-
ство, а Y — любое подмножество множества X , Y ⊂ X , то существует единственный ин-
дикатор Yb = ha1 (x1 ), . . . , an (xn )i над множеством X , такой, что
∀ i ∈ 1..n (ai = 1 ⇐⇒ xi ∈ Y ) .
304 / 907
4.2.2. Равномощные множества (1/3)
Говорят, что установлено соответствие из множества A в множество B , если каждому
элементу множества A поставлен в соответствие один и только один элемент множе-
ства B , причём различным элементам множества A поставлены в соответствие различ-
ные элементы множества B . В этом случае говорят также, что множество A вложено в
множество B , и используют обозначение A ,→ B . Если элементу a ∈ A соответствует
элемент b ∈ B , то данное обстоятельство обозначают следующим образом: a 7→ b.
Пример. N ,→ Q. Соответствие: n 7→ n1 .
Замечание. Весьма общее понятие соответствия трактуется здесь с сугубо программист-
ских позиций. Если сказано, что установлено соответствие из множества A в множество
B , то подразумевается, что задан способ по любому элементу a ∈ A однозначно опреде-
лить соответствующий ему элемент b ∈ B . Способ может быть любым, если возможность
его применения не вызывает сомнений. Например, это может быть массив array [A] of B ,
или функция типа func (A) : B , или же выражение, зависящее от переменной типа A и
доставляющее значение типа B .
305 / 907
4.2.2. Равномощные множества (2/3)
Всякий элемент любого множества очевидно соответствует сам себе, поэтому
A ⊂ B =⇒ A ,→ B.
Пример. Поскольку N ⊂ Q ⊂ R, имеем N ,→ Q ,→ R.
Говорят, что между множествами A и B установлено взаимно-однозначное соответст-
вие, если каждому элементу A поставлен в соответствие один и только один элемент B ,
и для каждого элемента B один и только один элемент A поставлен в соответствие этому
элементу B . В этом случае говорят также, что множества A и B изоморфны, и используют
обозначение A ∼ B . Если элементу a ∈ A взаимно-однозначно соответствует элемент
b ∈ B , то данное обстоятельство обозначают так: a ↔ b.
Примеры. Соответствие n ↔ 2n устанавливает взаимно-однозначное соответствие меж-
ду множеством натуральных чисел N и множеством чётных натуральных чисел 2N:
N ∼ 2N.
Соответствие n ↔ n2 устанавливает взаимно-однозначное соответствие между множе-
ством натуральных чисел и множеством полных квадратов.
306 / 907
4.2.2. Равномощные множества (3/3)
Если между двумя множествами, A и B , может быть установлено взаимно-однозначное
соответствие, то говорят, что множества имеют одинаковую мощность, или что множества
равномощны, и записывают это так: |A| = |B|.
Теорема. Равномощность множеств обладает следующими свойствами:
1) ∀ A (|A| = |A|);
2) ∀ A, B (|A| = |B| =⇒ |B| = |A|);
3) ∀ A, B, C (|A| = |B| & |B| = |C| =⇒ |A| = |C|).
Доказательство.
[ 1) ] достаточно рассмотреть соответствие a ↔ a, где a ∈ A;
[ 2) ] ввиду взаимной однозначности соответствия a ↔ b;
[ 3) ] соответствие устанавливается с использованием элемента b ∈ B : a ↔ b ↔ c, где
a ∈ A, b ∈ B, c ∈ C .
B Def B
Пусть A ,→ B . Обозначим A,→ = {b ∈ B | ∃ a ∈ A (a 7→ b)}. Заметим, что A,→ ⊂ B .
B
Замечание. Если B ясно из контекста, то его можно опустить: A,→ = A,→ .
Лемма. A ,→ B =⇒ |A| = |A,→ |.
Доказательство. Достаточно положить a ↔ b если и только если a 7→ b. 307 / 907
4.2.3. Конечные и бесконечные множества (1/2)
Вопрос о том, чем конечное отличается от бесконечного, может поставить в тупик. Здесь
мы рассматриваем применительно к множествам один из возможных ответов на этот
вопрос. С античных времен известен принцип: «часть меньше целого». Оказывается, для
бесконечных множеств этот принцип не имеет места.
Множество A называется конечным, если у него нет равномощного собственного подмно-
жества:
∀ B ((B ⊂ A & |B| = |A|) =⇒ (B = A)) .
Для конечного множества A используется запись |A| < ∞. Все остальные множества
называются бесконечными:

∃ B (B ⊂ A & |B| = |A| & B 6= A) ,

то есть бесконечное множество равномощно некоторому своему собственному подмно-


жеству. Для бесконечного множества A используется запись |A| = ∞.
308 / 907
4.2.3. Конечные и бесконечные множества (2/2)
Пример. Множество натуральных чисел бесконечно, |N| = ∞, поскольку оно равномощ-
но своему собственному подмножеству чётных чисел.
Теорема. Множество, имеющее бесконечное подмножество, бесконечно:
(B ⊂ A & |B| = ∞) =⇒ (|A| = ∞).
Доказательство. Множество B бесконечно, значит B ∼ C , причём C ⊂ B . Обозначим
это соответствие x 7→ x0 . Построим соответствие между множеством A и его собственным
подмножеством D: x 7→ if x ∈ B then x0 else x end if.
Другими словами, на элементах из B мы пользуемся за-
данным соответствием, а остальным элементам сопостав-
ляем их самих. Это взаимно-однозначное соответствие
между множеством A и его собственным подмножеством
D, и, значит, |A| = ∞.
Следствие. Все подмножества конечного множества конечны.
Доказательство. Пусть ∃ A ⊂ B (|A| = ∞ & |B| < ∞). Но по теореме |B| = ∞, так как
|A| = ∞ & A ⊂ B . Противоречие. 309 / 907
4.2.4. Счётные и несчётные множества (1/2)
Бесконечные множества, равномощные множеству натуральных чисел, называются счёт-
ными. Счётные множества отличаются тем, что для каждого элемента можно указать
взаимно-однозначно соответствующее натуральное число, то есть номер. Другими сло-
вами, множество счётно, если его элементы можно перенумеровать.
Пример. Множество целых чисел Z счётно: 0, 1, −1, 2, −2, . . . .
Не все бесконечные множества являются счётными. Существуют несчётные множества.
Теорема. Множество всех подмножеств натурального ряда несчётно.
Доказательство. Допустим, что множество всех подмножеств натурального ряда счёт-
но. Тогда их можно перенумеровать, и каждое множество чисел получит свой номер.
Обозначим N (X) — номер множества X . Может статься, что некоторые множества чи-
сел содержат свой номер в качестве элемента, а другие не содержат. Рассмотрим число-
вое множество Y , которое состоит из номеров множеств, не содержащих свой номер в
качестве элемента: Y = {x ∈ N | ∃ X ⊂ N (x = N (X) & x 6∈ X)} . Пусть множество Y
имеет номер y = N (Y ). Тогда, если y 6∈ Y , то множество Y не содержит свой номер, а
значит, по своему определению, y ∈ Y . Обратно: если y ∈ Y , то y 6∈ Y . Противоречие, и
значит нумерация всех числовых множеств невозможна. 310 / 907
4.2.4. Счётные и несчётные множества (2/2)
Следующий алгоритм перечисляет все конечные подмножества натурального ряда, откуда
следует, что множество всех конечных подмножеств натурального ряда счётно.
n ← 0 //добавляемое число
Q ← ∅ //очередь множеств содержит пустое множество
yield ∅ //первое подмножество пустое
while true do
S ← Q //извлекаем первое множество из очереди
if S = ∅ then n ← n + 1 end if //следующее добавляемое число
Q ← S //возвращаем извлечённое множество в очередь
S ← S + n //добавляем число n в множество S
Q ← S //добавляем новое множество в очередь
yield S //очередное множество
end while
Обоснование. Множество всех конечных подмножеств отрезка 1..n состоит из двух рав-
номощных частей: множества всех подмножеств отрезка 1..(n − 1) и множества этих же
подмножеств, в каждое из которых добавлено число n.
311 / 907
4.2.5. Мощность конечного множества (1/5)
Теорема. Любое непустое конечное множество равномощно некоторому отрезку нату-
рального ряда: ∀ A (A 6= ∅ & |A| < ∞ =⇒ ∃ k ∈ N (|A| = |1..k|)) .
Доказательство. Рассмотрим следующую программу:
i ← 0 //счётчик элементов
while A 6= ∅ do
select x ∈ A //выбираем элемент
i ← i + 1 //увеличиваем счётчик
x 7→ i //ставим элементу в соответствие его номер
A ← A − x //удаляем элемент из множества
end while
Если эта программа не заканчивает работу, то она даёт соответствие B ∼ N для некото-
рого множества B ⊂ A, что невозможно ввиду конечности A. Значит, процедура закан-
чивает работу при i = k . Но в этом случае построено взаимно-однозначное соответствие
A ∼ 1..k .
312 / 907
4.2.5. Мощность конечного множества (2/5)
Лемма. Любое непустое подмножество множества натуральных чисел содержит наи-
меньший элемент.
Доказательство. Пусть A — произвольное подмножество множества натуральных чисел,
конечное или бесконечное. Рассмотрим задание множества A следующей порождающей
процедурой:
n ← 0 //переменная для натуральных чисел
while true do
n ← n + 1 //следующее натуральное число
if n ∈ A then
yield n //число входит в множество A
end if
end while
Ясно, что множество A действительно порождается этой процедурой, причём тот элемент,
который порождается первым, является наименьшим.
313 / 907
4.2.5. Мощность конечного множества (3/5)
Теорема. Любой отрезок натурального ряда конечен:

∀ n ∈ N (|1..n| < ∞) .

Доказательство. От противного. Пусть существуют бесконечные отрезки натурального ря-


да. Рассмотрим наименьшее n такое, что |1..n| = ∞. Тогда отрезок 1..n равномощен
некоторому своему собственному подмножеству A: |1..n| = |A|, A ( 1..n, то есть суще-
ствует взаимно-однозначное соответствие 1..n ∼ A. Пусть при этом соответствии n ↔ i.
Может случиться так, что n ∈ A и n 6= i. Тогда «подправим» соответствие так, что n ↔ n
и i ↔ i. Рассмотрим теперь соответствие между отрезком 1..(n − 1) и его собственным
подмножеством A − i, задаваемое соответствием между отрезком 1..n и множеством A.
Это соответствие является взаимно-однозначным, а значит, отрезок 1..(n−1) изоморфен
своему собственному подмножеству и является бесконечным, что противоречит выбору
n.

314 / 907
4.2.5. Мощность конечного множества (4/5)
Следствие. Различные отрезки натурального ряда неравномощны:

n 6= m =⇒ |1..n| =
6 |1..m|.
Доказательство. Пусть для определённости n > m. Тогда 1..m ⊂ 1..n и 1..m 6= 1..n. Если
|1..n| = |1..m|, то |1..n| = ∞, что противоречит теореме.
Замечание. Это следствие часто излагают в следующей форме: если n 6= m, то n кроли-
ков невозможно рассадить в m ящиков так, чтобы в каждом ящике было по одному кро-
лику. Действительно, если бы рассадить кроликов было возможно, то было бы установле-
но взаимно-однозначное соответствие между различными отрезками натурального ря-
да. Это утверждение называется принцип Дирихле.
Говорят, что конечное множество A имеет мощность k (обозначения: |A| = k , card A = k ,
#A = k ), если оно равномощно отрезку 1..k :
Def
|A| = k = A ∼ 1..k.
315 / 907
4.2.5. Мощность конечного множества (5/5)
Замечание. Таким образом, если множество A конечно, |A| = k , то элементы A всегда
можно перенумеровать, то есть поставить им в соответствие номера из отрезка 1..k с
помощью некоторой процедуры. Наличие такой процедуры подразумевается, когда упо-
требляется запись A = {a1 , . . . , ak }.
Def
По определению |∅| = 0.
Отступление. Определение мощности конечного множества как натурального числа позволяет
сравнивать конечные множества по мощности естественным и привычным образом, например,
констатировать, что A ⊂ B =⇒ |A| 6 |B|. Однако указанное определение мощности для конеч-
ных множеств не распространяется на бесконечные множества, поэтому сравнивать по мощно-
сти бесконечные множества надобно с большой осторожностью. Для этого вводятся кардиналь-
ные числа и другие трансфинитные построения. Точное определение соответствующих понятий
выходит за намеченные здесь рамки наивной теории множеств, поскольку эти понятия никогда
не используются в программировании.

316 / 907
4.2.6. Операции над множествами (1/4)
Обычно рассматриваются следующие операции над множествами:
Def
объединение: A ∪ B = {x | x ∈ A ∨ x ∈ B};
Def
пересечение: A ∩ B = {x | x ∈ A & x ∈ B};
Def
разность: A \ B = {x | x ∈ A & x ∈
/ B};
Def
симметрическая A M B = (A ∪ B) \ (A ∩ B);
Def
разность: A M B = {x | x ∈ A 6≡ x ∈ B};
Def
дополнение: / A}.
A = {x | x ∈

Результаты операций объединения, пересечения, разности и симметрической разности


множеств всегда определены и являются множествами. Операция дополнения подразу-
мевает, что задан некоторый универсум U : A = U \ A. В противном случае операция до-
полнения не определена.
Пример. Пусть A ←{1, 2, 3}, B ←{3, 4, 5}. Тогда A ∩ B = {3}, A ∪ B = {1, 2, 3, 4, 5},
A \ B = {1, 2}, A M B = {1, 2, 4, 5}.
317 / 907
4.2.6. Операции над множествами (2/4)
На рисунке приведены диаграммы Венна, иллюстрирующие операции над множествами.
Сами исходные множества изображаются фигурами (в данном случае прямоугольника-
ми), а результат выделяется графически (в данном случае для выделения использована
заливка серым).

В некоторых случаях операции над множествами выразимы через комбинации других


операций.
∪, ∩ ∪, \ ∪, M
A∪B = A∪B A∪B A∪B
A∩B = A∩B A \ (A \ B) (A ∪ B) M (A M B)
A\B = — A\B (A ∪ B) M B
AMB= — (A \ B) ∪ (B \ A) AMB
318 / 907
4.2.6. Операции над множествами (3/4)
∩, \ ∩, M \, M
A∪B = — (A M B) M (A ∩ B) (A M B) M (A \ (A \ B))
A∩B = A∩B A∩B A \ (A \ B)
A\B = A\B A M (A ∩ B) A\B
AMB= — AMB AMB
В то же время, в четырёх случаях выражения не существует.
Разность и симметрическая разность невыразимы через объединение и пересечение.
Действительно, если A = B 6= ∅, то A \ B = ∅, A M B = ∅, при этом любые ком-
бинации объединения и пересечения непустого множества с самим собой дают это же
самое множество.
Объединение и симметрическая разность невыразимы через пересечение и разность, по-
скольку результат пересечения и разности всегда является подмножеством первого ар-
гумента, и поэтому значение любого выражения, составленного из пересечений и разно-
стей, является подмножеством одного из исходных аргументов.
319 / 907
4.2.6. Операции над множествами (4/4)
Если множества A и B конечны, то из определений и диаграмм Венна ясно, что
|A ∪ B| = |A| + |B| − |A ∩ B|,
|A \ B| = |A| − |A ∩ B|,
|A M B| = |A| + |B| − 2|A ∩ B|.

Операции пересечения и объединения двух множеств допускают следующее обобщение.


Пусть задано семейство множеств {Ai }i∈I . Тогда
Def Def
[ \
Ai = {x | ∃ i ∈ I (x ∈ Ai )} , Ai = {x | ∀ i ∈ I (x ∈ Ai )} .
i∈I i∈I
Замечание. Если операция ассоциативна, то неважно, как расставлены скобки в выраже-
нии с этой операцией. В таком случае можно считать, что операция допускает перемен-
ное количество аргументов, два или более, и считать операцию
S групповой.
T Примерами
групповых операций являются
P введённые объединение
Q и пересечение , а также хо-
рошо известные сумма и произведение .
320 / 907
4.2.7. Разбиения и покрытия (1/5)
Пусть E = {Ei }i∈I — семейство подмножеств множества M ; Ei ⊂ M . Семейство E назы-
вается покрытием множества M , если каждый элемент M принадлежит хотя бы одному
из Ei :
∀ x ∈ M (∃ i ∈ I (x ∈ Ei )) .
Семейство E называется дизъюнктным, если элементы этого семейства попарно не пе-
ресекаются, то есть каждый элемент M принадлежит не более чем одному из множеств
Ei :
∀ i, j ∈ I (i 6= j =⇒ Ei ∩ Ej = ∅) .
Дизъюнктное покрытие называется разбиением множества M . Элементы разбиения, то
есть подмножества множества M , часто называют блоками разбиения.
Теорема. Если E = {Ei }i∈I есть дизъюнктное семейство подмножеств множества M ,
то существует разбиение B = {Bi }i∈I множества M такое, что каждый элемент дизъ-
юнктного семейства E является подмножеством блока разбиения B : ∀ i ∈ I (Ei ⊂ Bi ) .

321 / 907
4.2.7. Разбиения и покрытия (2/5)
Доказательство. Выберем произвольный элемент i0 ∈ I и построим семейство
B = {Bi }i∈I следующим образом:
[
Bi0 ← M \ Ei , ∀ i ∈ I − i0 (Bi ← Ei ) .
i∈I−i0

Семейство B по построению является дизъюнктным покрытием, то есть разбиением. Ясно,


что Ei0 ⊂ Bi0 , а для остальных элементов требуемое включение имеет место по постро-
ению.
Пример. Пусть M ←{1, 2, 3}. Тогда элементы дизъюнктного семейства
E = {E1 = {1}, E2 = {2}} являются подмножествами блоков разбиения
B = {E1 = {1, 3}, E2 = {2}}.
Следствие. Если все множества Ei конечны и множество индексов I конечно, а семейство
E = {Ei }i∈I дизъюнктно, то
[ X
Ei = |Ei |.


i∈I i∈I
322 / 907
4.2.7. Разбиения и покрытия (3/5)
Теорема. Если A ,→ B и A ←- B , то A ∼ B .
Доказательство. Определим операцию ∗ так: ∀ C ⊂ A (C ∗ ← A \ (B \ C ,→ )←- ).
Заметим, что D ⊂ C ⊂ A =⇒ D,→ ⊂ C ,→ ⊂ B =⇒ B \ C ,→ ⊂ B \ D,→ =⇒
=⇒ (B \ C ,→ )←- ⊂ (B \ D,→ )←- =⇒ A \ (B \ D,→ )←- ⊂ A \ (B \ C ,→ )←- =⇒ D∗ ⊂ C ∗ ⊂ A,
поскольку ∀ X, Y, Z (X ⊂ Y ⊂ Z =⇒ Z \ Y ⊂ Z \ X) (то есть введённая операция ∗
монотонна по включению). Заметим также, что (C ∪ D)∗ = C ∗ ∪ D∗ , поскольку
∀ X, Y, Z, W (X \ (Y \ (Z ∪ W )) = (X \ (Y \ Z)) ∪ (X \ (Y \ W ))) . Пусть теперь

M = {CS ⊂ A | C ⊂ C }. Семейство S M непустое:S∅ ∈ M∗. Рассмотрим множество
∗ ∗
S = C∈M C . Имеем S = C∈M C = C∈M C , значит S ⊂ S ∗ и S ∈ M.
По свойству монотонности получаем S ⊂ S ∗ ∗ , так что S ∗ ∈ M, а значит, S ∗ ⊂ S .

Таким образом, S = S ∗ = A \ (B \ S ,→ )←- , откуда A \ S = (B \ S ,→ )←- , поскольку


∀ X, Y, Z (X = Y \ Z =⇒ Z = Y \ X). Теперь рассмотрим разбиение множества
A = (A \ S) ∪ S и множества B = (B \ S ,→ ) ∪ S ,→ . Определим требуемое взаимно-
однозначное соответствие на подмножествах S и S ,→ с помощью вложения A ,→ B , а на
подмножествах A \ S и B \ S ,→ с помощью вложения A ←- B .
323 / 907
4.2.7. Разбиения и покрытия (4/5)
Приведём доказательство этой важной теоремы без опоры на понятие семейства.
Доказательство. Введём обозначения: A0 ← A, B0 ← B , B1 ← A,→ , A1 ← B ←- , и так
←-
далее, Bi+1 ← A,→
i , Ai+1 ← Bi . В этих обозначениях A0 ⊃ A1 ⊃ A2 ⊃ . . . ,
B0 ⊃ B1 ⊃ B2 ⊃ . . . , причём A0 ∼ B1 ∼ A2 ∼ . . . , B0 ∼ A1 ∼ B2 ∼ . . . ,
то есть Ai ∼ Ai+2 , Bi ∼ Bi+2 . Осталось доказать, что A0 ∼ A1 . Обозначим Ci ← Ai \Ai+1 .
Имеем Ci = Ai \ A Ti+1 ∼ Ai+2 \ Ai+1+2 = Ci+2 .
Обозначим C ← i Ai — «сердцевина», воз-
можно, пустая. По построению A0 = C0 ∪ C1 ∪
C2 ∪ · · · ∪ C и A1 = C1 ∪ C2 ∪ · · · ∪ C . Пусть
вложение A ,→ B элементу a ∈ A сопоставля-
ет элемент f (a) ∈ B , а вложение A ←- B эле-
менту b ∈ B сопоставляет элемент g(b) ∈ A.
Тогда построим соответствие h из A0 в A1 : h(a) ← if a ∈ C2n then g(f (a)) else a end if. Это
соответствие взаимно-однозначно. В самом деле, h(C2n ) = C2n+2 , h(C2n+1 ) = C2n+1 , и
h(C) = C . Таким образом, h(A0 ) = h(C0 ∪ C1 ∪ C2 ∪ · · · ∪ C) = C1 ∪ C2 ∪ · · · ∪ C = A1 ,
и значит A0 ∼ A1 . 324 / 907
4.2.7. Разбиения и покрытия (5/5)
Замечание. Доказанное утверждение в отечественной традиции называется теоремой
Кантора–Бернштейна, а в зарубежной традиции — теоремой Шрёдера–Бернштейна.
Следствие. Если A ⊂ B ⊂ C и A ∼ C , то B ∼ C .
Доказательство. B ⊂ C =⇒ B ,→ C , A ⊂ B & A ∼ C =⇒ B ←- C
Отступление. Для случая конечных множеств теорема Кантора–Бернштейна представляется инту-
итивно очевидной. Однако доказательство теоремы для общего случая оказывается сравнительно
сложным. Это не случайно, при трансфинитных построениях интуиция часто подводит, поскольку
рассуждения не опираются на повседневный опыт. В таких случаях формализация оказывается
более надёжным инструментом по сравнению с интуицией.
Пример. Пусть A — множество точек квадрата, а B — множество то-
чек вписанного в него круга. С одной стороны, поскольку круг впи-
сан в квадрат, имеем
√ B ,→ A. С другой стороны, исходный квадрат
можно сжать в 2/2 раз (биекция), получив квадрат A0 , и вписать
его в круг так, что A ∼ A0 ,→ B . Получаем A ∼ B , причём соответ-
ствие хорошо видно на рисунке: белые точки соответстствуют√ сами
себе, а чёрные точки сопоставляет друг другу гомотетия 1/ 2.
325 / 907
4.2.8. Булеан (1/4)
Множество всех подмножеств множества M называется булеаном множества M и обо-
значается 2M :
Def
2M = {A | A ⊂ M } .
Теорема. Если множество M конечно, то |2M | = 2|M | .
Доказательство. Индукция по |M  |. База: если |M | = 0, то M = ∅ и 2 = {∅}. Пусть

M |M |
∀ M |M  | < kM=⇒ |2 | = 2 . Рассмотрим
 M = {a 1 , . . . , ak }, |M | = k . Положим
M1 ← X ∈ 2 | a k ∈ / X и M2 ← X ∈ 2 | ak ∈ X . Имеем 2M = M1 ∪ M2 ,
M

M1 ∩ M2 = ∅, M1 ∼ M2 за счёт взаимно-однозначного соответствия X ↔ X + ak


и M1 ∼ 2{a1 ,...,ak−1 } . По индукционному предположению |2{a1 ,...,ak−1 } | = 2k−1 , и, значит,
|M1 | = |M2 | = 2k−1 . Следовательно, |2M | = |M1 | + |M2 | = 2k−1 + 2k−1 = 2k .
Примеры. 2∅ = {∅}; |2∅ | = 2|∅| = 20 = 1.
2{1} = {∅, {1}}; |2{1} | = 2|{1}| = 21 = 2.
Применение операций к подмножествам универсума не выводит за его пределы.
Множество всех подмножеств множества U с операциями пересечения, объединения,
разности и дополнения образует алгебру подмножеств множества U .
326 / 907
4.2.8. Булеан (2/4)
В булеане 2M естественно выделяются семейства подмножеств C k (M ), состоящие из под-
множеств множества M , имеющих одинаковую мощность k , то есть
C k (M ) = {S ⊂ M | k = |S|}. Такие семейства называются семействами равномощных
подмножеств. Заметим, что семейства равномощных подмножеств, за исключением
C 0 (M ), являются покрытиями множества M , а C 1 (M ) — семейство одноэлементных под-
множеств множества M — является разбиением. Кроме того, семейства C k (M ) не пере-
секаются. Если |M | = n, то очевидно, что
n
[ n
X
M k n
2 = C (M ) и 2 = |C k (M )|.
k=0 k=0
Замечание. В п. 2.1.5. показано, что мощность семейства равномощных подмножеств
C k (M ) является биномиальным коэффициентом, |C k (M )| = C(n, k).
Пример. Множество всех подмножеств множества {1, 2, 3} содержит одно несобствен-
ное подмножество ∅, семейство из трёх одноэлементных подмножеств {1}, {2}, {3}, се-
мейство из трёх двухэлементных подмножеств {1, 2}, {2, 3}, {1, 3} и одно несобствен-
ное подмножество {1, 2, 3}.
327 / 907
4.2.8. Булеан (3/4)
Неравномощные множества можно сравнивать. Если множества A и B неравномощны,
|A| 6= |B|, и при этом в множестве B существует собственное подмножество C , C B ,
такое что |A| = |C|, то говорят, что множество B мощнее множества A и записывают это
так: |A| < |B|. Более формально:
Def
|A| < |B| = A ,→ B & |A| =
6 |B|.
Теорема. Булеан множества мощнее множества: |A| < |2A |.
Доказательство. От противного. Пусть A — некоторое множество и существует взаимно-
f
однозначное соответствие A ∼ 2A . Положим Y ← {x ∈ A | x ∈ / f (x)}. Имеем Y ∈ 2A ,
значит ∃ y ∈ A (f (y) = Y ). Рассмотрим элемент y и множество Y . Если y ∈ Y , то y ∈
/ Y,
а если y ∈
/ Y , то y ∈ Y — противоречие. Следовательно, соответствие f не существует, а
значит множество и его булеан неравномощны. Но множество A равномощно множеству
одноэлементных подмножеств, которое является собственным подмножеством булеана,
A ∼ C 1 (A).
Def
Замечание. Иногда используют обозначение |A| 6 |B|, полагая |A| 6 |B| = A ,→ B .
328 / 907
4.2.8. Булеан (4/4)
Следствие. Не существует множества всех множеств.
Доказательство. От противного. Пусть множество всех множеств существует, обозначим
его U . Тогда U ∼ C 1 (U ) ⊂ 2U , и значит U ,→ 2U . С другой стороны, все элементы булеана
также являются множествами, ∀ X ∈ 2U (X ∈ U ), то есть 2U ⊂ U , и значит 2U ,→ U . По
теореме Кантора–Бернштейна имеем U ∼ 2U , что противоречит |U | < |2U |.
Замечание. Это следствие известно как парадокс Кантора.
Пример. Множества всех конечных множеств также не существует. Действительно, пусть
такое множество M существует. Тогда ∀ A (A ,→ M ): a 7→ {a}, a ∈ A, {a} ∈ M , и значит
|A| 6 |M |. Если взять A ← 2M , то |2M | 6 |M |, что противоречит теореме Кантора.
Отступление. При обобщении любой теории неизбежно возникают трудные вопросы, на которые
надобно ответить для обоснования обобщения. Разобранный парадокс Кантора является приме-
ром ответа на такой вопрос в наивной теории множеств. Другие примеры трудных вопросов: су-
ществует ли надмножество всех множеств? Существует ли множество максимальной мощности?
Существует ли множество Y , такое что |X| < |Y | < |2X | для бесконечного множества X ? (обоб-
щённая континуум-гипотеза). При поиске ответа на трудные вопросы следует оценить, окупит ли
найденный ответ затраты на решение вопроса? 329 / 907
4.2.9. Свойства операций над множествами (1/4)
Теорема. Пусть A, B, C ⊂ U 6= ∅. Тогда операции над множествами обладают
следующими свойствами:
1) идемпотентность: A ∪ A = A, A ∩ A = A;
2) коммутативность: A ∪ B = B ∪ A, A ∩ B = B ∩ A;
3) ассоциативность: A ∪ (B ∪ C) = (A ∪ B) ∪ C ,
A ∩ (B ∩ C) = (A ∩ B) ∩ C ;
4) дистрибутивность: A ∪ (B ∩ C) = (A ∪ B) ∩ (A ∪ C),
A ∩ (B ∪ C) = (A ∩ B) ∪ (A ∩ C);
5) поглощение: (A ∩ B) ∪ A = A, (A ∪ B) ∩ A = A;
6) свойства нуля: A ∪ ∅ = A, A ∩ ∅ = ∅;
7) свойства единицы: A ∪ U = U, A ∩ U = A;
8) инволютивность дополнения: A = A;
9) законы де Моргана A ∩ B = A ∪ B, A ∪ B = A ∩ B ;
10) свойства дополнения: A ∪ A = U, A ∩ A = ∅;
11) выражение для разности: A \ B = A ∩ B.
330 / 907
4.2.9. Свойства операций над множествами (2/4)
Доказательство. Для первого равенства: x ∈ A ∪ A ⇐⇒ x ∈ A ∨ x ∈ A ⇐⇒ x ∈ A.
Аналогично и для остальных равенств.
Отступление. Чтобы наглядно усмотреть справедливость указанных равенств, очень полезно на-
рисовать соответствующие диаграммы Венна.
Введённые операции над множествами — объединение, пересечение, разность и сим-
метрическая разность — примечательны тем, что определены для любых множеств, по-
скольку элементы множества-результата берутся из множеств-операндов.
Замечание. Если наложить ограничение, что в результат операции над множествами вхо-
дят только элементы операндов, то набор из четырёх введённых операций оказывается
исчерпывающим.
Однако в алгебре подмножеств любого множества U возможно определять такие опера-
ции, в результаты которых входят элементы множества U , не входящие в операнды.
Def
Пример. Результат операции дополнения A = {a ∈ U | a 6∈ A} состоит из элементов,
которые не входят в операнд.
331 / 907
4.2.9. Свойства операций над множествами (3/4)
Рассмотрим ещё две операции: | и ↓ над подмножествами множества U :
Def Def
A | B = {x ∈ U | x 6∈ A ∨ x 6∈ B} , A ↓ B = {x ∈ U | x 6∈ A & x 6∈ B} .
Замечание. В алгебре подмножеств эти операции обычно не рассматриваются, а потому
не именуются. Аналогичные операции в алгебре логики называются штрих Шеффера и
стрелка Пирса, соответственно.
Нетрудно показать, что введённые здесь операции выражаются через привычные опера-
ции над множествами:
A | B = U \ (A ∩ B) = A ∩ B = A ∪ B, A ↓ B = U \ (A ∪ B) = A ∪ B = A ∩ B.
Это наблюдение позволяет заметить, что некоторые нетривиальные свойства привычных
операций выполняются и для вновь введённых операций, например, законы де Моргана
A | B = A ↓ B, A ↓ B = A | B.
Замечание. Если определена инволютивная операция дополнения, то операции, для ко-
торых выполняются законы де Моргана, называются двойственными. Двойственными яв-
ляются пересечение и объединение, штрих Шеффера и стрелка Пирса. 332 / 907
4.2.9. Свойства операций над множествами (4/4)
Все традиционные операции над множествами непосредственно выражаются как через
штрих Шеффера, так и через стрелку Пирса:
A = A ∪ A = A | A = A ∩ A = A ↓ A,
A ∪ B = (A | A) | (B | B) = (A ↓ B) ↓ (A ↓ B),
A ∩ B = (A | B) | (A | B) = (A ↓ A) ↓ (B ↓ B),
A \ B = A ∩ B = (A | (B | B)) | (A | (B | B)) = (A ↓ A) ↓ B,
A4B = (A \ B) ∪ (B \ A) = (((A ↓ A) ↓ B) ↓ ((B ↓ B) ↓ A)) ↓ (((A ↓ A) ↓ B) ↓ ((B ↓ B) ↓ A)).
Отступление. Отмеченные свойства операций бывают присущи различным операциям, в частно-
сти, они присущи арифметическим операциям с числами. Однако операции над множествами от-
личаются от числовых операций в следующем существенном аспекте. Образно говорят, что би-
нарная операция  обладает памятью, если по результату операции и одному из операндов мож-
но восстановить второй операнд. Другими словами, если уравнение a  x = b имеет однозначное
решение, выражаемое через a и b. Например, в арифметике, если a + x = b, то x = b − a. Однако,
если A ∪ X = B , то в общем случае можно утверждать, что B \ A ⊂ X ⊂ B , но не более того.
333 / 907
4.3. Отношения

Обычное широко используемое понятие «отношение» имеет вполне точное математиче-


ское значение, которое вводится в этом разделе.
Формально отношения являются множествами, и четвёртую тему курса можно было бы
назвать «Множества, в том числе отношения». Однако с помощью отношений вводят в
рассмотрение целый ряд понятий и обозначений, которые находят, может быть, даже
больше применений, чем рассмотренные операции с множествами. В частности, широко
используемое понятие «граф», рассматриваемое в следующей теме, в сущности равно-
объёмно понятию «бинарное отношение».
Поэтому понятие «отношение» вполне правомерно поставить в один ряд с понятием
«множество».

334 / 907
4.3.1. Упорядоченные пары и наборы (1/2)
Если a и b — объекты, то через (a, b) обозначим упорядоченную пару. Равенство упорядо-
ченных пар определяется следующим образом:
Def
(a, b) = (c, d) = a = c & b = d.
Вообще говоря, (a, b) 6= (b, a), если a 6= b.
Пример. Место в зрительном зале обычно определяется парой натуральных чисел: номер
ряда и номер места в ряду.
Замечание. Формально, упорядоченные пары можно определить как множества, если
Def
определить их так: (a, b) = {{a}, {a, b}}. Таким образом, введённое понятие упорядо-
ченной пары не выводит рассмотрение за пределы наивной теории множеств.
Аналогично упорядоченным парам можно рассматривать упорядоченные тройки, четвёр-
ки и т. д. В общем случае подобные объекты называются n-ками, кортежами, наборами
или (конечными) последовательностями. Упорядоченный набор из n элементов обозна-
чается (a1 , . . . , an ).
Замечание. Обычно элементы последовательности считают однотипными, то есть при-
надлежащими одному множеству, хотя, вообще говоря, это не обязательно. 335 / 907
4.3.1. Упорядоченные пары и наборы (2/2)
Набор (a1 , . . . , an ) можно определить рекурсивно, используя понятие упорядоченной па-
Def
ры: (a1 , . . . , an ) = ((a1 , . . . , an−1 ) , an ) . Количество элементов в наборе называется его
длиной и обозначается следующим образом: |(a1 , . . . , an )|.
Замечание. Наиболее естественным представлением в программе n-ки с элементами из
множества A является массив array [1..n] of A.
Теорема.
 Два набора одной длины равны, если равны  их соответствующие элементы:
n
V
∀n (a1 , . . . , an ) = (b1 , . . . , bn ) ⇐⇒ ai = b i .
i=1
Доказательство. Индукция по n. База: при n = 2 по определению равенства упорядочен-
n−1
V
ных пар. Пусть теперь (a1 , . . . , an−1 ) = (b1 , . . . , bn−1 ) ⇐⇒ ai = bi . Тогда
i=1
(a1 , . . . , an ) = (b1 , . . . , bn ) ⇐⇒ ((a1 , . . . , an−1 ) , an ) = ((b1 , . . . , bn−1 ) , bn ) ⇐⇒
Vn
⇐⇒ (a1 , . . . , an−1 ) = (b1 , . . . , bn−1 ) & an = bn ⇐⇒ ai = b i .
i=1
Отсюда следует, что порядок «отщепления» элементов в рекурсивном определении кор-
тежа не имеет значения.
336 / 907
4.3.2. Прямое произведение множеств (1/2)
Пусть A и B — два множества. Прямым (декартовым) произведением двух множеств A и B
называется множество всех упорядоченных пар, в которых первый элемент принадлежит
множеству A, а второй принадлежит множеству B :
Def
A × B = {(a, b) | a ∈ A & b ∈ B} .
Замечание. Точка на плоскости может быть задана упорядоченной парой координат, т. е.
двумя точками на координатных осях. Таким образом, R2 = R × R. Своим появлением
метод координат обязан Декарту, отсюда и название «декартово произведение».
Теорема. Если множества A и B конечны, то |A × B| = |A| |B|.
Доказательство. Первый компонент упорядоченной пары можно выбрать |A| способами,
второй — |B| способами, причём независимо от выбора первого элемента. Таким обра-
зом, всего имеется |A||B| различных упорядоченных пар.
Понятие прямого произведения допускает обобщение.
Def
A1 × · · · × An = {(a1 , . . . , an ) | a1 ∈ A1 & . . . & an ∈ An } .
337 / 907
4.3.2. Прямое произведение множеств (2/2)
В прямом произведении A1 × · · · × An множества Ai не обязательно различны.
Следствие. |A1 × · · · × An | = |A1 | · · · · · |An |.
Прямое произведение нескольких множеств можно вычислять в произвольном порядке.
Лемма. (A × B) × C ∼ A × (B × C).
Доказательство. (A × B) × C = {((a, b), c) | (a, b) ∈ A × B & c ∈ C} =
(a,b,c)↔(a,(b,c))
= {(a, b, c) | a ∈ A & b ∈ B & c ∈ C} ∼
∼ {(a, (b, c)) | a ∈ A & (b, c) ∈ B × C} = A × (B × C).
Степенью множества A называется его n-кратное прямое произведение самого на себя.
Def Def Def
Обозначение: An = A · · × A} . Соответственно, A1 = A, A2 = A × A и вообще
| × ·{z
n раз

Def
An = An−1 × A.

Следствие. |An | = |A|n .


338 / 907
4.3.3. Бинарные отношения (1/4)

Бинарным отношением между множествами A и B называется тройка hA, B, Ri, где R —


подмножество прямого произведения A и B : R ⊂ A×B. Множество R называется графи-
ком отношения, A называется областью отправления, а B — областью прибытия. Если
множества A и B определены контекстом, то часто просто говорят, что задано отноше-
ние R. При этом для краткости отношение обозначают тем же символом, что и график.
Замечание. Принято говорить «отношение между множествами», хотя порядок множеств
имеет значение и отношение между A и B совсем не то же самое, что отношение меж-
ду B и A. Поэтому иногда, чтобы подчеркнуть это обстоятельство, употребляют оборот
«отношение R из множества A в множество B ».
Среди элементов множеств A и B могут быть такие, которые входят в одну или несколько
пар, определяющих отношение R, а могут быть такие, которые не входят ни в одну из пар,
определяющих отношение R.

339 / 907
4.3.3. Бинарные отношения (2/4)
Множество элементов области отправления, которые присутствуют в парах отношения,
называется областью определения отношения R и обозначается Dom R, а множество эле-
ментов области прибытия, которые присутствуют в парах отношения, называется обла-
стью значений отношения R и обозначается Im R:
Def
Dom R = {a ∈ A | ∃ b ∈ B ((a, b) ∈ R)} , Dom R ⊂ A
Def
Im R = {b ∈ B | ∃ a ∈ A ((a, b) ∈ R)} , Im R ⊂ B .
Если A = B (R ⊂ A2 ), то говорят, что R есть отношение на множестве A. Для бинарных
Def
отношений обычно используется инфиксная форма записи : aRb = (a, b) ∈ R ⊂ A × B.
Инфиксная форма позволяет более кратко записывать некоторые формы утверждений
Def
относительно отношений: aRbRc = (a, b) ∈ R &(b, c) ∈ R.
Пример. Пусть задано множество U . Тогда ∈ (принадлежность) — отношение между эле-
ментами множества U и элементами булеана 2U , а ⊂ (включение) и = (равенство) — от-
ношения на 2U . Хорошо известны отношения =, <, 6, >, >, 6= между числами.
340 / 907
4.3.3. Бинарные отношения (3/4)
Пусть R — отношение между множествами A и B : R ⊂ A × B . Введём следующие поня-
тия:
Def
Обратное отношение: R−1 = {(b, a) | (a, b) ∈ R} ⊂ B × A.
Def
Дополнение отношения: R = {(a, b) | (a, b) ∈ / R} ⊂ A × B .
Def
Универсальное отношение: U = {(a, b) | a ∈ A & b ∈ B} = A×B .
Пример. Графики отношений
R = {(x, y) | 4 > x − y > 1},
x ∈ 1..5, y ∈ 1..4 и
R−1 = {(x, y) | 4 > y − x > 1},
x ∈ 1..4, y ∈ 1..5.

341 / 907
4.3.3. Бинарные отношения (4/4)
На любом множестве можно определить тождественное отношение:
Def
I = {(a, a) | a ∈ A} ⊂ A2 . Обычно для обозначения тождественного отношения исполь-
зуют знак равенства =.
Примеры. Равенство множеств и равенство чисел — тождественные отношения.
Замечание. График тождественного отношения на множестве A иногда называют диаго-
налью в A × A.
Обобщённое понятие отношения: n-местное (n-арное) отношение R — это подмножество
прямого произведения n множеств, то есть множество кортежей:
Def
R ⊂ A1 × · · · × An = {(a1 , . . . , an ) | a1 ∈ A1 & . . . & an ∈ An } .
Обычно вместо (a1 , . . . , an ) ∈ R пишут R(a1 , . . . , an ). Число n, то есть длину кортежей
отношения, называют иногда вместимостью.
Отступление. Многоместные отношения используются, например, в теории баз данных. Само на-
звание «реляционная» база данных происходит от слова relation (отношение).
Далее рассматриваются только двуместные (бинарные) отношения, при этом слово «би-
нарные» опускается.
342 / 907
4.3.4. Композиция отношений (1/2)
Пусть R1 ⊂ A × C — отношение из A в C , а R2 ⊂ C × B — отношение из C в B .
Композицией двух отношений R1 и R2 называется отношение R ⊂ A × B из A в B ,
определяемое следующим образом:
Def
R = R1 ◦ R2 = {(a, b) | a ∈ A & b ∈ B & ∃ c ∈ C (aR1 c & cR2 b)} .
Другими словами, a(R1 ◦ R2 )b ⇐⇒ ∃ c ∈ C (aR1 c & cR2 b) .
Теорема. Композиция отношений ассоциативна, то есть
∀R1 ⊂ A × B, R2 ⊂ B × C, R3 ⊂ C × D ((R1 ◦ R2 ) ◦ R3 = R1 ◦ (R2 ◦ R3 )) .
Доказательство.
a(R1 ◦ R2 ) ◦ R3 d ⇐⇒ ∃ c ∈ C (aR1 ◦ R2 c & cR3 d) ⇐⇒
⇐⇒ ∃ c ∈ C ((∃ b ∈ B (aR1 b & bR2 c)) & cR3 d) ⇐⇒
⇐⇒ ∃ b ∈ B, c ∈ C (aR1 b & bR2 c & cR3 d) ⇐⇒
⇐⇒ ∃ b ∈ B (aR1 b & (∃ c ∈ C (bR2 c & cR3 d))) ⇐⇒
⇐⇒ ∃ b ∈ B (aR1 b & bR2 ◦ R3 d) ⇐⇒ aR1 ◦ (R2 ◦ R3 )d.
343 / 907
4.3.4. Композиция отношений (2/2)

Композиция отношений на множестве A является отношением на множестве A.


Пример. Композиция отношений < и 6 на множестве вещественных чисел совпадает с
отношением <: < ◦ 6 = <.
Замечание. В общем случае композиция отношений не коммутативна, то есть
R1 ◦ R2 6= R2 ◦ R1 .
Пример. На множестве людей определены отношения кровного родства и супружества.
Отношения «кровные родственники супругов» и «супруги кровных родственников» раз-
личны.
Из определения композиции непосредственно следует, что если S1 ⊂ R1 & S2 ⊂ R2 ,
то S1 ◦ S2 ⊂ R1 ◦ R2 .

344 / 907
4.3.5. Свойства отношений (1/4)
Пусть R ⊂ A2 . Тогда отношение R называется
рефлексивным, если ∀ a ∈ A (aRa);
антирефлексивным, если ∀ a ∈ A (¬aRa);
симметричным, если ∀ a, b ∈ A (aRb =⇒ bRa);
антисимметричным, если ∀ a, b ∈ A (aRb & bRa =⇒ a = b);
транзитивным, если ∀ a, b, c ∈ A (aRb & bRc =⇒ aRc);
линейным, если ∀ a, b ∈ A (a = b ∨ aRb ∨ bRa).
Замечание. Иногда линейное отношение R называют полным. Такой термин является
оправданным, поскольку для любых двух различных элементов, a и b, либо пара (a, b),
либо пара (b, a) принадлежит отношению R. Отношение, не обладающее свойством пол-
ноты, при этом вполне естественно называть частичным. Однако использование терми-
на «полное отношение» может порождать терминологическую путаницу. Дело в том, что
словосочетание «вполне упорядоченное множество», оказывается созвучным словосо-
четанию «множество с полным порядком», хотя эти словосочетания обозначают суще-
ственно различные объекты. Поэтому здесь термин «линейное отношение» считается ан-
тонимом термину «частичное отношение». 345 / 907
4.3.5. Свойства отношений (2/4)
Теорема. Пусть R ⊂ A × A — отношение на A. Тогда:

1. R рефлексивно ⇐⇒ I ⊂ R;
2. R симметрично ⇐⇒ R = R−1 ;
3. R транзитивно ⇐⇒ R ◦ R ⊂ R;
4. R антисимметрично ⇐⇒ R ∩ R−1 ⊂ I ;
5. R антирефлексивно ⇐⇒ R ∩ I = ∅;
6. R линейно ⇐⇒ R ∪ I ∪ R−1 = U .

Доказательство. Используя определения свойств отношений, имеем:


[ 1. ⇐⇒ ] ∀ a ∈ A (aRa) ⇐⇒ ∀ a ∈ A ((a, a) ∈ R) ⇐⇒ I ⊂ R.
[ 2. ⇐⇒ ] ∀ a, b ∈ A (aRb =⇒ bRa) ⇐⇒ ∀ a, b ∈ A ((a, b) ∈ R =⇒ (b, a) ∈ R) ⇐⇒
⇐⇒ ∀ a, b ∈ A (((a, b) ∈ R =⇒ (b, a) ∈ R) & ((b, a) ∈ R =⇒ (a, b) ∈ R)) ⇐⇒
⇐⇒ ∀ a, b ∈ A (((a, b) ∈ R =⇒ (a, b) ∈ R−1 ) & ((a, b) ∈ R−1 =⇒ (a, b) ∈ R)) ⇐⇒
⇐⇒ R ⊂ R−1 & R−1 ⊂ R ⇐⇒ R = R−1 .
346 / 907
4.3.5. Свойства отношений (3/4)
Доказательство.(Продолжение)
[ 3. ⇐⇒ ] ∀ a, b, c ∈ A (aRb & bRc =⇒ aRc) ⇐⇒
⇐⇒ ∀ a, b, c ∈ A ((a, b) ∈ R & (b, c) ∈ R =⇒ (a, c) ∈ R) ⇐⇒
⇐⇒ ∀ a, c ∈ A (∃ b ∈ A ((a, b) ∈ R & (b, c) ∈ R) =⇒ (a, c) ∈ R) ⇐⇒
⇐⇒ ∀ a, c ∈ A ((a, c) ∈ R ◦ R =⇒ (a, c) ∈ R) ⇐⇒
⇐⇒ ∀ a, c ∈ A (aR ◦ Rc =⇒ aRc) ⇐⇒ R ◦ R ⊂ R.
[ 4. =⇒ ] От противного. R ∩ R−1 6⊂ I =⇒ ∃ a 6= b (aRb & aR−1 b) =⇒
=⇒ ∃ a 6= b (aRb & bRa).
[ 4. ⇐= ] R ∩ R−1 ⊂ I =⇒ (aRb & aR−1 b =⇒ a = b) =⇒ (aRb & bRa =⇒ a = b).
[ 5. =⇒ ] От противного. R ∩ I 6= ∅ =⇒
=⇒ ∃ a ∈ A (aRa & aIa) ⇐⇒ ∃ a ∈ A (aRa) ⇐⇒ ¬∀ a ∈ A (¬aRa).
[ 5. ⇐= ] R ∩ I = ∅ =⇒ ¬∃ a ∈ A (aRa) =⇒ ∀ a ∈ A (¬aRa).
[ 6. ⇐⇒ ] ∀ a, b ∈ A (a = b ∨ aRb ∨ bRa) ⇐⇒
⇐⇒ ∀ a, b ∈ A ((a, b) ∈ I ∨ (a, b) ∈ R ∨ (a, b) ∈ R−1 ) ⇐⇒
⇐⇒ U ⊂ I ∪ R ∪ R−1 ⇐⇒ U = R ∪ I ∪ R−1 .
347 / 907
4.3.5. Свойства отношений (4/4)
Пример. Пусть на множестве M = {1, 2, 3, 4} задано би-
нарное отношение R, график которого показан справа.
Какими из перечисленных свойств обладает это отно-
шение? Отношение R не является ни рефлексивным, ни
симметричным, ни транзитивным, ни линейным, ни анти-
рефлексивным, ни антисимметричным.
Свойства отношений не являются полностью независимыми, в некоторых случаях они
несовместны.
Пример. Отношение не может одновременно быть рефлексивным и антирефлексивным.
Теорема. Если отношение линейно, симметрично и транзитивно, то оно рефлексивно.
Доказательство. Рассмотрим R ⊂ M 2 . Пусть a ∈ M, b ∈ M, a 6= b. Тогда, в силу линей-
ности, aRb ∨ bRa, ввиду симметричности aRb & bRa и по транзитивности aRa.
Замечание. Однако из симметричности и транзитивности рефлексивность не вытекает.
Контрпример — пустое отношение, которое симметрично и транзитивно, но не линейно,
а потому и не рефлексивно.
348 / 907
4.3.6. Степень отношения и циклы (1/4)
Пусть R — отношение на множестве A. Степенью отношения R на множестве A называ-
ется его n-кратная композиция с самим собой. Обозначение:
Def
Rn = R
| ◦ ·{z
· · ◦ R} .
n раз

Def Def Def Def


Соответственно, R0 = I , R1 = R, R2 = R ◦ R и вообще Rn = Rn−1 ◦ R.
Если (a, b) ∈ Rn , то это значит, что ∃ c1 , . . . , cn−1 ∈ A (a R c1 R . . . R cn−1 R b). Последо-
вательность промежуточных элементов, если их индивидуальные имена не важны, обо-
значим для краткости ha R . . . R bi. Количество промежуточных элементов на 1 меньше
степени отношения. Заметим, что не все элементы в последовательности элементов обя-
зательно различны. Вполне может быть, что (a, a) ∈ Rn . В таком случае последователь-
ность ha R . . . R ai называется циклом. Количество вхождений отношения R в запись цик-
ла (т. е. степень отношения) называется длиной цикла.
349 / 907
4.3.6. Степень отношения и циклы (2/4)

Примеры. Простейший цикл длины 2 образует симметричная пара (a, b), такая что
aRb & bRa. Тройка элементов (a, b, c), такая что (a, b) ∈ R & (b, c) ∈ R & (c, a) ∈ R,
образует цикл длины 3 и называется треугольником и т. д.
Замечание. Строго говоря, рефлексивный элемент a, такой что (a, a) ∈ R = R1 , также
образует цикл длины 1 и называется петлёй. Однако такой цикл является тривиальным
и неинтересным с точки зрения свойств отношения в целом. Действительно, если aRa, то
∀ n (aRn a). По петле можно «накручивать» сколь угодно длинные циклы, и это не даёт
никакой новой информации. Поэтому петли обычно не считают циклами.
Отношение R на множестве A (R ⊂ A2 ) называется ациклическим, если оно не содержит
циклов, т. е. последовательностей ha R . . . R ai. Свойство ацикличности тесно связано с
другими свойствами отношений.

350 / 907
4.3.6. Степень отношения и циклы (3/4)

Лемма. [1] Если отношение R на множестве A антисимметрично и транзитивно, то оно


ациклично.
Доказательство. От противного. Пусть ha R b R . . . R ai — цикл. Тогда с одной стороны,
aRb, но с другой стороны, bRa по транзитивности, что противоречит антисимметрично-
сти.
Лемма. [2] Если отношение R на множестве A ациклично, то оно не симметрично и не
содержит симметричных пар aRb & bRa.
Доказательство. Действительно, каждая такая пара образует цикл длины 2.
Вообще говоря, допустимо рассматривать произвольные степени отношения, то есть по-
следовательности элементов и, в частности, циклы произвольной длины. Однако это не
имеет особого смысла, как показывает следующая теорема.

351 / 907
4.3.6. Степень отношения и циклы (4/4)
Теорема. Если некоторая пара (a, b) принадлежит какой-либо степени отношения R на
множестве A мощности n, то эта пара принадлежит и некоторой степени R не выше
n − 1:
R ⊂ A2 & |A| = n =⇒ ∀ a, b ∈ A ∃ k aRk b =⇒ ∃ k < n aRk b .
 

Доказательство. Обозначим c0 ← a, ck ← b. По определению

(a, b) ∈ Rk =⇒ ∃ c1 , . . . , ck−1 ∈ A (c0 Rc1 Rc2 R . . . Rck−1 Rck ) .


Далее, если |A| = n & k > n, то по принципу Дирихле ∃ i, j (ci = cj & i 6= j), то есть
цикл hci R . . . Rcj i, который можно удалить, получив последовательность меньшей дли-
ны c0 Rc1 R . . . Rci Rcj+1 R . . . Rck−1 Rck , то есть (a, b) ∈ Rk−(j−i) . Обозначим через d про-
цедуру, которая вычисляет пару чисел (i, j). Существование требуемого числа k (степени
отношения R) обеспечивается следующим построением:
while k > n do (i, j) ← d(); k ← k −S(j − i) endSwhile
∞ n−1
Следствие. R ⊂ A2 & |A| = n =⇒ i=1 Ri = i=1 Ri .
352 / 907
4.3.7. Ядро отношения (1/3)
Если R ⊂ A × B — отношение между множествами A и B , то композиция R ◦ R−1
называется ядром отношения R и обозначается ker R. Другими словами,
a1 ker R a2 ⇐⇒ ∃ b ∈ B (a1 R b & a2 R b) .
Примеры.
1. Пусть отношение N1 «находиться на расстоянии не более 1» на множестве целых
чисел определено следующим образом: N1 ← {(n, m) | |n − m| 6 1} . Тогда ядром
этого отношения является отношение N2 «находиться на расстоянии не более 2»:
N2 ← {(n, m) | |n − m| 6 2} .
2. Ядром отношения «быть знакомыми» является отношение «быть знакомыми или
иметь общего знакомого». 
3. Ядро отношения ∈ между M и 2M универсально: ∀ a, b ∈ M {a, b} ∈ 2M .
4. Ядро отношения ⊂ на 2M также универсально.
Ядро отношения R между A и B является отношением на A:
R ⊂ A × B =⇒ ker R ⊂ A2 .
353 / 907
4.3.7. Ядро отношения (2/3)
Примеры. (продолжение) 5. Рассмотрим отношение «тесного включения» на 2U :
+1 Def
X ⊂ Y = X ⊂ Y & |X| + 1 = |Y |.
+1
Ядром отношения ⊂ является отношение «отличаться не более чем одним элементом»:
+1 
ker ⊂= X, Y ∈ 2U | |X| = |Y | & |X ∩ Y | > |X| − 1 .
Замечание. Термин «ядро» и обозначение ker используются также и для других объектов.
Их не следует путать — из контекста обычно ясно, в каком смысле используется термин
«ядро».
Теорема. Ядро любого отношения рефлексивно и симметрично на области определения.
Доказательство.
[ Рефлексивность ] Пусть a ∈ Dom R. Тогда ∃ b ∈ B (aRb) =⇒
=⇒ ∃ b ∈ B (aRb & bR−1 a) =⇒ (a, a) ∈ R ◦ R−1 =⇒ a ker R a.
[ Симметричность ] Пусть a, b ∈ Dom R & a ker R b. Тогда ∃ c ∈ B (aRc & cR−1 b) =⇒
=⇒ ∃ c ∈ B (bRc & cR−1 a) =⇒ (b, a) ∈ R ◦ R−1 =⇒ b ker R a.
354 / 907
4.3.7. Ядро отношения (3/3)
Пример. Пусть на множестве M = {1, 2, 3, 4, 5, 6} задано бинарное отношение
R = {(x, y) | xy = 6}. Обратное отношение совпадает с исходным, а ядро рефлексивно
и симметрично, хотя и не линейно.

355 / 907
4.4. Замыкание и сокращение отношений

Замыкание является весьма общим математическим понятием. Неформально говоря, за-


мкнутость означает, что многократное выполнение допустимых шагов не выводит за опре-
делённые границы. Например, предел сходящейся последовательности чисел из замкну-
того интервала [a, b] обязательно принадлежит этому интервалу, а предел сходящейся
последовательности чисел из открытого (то есть не замкнутого) интервала (a, b) может
лежать вне этого интервала. В некоторых случаях можно «расширить» незамкнутый объ-
ект так, чтобы он оказался замкнутым.
Сокращение, или редукция, в некотором смысле противоположно замыканию. Если в за-
мыкание включается всё, что только можно получить из исходного объекта, то в сокра-
щение включается минимум информации из исходного объекта, но так, чтобы можно бы-
ло получить всё то, что несёт в себе исходный объект. Другими словами, замыкание ре-
дукции некоторого объекта совпадает с замыканием исходного объекта.

356 / 907
4.4.1. Транзитивное и рефлексивное замыкание (1/2)
Пусть R и R0 — отношения на множестве M . Отношение R0 называется замыканием от-
ношения R относительно свойства C , если
1) R0 обладает свойством C : C(R0 );
2) R0 является надмножеством R: R ⊂ R0 ;
3) R0 является наименьшим: C(R00 ) & R ⊂ R00 =⇒ R0 ⊂ R00 .
Пусть R+ — объединение положительных степеней R, а R∗ — объединение неотрица-
тельных степеней R:
∞ ∞
+ Def ∗ Def
[ [
i
R = R, R = Ri .
i=1 i=0
+
Теорема. R — транзитивное замыкание R.
Доказательство. Проверим выполнение свойств замыкания при условии, что свойство
C — это транзитивность.
[ C(R+ ) ] Пусть aR+ b & bR+ c. Тогда ∃ n (aRn b) & ∃ m (bRm c). Следовательно,
∃ c1 , . . . , cn−1 (aRc1 R . . . Rcn−1 Rb) и ∃ d1 , . . . , dm−1 (bRd1 R . . . Rdm−1 Rc). Таким обра-
зом, aRc1 R . . . Rcn−1 RbRd1 R . . . Rdm−1 Rc =⇒ aRn+m c =⇒ aR+ c.
357 / 907
4.4.1. Транзитивное и рефлексивное замыкание (2/2)
Доказательство. (Продолжение)

[ R ⊂ R+ ] R = R1 =⇒ R ⊂ Ri =⇒ R ⊂ R+ .
S
i=1 
[ C(R00 ) & R ⊂ R00 =⇒ R+ ⊂ R00 ] aR+ b =⇒ ∃ k aRk b =⇒
=⇒ ∃ c1 , . . . , ck−1 (aRc1 R . . . Rck−1 Rb); R ⊂ R00 =⇒ aR00 c1 R00 . . . R00 ck−1 R00 b =⇒ aR00 b.
Таким образом, R+ ⊂ R00 .
Следствие. R∗ — рефлексивное замыкание R+ .
Таким образом, R∗ — рефлексивное и транзитивное замыкание R.
Вычислить транзитивное замыкание заданного отношения можно следующим образом:
∞ n−1 n−1 n−1
+
[
i
[
i +
_
i
_ i
R = R = R =⇒ R = R = R .
i=1 i=1 i=1 i=1

Такое вычисление имеет сложность O(n4 ).


358 / 907
4.4.2. Алгоритм Уоршалла (1/2)
Следующий алгоритм Уоршалла вычисляет транзитивное замыкание за O(n3 ) шагов.
Вход: матрица отношения R: array[1..n, 1..n] of 0..1.
Выход: матрица замыкания T : array[1..n, 1..n] of 0..1.
T ←R
for i from 1 to n do
for j from 1 to n do
for k from 1 to n do
T [j, k] ← T [j, k] ∨ T [j, i] & T [i, k]
end for
end for
end for
Обоснование. До начала цикла T [j, k] = 1, если элементы j и k непосредственно свя-
заны отношением R без промежуточных элементов. На каждом шаге основного цикла
(по i) в транзитивное замыкание добавляются такие пары элементов с номерами j и k
(то есть T [j, k] ← 1), для которых существует последовательность промежуточных эле-
ментов с номерами в диапазоне 1..i, связанных отношением R (то есть j R . . . R k ).
359 / 907
4.4.2. Алгоритм Уоршалла (2/2)

Обоснование. (Окончание) Последовательность промежуточных элементов с номерами


из диапазона 1..i (эта последовательность отнюдь не обязательно включает все элемен-
ты с номерами из диапазона 1..i), связанных отношением R, для элементов с номерами
j и k существует в одном из двух случаев: либо уже существует последовательность про-
межуточных элементов с номерами из диапазона 1..i для пары элементов с номерами j
и k , либо существуют две последовательности элементов с номерами из диапазона 1..i —
одна для пары элементов с номерами j и i, а вторая для пары элементов с номерами i и
k . Именно это отражено в операторе T [j, k]←T [j, k] ∨ T [j, i] & T [i, k]. После окончания
основного цикла в качестве промежуточных рассмотрены все элементы, и, таким обра-
зом, построено транзитивное замыкание. Заметим, что в начале каждого шага цикла по
i матрица T содержит все пары с промежуточными элементами с номерами из диапазо-
на 1..(i − 1), а в конце этого шага по i — все пары с промежуточными элементами с но-
мерами из диапазона 1..i.

360 / 907
4.4.3. Транзитивное сокращение (1/6)
Транзитивным сокращением (или транзитивной редукцией, или минимальным представ-
лением) отношения R на множестве A называется наименьшее (по количеству элемен-
+
тов) отношение, обозначаемое R− , такое, что R− = R+ . Транзитивное сокращение со-
держит минимально необходимые данные, по которым, используя транзитивность, мож-
но восстановить транзитивное замыкание отношения в полном объёме.
Пример. На рисунке представлены (слева направо) графики отношения, его транзитив-
ного замыкания и транзитивной редукции, определённые на множестве 1..5.

361 / 907
4.4.3. Транзитивное сокращение (2/6)
Задача отыскания транзитивного сокращения заданного отношения R является практи-
чески значимой и не является тривиальной.
Действительно, обозначим R(R) = {S ⊂ A2 | S + = R+ } — семейство отношений, тран-
зитивные замыкания которых совпадают с транзитивным замыканием исходного отно-
шения. Ясно, что R(R) 6= ∅, поскольку R ∈ R(R), и ясно, что семейство отношений
2
R(R) может быть весьма велико, грубая оценка сверху |R(R)| 6 2|A| , поскольку состав
семейства R(R) не очевиден. Таким образом, налицо экстремальная задача: найти гло-
бальный минимум в обширном пространстве поиска. К счастью, некоторые свойства ис-
ходного отношения упрощают нахождение его транзитивного сокращения.
Замечание. Исторически идея транзитивной редукции возникла применительно к ориен-
тированным графам, как средство построить минимальный по числу дуг орграф, имею-
щий заданное отношение достижимости. Отсюда и происходит название «минимальное
представление». В такой постановке задача транзитивной редукции особенно наглядна.
Поэтому алгоритмы отыскания минимального представления удобнее формулировать на
языке графов, хотя они применимы к любым отношениям.
362 / 907
4.4.3. Транзитивное сокращение (3/6)
Лемма. [1] Пусть S, T ⊂ A2 — конечные ациклические отношения на множестве A и
S + = T + . Тогда если ∃ (a, b) ((a, b) ∈ S & (a, b) 6∈ T ), то (S \ {(a, b)})+ = S + .
Доказательство. Пусть (a, b) ∈ S & (a, b) 6∈ T . Поскольку S + = T + , существует после-
довательность промежуточных элементов haT . . . T bi. Обозначим один из этих проме-
жуточных элементов c. Тогда существуют последовательности haT . . . T ci и hcT . . . T bi,
но в силу того, что S + = T + , существуют и последовательности haS . . . Sci и hcS . . . Sbi.
Если предположить, что b ∈ haS . . . Sci, получаем две последовательности hbS . . . Sci и
hcS . . . Sbi, то есть цикл, что противоречит ацикличности S . Аналогично, если предполо-
жить, что a ∈ hcS . . . Sbi, получаем две последовательности haS . . . Sci и hcS . . . Sai, то
есть цикл, что также противоречит ацикличности S . Таким образом, пара (a, b) для по-
строения транзитивного замыкания S избыточна, что и доказывает требуемое равенство
(S \ {(a, b)})+ = S + .
Следствие. Если отношение R ациклично и конечно, то его транзитивное сокращение
единственно.
Доказательство. От противного. Пусть ∃ S, T (S = R− & T = R− & S 6= T ). Тогда по
лемме любое из сокращений можно ещё уменьшить, что противоречит их выбору. 363 / 907
4.4.3. Транзитивное сокращение (4/6)
Лемма. [2] Если отношение R ациклично и конечно, то семейство R(R) замкнуто отно-
сительно пересечения, то есть ∀ S, T ∈ R(R) (S ∩ T ∈ R(R)).
Доказательство. Пусть S, T ∈ R(R). Обозначим
{(a1 , b1 ), (a2 , b2 ), . . . , (ak , bk )} ← S \ T = S \ (S ∩ T ). Последовательно применяя лемму
1 имеем: (S \ {(a1 , b1 )} \ {(a2 , b2 )} \ · · · \ {(ak , bk )})+ = S + = R+ .
Но S \ {(a1 , b1 )} \ {(a2 , b2 )} \ · · · \ {(ak , bk )} = S ∩ T , значит (S ∩ T )+ = S + = R+
и (S ∩ T ) ∈ R(R).
Теорема. Если отношение R ациклично и конечно, то транзитивная редукция R− един-
ственна и определяется по формуле \
R− = S.
S∈R(R)
Доказательство. Отношение R конечно, поэтому и семейство R(R) конечно, следова-
тельно, R− всегда определено и единственно. По лемме 2 имеем R− ∈ R(R). Наконец,
∀ S ∈ R(R) (|R− | 6 |S|).
364 / 907
4.4.3. Транзитивное сокращение (5/6)
Следствие. Если отношение R ациклично и конечно, то транзитивное сокращение R−
обладает следующими свойствами:
1) R− ⊂ R;
2) ∀ (a, b) ∈ R− (¬∃haR− . . . R− bi);
3) R− = R \ (R ◦ R+ ).
Доказательство.
[ 1) ] R− = S∈R(R) S ⊆ R, поскольку R ∈ R(R);
T

[ 2) ] если ∃haR− . . . R− bi, то (R− \ {(a, b)})+ = (R− )+ , и значит, пару (a, b) можно
исключить из транзитивного сокращения, что противоречит его минимальности;
[ 3) ] cледует из того, что (a, b) ∈ R ◦ R+ ⇐⇒ ∃haR . . . Rbi.
Замечание. Транзитивное замыкание определено для любого отношения, единственно и
содержит исходное отношение. Если выполнены условия теоремы, то транзитивное со-
кращение также определено, единственно и содержится в исходном отношении. Однако
если условия теоремы не выполнены, то для транзитивного сокращения все условия мо-
гут нарушаться.
365 / 907
4.4.3. Транзитивное сокращение (6/6)
Пример. На рисунке слева представлен график отношения на множестве {1, 2, 3}, кото-
рое содержит четыре элемента (два цикла длины 2) и имеет в качестве транзитивного за-
мыкания универсальное отношение. При этом ни одну из пар нельзя исключить из отно-
шения так, чтобы транзитивное замыкание сохранилось. Однако справа на этом же ри-
сунке представлены графики двух различных отношений, у которых транзитивное замы-
кание также является универсальным отношением, но при этом в них всего по три эле-
мента. Обратите внимание, что ни одно из транзитивных сокращений не является под-
множеством исходного отношения!

366 / 907
4.4.4. Диаграммы Хассе (1/6)
В самом общем случае диаграммой Хассе для отношения R на множестве A (обозначение
H(R)) называется отношение
Def
H(R) = {(a, b) ∈ R & a 6= b | ¬∃ c ∈ A (a 6= c & c 6= b & aRc & cRb)} .
Другими словами, в диаграмму Хассе заданного отношения включаются только такие па-
ры элементов, которые являются «соседними».
Пример. Рассмотрим отношение «тесного включения» на 2U (см. пример 5 п. 4.3.7):
+1 Def
X ⊂ Y = X ⊂ Y & |X| + 1 = |Y |.
+1
Ядром отношения ⊂ является отношение «отличаться не более чем одним элементом»:
+1
ker ⊂= X, Y ∈ 2U | |X| = |Y | & |X ∩ Y | > |X| − 1 .


При этом отношение «тесного включения» является диаграммой Хассе для отношения
+1
включения на булеане 2U : H(⊂) = ⊂ .
367 / 907
4.4.4. Диаграммы Хассе (2/6)
Диаграмма Хассе, подобно транзитивному сокращению, более экономно представляет
исходное отношение. Однако диаграмма Хассе не тождественна транзитивному сокра-
щению хотя бы потому, что диаграмма Хассе обязательно является подмножеством ис-
ходного отношения, в то время как транзитивное сокращение может даже не пересе-
каться с исходным отношением. Более того, в некоторых случаях диаграммы Хассе мо-
жет быть недостаточно для восстановления самого отношения или его транзитивного
замыкания.
Примеры. На следующем рисунке: 1) все отношения совпадают со своими диаграммами
Хассе; 2) два отношения справа являются транзитивными сокращениями друг для друга;
3) для универсального отношения на трёх элементах диаграмма Хассе пуста.

368 / 907
4.4.4. Диаграммы Хассе (3/6)
Теорема. Если конечное отношение R антисимметрично и транзитивно, то H(R) = R− .
Доказательство. Антисимметричное транзитивное отношение ациклично (п. 4.3.6, лем-
ма 1), значит, действует теорема п. 4.4.3 и следствия к ней. По первому следствию
R− ⊂ R, а по второму следствию ∀ (a, b) ∈ R− (¬∃haR− . . . R− bi), и тем более
∀ (a, b) ∈ R− (¬∃ c ∈ A (a R c R b)). Таким образом, для транзитивного сокращения в
данном случае выполняются условия определения диаграммы Хассе.
Замечание. Антисимметричное и транзитивное отношение — это отношение порядка.
Мы видим, что для отношения порядка на конечном множестве диаграмма Хассе суще-
ствует и единственна. По этой причине обычно диаграммы Хассе рассматривают приме-
нительно только к упорядоченным множествам.
Замечание. Для отношений на бесконечных множествах диаграмма Хассе может не су-
ществовать, даже если эти множества упорядочены.
Примеры. Множество вещественных чисел R и множество рациональных чисел Q с обыч-
ным отношением порядка не имеют диаграмм Хассе: между любыми двумя элементами
всегда можно вставить третий.
369 / 907
4.4.4. Диаграммы Хассе (4/6)
Если отношение не является антисимметричным (и, тем самым, не является отношением
порядка), то диаграмма Хассе может не быть определена разумным образом, даже если
множество конечно.
Пример. Пусть U = A2 — универсальное отношение на конечном множестве A, |A| > 2.
Тогда H(U ) = ∅, поскольку ∀ a, b ∈ A (∃ c ∈ A (aU c & cU b)).
Пустая диаграмма Хассе, разумеется, не может служить средством редукции — инфор-
мация об исходном отношении теряется безвозвратно. Однако в некоторых случаях воз-
можно построить отношение, подобное по своим полезным свойствам диаграмме Хассе,
но не удовлетворяющее формальному определению
Пример. Пусть U = A2 — универсальное отношение на конечном множестве
A = {a1 , . . . , an }, n > 2. Тогда положим W ←{(a1 , a2 ), (a2 , a3 ), . . . , (an−1 , an ), (an , a1 )}.
Имеем W ⊂ U , W + = U + = U и ∀ (a, b) ∈ W (¬∃ c ∈ A (aW c & cW b)).
Замечание. Более подробно этот вопрос обсуждается в следующей теме.
Для любого ациклического отношения на конечном множестве диаграмма Хассе суще-
ствует, что показывает следующий алгоритм, очевидным образом следующий из преды-
дущих формул. 370 / 907
4.4.4. Диаграммы Хассе (5/6)
Вход: отношение R: array [1..n, 1..n] of 0..1.
Выход: диаграмма Хассе H : array[1..n, 1..n] of 0..1.
for i from 1 to n do
for j from 1 to n do
if R[i, j] = 1 then
H[i, j] ← 1 //возможно, это соседи
for k from 1 to n do
if R[i, k] = 1 & R[k, j] = 1 then
H[i, j] ← 0; exit for k //найден промежуточный элемент
end if
end for
else
H[i, j] ← 0 //диаграмма Хассе — подмножество
end if
end for
end for
371 / 907
4.4.4. Диаграммы Хассе (6/6)
Особенно удобным является графическое представление, из-за которого диаграммы Хассе
и получили название диаграмм. При этом элементы множества A изображаются в опре-
делённых фигурах, например, в кругах или овалах, а элементы самой диаграммы, т. е.
упорядоченные пары (a, b), изображаются в виде стрелочки, ведущей от a к b.
Пример. На рисунке приведён
пример диаграммы Хассе для от-
ношения включения на множестве
2{1,2,3} .

372 / 907
4.5. Отношения эквивалентности

Различные встречающиеся на практике отношения могут обладать (или не обладать) те-


ми или иными свойствами. Свойства, введённые в п. 4.3.5, встречаются особенно часто
(потому им и даны специальные названия). Более того, оказывается, что некоторые устой-
чивые комбинации этих свойств встречаются настолько часто, что заслуживают отдельно-
го названия и специального изучения.
Здесь рассматриваются классы отношений, обладающих определённым набором свойств.
Такое «абстрактное» изучение классов отношений обладает тем преимуществом, что,
один раз установив некоторые следствия из наличия у отношения определённого на-
бора свойств, далее эти следствия можно автоматически распространить на все конкрет-
ные отношения, которые обладают данным набором свойств. Рассмотрение начинается
отношениями эквивалентности (в этом разделе) и продолжается отношениями порядка
(в следующем разделе).

373 / 907
4.5.1. Классы эквивалентности (1/4)
Рефлексивное симметричное транзитивное отношение называется отношением эквива-
лентности. Обычно отношение эквивалентности обозначают знаком ≡.
Примеры.
1. Отношения равенства чисел, равенства множеств.
2. Отношение равномощности множеств.
3. Отношение между мультимножествами «иметь одинаковый состав».
4. Отношения между конечными последовательностями: «быть последовательностями
над одним и тем же мультимножеством» и «быть последовательностями над муль-
тимножествами одного состава». При этом первое из этих отношений является соб-
ственным подмножеством второго.
Пусть ≡ — отношение эквивалентности на множестве M , и x ∈ M . Подмножество эле-
ментов множества M , эквивалентных x, называется классом эквивалентности для x:
Def
[x]≡ = {y ∈ M | y ≡ x} .
Если отношение подразумевается, то нижний индекс опускают.
374 / 907
4.5.1. Классы эквивалентности (2/4)
Лемма. [1] ∀ a ∈ M ([a] 6= ∅).
Доказательство. a ≡ a =⇒ a ∈ [a].
Лемма. [2] a ≡ b =⇒ [a] = [b].
Доказательство. Пусть a ≡ b. Тогда x ∈ [a] ⇐⇒ x ≡ a ⇐⇒ x ≡ b ⇐⇒ x ∈ [b].
Лемма. [3] a 6≡ b =⇒ [a] ∩ [b] = ∅.
Доказательство. От противного: [a] ∩ [b] 6= ∅ =⇒ ∃ c ∈ M (c ∈ [a] ∩ [b]) =⇒
=⇒ c ∈ [a] & c ∈ [b] =⇒ c ≡ a & c ≡ b =⇒ a ≡ c & c ≡ b =⇒ a ≡ b, противоречие.

Теорема. Если ≡ — отношение эквивалентности на множестве M , то классы эквива-


лентности по этому отношению образуют разбиение множества M , причём среди эле-
ментов разбиения нет пустых. И обратно, всякое разбиение B = {Bi } множества M , не
содержащее пустых элементов, определяет отношение эквивалентности на множестве
M , классами эквивалентности которого являются элементы разбиения.
375 / 907
4.5.1. Классы эквивалентности (3/4)
Доказательство.
[ =⇒ ] Построение требуемого разбиения обеспечивается следующим алгоритмом.
Вход: множество M , отношение эквивалентности ≡ на M .
Выход: разбиение B множества M на классы эквивалентности.
B ← ∅ //вначале разбиение пусто
for a ∈ M do
for B ∈ B do
select b ∈ B //берём представителя из B
if a ≡ b then
B ← B + a //пополняем класс эквивалентности
next for a //переходим к новому элементу из M
end if
end for
B ← B ∪ {{a}} //вводим новый класс эквивалентности
end for
376 / 907
4.5.1. Классы эквивалентности (4/4)
Доказательство. (Продолжение)
[ ⇐= ] Положим a ≡ b ← ∃ i (a ∈ Bi & b ∈ Bi ). Тогда отношение ≡ рефлексивно, по-
S
скольку M = Bi =⇒ ∀ a ∈ M (∃ i (a ∈ Bi )) и a ∈ Bi =⇒ a ∈ Bi & a ∈ Bi =⇒ a ≡ a.
Отношение ≡ симметрично, поскольку
a ≡ b =⇒ ∃ i (a ∈ Bi & b ∈ Bi ) =⇒ ∃ i (b ∈ Bi & a ∈ Bi ) =⇒ b ≡ a.
Отношение ≡ транзитивно, поскольку
a ≡ b & b ≡ c =⇒ [a] = [b] & [b] = [c] =⇒ [a] = [c] =⇒ a ≡ c.
Если отношение f из множества A в множество B обладает таким свойством, что

(a, b) ∈ f & (a, c) ∈ f =⇒ b = c,

то говорят, что отношение f функционально или однозначно и называют просто функцией.


В следующем параграфе выявляется тесная связь функциональных отношений с отноше-
ниями эквивалентности.
377 / 907
4.5.2. Ядро функционального отношения (1/2)
Всякая функция f , будучи отношением, имеет ядро f ◦f −1 , которое является отношением
на области определения функции.
Замечание. Даже если f — функция, f −1 отнюдь не обязательно функция, поэтому здесь
◦ — знак композиции отношений, а не суперпозиции функций.
Теорема. Ядро функционального отношения является отношением эквивалентности на
множестве определения.
Доказательство. Пусть f : A → B . Можно считать, что Dom f = A и Im f = B .
[ Рефлексивность ] Пусть a ∈ A. Тогда ∃ b ∈ B (b = f (a)) =⇒ a ∈ f −1 (b) =⇒
=⇒ (a, b) ∈ f & (b, a) ∈ f −1 =⇒ (a, a) ∈ f ◦ f −1 .
[ Симметричность ] Пусть (a1 , a2 ) ∈ f ◦ f −1 . Тогда ∃ b (b = f (a1 ) & a2 ∈ f −1 (b)),
a1 ∈ f −1 (b) & b = f (a2 ) и b = f (a2 ) & a1 ∈ f −1 (b), откуда (a2 , a1 ) ∈ f ◦ f −1 .
[ Транзитивность ] Пусть (a1 , a2 ) ∈ f ◦ f −1 и (a2 , a3 ) ∈ f ◦ f −1 . Это означает, что
∃ b1 ∈ B (b1 = f (a1 ) & a2 ∈ f −1 (b1 )) и ∃ b2 ∈ B (b2 = f (a2 ) & a3 ∈ f −1 (b2 )). Тогда
b1 = f (a1 ) & b1 = f (a2 ) & b2 = f (a2 ) & b2 = f (a3 ) =⇒ b1 = b2 . Положим b ← b1 . Тогда
b = f (a1 ) & b = f (a3 ) =⇒ b = f (a1 ) & a3 ∈ f −1 (b) =⇒ (a1 , a3 ) ∈ f ◦ f −1 .
378 / 907
4.5.2. Ядро функционального отношения (2/2)
Замечание. Термин «ядро» применительно к функции f и обозначение ker f обычно ре-
зервируются для других целей, поэтому в формулировке предыдущей теоремы вместо
слова «функция» употреблён несколько тяжеловесный оборот «функциональное отно-
шение».
Пример. Функциональное
отношение R ⊂ 1..3 × 1..3,
y − 1 = (x − 2)2 , обратное
отношение и ядро отноше-
ния.
Следствие. Ядром биекции является тождественное отношение.
Пример. Биективное отно-
шение R ⊂ 1..3 × 1..3,
x + y = 4, обратное отноше-
ние и ядро отношения.

379 / 907
4.5.3. Фактормножество (1/3)
Если R — отношение эквивалентности на множестве M , то множество классов эквива-
лентности называется фактормножеством множества M относительно эквивалентности
Def
R и обозначается M/R: M/R = {[x]R }x∈M . Фактормножество является подмножеством
булеана: M/R ⊂ 2M .
Пример. Рассмотрим множество A = {1, 2, 3, 4} и отношение
эквивалентности R = {(1, 1), (2, 2), (3, 3), (4, 4), (1, 2), (2, 1),
(3, 4), (4, 3)}. Элементы исходного отношения обозначены за-
крашенными кружками, элементы исходного множества обо-
значены квадратиками, а элементы фактормножества обозна-
чены цветом квадратиков. В данном случае в фактормножестве
два элемента, поэтому использованы два цвета.
Теорема. Если f : A → B функция, то | Dom f / (f ◦ f −1 ) | = | Im f |.
Доказательство. Ядро функционального отношения является эквивалентностью на обла-
сти определения, и каждому классу эквивалентности взаимно однозначно соответствует
тот элемент области значений, в который отображаются элементы класса.
380 / 907
4.5.3. Фактормножество (2/3)
Функция nat R : M → M/R называется отождествлением (или натуральным отобра-
жением, или канонической проекцией) и определяется следующим образом:
Def
nat R(x) = [x]R .
Использование фактормножества вместо множества называется факторизацией.
Пусть задана функция f : A → B . Тогда ker f — это эквивалентность, которая определяет
фактормножество A/ ker f с элементами [x]ker f и функцию отождествления
nat : A → A/ ker f .
Определим индуцированную функцию из фактормножества в множество B :
f /ker f ← {(s, b) | s = [x]ker f & b = f (x)} .
Тогда исходная функция может быть факторизована, или разложена, в суперпозицию
f = (nat f ) ◦ (f /ker f ).
Заметим, что при этом сначала применяется отождествление, которое сюръективно, а
потом индуцированная функция, которая инъективна. 381 / 907
4.5.3. Фактормножество (3/3)
Понятие факторизации выглядит на первый взгляд формальным и искусственным, но это
один из самых востребованных приёмов построения полезных прикладных математиче-
ских моделей.
Пример. Пусть A — множество студентов, а B — множество проводимых занятий (в дан-
ный момент времени). Отношение «посещаемости» между студентами и занятиями функ-
ционально: студент может посещать (или прогуливать) только одно занятие. Значит, ядро
этого функционального отношения является эквивалентностью. Классы эквивалентности
по отношению посещаемости называются группами. Студентов одной группы объединяет
общий учебный план. При составлении расписания занятий обычно применяется факто-
ризация по группам (а также по курсам и факультетам). На стене вывешивается таблица
с расписанием, которая представляет индуцированную функцию. Функцию отождествле-
ния студент должен выполнить сам, и таким образом, удаётся компактно представить до-
вольно сложное отношение (количество элементов в исходных множествах исчисляется
тысячами).
382 / 907
4.5.4. Множества уровня
Пусть f : A → B — функция и f ◦f −1 — отношение эквивалентности на Dom f . Рассмотрим
фактормножество Dom f / (f ◦ f −1 ). Класс эквивалентности (элемент фактормножества)
— это подмножество элементов A, которые отображаются в один и тот же элемент b ∈ B .
Такие множества называются множествами уровня функции f .
Пример. Множество уровня 0 для функции sin(x) — это πZ.
Неформально множество уровня функции f , соответствующее значению c, — это множе-
ство решений уравнения f (x) = c.
Отступление. Термин «множество уровня» опирается на очевидные геометрические ассоциации.
Если нарисовать график функции одной переменной в обычной декартовой системе координат
и провести горизонтальную прямую на определённом уровне, то абсциссы точек пересечения с
графиком функции дадут множество уровня функции.
Пример. Пусть задано множество M , |M | = n. Рассмотрим функциональное отношение
(мощность) P между булеаном 2M и множеством неотрицательных целых чисел:
P ⊂ 2M × 0..n, где P ← {(X, k) | X ⊂ M & k ∈ 0..n & |X| = k}. Ядром является отно-
шение равномощности, а множествами уровня — семейства равномощных подмножеств.
383 / 907
4.5.5. Толерантность (1/2)

Рефлексивное симметричное отношение называется толерантностью. Отношение экви-


валентности является частным случаем отношения толерантности. В отличие от отноше-
ния эквивалентности, дающего разбиение множества элементов, на котором оно опре-
делено, отношение толерантности даёт покрытие этого множества. Действительно, пусть
T ⊂ A2 — отношение толерантности. Определим класс толерантности для элемента x
по отношению толерантности T как множество {y ∈ A | x T y}. Тогда семейство классов
толерантности образует покрытие множества A. На содержательном уровне толерант-
ность означает следующее: любой объект толерантен самому себе (рефлексивность), а
толерантность двух объектов не зависит от того, в каком порядке они рассматриваются
(симметричность). Однако, если один объект толерантен с другим, а этот другой — с тре-
тьим, то это вовсе не значит, что все три объекта толерантны между собой.

384 / 907
4.5.5. Толерантность (2/2)

Примеры.
1. Отношение знакомства на множестве людей. Иванов может быть знаком с Петровым,
Петров — с Сидоровым, но при этом Иванов и Сидоров могут не быть знакомы между
собой.
2. Отношение похожести между поисковыми запросами в системах информационного
поиска.
3. Отношение на множестве слов, которое задаётся как наличие хотя бы одной общей
буквы. В этом отношении находятся, например, пересекающиеся слова кроссворда.

385 / 907
4.5.6. Гомоморфизмы и изоморфизмы (1/5)
Пусть R — n-местное отношение на множестве X , причём R ⊂ X n ; а S — n-местное
отношение на множестве Y , причём S ⊂ Y n , n > 1. Тогда функция f : X → Y называется
гомоморфизмом, если
∀ x1 , . . . , xn ∈ X (R(x1 , . . . , xn ) = S(f (x1 ), . . . , f (xn ))) .
Пример. Пусть R — некоторое отношение эквивалентности на множестве A, а S — тож-
дественное отношение на фактор-множестве A/R. Тогда функция отождествления
nat R : A → A/R — это гомоморфизм.
Замечание. Образно говорят, что гомоморфизм из множества в множество «уважает» со-
ответствующие отношения на этих множествах.
Функция может быть гомоморфизмом и уважать одни отношения на множествах, и при
этом не уважать другие отношения на этих же множествах.
Пример. Рассмотрим функцию n div 2 + 1 на множестве натуральных чисел. Эта функция
уважает отношение порядка 6 на множестве натуральных чисел, поскольку n 6 m ⇐⇒
(n div 2 + 1) 6 (m div 2 + 1), но не уважает отношение неравенства 6=, поскольку 4 6= 5,
но 4 div 2 + 1 = 3 = 5 div 2 + 1.
386 / 907
4.5.6. Гомоморфизмы и изоморфизмы (2/5)
Биективный гомоморфизм называется изоморфизмом. Любая биекция f : X → Y уважа-
X Y X Y
ет тождественные отношения = и = на множествах X и Y : x1 = x2 ⇐⇒ f (x1 ) = f (x2 ).
Пример. Взаимно-однозначное соответствие между множествами является изоморфиз-
мом. Равномощные множества изоморфны относительно тождественных отношений.
Пусть X и Y — множества с определёнными на них n-местными отношениями R и S
соответственно, и f : X → Y — изоморфизм.
Теорема. Если f : X → Y — изоморфизм, то f −1 : Y → X — тоже изоморфизм.
Доказательство. Пусть x1 , . . . , xn ∈ X . Обозначим y1 ← f (x1 ), . . . , yn ← f (xn ),
где y1 , . . . , yn ∈ Y . Поскольку f — биекция, имеем x1 = f −1 (y1 ), . . . , xn = f −1 (yn ). Тогда
S(y1 , . . . , yn ) = S(f (x1 ), . . . , f (xn )) = R(x1 , . . . , xn ) = R(f −1 (y1 ), . . . , f −1 (yn )).
Если f : X → Y — изоморфизм, то множества X и Y называют изоморфными и этот факт
f
обозначают так: X ∼ Y . Если f ясно из контекста, то пишут просто X ∼ Y .
Замечание. Не всякая биекция является изоморфизмом.
Пример. Рассмотрим функцию изменения знака f : Z → Z, f (x) ← −x. Это биекция,
которая не уважает, например, отношение порядка <.
387 / 907
4.5.6. Гомоморфизмы и изоморфизмы (3/5)
Даже если множества равномощны, |X| = |Y |, отношения R ⊂ X n и S ⊂ Y n могут быть
таковы, что не существует изоморфизма, уважающего эти отношения.
Y
X
Пример. Пусть |X| = |Y |. Положим R ← =, S ← 6=. Тогда
∀ f : X → Y (x1 = x2 =⇒ ¬ (f (x1 ) 6= f (x2 ))).
В то же время, если задано n-местное отношение R на множестве X и биекция f : X → Y ,
то на множестве Y всегда возможно задать n-местное отношение S так, чтобы X ∼ Y .
Для этого достаточно определить
S ← (y1 , . . . , yn ) ∈ Y n | R(f −1 (y1 ), . . . , f −1 (yn )) .


Таким образом, если задано семейство множеств X = {X1 , . . . , Xn }, и на каждом мно-


жестве Xi ∈ X задано n-местное отношение Ri ⊂ Xin , то некоторые пары множеств мо-
гут оказаться изоморфными: Xi ∼ Xj , а другие — нет. Всё зависит от заданных отно-
шений. Семейство пар изоморфных множеств образует отношение изоморфности на се-
мействе множеств X .
Замечание. Неравномощные множества не могут быть изоморфны.
388 / 907
4.5.6. Гомоморфизмы и изоморфизмы (4/5)
Теорема. Изоморфность является отношением эквивалентности.
Доказательство.
[ Рефлексивность ] Функция x 7→ x — требуемый изоморфизм.
[ Симметричность ] Следует из предыдущей теоремы.
[ Транзитивность ] Пусть X , Y и Z — три множества с заданными на них n-местными
отношениями Rx , Ry и Rz соответственно, f : X → Y и g : Y → Z — изоморфизмы.
Тогда Rx (x1 , . . . , xn ) = Ry (f (x1 ), . . . , f (xn )) = Rz (g(f (x1 )), . . . , g(f (xn ))).
Всякий гомоморфизм индуцирует связанный изоморфизм.
Теорема. [О гомоморфизме] Если f : X → Y — гомоморфизм, то Dom f / ker f ∼ Im f .
Доказательство.
[ Биекция ] Рассмотрим индуцированную функцию g = f / ker f : Dom f / ker f → Y .
Функция g инъективна по построению. Функция h : Dom f / ker f → Im f , полученная из
g сокращением области прибытия, сюръективна, при этом так же как и g инъективна, а
значит, биективна.
389 / 907
4.5.6. Гомоморфизмы и изоморфизмы (5/5)
Доказательство. (Продолжение)
[ Гомоморфизм ] Пусть R — исходное n-местное отношение на множестве X . Оно инду-
цирует новое n-местное отношение Rf на множестве Dom f / ker f :
Rf ([x1 ], . . . , [xn ]) ← R(x1 , . . . , xn ). Представим функцию f в виде
f = (nat f ) ◦ (f / ker f ) = (nat f ) ◦ h.
Имеем
Rf ([x1 ], . . . , [xn ]) = R(x1 , . . . , xn ) = S(f (x1 ), . . . , f (xn )) = S(h([x1 ]), . . . , h([xn ])).
Пример. Рассмотрим множество слов A+ , заданных над алфавитом A, и отношение ра-
венства длин слов на нём. Также рассмотрим множество S конечных мультимножеств
букв из алфавита A и отношение равномощности на нём. Пусть f : A+ → S — функция,
отображающая слово в мультимножество составляющих его букв. Она является гомомор-
физмом относительно описанных отношений. Тогда по теореме о гомоморфизме множе-
ство всех множеств слов, составленных из одних и тех же букв, изоморфно множеству
мультимножеств этих букв.
390 / 907
4.6. Отношения порядка

В этом разделе определяются и описываются различные варианты отношений поряд-


ка. Отношение порядка позволяет сравнивать между собой различные элементы одного
множества. Фактически, интуитивные представления об отношениях порядка можно счи-
тать общеизвестными, и такие представления в этом курсе уже использованы при опи-
сании работы с упорядоченными списками. Однако при построении математических мо-
делей интуитивных представлений может оказаться недостаточно, и необходимо более
детальное описание свойств отношений порядка.

391 / 907
4.6.1. Предпорядок (1/2)

Рефлексивное транзитивное отношение называется отношением предпорядка (иногда ис-


пользуют термин квазипорядок). Отношение предпорядка обычно обозначают знаком v.
Отношение предпорядка, с одной стороны, является обобщением эквивалентности, а с
другой стороны, является обобщением нестрогого частичного порядка (см. следующий
параграф). Предпорядок, будучи транзитивным, совпадает со своим транзитивным за-
мыканием: v+ =v.

Теорема. Если R — отношение предпорядка, то ∀ n > 1 ∀ k > 0 Rn+k ⊂ Rn .
Доказательство. По теореме п. 4.3.5 R2 ⊂ R, и значит, R3 = R2 ◦ R ⊂ R ◦ R = R2 , и
так далее, имеем ∀ n > 0 (Rn+1 n
 ⊂ R ). Откуда по транзитивности отношения v имеем
∀ n > 1 ∀ k > 0 Rn+k ⊂ Rn
Следствие. Если R — отношение предпорядка, то R∗ = R+ = R.
Доказательство. По формулам параграфа 4.4.1.

392 / 907
4.6.1. Предпорядок (2/2)
Антирефлексивное транзитивное отношение называется отношением строгого предпо-
рядка и обозначается знаком <.
Пример. В «Повести временных лет» сказано: «И были три брата: один по имени Кий,
другой — Щек и третий — Хорив, а сестра их была Лыбедь». Отношения на множестве
людей «x брат y » и «x сестра y » являются строгими предпорядками. На рисунке показаны
диаграммы этих отношений.

393 / 907
4.6.2. Частичный и линейный порядок (1/7)
Антисимметричное транзитивное отношение называется отношением порядка. Отношение
порядка может быть рефлексивным, и тогда оно называется отношением нестрогого по-
рядка. Отношение порядка может быть антирефлексивным, и тогда оно называется отно-
шением строгого порядка. Отношение порядка может быть линейным, и тогда оно на-
зывается отношением линейного порядка. Отношение порядка может не обладать свой-
ством линейности, и тогда оно называется отношением частичного порядка. Обычно от-
ношение строгого порядка (линейного или частичного) обозначается знаком ≺, а отно-
шение нестрогого порядка — знаком .
Замечание. Для строгого порядка свойство антисимметричности можно определить так:
∀ a, b (¬(a ≺ b) ∨ ¬(b ≺ a)), что эквивалентно ∀ a, b (¬(a ≺ b & b ≺ a)), а если порядок
ещё и линейный, то антисимметричность задаётся формулой ∀ a, b (a ≺ b ⇐⇒ ¬(b ≺ a)).
Примеры. Отношение < на множестве вещественных чисел является отношением стро-
гого линейного порядка. Отношение 6 на множестве вещественных чисел является от-
ношением нестрогого линейного порядка. Отношение ⊆ на булеане 2M — нестрогий ча-
стичный порядок, а отношение — строгий частичный порядок.
394 / 907
4.6.2. Частичный и линейный порядок (2/7)
Множество, на котором задано отношение частичного порядка, называется частично упо-
рядоченным. Множество, на котором задано отношение линейного порядка, называется
линейно упорядоченным.
Пример. Множество вещественных чисел упорядочено линейно, а булеан упорядочен
частично.
Теорема. Если ≺ — отношение частичного порядка, то обратное отношение  также
является отношением частичного порядка.
Доказательство.
[ Антисимметричность ] ∀ a, b ((a ≺ b) & (b ≺ a) =⇒ a = b) ⇐⇒
⇐⇒ ∀ a, b ((b ≺ a) & (a ≺ b) =⇒ a = b) ⇐⇒ ∀ a, b ((a  b) & (b  a) =⇒ a = b).
[ Транзитивность ] ∀ a, b, c ((a ≺ b) & (b ≺ c) =⇒ a ≺ c) ⇐⇒
∀ a, b, c ((b  a) & (c  b) =⇒ c  a) ⇐⇒ ∀ a, b, c ((c  b) & (b  a) =⇒ c  a).
Следствие. Если ≺ является отношением частичного порядка, то отношения ≺ \I и
 \I являются отношениями строгого частичного порядка, и отношения ≺ ∪I и  ∪I
являются отношениями нестрогого частичного порядка.
Доказательство. По теореме п. 4.3.5. 395 / 907
4.6.2. Частичный и линейный порядок (3/7)

Лемма. Отношение R антисимметрично и линейно тогда и только тогда, когда допол-


нение отношения R совпадает с обратным отношением R−1 везде, за исключением диа-
гонали.
Доказательство. По условиям леммы, исключим диагональ, то есть рассмотрим пары раз-
личных элементов a и b.
[ Необходимость ] В указанных условиях свойство антисимметричности гласит:
∀ a, b (¬ (aRb & bRa)), а свойство линейности гласит: ∀ a, b (aRb ∨ bRa), так что из двух
пар (a, b) и (b, a) в точности одна принадлежит отношению R, а другая пара принадлежит
как дополнению, так и обратному отношению.
[ Достаточность ] Если дополнение отношения R совпадает с обратным отношением, то
это означает, что ∀ a, b (¬(aRb) ⇐⇒ bRa), то есть отношение R антисимметрично. Линей-
ность докажем от противного. Пусть ∃ a, b (¬(aRb ∨ bRa)). Тогда ∃ a, b (¬aRb & ¬bRa),
и по уже доказанному, ∃ a, b (bRa & aRb), что противоречит антисимметричности.

396 / 907
4.6.2. Частичный и линейный порядок (4/7)

Следствие. Если отношение R антисимметрично и линейно, то

∀ a, b (a 6= b =⇒ (aRb ⇐⇒ ¬(bRa))) .

Теорема. Если ≺ является отношением линейного порядка, то его дополнение 6≺ также


является отношением линейного порядка.
Доказательство. По лемме ∀ a, b (aRb ⇐⇒ ¬(bRa)).
[ Линейность ] ∀ a, b (a = b ∨ a ≺ b ∨ b ≺ a) ⇐⇒ ∀ a, b (a = b ∨ b 6≺ a ∨ a 6≺ b) ⇐⇒
⇐⇒ ∀ a, b (a = b ∨ a 6≺ b ∨ b 6≺ a).
[ Антисимметричность ] ∀ a, b (a ≺ b & b ≺ a =⇒ a = b) ⇐⇒
⇐⇒ ∀ a, b (b 6≺ a & a 6≺ b =⇒ a = b) ⇐⇒ ∀ a, b (a 6≺ b & b 6≺ a =⇒ a = b).
[ Транзитивность ] ∀ a, b, c (c ≺ b & b ≺ a =⇒ c ≺ a) ⇐⇒
⇐⇒ ∀ a, b, c (b 6≺ c & a 6≺ b =⇒ a 6≺ c) ⇐⇒ ∀ a, b, c (a 6≺ b & b 6≺ c =⇒ a 6≺ c).

397 / 907
4.6.2. Частичный и линейный порядок (5/7)
Следствие. Если  является отношением нестрогого линейного порядка, то дополни-
тельное отношение  является отношением строгого линейного порядка. Обратно, ес-
ли ≺ является отношением строгого линейного порядка, то дополнительное отношение
 является отношением нестрогого линейного порядка.
Доказательство. Достаточно проверить, в какое отношение входит диагональ.
Пример. Отношение < является отношением строгого линейного порядка, а его дополне-
ние > является отношением нестрогого линейного порядка на любом подмножестве чис-
ловой оси, то есть любом подмножестве (конечном или бесконечном) множества чисел —
целых, рациональных и вещественных.
Замечание. Линейность существенна: дополнение частичного порядка не обязательно
частичный порядок.
Пример. Пусть есть три конфеты: мятная, яблочная и лимонная. Пусть мятная конфе-
та не менее вкусная, чем лимонная, и любая конфета не менее вкусная, чем она сама.
Рассмотрим дополнительное отношение «менее вкусная». Тогда яблочная конфета ме-
нее вкусная, чем лимонная, и в то же время, лимонная менее вкусная, чем яблочная —
стало быть, это совсем не отношение порядка. 398 / 907
4.6.2. Частичный и линейный порядок (6/7)
Пример. Отношение ⊆ на булеане является отношением нестрогого частичного поряд-
ка, но его дополнение не является отношением строгого частичного порядка. Более то-
го, оно вообще не является отношением порядка, поскольку не антисимметрично и не
транзитивно. На рисунке показаны графики отношения ⊆ и его дополнения на булеане
2{1,2,3} .

399 / 907
4.6.2. Частичный и линейный порядок (7/7)
Даже если частично упорядоченное множество не является линейно упорядоченным, в
нем могут найтись линейно упорядоченные подмножества.
Пример. Семейство подмножеств {Ci } множества A называется цепочкой в A, если
∀ i (Ci ⊂ Ci+1 & Ci 6= Ci+1 ). Любая цепочка в A образует линейно упорядоченное под-
множество частично упорядоченного множества 2A .
Линейно упорядоченное подмножество {a1 , . . . , an , . . . } можно рассматривать как по-
следовательность ha1 , . . . , an , . . . i, в которой ∀ i (ai ≺ ai+1 & ai 6= ai+1 ). Такие последо-
вательности называются строго монотонно возрастающими, или просто возрастающи-
ми.
Последовательности могут быть конечными или бесконечными. Если последовательность
конечная, количество элементов в ней называется длиной.
Говорят, что частично упорядоченное множество имеет конечную высоту k , если любая
возрастающая последовательность имеет длину не более k .

400 / 907
4.6.3. Минимальные и наименьшие элементы (1/3)
Элемент x множества M с отношением порядка ≺ называется минимальным, если в мно-
жестве M не существует элементов, меньших, чем элемент x:
¬∃ y ∈ M (y ≺ x & y 6= x) ,
иначе говоря,
∀ y ∈ M (¬(y ≺ x) ∨ y = x) .
Пример. Пустое множество ∅ является минимальным элементом булеана по включению.
Теорема. Во всяком конечном непустом частично упорядоченном множестве существует
минимальный элемент.
Доказательство. От противного. Пусть ¬(∃ x ∈ M (¬∃ y ∈ M (y ≺ x & y 6= x))). Тогда
∀ x ∈ M (∃ y ∈ M (y ≺ x)) =⇒ ∃ (ui )∞ i=1 (∀ i (ui+1 ≺ ui & ui+1 6= ui )) . Поскольку
|M | < ∞, по принципу Дирихле имеем ∃ i, j (i < j & ui = uj ). Но по транзитивности
ui  ui+1  · · ·  uj =⇒ ui+1  uj = ui .
Таким образом, ui+1 ≺ ui & ui+1  ui =⇒ ui+1 = ui — противоречие.
401 / 907
4.6.3. Минимальные и наименьшие элементы (2/3)
Замечание. Линейно упорядоченное конечное множество содержит ровно один мини-
мальный элемент, а в произвольном конечном частично упорядоченном множестве их
может быть несколько.
Теорема. Всякий частичный порядок на конечном множестве может быть дополнен до
линейного.
Доказательство. Алгоритм топологической сортировки (п. 4.6.4).
Замечание. В данном случае слова «может быть дополнен» означают, что существует от-
ношение линейного порядка, которое является надмножеством заданного отношения ча-
стичного порядка.
Пусть M — частично упорядоченное множество с отношением порядка ≺, а X — его
подмножество: X ⊂ M . Элемент a называется наименьшим в множестве X (обозначение
a = min X ), если a ∈ X & ∀ x ∈ X (x 6= a =⇒ a ≺ x).
Очевидно, что наименьший элемент, если он существует, является минимальным. Но эле-
мент может быть минимальным, не будучи наименьшим.
402 / 907
4.6.3. Минимальные и наименьшие элементы (3/3)
Более того, конечное частично упорядоченное множество, имея минимальные элементы,
может не иметь наименьшего элемента.
Пример. Пусть в множестве {a, b, c, d} задано отношение порядка {(a, b), (c, d)}, то есть
a ≺ b и c ≺ d. Тогда элементы a и c минимальные, но наименьшего элемента не суще-
ствует.
Теорема. Наименьший элемент, если он существует, является единственным.
Доказательство. Пусть существуют два наименьших элемента, a и b. Тогда a ≺ b, посколь-
ку a наименьший, и, аналогично, b ≺ a, поскольку b наименьший. По антисимметрично-
сти, a = b.
В частично упорядоченном множестве с отношением порядка ≺ можно определить мак-
симальные и наибольшие элементы, используя обратное отношение .
Замечание. Используя теоремы п. 4.6.2, нетрудно показать, что все утверждения относи-
тельно минимальных и наименьших элементов имеют место и относительно максималь-
ных и наибольших элементов соответственно, то есть имеет место двойственность.
403 / 907
4.6.4. Алгоритм топологической сортировки (1/3)
Алгоритм дополнения частичного порядка до линейного на конечном множестве.
Вход: конечное частично упорядоченное множество U .
Выход: линейно упорядоченное множество W .
while U 6= ∅ do
m ← min(U ) // минимальный элемент
yield m // включаем элемент m в множество W
U ← U − m // элемент m более не рассматривается
end while
Обоснование. Всякая процедура, генерирующая объекты с помощью оператора yield,
определяет линейный порядок на множестве своих результатов. Действительно, последо-
вательность, в которой объекты генерируются во время работы процедуры — это линей-
ный порядок.
Замечание. Используемая в алгоритме функция min возвращает минимальный элемент,
существование которого гарантируется теоремой. При удалении этого элемента из мно-
жества частичный порядок сохраняется. Даже если оставшиеся элементы окажутся несрав-
нимы, алгоритм работает правильно, поскольку все элементы минимальны.
404 / 907
4.6.4. Алгоритм топологической сортировки (2/3)
Вход: конечное частично упорядоченное множество U .
Выход: минимальный элемент m.
select m ∈ U //выбираем кандидата в минимальные
for u ∈ U do
if u ≺ m then
m ← u //меняем кандидата в минимальные
end if
end for
return m //элемент m минимальный
Обоснование. Рассмотрим последовательность элементов, которые присваивались m во
время работы min. Эта последовательность не может быть бесконечной, и она линей-
но упорядочена. Рассмотрим последний элемент этой последовательности. Этот элемент
m — минимальный. Действительно, от противного, пусть существует элемент u такой, что
u ≺ m & u 6= m и u не входит в последовательность. Тогда по транзитивности u меньше
любого члена последовательности, и он был бы включен в последовательность в момент
своего рассмотрения.
405 / 907
4.6.4. Алгоритм топологической сортировки (3/3)
Замечание. Если отношение порядка представлено матрицей, то функцию min можно
реализовать, например, так — найти в матрице отношения первую строку, содержащую
только нули.
Дополнение частичного порядка до линейного в общем случае не единственно.
Пример. На рисунке слева показана диаграмма отношения частичного порядка, а справа
показаны два дополнения из четырёх возможных дополнений этого порядка до линей-
ного.

406 / 907
4.6.5. Верхние и нижние границы (1/2)
Пусть X ⊂ M — подмножество упорядоченного множества M с отношением порядка ≺.
Элемент m ∈ M называется нижней границей для подмножества X , если
∀ x ∈ X (m 6= x =⇒ m ≺ x) .
Элемент m ∈ M называется верхней границей для подмножества X , если
∀ x ∈ X (m 6= x =⇒ x ≺ m) .
Верхние и нижние границы не обязаны существовать для любого множества, и если су-
ществуют, то не всегда единственны.
Если существует наибольшая нижняя граница, то она называется инфимумом и обозна-
чается inf(X). Если существует наименьшая верхняя граница, то она называется супре-
мумом и обозначается sup(X).
Пример. Рассмотрим множество рациональных чисел Q с обычным отношением поряд-
ка < и его подмножество X ← {x ∈ Q | x > 0 & x2 > 2}. Тогда 17
12
17
∈ X , а 13 является од-
ной из нижних границ множества X . Инфимума это множество не имеет. Если в качестве
X мы √возьмем подмножество действительных, а не рациональных чисел, то инфимумом
будет 2. 407 / 907
4.6.5. Верхние и нижние границы (2/2)
Теорема. Пусть M — частично упорядоченное множество, а X — любое его подмноже-
ство. Тогда:
1) Если существует наименьший элемент a = min X , то a = inf X ;
2) если существует инфимум a = inf X и a ∈ X , то a = min X .
Доказательство.
[ 1) ] ∀ x ∈ X (a ≺ x), следовательно, a — нижняя граница X . Пусть b — любая нижняя
граница X , тогда b ≺ a, так как a ∈ X . Следовательно, a — наибольшая нижняя граница;
[ 2) ] ∀ x ∈ X (a ≺ x), поскольку a — нижняя граница X , и значит, это наименьший
элемент, поскольку a ∈ X .
Следствие. Пусть M — частично упорядоченное множество, а X — любое его подмноже-
ство. Тогда:
1) если существует наибольший элемент a = max X , то a = sup X ;
2) если существует супремум a = sup X и a ∈ X , то a = max X .
Говорят, что частично упорядоченное множество линейно полно, если любое его линейно
упорядоченное подмножество имеет супремум.
Пример. Если множество X конечно, то 2X — линейно полно относительно ⊂.
408 / 907
4.6.6. Монотонные функции (1/2)
Пусть A и B — упорядоченные множества, и f : A → B . Тогда функция f называется
монотонно возрастающей, если
a1 ≺ a2 & a1 6= a2 =⇒ f (a1 ) ≺ f (a2 ) ∨ f (a1 ) = f (a2 );
монотонно убывающей, если
a1 ≺ a2 & a1 6= a2 =⇒ f (a2 ) ≺ f (a1 ) ∨ f (a1 ) = f (a2 );
строго монотонно возрастающей, если
a1 ≺ a2 & a1 6= a2 =⇒ f (a1 ) ≺ f (a2 ) & f (a1 ) 6= f (a2 );
строго монотонно убывающей, если
a1 ≺ a2 & a1 6= a2 =⇒ f (a2 ) ≺ f (a1 ) & f (a1 ) 6= f (a2 ).
Монотонно возрастающие и убывающие функции называются монотонными, а строго
монотонно возрастающие и убывающие функции называются строго монотонными.
Очевидно, что строго монотонная функция монотонна, но обратное неверно.
Замечание. Монотонная функция — это гомоморфизм, уважающий порядок.
Пример. Тождественная функция y = x для чисел является строго монотонно возраста-
Def
ющей, а знак числа sign(x) = if x < 0 then −1 elseif x > 0 then 1 else 0 end if является
монотонно возрастающей функцией. 409 / 907
4.6.6. Монотонные функции (2/2)
Примеры.
1. Пусть 2M — булеан над линейно упорядоченным конечным множеством M , а ча-
стичный порядок на булеане — это включение. Тогда функция из алгоритма топо-
логической сортировки, доставляющая минимальный элемент, является монотонно
убывающей, но не строго монотонной.
2. Пусть порядок на булеане 2M — это собственное включение. Тогда функция, кото-
рая сопоставляет подмножеству X ⊂ M его мощность, является строго монотонно
возрастающей.
3. Пусть f : M → M — некоторая функция. Тогда функция перехода к образам
F : 2M → 2M является монотонно возрастающей по включению.
Теорема. Суперпозиция одинаково монотонных функций монотонна в том же смысле.
Доказательство. Пусть a ≺ b и g монотонно возрастает, тогда g(a) ≺ g(b). Но f также
монотонно возрастает, и значит, f (g(a)) ≺ f (g(b)). Для других случаев монотонности
доказательство аналогично.
410 / 907
4.6.7. Вполне упорядоченные множества (1/3)
Частично упорядоченное множество X называется вполне упорядоченным, если любое
его непустое подмножество имеет минимальный элемент. В частности, для любых двух
элементов a, b ∈ X один из них обязан быть минимальным в подмножестве {a, b}, а
значит, вполне упорядоченное множество упорядочено линейно.
Замечание. Не надо путать вполне упорядоченные множества и множества, на которых
определён линейный порядок. Линейно упорядоченное множество может не быть вполне
упорядоченным.
Примеры. 1. Всякое конечное линейно упорядоченное множество вполне упорядочено.
2. Множество натуральных чисел N с обычным отношением порядка вполне упорядочено.
3. Множество рациональных чисел Q с обычным отношением порядка является линейно
упорядоченным, но не является вполне упорядоченным, так как множество
X ← {x ∈ Q | x2 > 2} (равно как и само множество Q) не имеет минимального элемента.
4. Множество вещественных чисел R с обычным отношением порядка не является вполне
упорядоченным, так как множество X ← {x ∈ R | x > 0} (равно как и само множество
R) не имеет минимального элемента.
411 / 907
4.6.7. Вполне упорядоченные множества (2/3)
Говорят, что два линейно упорядоченных множества A и B изоморфны (обозначение
A ∼ B ), если между ними существует взаимно-однозначное соответствие, сохраняю-
щее порядок:
Def
A ∼ B = |A| = |B| & (∀ a1 , a2 ∈ A (a1 ≺ a2 & a1 7→ b1 & a2 7→ b2 =⇒ b1 ≺ b2 )).

Теорема. Линейно упорядоченные множества A и B изоморфны тогда и только тогда,


когда между ними существует строго монотонное взаимно-однозначное соответствие.
Доказательство. Пусть A и B — линейно упорядоченные множества с отношениями по-
рядка <A и <B .
[ =⇒ ] Если A ∼ B , то ∃ f : A → B (a1 <A a2 =⇒ f (a1 ) <B f (a2 )), причём f — биекция,
то есть требуемое строго монотонно возрастающее взаимно-однозначное соответствие.
[ ⇐= ] Если f : A → B — строго монотонно возрастающее взаимно-однозначное соот-
ветствие, то оно является требуемым изоморфизмом, и A ∼ B . Если же f : A → B —
строго монотонно убывающее взаимно-однозначное соответствие, то достаточно вместо
отношения <B рассмотреть обратное отношение >B .
412 / 907
4.6.7. Вполне упорядоченные множества (3/3)

Замечание. Понятие изоморфизма применимо и к вполне упорядоченным множествам,


поскольку они упорядочены линейно.
Пример. Вполне упорядоченные множества натуральных чисел и чётных чисел с обыч-
ным порядком < изоморфны, поскольку соответствие n 7→ 2n является строго монотон-
но возрастающим.

413 / 907
4.6.8. Индукция (1/2)
Важность вполне упорядоченных множеств определяется тем, что для них можно обоб-
щить принцип индукции, применяемый обычно для множества натуральных чисел.
Теорема. [Индукция по вполне упорядоченному множеству] Пусть X — вполне упорядо-
ченное множество, x0 — его минимальный элемент, а P — некоторый предикат, завися-
щий от элементов X . Тогда если

P (x0 ) & ∀ x1 ∈ X ((∀ x ∈ X (x ≺ x1 =⇒ P (x))) =⇒ P (x1 )) ,

то
∀ x ∈ X (P (x)) .
Доказательство. Обозначим P ← {x ∈ X | ¬P (x)}, P ⊂ X . Далее от противного. Пусть
P 6= ∅. Поскольку X вполне упорядочено, P имеет минимальный элемент, обозначим
его x1 . Тогда ∀ x ∈ X (x ≺ x1 =⇒ P (x)) по выбору x1 , и значит, P (x1 ) по условию
теоремы, что противоречит выбору x1 .
414 / 907
4.6.8. Индукция (2/2)
Замечание. Обычная математическая индукция соответствует индукции по вполне упо-
рядоченному множеству N.
Индукция по вполне упорядоченному множеству сильнее обычного принципа математи-
ческой индукции в силу следующей замечательной теоремы.
Теорема. Любое множество может быть вполне упорядочено.
Данное утверждение эквивалентно так называемой аксиоме выбора в теории множеств
и само может быть принято за аксиому.
Пример. Рассмотрим множество положительных рациональных чисел
Def 
Q+ = m

n
| m, n ∈ N , где m и n взаимно просты. Определим отношение ≺ на множе-
Def
стве Q+ следующим образом: m 1
n1
≺ m 2
n2
= m1 < m2 ∨ (m1 = m2 & n1 < n2 ), где < —
обычное отношение порядка на N. Нетрудно видеть, что множество Q+ с отношением ≺
является вполне упорядоченным, в то время как с обычным отношением порядка < оно
таковым не является.
415 / 907
5. Теория графов
Среди дисциплин и методов дискретной математики теория графов, и особенно алгорит-
мы на графах, находят наиболее широкое применение в программировании.
Между понятием графа и понятием бинарного отношения, рассмотренным в предыду-
щей теме, имеется глубокая связь — можно сказать, что это равнообъёмные понятия.
Возникает естественный вопрос: почему же тогда графам оказывается столь заметное
предпочтение при изучении дискретной математики и программирования? Дело в том,
что теория графов предоставляет очень удобный язык для описания программных (да и
многих других) моделей.
Стройная система специальных терминов и обозначений теории графов позволяет про-
сто и доступно описывать сложные и тонкие вещи. Особенно важна возможность нагляд-
ной графической интерпретации понятия графа. Само название «граф» подразумева-
ет наличие графического представления — диаграммы графа. Картинки часто позволя-
ют сразу «усмотреть» суть дела на интуитивном уровне, дополняя и украшая утомитель-
ные текстовые доказательства и сложные формулы.
416 / 907
5.1. Определения графов
Как это ни удивительно, но у понятия «граф» нет общепризнанного единого определе-
ния. Разные авторы, особенно применительно к разным приложениям, называют словом
«граф» очень похожие, но всё-таки различные объекты. Здесь используется терминоло-
гия из книги Харари «Теория графов», которая была выбрана из соображений максималь-
ного упрощения определений и доказательств.
Целью этого раздела является введение специальных названий и обозначений для раз-
личных видов графов и их элементов. Определений оказывается сравнительно много,
поскольку используются разные слова для сходных понятий с целью учёта специфики
различных видов графов.
Введение разветвлённой терминологии позволяет использовать далее лаконичные, но
точные формулировки утверждений, без повторных определений, ссылок и напомина-
ний. Очень важным является явное определение и разграничение понятий: диаграмма
графа, граф и абстрактный граф. Эти понятия тесно связаны, но их не следует смешивать.

417 / 907
5.1.1. История теории графов (1/4)
Теория графов неоднократно переоткрывалась разными авторами при решении различ-
ных прикладных задач.
1. Задача о Кёнигсбергских мостах. На рисунке представлен схематический план цен-
тральной части города Кёнигсберг (ныне Калининград), включающий два берега реки
Преголя, два острова на ней и семь соединяющих их мостов. Задача состоит в том, что-
бы обойти все четыре участка суши (обозначены A, B , C , D), пройдя по каждому мосту
один раз, и вернуться в исходную точку. В 1736 году Эйлером было показано, что реше-
ния этой задачи не существует. Точнее говоря, Эйлер получил необходимое и достаточ-
ное условие существования решения для всех задач типа задачи о Кёнигсбергских мо-
стах.

418 / 907
5.1.1. История теории графов (2/4)
2. Задача о трёх домах и трёх колодцах. Имеется три дома и три колодца, каким-то обра-
зом расположенные на плоскости. Требуется провести от каждого дома к каждому колод-
цу тропинку так, чтобы тропинки не пересекались. Эта задача также не имеет решения.
В 1930 году Куратовским было доказано намного более сильное утверждение, а именно
достаточность условия существования решения для всех задач типа задачи о трёх домах
и трёх колодцах (необходимость этого условия была известна и ранее).

419 / 907
5.1.1. История теории графов (3/4)
3. Задача о четырёх красках. Разделение плоскости на неперекрывающиеся области на-
зывается картой. Области на карте называются соседними, если они имеют общую гра-
ницу. Задача состоит в раскрашивании карты таким образом, чтобы никакие две сосед-
ние области не были закрашены одним цветом.
С конца XIX века известна гипотеза, что для этого достаточно четырёх красок. В 1976 го-
ду Аппель и Хейкен опубликовали решение задачи о четырёх красках, которое базиро-
валось на переборе вариантов с помощью компьютера.

420 / 907
5.1.1. История теории графов (4/4)

Отступление. Решение задачи о четырёх красках Аппелем и Хейкеном «программным путем» яви-
лось прецедентом, породившим бурную дискуссию, которая отнюдь не закончена. Суть опубли-
кованного решения состоит в том, чтобы перебрать большое, но конечное число (около 2000) ти-
пов потенциальных контрпримеров к теореме о четырёх красках и показать, что ни один случай
контрпримером не является. Этот перебор был выполнен программой примерно за тысячу часов
работы суперкомпьютера. Проверить «вручную» полученное решение невозможно — объём пе-
ребора выходит далеко за рамки человеческих возможностей. Многие математики ставят вопрос:
можно ли считать такое «программное доказательство» действительным доказательством? Ведь в
программе могут быть ошибки... Методы доказательства правильности программ не применимы
к программам такой сложноcти, как обсуждаемая. Тестирование не может гарантировать отсут-
ствие ошибок и в данном случае вообще невозможно. Таким образом, остаётся уповать на про-
граммистскую квалификацию авторов.

421 / 907
5.1.2. Основные определения (1/8)
Графом G(V, E) называется совокупность двух множеств — непустого множества V (мно-
жества вершин) и множества E двухэлементных подмножеств множества V (E — множе-
Def
ство рёбер), G(V, E) = hV ; Ei , V 6= ∅, E ⊂ 2V & ∀ e ∈ E (|e| = 2) .
Замечание. Вершины графа считаются различными, им можно давать имена или номера.
Чтобы подчеркнуть это обстоятельство, иногда к слову «граф» добавляют прилагательное
и говорят помеченный.
Два графа равны, если равны множества вершин и рёбер:
Def
G1 (V1 , E1 ) = G2 (V2 , E2 ) = V1 = V2 & E1 = E2 .
Замечание. Легко видеть, что любое множество E двухэлементных подмножеств множе-
ства V определяет симметричное бинарное отношение на множестве V . Поэтому можно
считать, что E ⊂ V × V , E = E −1 , и трактовать ребро не только как множество {v1 , v2 },
но и как пару (v1 , v2 ).
Def Def
Число вершин графа G обозначим p, а число рёбер — q : p(G) = |V |, q(G) = |E|.
Если хотят явно упомянуть числовые характеристики графа, то говорят: (p, q)-граф.
Замечание. Множества вершин и рёбер считаются конечными, если явно не оговорено
противное. 422 / 907
5.1.2. Основные определения (2/8)
Пусть v1 , v2 — вершины, e = (v1 , v2 ) — соединяющее их ребро. Тогда вершина v1 и реб-
ро e инцидентны, ребро e и вершина v2 также инцидентны. Два ребра, инцидентные од-
ной вершине, называются смежными; две вершины, инцидентные одному ребру, также
называются смежными.
Множество вершин, смежных с вершиной v , называется множеством смежности (или
окрестностью) вершины v и обозначается Γ+ (v). По определению
Def Def
Γ+ (v) = {u ∈ V | (u, v) ∈ E} , Γ∗ (v) = Γ+ (v) + v.
Замечание. Если не оговорено противное, то символ Γ подразумевает Γ+ , то есть саму
вершину в окрестность не включают.
Очевидно, что u ∈ Γ(v) ⇐⇒ v ∈ Γ(u). Если A ⊂ V — множество вершин, то Γ(A) —
множество всех вершин, смежных с вершинами из A:
Def
[
Γ(A) = {u ∈ V | ∃ v ∈ A (u ∈ Γ(v))} = Γ(v).
v∈A

Важно отметить, что в данном случае множество вершин A может пересекаться с Γ(A).
423 / 907
5.1.2. Основные определения (3/8)
Множество рёбер, инцидентных вершине v , называется множеством инцидентности вер-
Def
шины v и обозначается Λ(v). По определению Λ(v) = {e ∈ E | v ∈ e}.
Обычно граф представляют диаграммой: вершины — точками (или кружками), рёбра —
линиями. Размеры кружков и форма линий значения не имеют.
Пример. На рисунке приведены две различных диаграммы одного графа, имеющего че-
тыре вершины и пять рёбер. В этом графе вершины v1 и v2 , v2 и v3 , v3 и v4 , v4 и v1 , v2 и v4
смежны, а вершины v1 и v3 не смежны. Смежные рёбра: e1 и e2 , e2 и e3 , e3 и e4 , e4 и e1 , e1
и e5 , e2 и e5 , e3 и e5 , e4 и e5 . Несмежные рёбра: e1 и e3 , e2 и e4 .

424 / 907
5.1.2. Основные определения (4/8)
Рассмотрим граф G(V, E) с некоторым множеством вершин V . Дополнением G(V, E) на-
зывается другой граф, с тем же множеством вершин V , в котором вершины смежны то-
гда и только тогда, когда они не смежны в исходном графе. Другими словами, если реб-
ро e = {u, v} принадлежит графу, то оно не принадлежит дополнению графа, и обратно,
если ребро e = {u, v} принадлежит дополнению графа, то оно не принадлежит графу.
Теорема. Суммарное количество рёбер в графе и в его дополнении определяется числом
вершин p и равно p(p − 1)/2.
Доказательство. Число двухэлементных подмножеств множества вершин — это число со-
p!
четаний C(p, 2) = 2!(p−2)! = p(p − 1)/2.
Следствие. Для любой вершины суммарное количество вершин смежных и не смежных с
ней равно p − 1.
Дополнение можно рассматривать и как операцию на графах, и как отношение между
графами. Как операция, дополнение инволютивно: дополнением к дополнению графа
является сам граф. Как отношение, дополнение симметрично: если G — дополнение G,
то и G — дополнение G.
425 / 907
5.1.2. Основные определения (5/8)

Пример. Пусть G = ({v1 , v2 , v3 , v4 }, {{v1 , v2 }, {v2 , v4 }, {v3 , v4 }}).


Тогда G = ({v1 , v2 , v3 , v4 }, {{v1 , v4 }, {v1 , v3 }, {v2 , v3 }}).

426 / 907
5.1.2. Основные определения (6/8)
Часто рассматриваются следующие родственные графам объекты:
1. Если элементами множества E являются упорядоченные пары (то есть E ⊂ V × V ), то
граф называется ориентированным (или орграфом). В этом случае элементы множества
V называются узлами, а элементы множества E — дугами.
Замечание. На диаграммах дуги орграфов снабжают стрелками.
2. Если элементом множества E может быть пара одинаковых (не различных) элементов
V , то такой элемент множества E называется петлёй, а граф называется графом с пет-
лями (или псевдографом).
3. Если E является не множеством, а мультимножеством, содержащим некоторые эле-
менты по нескольку раз, то эти элементы называются кратными рёбрами, а граф называ-
ется мультиграфом.
Замечание. Если мультимножество E состоит из упорядоченных пар, то эти упорядо-
ченные пары называются мультидугами, а граф называется мультиорграфом. При этом
встречные дуги в оргафе не делают его мультиорграфом, поскольку кратность каждой ду-
ги не превышает 1.
427 / 907
5.1.2. Основные определения (7/8)
4. Если элементами множества E являются не обязательно двухэлементные, а любые
(непустые) подмножества множества V , то есть, если E ⊂ 2V , то такие элементы мно-
жества E называются гиперрёбрами, а граф называется гиперграфом.
Замечание. Количество элементов в гиперрёбрах может быть различным. Если же все
гиперрёбра имеют одинаковое количество элементов, скажем n, то гиперграф является
некоторым n-местным отношением на Vn .
5. Если каждый элемент множества E действует из множества «начал» в множество «кон-
цов», E ⊂ 2V × 2V , то элементы множества E называются гипердугами, а граф называ-
ется гиперорграфом.
Замечание. Для гиперорграфов используют несколько способов визуализации, но ни
один из них не является столь же общепринятым, как диаграммы графов.
6. Если задана функция F : V → M и (или) F : E → M , то множество M называет-
ся множеством пометок, а граф называется помеченным (или нагруженным). В качестве
множества пометок обычно используются буквы или целые числа. Если функция F инъ-
ективна, то есть разные вершины (рёбра) имеют разные пометки, то граф называют ну-
мерованным. 428 / 907
5.1.2. Основные определения (8/8)
Замечание. Отношение смежности является в некотором смысле определяющим для гра-
фов и подобных им объектов. При этом следует учитывать особенности каждого типа
объектов. Отношение смежности в графе симметрично, а в орграфе оно вовсе не обяза-
но быть симметричным. В графе обычно считают отношение смежности рефлексивным,
то есть полагают, что вершина смежна сама с собой. В псевдорграфе, напротив, вершину
не считают смежной с собой, если у неё нет петли. В гиперграфе две вершины считаются
смежными, если они принадлежат одному гиперребру. В гиперорграфе гипердуга обыч-
но проводится из одного узла в множество узлов (возможно, пустое). В таком случае от-
ношение смежности оказывается уже не бинарным отношением на V , а отношением из
V в 2V . Эти и подобные естественные вариации определений обычно считают ясными из
контекста.
Далее выражение «граф G(V, E)» означает неориентированный непомеченный граф без
петель и кратных рёбер, с множеством вершин V и множеством рёбер E .

429 / 907
5.1.3. Изоморфизм графов (1/6)
Говорят, что два графа, G1 (V1 , E1 ) и G2 (V2 , E2 ), (вершинно) изоморфны (обозначается
G1 ∼ G2 ), если существует изоморфизм h : V1 → V2 , уважающий отношение смежности
вершин: e1 = (u, v) ∈ E1 ⇐⇒ e2 = h(u), h(v) ∈ E2 .
Теорема. Изоморфизм графов есть отношение эквивалентности.
Доказательство.
h
[ Рефлексивность ] Имеем G ∼ G, где h — тождественная функция.
h h−1
[ Симметричность ] Если G1 ∼ G2 , то G2 ∼ G1 .
h g g◦h
[ Транзитивность ] Если G1 ∼ G2 и G2 ∼ G3 , то G1 ∼ G3 .
Пример. Три внешне различные диаграммы, приведённые на рисунке, являются диаграм-
мами одного и того же графа K3,3 .

430 / 907
5.1.3. Изоморфизм графов (2/6)
Числовая характеристика, одинаковая для всех изоморфных графов, называется инвари-
антом графа. Так, p(G) и q(G) — инварианты графа G. Неизвестно никакого простого
набора инвариантов, определяющих граф с точностью до изоморфизма.
Пример. Количество вершин, рёбер и количество смежных вершин для каждой вершины
не определяют граф даже в простейших случаях! На рисунке представлены диаграммы
графов, у которых указанные инварианты совпадают, но графы при этом не изоморфны.

Представленные графы не изоморфны, потому что в графе справа есть два треугольника,
а в графе слева треугольников нет.

431 / 907
5.1.3. Изоморфизм графов (3/6)
Изоморфизм графа в себя называется автоморфизмом графа.
Пример. Треугольник автоморфен себе при любой перестановке вершин.
Графы рассматриваются с точностью до изоморфизма, то есть рассматриваются классы
эквивалентности по отношению изоморфизма.
Замечание. Чтобы подчеркнуть это обстоятельство, иногда говорят абстрактный граф,
подразумевая элемент фактормножества графов по отношению изоморфности.
Смежными могут быть не только вершины, но и рёбра. Аналогично понятию вершин-
ного изоморфизма, вводится понятие рёберного изоморфизма. Два графа G1 (V1 , E1 ) и
G2 (V2 , E2 ) рёберно изоморфны, если существует изоморфизм h : E1 → E2 , уважающий
отношение смежности рёбер.
Пример. Рассмотрим графы G1 (V1 , E1 ) и G2 (V2 , E2 ), где V1 = V2 = {v1 , v2 , v3 },
E1 = {{v1 , v2 }, {v1 , v3 }}, E2 = {{v1 , v2 }, {v2 , v3 }}. По определению эти графы являются
различными помеченными графами, так как E1 6= E2 . В тоже время функция h, такая что
h(v1 ) = v2 , h(v2 ) = v1 , h(v3 ) = v3 устанавливает изоморфизм этих графов.
Замечание. Абстрактный граф, который является классом простых цепей на n вершинах,
обозначается Pn . Графы G1 , G2 в примере суть представители абстрактного графа P432 3 . / 907
5.1.3. Изоморфизм графов (4/6)
В этом курсе слово «граф» означает как индивидуальный помеченный граф, так и пред-
ставителя класса изоморфных графов, то есть представителя абстрактного графа. Какая
именно интерпретация подразумевается, надобно определять из контекста.
Лемма. Пусть графы G и H рёберно изоморфны с изоморфизмом h, тогда если для рё-
бер e1 , . . . , en+1 , где n > 2, образы h(e1 ), . . . , h(en ) инцидентны вершине v1 , а образы
h(e2 ), . . . , h(en+1 ) инцидентны вершине v2 , то v1 = v2 .
Доказательство. Поскольку две вершины полностью определяют ребро, то в случае, если
v1 6= v2 , получаем h(e2 ) = . . . = h(en ) = (v1 , v2 ), что противоречит биективности h.
Теорема. Если графы вершинно изоморфны, то они и рёберно изоморфны.
Доказательство. Пусть графы G1 (V1 , E1 ) и G2 (V2 , E2 ) вершинно изоморфны с изомор-
физмом h1 : V1 → V2 . Тогда построим функцию h2 : E1 → E2 следующим образом:
h2 ({u, v}) ←{h1 (u), h1 (v)}. Эта функция биективна и уважает смежность рёбер.
Обратное, вообще говоря, неверно.
Пример. На рисунке представлены диаграм-
мы двух графов, которые изоморфны рёбер-
но, но не изоморфны вершинно. 433 / 907
5.1.3. Изоморфизм графов (5/6)
Отступление. Изоморфизм графов — это очень трудная, и в то же время весьма насущная про-
блема. Даже установить отсутствие или наличие изоморфизма у двух помеченных графов с сов-
падающими инвариантами не всегда просто, как видно из предшествующих примеров.
На практике очень часто проблема изоморфизма возникает в более сложной постановке: даны
два абстрактных графа, требуется определить, имеются ли вхождения одного графа в другой в
качестве подграфа, и если такие вхождения имеются, то найти их (какое-нибудь одно или все).
Обычно эта проблема называется изоморфизм подграфов.
К решению проблемы изоморфизма подграфов сводятся самые разные задачи в области химии и
биоинформатики (например, входят ли в молекулу полимера те или иные характерные составные
части), в области шифрования и кодирования информации (содержит ли некоторая информаци-
онная структура те или иные подструктуры) и в множестве других областей. Фактически, пробле-
ма изоморфизма подграфов встаёт везде, где в качестве языка описания модели предметной об-
ласти применяется теория графов (а язык теории графов — самый распространённый формализм
дискретной математики).

434 / 907
5.1.3. Изоморфизм графов (6/6)
Отступление. (Продолжение) В такой самой общей постановке проблема изоморфизма подгра-
фов оказывается трудоёмкой задачей и решается, фактически, перебором. В практически значи-
мых моделях (в биоинформатике, в криптографии) вершины в графах исчисляются тысячами и
миллионами, поэтому проблема изоморфизма подграфов в общей постановке оказывается прак-
тически неразрешимой даже с применением суперкомпьютеров. Однако в каждой конкретной
предметной области удаётся отыскать такие особенности, которые позволяют ограничить поста-
новку задачи проверки изоморфизма так, что задача становится практически разрешимой. Эти
специфические особенности и приёмы не имеют универсальной силы и неприменимы в общем
случае.
Поэтому в этом курсе нет описания алгоритма проверки изоморфизма графов в общем случае —
такой алгоритм не имеет практического смысла. Зато в курсе имеется несколько замечаний от-
носительно того, как можно эффективно проверить изоморфизм в том или ином сугубо частном
случае. Комбинируя эти идеи, иногда удаётся построить эффективный алгоритм для решения кон-
кретной частной задачи.

435 / 907
5.1.4. Элементы графов (1/7)
Граф G0 (V 0 , E 0 ) называется подграфом (или частью) графа G(V, E) (обозначается
G0 ⊂ G), если V 0 ⊂ V & E 0 ⊂ E . Если V 0 = V , то G0 называется остовным подграфом G.
Если V 0 ⊂ V & E 0 ⊂ E & (V 0 6= V ∨ E 0 6= E), то граф G0 называется собственным под-
графом графа G. Подграф G0 (V 0 , E 0 ) называется правильным подграфом графа G(V, E),
если G0 содержит все возможные рёбра G: ∀ u, v ∈ V 0 ((u, v) ∈ E =⇒ (u, v) ∈ E 0 ).
Правильный подграф G0 (V 0 , E 0 ) графа G(V, E) определяется подмножеством вершин V 0 .
Пример. На рисунке показаны диаграммы графа, правильного подграфа, неправильного
подграфа и остовного подграфа.

Замечание. Иногда подграфами называют только правильные подграфы, а неправильные


подграфы называют изграфами.
436 / 907
5.1.4. Элементы графов (2/7)
Количество рёбер, инцидентных вершине v , называется степенью (или валентностью)
вершины v и обозначается d(v):
∀ v ∈ V (0 6 d(v) 6 p − 1) , d(v) = |Γ+ (v)|.
Таким образом, степень d(v) вершины v совпадает с количеством смежных с ней вершин.
Количество вершин, не смежных с v , обозначают d(v). Ясно, что

∀v ∈ V d(v) + d(v) = p − 1 .
Обозначим минимальную степень вершины графа G через δ(G), а максимальную — через
∆(G):
Def Def
δ (G(V, E)) = min d(v), ∆ (G(V, E)) = max d(v).
v∈V v∈V
Ясно, что δ(G) и ∆(G) являются инвариантами. Если степени всех вершин равны k , то
граф называется регулярным степени k :
δ(G) = ∆(G) = k, ∀ v ∈ V (d(v) = k) .
Степень регулярности обозначается r(G). Для нерегулярных графов r(G) не определено.
437 / 907
5.1.4. Элементы графов (3/7)
Примеры. На рисунке приведены диаграммы трёх примечательных регулярных графов
степени 3.

Если степень вершины равна нулю (то есть d(v) = 0), то вершина называется изолиро-
ванной. Если степень вершины равна единице (то есть d(v) = 1), то вершина называется
концевой, или висячей.

Для орграфа число дуг, исходящих из узла v , называется полустепенью исхода, а чис-
ло входящих — полустепенью захода. Обозначаются эти числа, соответственно, d− (v) и
d+ (v).
438 / 907
5.1.4. Элементы графов (4/7)
Теорема. [Лемма о рукопожатиях] Сумма степеней вершин графа (мультиграфа) равна
удвоенному количеству рёбер: X
d(v) = 2q.
v∈V
Доказательство. При подсчёте суммы степеней вершин каждое ребро учитывается два
раза.
Следствие. Число вершин нечётной степени чётно.
Доказательство. Сумма степеней вершин чётной степени чётна, значит, сумма степеней
вершин нечётной степени также чётна, следовательно, их чётное число.
Следствие. Суммы полустепеней узлов орграфа равны количеству дуг:
X X
d− (v) = q = d+ (v).
v∈V v∈V

Доказательство. Сумма полустепеней узлов орграфа равна сумме степеней вершин графа
(мультиграфа), полученного из орграфа забыванием ориентации дуг.
439 / 907
5.1.4. Элементы графов (5/7)
Маршрутом в графе называется чередующаяся последовательность вершин и рёбер, на-
чинающаяся и кончающаяся вершиной, v0 , e1 , v1 , e2 , v2 , . . . , ek , vk , в которой любые два
соседних элемента инцидентны, причём однородные элементы (вершины, рёбра) через
один смежны или совпадают.
Замечание. Это определение подходит также для псевдо-, мульти- и орграфов. При этом в
графе (орграфе) достаточно указать только последовательность вершин (узлов) или толь-
ко последовательность рёбер (дуг).
Если v0 = vk , то маршрут замкнут, иначе — открыт.
Если все рёбра различны, то маршрут называется цепью. Если все вершины (а значит, и
рёбра!) различны, то маршрут называется простой цепью. В цепи v0 , e1 , . . . , ek , vk вер-
шины v0 и vk называются концами цепи. Цепь с концами u и v соединяет вершины u и
v и обозначается hu, vi. Если нужно указать граф G, которому принадлежит цепь, то до-
бавляют индекс: hu, viG .

440 / 907
5.1.4. Элементы графов (6/7)
Лемма. Если есть какая-либо цепь, соединяющая вершины u и v , то есть и простая цепь.
Доказательство. Если имеющаяся цепь не простая, то будем удалять часть цепи меж-
ду повторяющимися вхождениями одной вершины, получая новую цепь, соединяющую
вершины u и v , с меньшим количеством вершин, пока цепь не станет простой.
Замкнутая цепь называется циклом; замкнутая простая цепь называется простым циклом.
Число циклов в графе G обозначается z(G). Граф без циклов называется ациклическим.
Число рёбер в цикле называется длиной цикла. Число циклов длины k в графе G обозна-
чается z(G, k).
Лемма. Количество простых циклов длины l одинаково для изоморфных графов.
Доказательство. Пусть графы G1 (V1 , E1 ) и G2 (V2 , E2 ) изоморфны с биекцией h : V1 → V2 ,
сохраняющей смежность. Количество простых циклов длины l в G2 не меньше, чем в
G1 : z(G1 , l) 6 z(G2 , l). От противного. Пусть v1 , v2 , . . . , vl — простой цикл графа G1 , а
h(v1 ), h(v2 ), . . . , h(vl ) не является простым циклом графа G2 . Значит, найдётся такая па-
ра смежных вершин vi , vi+1 , для которой (h(vi ), h(vi+1 )) 6∈ E2 , что противоречит тому, что
h сохраняет смежность. Аналогично, количество простых циклов длины l в G2 не боль-
ше, чем в G1 : достаточно рассмотреть h−1 : V2 → V1 . 441 / 907
5.1.4. Элементы графов (7/7)
Замечание. Для псевдографов обычно особо оговаривают, считаются ли петли циклами.
Для орграфов цепь называется путём, а цикл — контуром. Путь в орграфе из узла u в

узел v обозначают hu, vi.
Пример. В графе, диаграмма которого приведена на рисунке:
1) v1 , v3 , v1 , v4 — маршрут, но не цепь;
2) v1 , v3 , v5 , v2 , v3 , v4 — цепь, но не простая цепь;
3) v1 , v4 , v3 , v2 , v5 — простая цепь;
4) v1 , v3 , v5 , v2 , v3 , v4 , v1 — цикл, но не простой цикл;
5) v1 , v3 , v4 , v1 — простой цикл.

442 / 907
5.1.5. Инварианты графов (1/7)

Говорят, что две вершины в графе связаны, если существует соединяющая их цепь. Граф,
в котором все вершины связаны, называется связным.
Замечание. Если две вершины связаны, то по первой лемме предыдущего параграфа
существует соединяющая их простая цепь.
Нетрудно показать, что отношение связанности вершин является эквивалентностью.
Классы эквивалентности по отношению связанности называются компонентами связно-
сти графа. Число компонент связности графа G обозначается k(G). Граф G является связ-
ным тогда и только тогда, когда k(G) = 1. Если k(G) > 1, то G — несвязный граф.
Граф, состоящий только из изолированных вершин в котором k(G) = p(G) и q(G) = 0,
иногда называется вполне несвязным.
Замечание. Вполне несвязный граф G является регулярным нулевой степени, r(G) = 0.

443 / 907
5.1.5. Инварианты графов (2/7)

Теорема. Любой граф или его дополнение являются связным графом.


Доказательство. Если исходный граф связен, то теорема доказана. Пусть исходный граф
несвязен и имеет несколько компонент связности. Рассмотрим любые две вершины. Если
они принадлежат разным компонентам связности исходного графа, то они соединены в
дополнении ребром, а потому связаны. Если они принадлежат одной компоненте связ-
ности, то в дополнении они связаны маршрутом из двух рёбер, проходящим через лю-
бую вершину из другой компоненты связности.
Замечание. Как сам граф, так и его дополнение могут быть связными одновременно, но
граф и его дополнение не могут быть несвязными одновременно!

444 / 907
5.1.5. Инварианты графов (3/7)
Длиной маршрута называется количество рёбер в нём (с учётом повторений). Если марш-
рут M = v0 , e1 , v1 , e2 , v2 , . . . , ek , vk , то длина M равна k (обозначается |M | = k ).
Расстоянием между вершинами u и v (обозначается d(u, v)) называется длина кратчай-
шей цепи hu, vi, а сама кратчайшая цепь называется геодезической,
Def
d(u, v) = min |hu, vi|.
{hu,vi}

Если для любых двух вершин графа существует единственная геодезическая цепь, то
граф называется геодезическим.
Def
Замечание. Если вершины u и v не связаны, то d(u, v) = +∞.
Легко видеть, что расстояние между вершинами является метрикой в пространстве вер-
шин графа. Действительно, ∀ u, v ∈ V (d(u, v) > 0), так как d(u, v) — это количество рё-
бер в кратчайшей цепи.

445 / 907
5.1.5. Инварианты графов (4/7)
Проверим выполнение аксиом метрики.
1. ∀ u, v ∈ V (d(u, v) = 0 ⇐⇒ v = u), поскольку из нуля рёбер можно составить марш-
рут, который состоит только из одной вершины.
2. ∀ u, v ∈ V (d(u, v) = d(v, u)), поскольку пересчёт рёбер цепи в обратном порядке
не меняет их количества.
3. ∀ u, v, w ∈ V (d(u, v) 6 d(u, w) + d(w, v)), поскольку d(u, w) + d(w, v) — это длина
некоторой цепи hu, . . . , w, . . . , vi, а d(u, v) — это длина кратчайшей цепи hu, vi.

Множество вершин, находящихся на заданном расстоянии n от вершины v (обозначение


D(v, n)), называется ярусом:
Def
D(v, n) = {u ∈ V | d(v, u) = n} .
Ясно, что множество вершин V всякого связного графа однозначно разбивается на ярусы
относительно данной вершины.
446 / 907
5.1.5. Инварианты графов (5/7)
Эксцентриситетом e(v) вершины v в связном графе G(V, E) называется максимальное
расстояние от вершины v до других вершин графа G:
Def
e(v) = max d(v, u).
u∈V

Диаметром графа называется длиннейшая геодезическая цепь. Длина диаметра графа


G обозначается D(G):
Def
D(G) = max d(u, v) = max e(v).
u,v∈V v∈V

Заметим, что наиболее эксцентричные вершины — это концы диаметра.


Радиусом графа называется простая цепь, длина которой равна наименьшему из эксцен-
триситетов вершин. Длина радиуса графа G обозначается R(G):
Def
R(G) = min e(v).
v∈V

447 / 907
5.1.5. Инварианты графов (6/7)
Вершина v называется центральной, если её эксцентриситет совпадает с длиной радиуса
графа, e(v) = R(G). Множество центральных вершин C(G) называется центром графа:
Def
C(G) = {v ∈ V | e(v) = R(G)} .

Пример. На диаграммах ниже указаны эксцентриситеты вершин и центры двух графов.


Вершины, составляющие центр, на диаграммах выделены жирными точками.

448 / 907
5.1.5. Инварианты графов (7/7)

Теорема. Если граф G связен, то D(G)/2 6 R(G) 6 D(G).


Доказательство.
[ R(G) 6 D(G) ] Следует из определения.
[ D(G)/2 6 R(G) ] Рассмотрим центральную вершину w ∈ C(G), e(w) = R(G). Имеем
∀ u, v ∈ V (d(u, v) 6 d(u, w) + d(w, v)) по неравенству треугольника для метрики d(u, v).
Но d(u, w) = d(w, u) 6 e(w) = R(G) и d(w, v) 6 e(w) = R(G), значит
∀ u, v ∈ V (d(u, v) 6 2R(G)), откуда D(G) 6 2R(G).
Пример. В левой диаграмме на предыдущем слайде имеем D(G) = 4, R(G) = 2. В
правой диаграмме D(G) = 3, R(G) = 2, неравенства выполняются.

449 / 907
5.1.6. Степенные последовательности (1/9)

Последовательность степеней вершин (d1 , . . . , dp ) некоторого графа называется степен-


ной последовательностью графа или графовой последовательностью. Ясно, что всякая
степенная последовательность является представлением мультимножества, поэтому, не
ограничивая общности, можно считать, что d1 6 d2 6 · · · 6 dp .
Пример. Последовательности (2, 2, 2, 2, 3, 3, 4) и (1, 1, 1, 1, 2, 4) являются степенными по-
следовательностями графов, диаграммы которых представлены на предыдущем рисун-
ке.
Не всякая последовательность неотрицательных целых чисел является степенной после-
довательностью.
Пример. Последовательность (0, 1, 2, . . . , p − 1) не является степенной ни при каком
p > 1. Действительно, первая вершина должна быть изолированной, а последняя должна
быть смежна со всеми остальными, что противоречит изолированности первой вершины.

450 / 907
5.1.6. Степенные последовательности (2/9)
Если последовательность D = (d1 , . . . , dp ) является степенной последовательностью гра-
фа G, то говорят, что граф G реализует последовательность D.
Легко заметить, что если два графа имеют различные степенные последовательности, то
они не изоморфны. Но из рисунка п. 5.1.6. видно, что графы с одинаковыми степенны-
ми последовательностями также могут быть не изоморфными. Таким образом, степенная
последовательность может иметь множество различных реализаций.
Отметим несколько очевидных свойств степенных последовательностей.
Лемма. [1] Сумма степенной последовательности
Pp — чётное число.
Доказательство. По лемме о рукопожатиях i=1 di = 2q .
Лемма. [2] Если последовательность (d1 , . . . , dp ) степенная, то последовательность
(0, . . . , 0, d1 , . . . , dp ) также степенная, и наоборот.
Доказательство. Изолированные вершины можно не учитывать.
Лемма. [3] В степенной последовательности (d1 , . . . , dp ) каждый элемент меньше длины
последовательности: ∀ i ∈ 1..p (di < p).
Доказательство. Степень любой вершины меньше числа вершин.
451 / 907
5.1.6. Степенные последовательности (3/9)
Таким образом, не умаляя общности, достаточно рассматривать только последователь-
ности (d1 , . . . , dp ), такие, что

0 < d1 6 d2 6 · · · 6 dp < p.

Пусть D = (d1 , . . . , dp ) — неубывающая последовательность натуральных чисел, причём


∀ i (di < p). Построим последовательность D0 = (d0 1 , . . . , d0 p−1 ) следующим образом:
d0p−1 ← dp−1 − 1, . . . , d0p−dp +1 ← dp−dp +1 − 1, d0p−dp ← dp−dp − 1, d0p−dp −1 ← dp−dp −1 , . . . ,
d01 ← d1 .
Другими словами, последний (наибольший) элемент последовательности dp удаляется, а
dp предшествующих элементов уменьшаются на единицу. Оставшиеся вершины (они есть,
если dp < p − 1) остаются без изменения.
Такая операция называется откладыванием вершины dp , а D0 называется остаточной
последовательностью.
452 / 907
5.1.6. Степенные последовательности (4/9)
Пример. Отложим последний элемент в последовательности:
(2, 2, 3, 3, 3 | 3) 7→ (2, 2, 2, 2, 2).
При откладывании элемента упорядоченность может нарушиться:
(2, 2, 2, 2 | 2) 7→ (2, 2, 1, 1).
Графически откладывание вершины можно отобразить, соединяя рёбрами вершину, соот-
ветствующую удаляемому элементу, с вершинами, соответствующими уменьшаемым эле-
ментам. Фактически, при откладывании вершин постепенно прорисовывается диаграм-
ма графа, начиная с вершины с максимальной степенью.
Пример. На рисунке показано откладывание вершин для последовательности (2, 3, 3, 3, 3).
Откладываемые вершины выделены.

453 / 907
5.1.6. Степенные последовательности (5/9)

Теорема. Последовательность D = (d1 , . . . , dp ) является степенной последовательно-


стью тогда и только тогда, когда последовательность D0 = (d0 1 , . . . , d0 p−1 ), полученная
откладыванием последнего элемента dp , является степенной.
Доказательство.
[ ⇒ ] Пусть последовательность D = (d1 , . . . , dp ) степенная, а G — реализующий граф.
Рассмотрим в графе G вершину максимальной степени w, d(w) = dp . Пусть S — множе-
ство вершин со степенями dp−dp , . . . , dp−1 . Тогда если Γ(w) = S , то G − w — искомый
граф, реализующий последовательность D0 = (d0 1 , . . . , d0 p−1 ). Пусть теперь Γ(w) 6= S ,
построим тогда такой граф G0 , в котором Γ(w) = S . Поскольку Γ(w) 6= S , существует
вершина z ∈ Γ(w), которая не принадлежит S , и существует вершина x ∈ S , не смежная
с вершиной w. По построению S имеем d(z) 6 d(x), следовательно, существует верши-
на y смежная с x, но не смежная с z . Удалим рёбра (w, z) и (y, x), добавим рёбра (w, x)
и (y, z).

454 / 907
5.1.6. Степенные последовательности (6/9)
Доказательство. (Продолжение) Такими построениями получаем граф G0 такой, что
Γ(w) = S , причём граф G0 − w реализует последовательность D0 = (d0 1 , . . . , d0 p−1 ).

[ ⇐ ] Пусть последовательность D 0 = (d0 1 , . . . , d0 p−1 ) степенная, а G — реализующий


граф, вершины которого перенумерованы в порядке неубывания степеней 1, . . . , p − 1.
Добавим в граф G вершину степени dp и соединим её с вершинами с номерами p−dp ..p−
1. Полученный граф реализует последовательность D = (d1 , . . . , dp ).
Доказанная теорема позволяет проверить, является ли заданная последовательность на-
туральных чисел степенной и построить граф, реализующий эту последовательность, с
помощью алгоритма, приведённого на следующих трёх слайдах.
455 / 907
5.1.6. Степенные последовательности (7/9)
Вход: натуральное число p и двусвязный упорядоченный список пар натуральных чисел
(d, n), представленный двумя указателями: на начало списка s и на конец списка t.
Выход: false, если последовательность D не степенная, иначе
true и граф G : array [1..q] of {b, e : 1..p}
q ← 0 //счётчик рёбер
if t.d > p then return false end if //D не степенная
for i from 1 to p do
d ← t.d; n ← t.n //d — степень, n — номер вершины
if s.d < 0 then return false end if //граф нельзя построить
if d = 0 then return true end if //граф уже построен
u ← t.l; u.r ← nil; ∼ t; t ← u //откладываем вершину t
for j from 1 to d do
u.d ← u.d − 1; q ← q + 1; G[q] ←(u.n, n); u ← u.l //ребро
end for
if u 6= nil then Ordering(s, t, u.r) end if //восстановление
end for 456 / 907
5.1.6. Степенные последовательности (8/9)
Процедура Ordering восстанавливает упорядоченность двусвязного списка после откла-
дывания вершины, используя тот факт, что отрезки слева и справа упорядочены.

Вход: указатель на начало списка s, указатель на конец списка t, указатель на тот элемент
u, где может быть нарушен порядок.
Выход: переупорядоченный список
if u.l.d > u.d then
v ← u.l //v.d > u.d — нарушение порядка
z ← u; while z 6= t & v.d > z.r.d do z ← z.r end while //v.d 6 z.r.d
w ← v; while w 6= s & w.l.d > u.d do w ← w.l end while //w.l.d 6 u.d
if z 6= t then z.r.l ← v end if //справа что-то осталось
if w 6= s then w.l.r ← u end if //слева что-то осталось
v.r ← z.r; u.l ← w.l; z.r ← w; w.l ← z //зашили разрыв
end if 457 / 907
5.1.6. Степенные последовательности (9/9)
Обоснование. Алгоритм следует доказательству теоремы (последовательно откладывает
вершины) с учётом следующих замечаний.
1. Двунаправленный список можно представить одним указателем, но здесь для удобства
используются два: s и t.
2. Если последнее число t.d в последовательности D больше или равно числу вершин p,
то алгоритм нельзя применять.
3. Если в результате успешных откладываний в конце списка t.d появился 0, то граф уже
построен.
4. Если в результате откладывания в начале списка s.d появляются отрицательные числа,
то граф построить невозможно.
5. Деструктор элемента списка t обозначен знаком ∼.
6. Элементу массива G присваивается сразу пара вершин (ребро).
7. Восстанавливать упорядоченность списка необходимо, только если следующая верши-
на существует.
Алгоритм заканчивает работу, поскольку на каждом шаге основного цикла один элемент
из списка удаляется. 458 / 907
5.1.7. Виды графов (1/9)
В данном параграфе рассматриваются различные частные случаи графов.
Граф, состоящий из одной вершины, называется тривиальным.
Граф, состоящий из простого цикла с k вершинами, обозначается Ck .
Пример. C3 — треугольник.
Замечание. В классе графов треугольники — минимальные возможные циклы. В классах
орграфов и псевдографов возможны контуры длиной 1 (петли) и 2 (встречные дуги).
Граф, в котором любые две вершины смежны, называется полным. Полный граф с p вер-
шинами обозначается Kp , он имеет максимально возможное число рёбер:
p(p − 1)
q(Kp ) = .
2
Граф, в котором нет смежных вершин, называется пустым. Пустой граф с p вершинами
обозначается Kp , он имеет минимально возможное число рёбер: q(Kp ) = 0.
Дополнением полного графа является пустой, и обратно: дополнением пустого графа яв-
ляется полный.
459 / 907
5.1.7. Виды графов (2/9)
Максимальный полный подграф (некоторого графа) называется кликой (этого графа). Мак-
симальным подграф является в том смысле, что любой другой подграф графа, включаю-
щий множество вершин клики, не является полным. Граф может иметь несколько клик.
Максимальное число вершин среди клик данного графа называется кликовым числом гра-
фа (или плотностью).
Граф G(V, E) называется двудольным (или биграфом, или чётным графом), если множе-
ство V может быть разбито на два непересекающихся множества V1 и V2 (V1 ∪ V2 = V ,
V1 ∩ V2 = ∅, V1 6= ∅, V2 6= ∅), причём всякое ребро из E инцидентно вершине из V1 и
вершине из V2 (то есть соединяет вершину из V1 с вершиной из V2 ). Множества V1 и V2 на-
зываются долями двудольного графа. Если двудольный граф содержит все рёбра, соеди-
няющие множества V1 и V2 , то он называется полным двудольным графом. Если |V1 | = m
и |V2 | = n, то полный двудольный граф обозначается Km,n .
Замечание. Обсуждая двудольность, достаточно рассматривать только связные графы,
поскольку каждую компоненту связности можно рассматривать отдельно.
460 / 907
5.1.7. Виды графов (3/9)
Теорема. Граф является двудольным тогда и только тогда, когда в нём нет простых
циклов нечётной длины.
Доказательство.
[ ⇐= ] Разобьём множество V на подмножества V1 и V2 следующей процедурой.
Вход: граф G(V, E).
Выход: Множества V1 и V2 — доли графа.
select v ∈ V //произвольная вершина
V1 ←{v}; V2 ← ∅ //вначале первая доля содержит v , а вторая пуста
for u ∈ V − v do
if d(v, u) — чётно then
V1 ← V1 + u //помещаем вершину u в первую долю
else
V2 ← V2 + u //помещаем вершину u во вторую долю
end if
end for
461 / 907
5.1.7. Виды графов (4/9)

Доказательство. (Продолжение) Далее от противного. Пусть есть две вершины в одной


доле, соединённые ребром. Пусть для определённости u, w ∈ V2 и (u, w) ∈ E . Рассмотрим
геодезические hv, ui и hv, wi (здесь v — та произвольная вершина, которая использова-
лась в алгоритме построения долей графа). Тогда длины | hv, ui | и | hv, wi | нечётны. Эти
геодезические имеют общие вершины (по крайней мере, вершину v ). Рассмотрим наи-
более удалённую от v общую вершину геодезических hv, ui и hv, wi и обозначим её v 0
(может оказаться так, что v = v 0 ).
Имеем | hv 0 , ui |+| hv 0 , wi | = | hv, ui |+| hv, wi |−2| hv, v 0 i | — чётно и v 0 , . . . , u, w, . . . , v 0 —
простой цикл нечётной длины, что противоречит условию. Если же u, w ∈ V1 , то длины
| hv, ui | и | hv, wi | чётны, и имеем v 0 , . . . , u, w, . . . , v 0 — простой цикл нечётной длины.
[ =⇒ ] От противного. Пусть G(V1 ,V2 ;E) — двудольный граф и v1 , v2 , . . . , v2k+1 , v1 — про-
стой цикл нечётной длины. Пусть v1 ∈ V1 , тогда v2 ∈ V2 , v3 ∈ V1 , v4 ∈ V2 , . . . , v2k+1 ∈ V1 .
Имеем: v1 , v2k+1 ∈ V1 и (v1 , v2k+1 ) ∈ E , что противоречит двудольности.

462 / 907
5.1.7. Виды графов (5/9)
Следствие. Ациклические графы двудольны.
Пример. На рисунке представлены диаграммы всех ациклических связных двудольных
графов с пятью вершинами.

Замечание. Если двудольный граф связен, то вершины по долям распределяются един-


ственным образом. Если же граф не является связным, то распределение вершин по до-
лям неоднозначно.
Пример. В пустом графе любое разбиение множества вершин на два непустых подмно-
жества определяет доли двудольного графа.
Отступление. Среди вершин, входящих в одну долю графа, нет смежных, то есть доли двудоль-
ного графа образуют независимые множества вершин (см. п. 5.5.1). Исходя из этого наблюдения,
можно определить k -дольный граф, как граф, вершины которого можно разбить на k независи-
мых множеств.
463 / 907
5.1.7. Виды графов (6/9)
Полный двудольный граф вида K1,n , где n > 1 называется звёздным графом (или кратко
звёздой) и обозначается Sn . Единственная вершина, входящая в первую долю V1 называ-
ется центральной вершиной звезды.
Замечание. В определении мы полагаем n > 1, чтобы исключить из рассмотрения вы-
рожденные случаи тривиального графа K1 = S1 и диполя K2 = K1,1 = S1 .
Теорема. Центр звёздного графа и его центральная вершина совпадают.
Доказательство. Эксцентриситет центральной вершины равен 1, а эксцентриситеты всех
остальных вершин равны 2.
Замечание. Доказанная теорема позволяет называть центральную вершину центром.
Звёзды играют особую роль в рёберном изоморфизме.
Лемма. Пусть G1 (V1 , E1 ) и G2 (V2 , E2 ) — связные рёберно изоморфные графы c изомор-
физмом h, причём p(G1 ) > 3, p(G2 ) > 3. Тогда если для некоторого r > 2 ребра e1 , . . . , er
составляют звезду Sr в графе G1 , то их образы h(e1 ), . . . , h(er ) составляют такую же
звезду Sr в графе G2 .
Замечание. То есть рёберный изоморфизм уважает звёзды.
464 / 907
5.1.7. Виды графов (7/9)
Доказательство.
Индукция по r. База r = 3. Возможны
два изоморфизма, показанные на рисунке.
Покажем, что «левый» изоморфизм g невоз-
можен. Действительно, поскольку p(G1 ) > 3,
то в исходном графе должна быть ещё од-
на вершина, которая в силу связности долж-
на иметь инцидентное ей ребро e4 .
Ребро e4 смежно либо только одному ребру из
множества {e1 , e2 , e3 }, либо всем трём, но при
изоморфизме g в графе G2 ребро g(e4 ) мо-
жет быть смежно только ровно двум ребрам
из множества {g(e1 ), g(e2 ), g(e3 )}. Таким об-
разом, изоморфизм g невозможен и база ин-
дукции доказана.
465 / 907
5.1.7. Виды графов (8/9)
Доказательство. (Продолжение) Пусть теперь лемма выполнена для всех звёзд с числом
рёбер r или менее. Тогда если r + 1 рёбер e1 , . . . , er+1 образуют звезду Sr+1 , а за выче-
том ребра e1 или er+1 образуют звезду Sr в графе G1 , то по предположению индукции
рёбра h(e1 ), . . . , h(er ) образуют звезду Sr с центром v1 в графе G2 , аналогично рёбра
h(e2 ), . . . , h(er+1 ) образуют звезду Sr с центром v2 в графе G2 . Значит по лемме v1 = v2
и рёбра h(e1 ), . . . , h(er+1 ) действительно образуют звезду Sr+1 .
Любое подмножество рёбер звезды из трёх или более элементов также образует звезду,
причём с тем же центром. Для вершины v в графе G можно определить максимальную
звезду как звезду, центром которой является v , такую что она не является собственным
подмножеством никакой другой звезды. Обозначим её как SG (v).
Замечание. Фактически, максимальная звезда для вершины — это её окрестность, если
степень больше двух.
Следствие. Пусть G1 (V1 , E1 ) и G2 (V2 , E2 ) — связные рёберно изоморфные графы c изо-
морфизмом h, причём p(G1 ) > 3, p(G2 ) > 3. Тогда максимальной звезде SG1 (v), образо-
ванной рёбрами e1 , . . . , ed(v) , изоморфизм h взаимно однозначно составляет максималь-
ную звезду SG2 (v0), образованную рёбрами h(e1 ), . . . , h(ed(v) ) в графе G2 . 466 / 907
5.1.7. Виды графов (9/9)
Если в графе ориентировать все рёбра, то получится орграф, который называется направ-
ленным, или антисимметричным. Направленный орграф, полученный из полного графа,
называется турниром.
Замечание. В направленном орграфе не может быть «встречных» дуг (u, v) и (v, u), а в
произвольном орграфе это допустимо.
Отступление. Название «турнир» имеет следующее происхождение. Рассмотрим спортивное со-
ревнование для пар участников (или пар команд), где не предусматриваются ничьи. Пометим вер-
шины орграфа участниками и проведем дуги от победителей к побеждённым. В таком случае тур-
нир в смысле теории графов — это как раз результат однокругового турнира в спортивном смыс-
ле.
Если в орграфе полустепень захода некоторого узла равна нулю (то есть d+ (v) = 0),
то такой узел называется источником, если же нулю равна полустепень исхода (то есть
d− (v) = 0), то узел называется стоком. Направленный орграф с одним источником и
одним стоком, в котором есть хотя бы один путь из источника в сток, называется сетью.
467 / 907
5.1.8. Операции над графами (1/9)
Введем следующие операции над графами:
I Объединение (дизъюнктное) графов G1 (V1 , E1 ) и G2 (V2 , E2 ) при условии V1 ∩V2 = ∅
(обозначение — G1 (V1 , E1 ) ∪ G2 (V2 , E2 )) даёт граф G(V, E),
где V = V1 ∪ V2 & E = E1 ∪ E2 .
Пример. K 3,3 = C3 ∪ C3 .
I Соединение графов G1 (V1 , E1 ) и G2 (V2 , E2 ) при условии V1 ∩ V2 = ∅
(обозначение — G1 (V1 , E1 ) + G2 (V2 , E2 )) даёт граф G(V, E),
где V = V1 ∪ V2 & E = E1 ∪ E2 ∪ {e = (v1 , v2 ) | v1 ∈ V1 & v2 ∈ V2 } .
Пример. K3,3 = C 3 + C 3 .
I Удаление вершины v из графа G1 (V1 , E1 ) при условии v ∈ V1
(обозначение — G1 (V1 , E1 ) − v ) даёт граф G2 (V2 , E2 ),
где V2 = V1 − v & E2 = E1 \ {e = (v1 , v2 ) | v1 = v ∨ v2 = v} .
Пример. C3 − v = K2 .
I Удаление ребра e из графа G1 (V1 , E1 ) при условии e ∈ E1
(обозначение — G1 (V1 , E1 ) − e) даёт граф G2 (V2 , E2 ), где V2 = V1 & E2 = E1 − e.
Пример. K2 − e = K 2 . 468 / 907
5.1.8. Операции над графами (2/9)
I Добавление вершины v в граф G1 (V1 , E1 ) при условии v ∈ / V1
(обозначение — G1 (V1 , E1 ) + v ) даёт граф G2 (V2 , E2 ), где V2 = V1 + v & E2 = E1 .
Пример. K2 + v = K2 ∪ K1 .
I Добавление ребра e в граф G1 (V1 , E1 ) при условии e 6∈ E1
(обозначение — G1 (V1 , E1 ) + e, ) даёт граф G2 (V2 , E2 ), где V2 = V1 & E2 = E1 + e.
Пример. P3 + e = C3 .
I Стягивание правильного подграфа с множеством вершин A графа G1 (V1 , E1 ) к вер-
шине v при условии A ⊂ V1 (обозначение — G1 (V1 , E1 )/A) даёт граф G2 (V2 , E2 ),
где V2 = (V1 \ A) + v ,
E2 = E1 \ {e = (u, w) | u ∈ A ∨ w ∈ A} ∪ {e = (u, v) | u ∈ Γ(A) \ A}.
Пример. K4 /C3 = K2 .
Замечание. Если A = {u, v}, причём e = (u, v) ∈ E , то допустима запись G/e.
I Размножение вершины v графа G1 (V1 , E1 ) при условии v ∈ V1 , v 0 6∈ V1
(обозначение — G1 (V1 , E1 ) ↑ v ) даёт граф G2 (V2 , E2 ),
где V2 = V1 + v 0 & E2 = E1 ∪ {(v, v 0 )} ∪ {e = (u, v 0 ) | u ∈ Γ+ (v)} .
Пример. K2 ↑ v = C3 . 469 / 907
5.1.8. Операции над графами (3/9)
Некоторые из примеров, приведённых в определениях операций, нетрудно обобщить. В
частности, легко показать, что имеют место следующие соотношения:
Km,n = K m + K n , Kp−1 = Kp − v,
G + v = G ∪ K1 , Kp−1 = Kp /K2 ,
Kp /Kp−1 = K2 , Kp = Kp−1 ↑ v.
Введённые операции обладают рядом простых свойств, которые легко вывести из опре-
делений. В частности:
G1 ∪ G2 = G2 ∪ G1 , G1 + G2 = G2 + G1 ,
G1 = G2 ⇐⇒ G1 = G2 , G1 ∪ G2 = G1 + G2 .
Замечание. Операции добавления и удаления ребра взаимно обратны:
∀ e ∈ E, e0 ∈
/ E ((G − e) + e = (G + e0 ) − e0 = G) .
В то же время ∀ v 0 ∈
/ V ((G + v 0 ) − v 0 = G), но если вершина v графа G не изолирован-
ная, то (G − v) + v 6= G, потому что в этом случае q((G − v) + v) < q(G).
470 / 907
5.1.8. Операции над графами (4/9)
Результат выполнения нескольких последовательных операций удаления или добавле-
ния вершин или рёбер не зависит от порядка выполнения операций:
(G + v1 ) + v2 = (G + v2 ) + v1 , (G − v1 ) − v2 = (G − v2 ) − v1 ,
(G + e1 ) + e2 = (G + e2 ) + e1 , (G − e1 ) − e2 = (G − e2 ) − e1 .
Поэтому операции удаления и добавления вершин и рёбер можно обобщить, и допускать
в качестве второго аргумента множества вершин и рёбер.
Отступление. Приведённые определения операций над графами и примеры к ним дают повод за-
тронуть один тонкий вопрос, связанный с различиями в традициях математических и программ-
ных обозначений.
Рассмотрим пример к операции дизъюнктного объединения графов
(K 3,3 = C3 ∪ C3 ). Если введённые обозначения понимать буквально, то этот пример кажется
противоречащим определению. Действительно, определение требует, чтобы множества вершин
объединяемых графов не пересекались. Если считать, что C3 обозначает конкретный треугольник,
то придётся признать, что в выражении C3 ∪ C3 множества вершин не только пересекаются, но и
совпадают, а значит, операция объединения неприменима. 471 / 907
5.1.8. Операции над графами (5/9)
Отступление. (Продолжение) На самом деле C3 обозначает как класс треугольников (все треуголь-
ники изоморфны как графы), так и отдельный объект — экземпляр этого класса. Как именно сле-
дует понимать обозначение, считается ясным из контекста. Если стремиться к (излишней в дан-
ном случае) строгости и однозначности обозначений, то приведённый пример можно было бы за-
писать, например, так:

∀ G1 (V1 , E1 ) ∈ C3 , G2 (V2 , E2 ) ∈ C3 V1 ∩ V2 6= ∅ =⇒ ∃ G3 (V3 , E3 ) ∈ K3,3 G1 ∪ G2 ∼ G3 .
Подобная неоднозначность обозначений присуща и программированию, хотя и в меньшей сте-
пени. Например, ключевое слово int в различных контекстах может обозначать встроенный тип
данных (класс объектов), операцию порождения нового объекта этого типа (экземпляра класса),
операцию преобразования другого объекта в объект типа int (явное приведение). Следуя стилю
объектно-ориентированных языков программирования, приведённый пример можно было бы за-
писать так:
newK3,3 = newC3 ∪ newC3 .
Ради краткости и простоты изложения здесь принят значительно менее строгий стиль обозначе-
ний в надежде на то, что программистская интуиция и здравый смысл позволят читателю избе-
жать заблуждений, несмотря на вольности в обозначениях. 472 / 907
5.1.8. Операции над графами (6/9)
Применение операций позволяет устанавливать простые, но очень важные в приложе-
ниях факты.
Теорема. В ациклическом графе рёбер меньше, чем вершин: z(G) = 0 =⇒ q(G) < p(G).
Доказательство. Рассмотрим сначала случай, когда G(V, E) — связный ациклический
граф. Индукция по p. База: при p = 1 имеем q = 0, при p = 2 имеем q = 1. Пусть утвер-
ждение теоремы верно для всех графов с числом вершин меньше p. Рассмотрим связ-
ный ацикличеcкий граф с p вершинами. Если в графе есть висячая вершина v , то удалим
её, G ← G − v . Тогда q − 1 < p − 1 по индукционному предположению, и q < p. Если ви-
сячих вершин нет, то ∀ v ∈ V (d(v) > 2). Возьмём произвольную вершину и перейдём
в смежную вершину по ранее не пройденному ребру. Это возможно, поскольку степень
любой вершины не меньше двух. Ввиду конечности множества вершин, рано или позд-
но попадём в одну из ранее пройденных вершин, то есть выявим цикл — противоречие.
Рассмотрим теперь несвязный ациклический граф. Его компонентами являются связные
ациклические графы, в каждом из которых q < p.
473 / 907
5.1.8. Операции над графами (7/9)
В рассмотренных операциях с графами вершины (рёбра) результирующего графа полу-
чаеются из вершин (рёбер) исходных графов. В приложениях оказываются весьма полез-
ными операции, в которых это ограничение не выполняется.
Рёберным графом I(G) для (p, q)-графа G(V, E) называется граф с q вершинами, соот-
ветствующими рёбрам исходного графа, причём вершины рёберного графа I(G) смеж-
ны тогда и только тогда, когда смежны соответствующие рёбра исходного графа G.
Замечание. Построить диаграмму рёберного графа I(G) по диаграмме графа G очень
просто. Достаточно поставить по одной точке в произвольном месте каждой линии, изоб-
ражающей ребро G, и затем соединить попарно все точки, которые соответствуют смеж-
ным ребрам.
Примеры. Ниже приведены диаграммы графов I(P3 ) = K2 , I(C3 ) = C3 , I(S3 ) = C3 ,
I(C4 ) = C4 , I(S4 ) = C4 .

474 / 907
5.1.8. Операции над графами (8/9)
Теорема. [Уитни] Любой связный граф, отличный от C3 и S3 , однозначно задаётся своим
рёберным графом.
h
Доказательство. Рассмотрим графы G1 и G2 такие, что I(G1 ) ∼ I(G2 ) и покажем, что
g
G1 ∼ G2 . Если p(G1 ) 6 4, p(G2 ) 6 4, то рассмотрев конечное число всех таких графов,
нетрудно убедиться, что среди них только пара C3 и S3 имеет изоморфные рёберные гра-
фы, но именно эта пара исключена из рассмотрения условием теоремы. Далее рассмот-
рим случай p(G1 ) > 4, p(G1 ) > 4. Для каждой вершины v из G1 найдём соответствую-
щую ей вершину u = g(v) из G2 , рассмотрев два случая.
[ d(v) > 1 ] Если вершина v не висячая, то она является центром максимальной звезды.
По следствию п. 5.1.3. ей соответствует максимальная звезда SG2 (u) с центром u в графе
G2 . Мы построили частичную функцию g1 (v) ← u на множестве вершин графа G1 , причём
функция g1 инъективна. Действительно, если h(SG1 (v1 )) = h(SG1 (v2 )) = SG2 (u), то из
биективности h имеем SG1 (v1 ) = SG1 (v2 ) = h−1 (SG2 (u)). Поскольку это максимальные
звезды, то в каждой звезде как минимум два ребра. В таком случае центр единственный
и v1 = v2 = v . Значит g1 — инъективная функция, а по соображениям симметрии g1 —
биекция на своей области определения. 475 / 907
5.1.8. Операции над графами (9/9)
Доказательство. (Продолжение)
[ d(v) = 1 ] Если вершина v висячая, то в силу связности графа и того, что p(G1 ) > 4,
существует вершина w смежная с v , такая что d(w) > 1. Положим x ←{v, w}. Вершина
w является центром звезды и для неё уже определена вершина u = g1 (w). Выберем в
звезде SG2 (u) = h(SG1 (w)) такое ребро y = {u, t}, что h(x) = y . Покажем что d(t) = 1.
Пусть это не так, тогда в звезде SG2 (t) существует ребро z 6= y не входящее в SG2 (u).
Следовательно, в звезде h−1 (SG2 (t)) также будет ребро h−1 (z) смежное с e, но не входя-
щее в SG1 (w). Значит его концом является v , но тогда d(v) 6= 1 — противоречие. Получаем
инъекцию множества висячих вершин G1 в такое же множество для G2 , обозначим её как
g2 . По соображениям симметрии g2 — биекция на своей области определения. Наконец
покажем, что биекция g(v) ← if d(v) > 1 then g1 (v) else g2 (v) end if является вершин-
ным изоморфизмом. Расширим обозначение SG (v) и на случай d(v) = 1. Вершины v1 и
v2 смежны в G1 тогда и только тогда, когда SG1 (v1 ) и SG1 (v1 ) имеют общее ребро. В слу-
чае если e является общим ребром SG1 (v1 ) и SG1 (v1 ), то h(e) является общим ребром
SG2 (g(v1 )) = h(SG1 (v1 )) и SG2 (g(v2 )) = h(SG1 (v2 )). Аналогично и в обратную сторону.
Таким образом {v1 , v2 } ∈ G1 ⇐⇒ {g(v1 ), g(v2 )} ∈ G2 . Графы G1 и G2 изоморфны. 476 / 907
5.2. Представления графов
Конструирование структур данных для представления в программе объектов математи-
ческой модели — это основа искусства практического программирования. Мы приво-
дим четыре различных базовых представления графов. Выбор наилучшего представле-
ния определяется требованиями конкретной задачи. Более того, на практике использу-
ются, как правило, некоторые комбинации или модификации указанных представлений,
общее число которых необозримо. Но все они так или иначе основаны на тех базовых
идеях, которые описаны в этом разделе.
Математические модели имеют две ипостаси: с одной стороны, они создаются, обдумы-
ваются и понимаются людьми; с дрогой стороны, они программируются и используют-
ся для вычислений в компьютерах. Для людей очень важна визуализация и наглядность
математических моделей. Графическое представлений отношений — важный вопрос, по-
скольку именно наглядность диаграмм является причиной востребованности языка тео-
рии графов в информатике.

477 / 907
5.2.1. Представление графов в компьютере (1/6)

Известны различные способы представления графов в памяти компьютера, которые раз-


личаются объёмом занимаемой памяти и скоростью выполнения операций над графа-
ми. Представление выбирается исходя из потребностей конкретной задачи. Далее при-
ведены четыре наиболее часто используемых представления с указанием характеристи-
ки n(p, q) — объёма памяти для каждого представления. Здесь p — число вершин, а q —
число рёбер.
Замечание. Значение характеристики n(p, q) указывается с помощью символа O, кото-
рый означает совпадение по порядку величины (или равенство с точностью до мульти-
пликативной константы c). Применительно к измерению занимаемой памяти использо-
вание символа O связано с тем, что память может быть измерена в битах, байтах, машин-
ных словах или иных единицах. Коэффициент c при этом меняется, а порядок величины
остаётся.

478 / 907
5.2.1. Представление графов в компьютере (2/6)
Представления иллюстрируются на конкретных примерах графа G и орграфа D, диа-
граммы которых представлены на рисунке.

479 / 907
5.2.1. Представление графов в компьютере (3/6)
Представление графа с помощью квадратной булевой матрицы

M : array [1..p, 1..p] of 0..1,

отражающей смежность вершин, называется матрицей смежности,


где M [i, j] ←(vi ∈ Γ(vj )), то есть вершины vi и vj смежны.
Для матрицы смежности n(p, q) = O(p2 ).

Пример. 0 1 0 1 0 1 0 0

1 0 1 1 0 0 1 1
G:
0 D:
1 0 1 0
0 0 0
1 1 1 0 1 0 1 0
Замечание. Матрица смежности графа симметрична относительно главной диагонали,
поэтому достаточно хранить только верхнюю (или нижнюю) треугольную матрицу.
Матрицу смежности орграфа необходимо хранить целиком.
480 / 907
5.2.1. Представление графов в компьютере (4/6)
Представление графа матрицей H : array [1..p, 1..q] of 0..1, отражающей инцидентность
вершин и рёбер, называется матрицей инциденций, где H[i, j] ← ∃ ej ∈ E (vi ∈ ej ), то
есть вершина vi инцидентна ребру ej . Представление орграфа матрицей
H : array [1..p, 1..q] of −1..1, отражающей инцидентность узлов и дуг, также называется
матрицей инциденций, где H[i, j] ← if ∃ ej ∈ E (ej = (x, vi )) then 1
elseif ∃ ej ∈ E (ej = (vi , x)) then −1 else 0 end if, то есть если узел vi инцидентен дуге
ej и является её концом, то H[i, j] = 1, а если узел vi инцидентен дуге ej и является её
началом, то H[i, j] = −1, если же узел vi и ребро ej не инцидентны, то H[i,j] = 0. Для
матрицы инциденций n(p, q) = O(pq).

Пример. 1 0 0 1 0 −1 0 0 1 0

1 1 0 0 1 1 −1 0 0 −1
G:
0 1 1 0 0 D:
0
1 1 0 0
0 0 1 1 1 0 0 −1 −1 1
Замечание. Для связных графов q > p − 1, поэтому матрица смежности несколько ком-
пактнее матрицы инциденций.
481 / 907
5.2.1. Представление графов в компьютере (5/6)
Представление графа с помощью списочной структуры, отражающей смежность вершин
и состоящей из массива указателей Γ : array [1..p] of ↑ N на списки смежных вершин, где
элемент списка представлен структурой N = struct {v : 1..p ; n : ↑ N }, называется спис-
ком смежности. В случае представления неориентированных графов списками смежно-
сти n(p, q) = O(p+2q), а в случае ориентированных графов n(p, q) = O(p+q).
Замечание. Массив Γ также можно представить списком.
Пример. Списки смежности для графа G и орграфа D представлены на рисунке.

482 / 907
5.2.1. Представление графов в компьютере (6/6)
Массив структур E : array [1..q] of struct {b, e : 1..p}, отражающий список пар смежных
вершин (или, для орграфов, узлов), называется массивом рёбер (массивом дуг). Для мас-
сива рёбер (или дуг) n(p, q) = O(2q).
Замечание. Для представления графов с изолированными вершинами может понадо-
биться хранить ещё и число p, если только система программирования не позволяет из-
влечь значение p из массива структур E .
Пример. Представление с b e b e
помощью массива рёбер 1 2 1 2
(дуг) показано в таблице 1 4 2 3
(для графа G — слева, а для 2 3 2 4
орграфа D — справа). 2 4 4 1
3 4 4 3
Замечание. Указанные представления пригодны для графов и орграфов, а после некото-
рой модификации — также и для псевдографов, мультиграфов и гиперграфов.
483 / 907
5.2.2. Обходы графов (1/9)
Обход графа — это некоторое систематическое перечисление его вершин и (или) рё-
бер. Наибольший интерес представляют обходы, использующие локальную информацию
(списки смежности). Среди всех обходов наиболее известны поиск в ширину и в глуби-
ну. Алгоритмы поиска в ширину и в глубину лежат в основе многих конкретных алгорит-
мов на графах и изложены во множестве источников. Определение поиска в ширину и
в глубину обычно даётся не постулированием требуемых свойств обходов, но алгорит-
мически, предъявлением конкретных алгоритмов. Это обстоятельство, а также многочис-
ленные технические детали изложения несколько затуманивают основную идею, и мо-
жет сложиться впечатление, что поиск в ширину и в глубину — это принципиально раз-
личные алгоритмы: например, поиск в ширину — итеративный алгоритм, а поиск в глу-
бину — рекурсивный. На самом деле, хотя поиск в ширину и в глубину действительно да-
ют различные обходы, по существу это две реализации одного алгоритма, применяющие
различные структуры данных.
Если структура данных T — это стек (LIFO — Last In First Out), то обход называется поиском
в глубину. Если T — это очередь (FIFO — First In First Out), то обход называется поиском
в ширину. 484 / 907
5.2.2. Обходы графов (2/9)
Вход: граф G(V, E), представленный списками смежности Γ.
Выход: последовательность вершин обхода.
for v ∈ V do x[v] ← 0 end for //вначале все вершины не отмечены
select v ∈ V //начало обхода — произвольная вершина
v → T //помещаем v в структуру данных T . . .
x[v] ← 1 //. . . и отмечаем вершину v
repeat
u ← T //извлекаем вершину из структуры данных T . . .
yield u //. . . и возвращаем её в качестве очередной пройденной вершины
for w ∈ Γ(u) do
if x[w] = 0 then
w → T //помещаем w в структуру данных T . . .
x[w] ← 1 //. . . и отмечаем вершину w
end if
end for
until T = ∅ 485 / 907
5.2.2. Обходы графов (3/9)
Замечание. Это изложение алгоритмов заметно отличается от обычного изложения. Здесь
не используется три цвета вершин, и при буквальном сравнении протоколов работы ал-
горитмов поиска в глубину получаются различные обходы. В результате у внимательного
читателя может создаваться ошибочное впечатление, что приведённый алгоритм «непра-
вильный». На самом деле, это не так. В случае поиска в ширину различий между приве-
дённым алгоритмом и обычным изложением алгоритма поиска в ширину нет. Различие
между приведённым алгоритмом в случае поиска в глубину и обычным рекурсивным ал-
горитмом поиска в глубину заключается только в порядке рассмотрения вершин w, смеж-
ных с текущей вершиной u. В нашем варианте вершины w заносятся в структуру данных
T в том порядке, в каком вершины встречаются в списке смежности Γ(u), и, соответствен-
но, рассматриваться будут в обратном порядке, если T — это стек. В рекурсивном вари-
анте вершины будут рассматриваться в порядке следования в списке смежности. Таким
образом, различие в том, как просматривать списки смежности: от начала к концу или от
конца к началу. На свойства алгоритмов и получаемых обходов это различие не влияет.

486 / 907
5.2.2. Обходы графов (4/9)
Пример. В следующей таблице показаны протоколы поиска в глубину и в ширину для
графа, диаграмма которого приведена на рисунке в начале раздела. Предполагается, что
начальной является вершина 1. В первой паре столбцов в таблице приведён протокол
поиска в ширину, а во второй паре столбцов — в глубину. Кроме того, для сравнения, в
третьем столбце приведен протокол поиска в глубину для случая, когда смежные верши-
ны заносятся в стек в обратном порядке. Тем самым третий столбец показывает, как ве-
дёт себя рекурсивный вариант алгоритма поиска в глубину. На рисунке сплошные стрел-
ки с номерами рядом с рёбрами показывают движение по графу при поиске в глубину, а
пунктирные — в ширину.
u T u T u T
1 2,4 1 2,4 1 4,2
2 4,3 4 2,3 2 4,3
4 3 3 2 3 4
3 ∅ 2 ∅ 4 ∅

487 / 907
5.2.2. Обходы графов (5/9)
Теорема. Если граф G связен и конечен, то поиск в ширину и поиск в глубину обходят
все вершины по одному разу за время, пропорциональное не более чем суммарному числу
вершин и рёбер.
Доказательство.
[ Единственность обхода вершины ] Обходятся только вершины из T . В T попадают неотме-
ченные вершины, при этом они отмечаются. Следовательно, любая вершина будет обой-
дена не более одного раза.
[ Завершаемость алгоритма ] Всего в T может попасть не более p вершин. На каждом шаге
одна вершина удаляется из T . Следовательно, алгоритм завершит работу не более чем
через p шагов.
[ Обход всех вершин ] От противного. Пусть алгоритм закончил работу и вершина w не
обойдена. Значит, w не попала в T . Следовательно, она не была отмечена. Отсюда сле-
дует, что все вершины, смежные с w, не были обойдены и отмечены. Аналогично, любые
вершины, связанные с неотмеченными, сами не отмечены (после завершения алгорит-
ма). Но G связен, значит, существует путь hv, wi. Следовательно, исходная вершина v не
отмечена — но она отмечена на первом шаге! 488 / 907
5.2.2. Обходы графов (6/9)
Доказательство. (Продолжение)
[ Трудоёмкость алгоритма ] Инициализация (вторая строчка) выполняется за O(p). В цик-
ле каждая вершина просматривается не более одного раза, и для каждой просматривае-
мой вершины её список смежности просматривается один раз. Следовательно, цикл вы-
полняется за O(q). Значит трудоёмкость алгоритма O(p + q).
Таким образом, алгоритмы обхода графа в ширину и в глубину обладают одними и теми
же теоретическими свойствами. Возникает вопрос: чем же отличаются алгоритмы прак-
тически и в каких случаях их целесообразно применять. Если целью применения ал-
горитмов является построение обходов графа, то алгоритмы практически не отличают-
ся. Если же целью применения алгоритмов является поиск в графе какой-то конкретной
вершины, то алгоритмы существенно различны с практической точки зрения, причём эти
различия зависят от особенностей графа поиска, и от того, как соотносятся начальная и
искомая вершины. Мы даём частичный ответ на вопрос о сравнении алгоритмов поис-
ка в ширину и в глубину в форме серии следствий. В следствиях приводятся оценки но-
мера шага алгоритма, на котором достигается некоторая искомая вершина. Номер шага
алгоритма можно трактовать как время поиска. 489 / 907
5.2.2. Обходы графов (7/9)
Следствие. [1] Пусть (u1 , . . . , ui , . . . , uj , . . . , up ) — обход (то есть последовательность
вершин) при поиске в ширину. Тогда ∀ i < j (d(u1 , ui ) 6 d(u1 , uj )) .
Другими словами, расстояние текущей вершины от начальной является монотонно воз-
растающей функцией времени поиска в ширину, вершины обходятся в порядке возрас-
тания расстояния от начальной вершины.
Следствие. [2] Пусть (u1 , . . . , ui , . . . , up ) — обход при поиске в глубину.
Тогда ∀ i > 1 (d(u1 , ui ) < i 6 p) .
Другими словами, время поиска в глубину любой вершины не менее расстояния от на-
чальной вершины и не более общего числа вершин. В худшем случае время поиска в глу-
бину может быть максимальным, независимо от расстояния до начальной вершины.
Следствие. [3] Пусть (u1 , . . . , ui , . . . , up ) — обход при поиске в ширину,
а D(u1 , 1), D(u1 , 2), . . . — ярусы графа относительно вершины u1 . Тогда
 
d(u1 ,ui )−1 d(u1 ,ui )
X X
∀i > 1  |D(u1 , j)| < i 6 |D(u1 , j)| .
j=0 j=0
490 / 907
5.2.2. Обходы графов (8/9)
Другими словами, время поиска в ширину ограничено снизу количеством вершин во всех
ярусах, находящихся на расстоянии меньшем, чем расстояние от начальной вершины до
текущей, и ограничено сверху количеством вершин в ярусах, начиная с яруса текущей
вершины и включая все меньшие ярусы.
Следствие. [4] Пусть (u1 , . . . , ui , . . . , up ) — обход при поиске в ширину,
а (v1 , . . . , vj , . . . , vp ) — обход при поиске в глубину, где ui = vj . Пусть также вершина
ui = vj — одна из вершин самого внешнего яруса относительно вершины u1 = v1 , то
есть расстояние d(u1 , ui ) максимально. Тогда математическое ожидание E( ji ) ≈ 2.
Другими словами, поиск в глубину отдалённой вершины в среднем вдвое быстрее, чем
поиск в ширину.
Замечание. В формулировке следствия используется знак приближённого равенства, по-
скольку граф может иметь особенности, влияющие на применение алгоритма. Например,
к искомой вершине может вести цепь из промежуточных вершин степени два. В таком
случае поиск в глубину, если «повезёт», найдёт искомую вершину за минимальное вре-
мя. Математическое ожидание равно двум, если особенностей нет, например, граф регу-
лярный. 491 / 907
5.2.2. Обходы графов (9/9)
Пример.

Замечание. Алгоритм поиска в ширину и в глубину может быть применен также к несвяз-
ным графам. Действительно, для этого достаточно применить алгоритм к одной компо-
ненте связности, потом к следующей и так далее. Алгоритм может быть применён также
к любым орграфам, в том числе к орграфам, которые не являются сильно связными (см.
следующий раздел). Для этого достаточно применить алгоритм, начиная с произвольно-
го узла, удалить все обойденные узлы с инцидентными дугами, а затем применить алго-
ритм к оставшейся части орграфа и так далее.
492 / 907
5.2.3. Орграфы и бинарные отношения (1/6)
Любой орграф G(V, E), возможно, с петлями, но без кратных дуг, задаёт бинарное отно-
шение E на множестве V . Обратно, любое бинарное отношение E на множестве V опре-
деляет орграф G(V, E): пара элементов принадлежит отношению (a, b) ∈ E ⊂ V × V
тогда и только тогда, когда в графе G есть дуга (a, b).
Пример. это определение должно быть в главе 2 Рассмотрим отношение делимости a | b
на множестве натуральных чисел. Известно, что ∀ n ∈ N (1 | n) и ∀ n ∈ N (n | n), то есть
любое число делится на 1 и себя. Такие делители называются тривиальными. Прочие де-
лители, если они есть, называются нетривиальными, или собственными. На рисунке пред-
ставлена диаграмма нагруженного орграфа, соответствующего отношению собственной
делимости, заданному на множестве {2, 3, 4, 5, 6, 7, 8, 9}.

493 / 907
5.2.3. Орграфы и бинарные отношения (2/6)
Орграф, соответствующий рефлексивному отношению, в каждой вершине имеет петлю,
а значит является псевдографом. Если же отношение антирефлексивно, то орграф вовсе
не имеет петель. Может оказаться так, что для рефлексивного отношения рисовать петлю
на диаграмме каждой вершины утомительно и неинформативно. Поэтому петли на диа-
граммах графов и орграфов показывают, только если эта информация существенна.
Пример. Рассмотрим отношение
{(a, b) ∈ N × N | (a + b) mod 4 = 0} на
множестве {2, 3, 4, 5, 6, 7, 8, 9}. Это отноше-
ние симметрично, поэтому ему удобнее ста-
вить в соответствие граф, а не орграф. Петли
на диаграмме этого графа являются суще-
ственными, так как отношение не рефлексив-
но и не антирефлексивно.

494 / 907
5.2.3. Орграфы и бинарные отношения (3/6)

Дополнение орграфов есть дополнение отношений. Изменение направления всех дуг со-
ответствует обратному отношению.
Степени бинарного отношения E ⊂ V × V соответствуют путям в орграфе. Степень E 1
соответствует путям длины 1, то есть дугам, E 2 соответствует путям длины 2 и т. д.
Если отношение антисимметрично, то соответствующий ему орграф не имеет встречных
дуг. Антисимметричными являются, в частности, отношения порядка, которые рассматри-
ваются в следующем параграфе с точки зрения теории графов.
Если же отношение симметрично, то всякая дуга орграфа имеет встречную, и направле-
ние дуги не имеет значения. Таким образом, всякому симметричному отношению соот-
ветствует неориентированный граф, и обратно, граф (неориентированный) соответству-
ет симметричному отношению.
Полный граф соответствует универсальному отношению.

495 / 907
5.2.3. Орграфы и бинарные отношения (4/6)

Пример. Напомним, что отношение взаимной


простоты {(a, b) ∈ N × N | gcd(a, b) = 1} на
множестве натуральных чисел симметрично.
На рисунке представлена диаграмма графа,
соответствующего отношению взаимной про-
стоты на множестве {2, 3, 4, 5, 6, 7, 8, 9}.

Исходя из названий «граф» и «ориентированный граф» в первый момент может пока-


заться, что класс графов шире класса орграфов. Однако на самом деле, поскольку сим-
метричные отношения являются подклассом класса всех отношений, класс графов явля-
ется подклассом класса орграфов. Так исторически сложилась терминология.

496 / 907
5.2.3. Орграфы и бинарные отношения (5/6)

В то же время, следует обратить внимание, что мультиорграф не может задавать бинар-


ное отношение, так как пары в подмножестве прямого произведения двух множеств не
повторяются. Иначе говоря, между языками мультиграфов и бинарных отношений нет
прямого соответствия.
Функция является частным случаем отношения и может быть представлена орграфом.
Рассмотрим функцию f : A → B , ей соответствует двудольный орграф G(A, B, E), для
которого V = A ∪ B и E = {(a, b) ∈ A × B | b = f (a)}. Множество всех вершин оргра-
фа G, имеющих исходящие дуги, есть область определения функции, а множество всех
вершин, имеющих хотя бы одну входящую дугу, — область значений функции. При этом в
силу однозначности, любой узел орграфа G имеет не более одной исходящей дуги. Если
функция является функцией на множестве V , f : V → V , то диаграмма орграфа G(V, E)
может иметь довольно причудливую форму.

497 / 907
5.2.3. Орграфы и бинарные отношения (6/6)
Примеры. На рисунке слева представлена диаграмма орграфа для функции x mod 9 + 1,
а справа — функции x mod 4 + 1, действующих на множестве {1, 2, 3, 4, 5, 6, 7, 8, 9}. Так
как функции тотальные, каждый узел имеет ровно одну исходящую дугу.

Замечание. Диаграммы орграфов пригодны для представления только таких функкций, у


которых область определения и область значений существенно конечны. Для бесконеч-
но заданных функций, в частности, непрерывных функций вещественной переменной,
традиционным и наиболее используемым графическим средством является представле-
ние графика функции в виде линии, которая к тому же наглядно иллюстрирует многие
свойства этой функции.
498 / 907
5.2.4. Свойства отношений и достижимость в орграфах (1/4)
В качестве примера связи между орграфами и бинарными отношениями рассмотрим от-
ношения частичного порядка с точки зрения теории графов. Узел u в орграфе G(V, E)

достижим из узла v , если существует путь из v в u. Путь из v в u обозначим hv, ui.
Отношение достижимости можно представить матрицей T : array [1..p, 1..p] of 0..1, где
T [i, j] = 1, если узел vj достижим из узла vi , и T [i, j] = 0, если узел vj недостижим из
узла vi .
Рассмотрим отношение строгого частичного порядка , которое характеризуется следу-
ющими аксиомами:

1. Антирефлексивность: ∀ v ∈ V (¬(v  v)).


2. Транзитивность: ∀ u, v, w ((v  w & w  u =⇒ v  u)).
3. Антисимметричность: ∀ u, v (¬(u  v & v  u)).

Отношению строгого частичного порядка ⊂ V × V можно сопоставить орграф G(V, E),


в котором a  b ⇐⇒ (a, b) ∈ E .
499 / 907
5.2.4. Свойства отношений и достижимость в орграфах (2/4)
Теорема. [1] Если отношение E есть строгое частичное упорядочение, то орграф G(V, E)
не имеет контуров.
Доказательство. От противного. Пусть в G есть контур. Рассмотрим любую дугу (a, b) в
этом контуре. Тогда имеем a  b, но b  a по транзитивности, что противоречит анти-
симметричности упорядочения.
Теорема. [2] Если орграф G(V, E) не имеет контуров, то отношение достижимости есть
строгое частичное упорядочение.
Доказательство.
[ Антирефлексивность ] Нет контуров, следовательно, нет петель.
[ Транзитивность ] Если существуют пути из v в w и из w в u, то существует и путь из v в u.
[ Антисимметричность ] От противного. Пусть ∃ u, v (u  v & v  u), то есть существует
→ → →
путь hv, ui из v в u и путь hu, vi из u в v . Следовательно, существует контур вида hu, v

i + hv, ui, что противоречит условию.

500 / 907
5.2.4. Свойства отношений и достижимость в орграфах (3/4)

Теорема. [3] Если орграф не имеет контуров, то в нем есть узел, полустепень исхода
которого равна 0.
Доказательство. От противного. Пусть такого узла нет, тогда для любого узла найдётся
исходящая дуга. Пойдём по этой дуге. Ввиду конечности числа узлов, рано или поздно
попадём в узел, в котором уже были. Следовательно, имеем контур — противоречие.
Замечание. Эта теорема позволяет найти минимальный элемент в конечном частично
упорядоченном множестве, который требуется в алгоритме топологической сортировки
(п. 4.6.3). А именно, минимальный элемент — это сток, то есть узел, которому в матрице
смежности соответствует нулевая строка.

501 / 907
5.2.4. Свойства отношений и достижимость в орграфах (4/4)
Если E — бинарное отношение на V , то транзитивным замыканием E + на V будет отно-
шение достижимости на орграфе G(V, E).
Теорема. Пусть M — матрица смежности орграфа G(V, E). Тогда M k [i, j] = 1 в том и
только в том случае, если существует путь длиной k из узла vi в узел vj .
Доказательство. Индукция по k . База: k = 1, M 1 = M — пути длины 1. Пусть M k−1
p 
содержит пути длины k−1. Тогда M k [i, j] = M k−1 [i, l] & M [l, j] , то есть путь длины
W
l=1
k из узла i в узел j существует тогда и только тогда, когда найдётся узел l такой, что
существует
→  →  k − 1 из
путь длины  i в→l и дуга
 →(l, j), то есть 
∃ hi, ji |hi, ji| = k ⇐⇒ ∃ l ∃ hi, li |hi, li| = k − 1 & (l, j) ∈ E .
Wp−1
Если T — матрица достижимости, то очевидно, что T = k=1 M k . Трудоёмкость прямого
вычисления по этой формуле составит O(p4 ). Матрица достижимости T может быть вы-
числена по матрице смежности M алгоритмом Уоршалла (п. 4.4.2) за O(p3 ).

502 / 907
5.2.5. Граф инциденций (1/5)
Отношение инцидентности между вершинами и рёбрами (узлами и дугами) также может
быть представлено графом (орграфом) инциденций. Для графов отношение инцидентно-
сти симметрично, поэтому граф инциденций является двудольным графом (а не оргра-
фом).
Пример. На рисунке представлены диаграммы графа (слева) и его графа инциденций
(справа), для примера из п. 5.3.1.

Чтобы не потерять информацию о направлении дуг, для орграфов обычно считают, что
узел инцидентен исходящим дугам и входящие дуги инцидентны узлу.
503 / 907
5.2.5. Граф инциденций (2/5)
Таким образом, для орграфов отношение инциденции задаётся орграфом.
Пример. На рисунке представлены диаграммы орграфа (слева) и его орграфа инциден-
ций (справа), для примера из п. 5.3.1.

Замечание. В графе инциденций степени вершин сохраняются, а степени рёбер равны 2.


В орграфе инциденций полустепени узлов сохраняются, а у дуг полустепени равны 1.
Граф инциденций оказывается особенно полезен при рассмотрении отношений, устро-
енных более сложно, нежели бинарные отношения на конечном множестве.
504 / 907
5.2.5. Граф инциденций (3/5)
В гиперграфах рёбра связывают произвольные непустые подмножества множества вер-
шин. Для гиперграфов нет единой общепринятой нотации диаграмм. На рисунке приве-
дены две наиболее распространенные. Слева рёбра изображены в виде овалов, охваты-
вающих смежные вершины. При большом количестве вершин и рёбер такая диаграмма
трудно читается. Можно рисовать рёбра, имеющие несколько концов (см. рисунок в цен-
тре), с помощью специальных «ромбиков», которые считаются частью линии, а не фигу-
рой. Фактически, этот способ задаёт диаграмму графа инциденций гиперграфа (см. ри-
сунок справа).

505 / 907
5.2.5. Граф инциденций (4/5)

Таким образом, граф инциденций гиперграфа — это двудольный граф без ограничений
на степени вершин.
Аналогичные построения легко провести для гиперорграфов.
Отступление. Не следует думать, что гиперграфы и гиперорграфы — это какая-то экзотика. Напротив
такие конструкции часто встречаются в реальных приложениях. Например, игровые деревья, из-
вестные также как деревья И/ИЛИ, которые являются основной структурой данных в игровых про-
граммах в символическом искусственном интеллекте, фактически являются гиперорграфами спе-
циального вида.
Другим примером являются блок-схемы, диаграммы UML, диаграммы «сущность-связь» и тому
подобное.

506 / 907
5.2.5. Граф инциденций (5/5)

Таким образом, имеется полная аналогия между орграфами и бинарны-


ми отношениями — фактически, это один и тот же класс объектов, только
описанный разными средствами. Отношения (в частности, функции) явля-
ются базовым средством для построения подавляющего большинства ма-
тематических моделей, используемых при решении практических задач.
С другой стороны, графы допускают наглядное представление в виде диа-
грамм. Этим обстоятельством объясняется широкое использование графов
в программировании.

507 / 907
5.3. Деревья

Деревья заслуживают отдельного и подробного рассмотрения по двум причинам.


I Деревья являются в некотором смысле простейшим классом графов. Для них выпол-
няются многие интересные утверждения, которые не всегда выполняются для гра-
фов в общем случае. Применительно к деревьям многие доказательства и рассуж-
дения оказываются намного проще. Выдвигая какие-то гипотезы при решении задач
теории графов, целесообразно сначала их проверять на деревьях.
I Деревья являются самым распространённым классом графов, применяемых в про-
граммировании, причём в самых разных ситуациях. Более половины объёма этой
главы посвящено рассмотрению конкретных применений деревьев в программиро-
вании.

508 / 907
5.3.1. Свободные деревья (1/8)
Граф без циклов называется ациклическим, или лесом. Связный ациклический граф назы-
вается (свободным) деревом. Таким образом, компонентами связности леса являются де-
ревья.
Замечание. Слово «свободное» употребляется в том случае, когда нужно подчеркнуть от-
личие деревьев от других объектов, родственных деревьям: ориентированных деревьев,
упорядоченных деревьев и т. д.
В связном графе G выполняется неравенство q(G) > p(G) − 1. Граф G (не обязательно
связный!), в котором q(G) = p(G)−1, называется древочисленным. В ациклическом графе
G z(G) = 0. Пусть u, v — несмежные вершины графа G, x = (u, v) 6∈ E . Если граф G + x
имеет ровно один простой цикл, z(G + x) = 1, то граф G (не обязательно ациклический!)
называется субциклическим.
Замечание. Графы K3 ∪ K1 и K3 ∪ K2 являются древочисленными и субциклическими и
в то же время не являются ни связными, ни ациклическими.
Ребро, соединяющее несмежные вершины свободного дерева, называется хордой. Хорда
дерева не принадлежит дереву!
509 / 907
5.3.1. Свободные деревья (2/8)
Следующая теорема устанавливает, что любые два из четырех свойств — связность, ацик-
личность, древочисленность и субцикличность — характеризуют граф как дерево.
Теорема. Пусть G(V, E) — граф с p вершинами, q ребрами, k компонентами связности и z
простыми циклами. Пусть далее x — ребро, соединяющее любую пару несмежных вершин
в G. Тогда следующие утверждения эквивалентны.
1. G — дерево, то есть связный граф без циклов, k(G) = 1 & z(G) = 0.
2. Любые две вершины соединены в G единственной простой цепью, ∀ u, v (|P (u, v)| = 1)
3. G — связный граф, и любое ребро есть мост, k(G) = 1 & ∀ e ∈ E (k(G − e) > 1) .
4. G — связный и древочисленный, k(G) = 1 & q(G) = p(G) − 1.
5. G — ациклический и древочисленный, z(G) = 0 & q(G) = p(G) − 1.
6. G — древочисленный и субциклический (за двумя исключениями), q(G) = p(G) − 1,
G 6= K1 ∪ K3 , G 6= K2 ∪ K3 , z(G + x) = 1.
7. G — ациклический и субциклический, z(G) = 0 & z(G + x) = 1.
8. G — связный, субциклический и неполный, k(G) = 1, G 6= Kp , p > 3, z(G + x) = 1.
510 / 907
5.3.1. Свободные деревья (3/8)
Доказательство.
[ 1=⇒2 ] От противного. Пусть существуют две цепи hu, vi. Некоторые вершины этих це-
пей различны. Обозначим через w1 первую вершину при перечислении вершин от u к v ,
такую, что следующие вершины в цепях различны, а через w2 обозначим первую верши-
ну при перечислении вершин от v к u, такую, что следующие вершины в цепях различны
(рисунок слева). Рассмотрим отрезок hw1 , w2 i первой цепи при перечислении вершин от
u к v и отрезок hw2 , w1 i второй цепи при перечислении вершин от v к u.
Тогда hw1 , w2 i + hw2 , w1 i – цикл, что противоречит ацикличности графа G.

[ 2=⇒3 ] Любые две вершины соединены цепью (единственной), следовательно,


k(G) = 1. Далее от противного. Пусть ребро x — не мост. Тогда в G−x концы этого ребра
связаны цепью. Само ребро x — вторая цепь.
511 / 907
5.3.1. Свободные деревья (4/8)
Доказательство. (Продолжение 1)
[ 3=⇒4 ] Индукция по p. База: p = 1 =⇒ q = 0. Пусть q(G) = p(G) − 1 для всех
связных графов G с числом вершин меньше p, у которых любое ребро является мостом.
Тогда удалим из графа G некоторое ребро x (которое является мостом). Получим две
компоненты, G0 и G00 , удовлетворяющие индукционному предположению. Имеем
q 0 = p0 − 1, q 00 = p00 − 1, q = q 0 + q 00 + 1 = p0 − 1 + p00 − 1 + 1 = p − 1.
[ 4=⇒5 ] От противного. Пусть есть цикл с n вершинами и n рёбрами. Остальные p − n
вершин имеют инцидентные им рёбра, которые связывают их с циклом. Следовательно,
q > p, что противоречит условию q = p − 1.
[ 5=⇒6 ] Граф G — ациклический, следовательно, G 6= K2 ∪ K3 , G 6= K1 ∪ K3 . Далее от
противного. Пусть z(G + x) 6= 1. Если z(G + x) > 2, то x ∈ Z1 , x ∈ Z2 , где Z1 и Z2 —
вновь образованные циклы в графе G + x. Но тогда Z1 ∪ Z2 \ {x} — цикл в графе G, что
противоречит ацикличности графа G. Если же z(G + x) = 0, то удалим из графа G + x
ребро x. Получим две компоненты, G1 и G2 . Графы G1 и G2 — ациклические.
512 / 907
5.3.1. Свободные деревья (5/8)
Доказательство. (Продолжение 2) Убедимся, что G1 и G2 являются связными. Если не
связны они оба, то q(G1 ) < p(G1 )−1 и q(G2 ) < p(G2 )−1, то есть q(G) = q(G1 )+q(G2 ) <
p(G1 )−1+p(G2 )−1 = p(G)−2, что противоречит древочисленности G. Если несвязным
является только один из них, пусть G1 , то G2 связный (q(G2 ) > p(G2 )−1) и ациклический
(q(G2 ) < p(G2 )), что даёт древочисленность. Тогда p(G1 ) = p(G) − p(G2 ) = q(G) + 1 −
(q(G2 ) + 1) = q(G1 ), что противоречит условию ацикличности G1 . То есть G1 и G2 —
связные и ациклические, а значит древочисленные. Имеем q(G) = q(G1 ) + q(G2 ) =
p(G1 ) − 1 + p(G2 ) − 1 = p(G) − 2 и получаем q(G) = p(G) − 2, что противоречит
условию древочисленности G.
[ 6=⇒7 ] От противного. Пусть в G есть цикл Z = Cn . Если n > 3, то рассмотрим пары
вершин цикла, которые не соединены рёбрами цикла. Если среди них уже есть смежные
вершины, имеем три цикла. Если среди них нет смежных вершин, то, соединив несмеж-
ные вершины в Z , получим три цикла. Следовательно, в цикле нет вершин, не соединён-
ных рёбрами цикла, значит Z = C3 . Этот цикл Z является компонентой связности G.
513 / 907
5.3.1. Свободные деревья (6/8)
Доказательство. (Продолжение 3) Действительно, пусть это не так. Тогда существует вер-
шина w, смежная с Z . Если w смежна более чем с одной вершиной Z , то имеем больше
одного цикла. Если w смежна только с одной вершиной Z , то, соединив её с другой вер-
шиной, получим два цикла. Рассмотрим G0 ← G − Z . Имеем p = p0 + 3, q = q 0 + 3. Но
q = p−1, значит, q 0 = p0 −1. Отсюда z(G0 ) = 0, так как один цикл уже есть. Следовательно,
компоненты G0 — деревья. Pk Pk Pk
Пусть этих деревьев k . Имеем q 0 = i=1 qi = i=1 (pi − 1) =
0
i=1 pi − k = p − k,
но q 0 = p0 − 1, следовательно, k = 1, то есть дерево одно. Если в этом дереве соеди-
нить несмежные вершины, то получим второй цикл. Два исключения: деревья, которые
не имеют несмежных вершин, — это K1 и K2 .
[ 7=⇒8 ] При p > 3 граф Kp содержит цикл, следовательно, G 6= Kp . Далее от противно-
го. Пусть G несвязен, тогда при соединении ребром двух компонент связности цикл не
возникнет, что противоречит субцикличности.

514 / 907
5.3.1. Свободные деревья (7/8)
Доказательство. (Окончание)
[ 8=⇒1 ] От противного. Пусть в графе G есть единственный цикл (большее количество
циклов противоречит субцикличности графа G). Если в G нет висячих вершин и p = 3, то
G = K3 , что противоречит условию неполноты G. Если в связном G нет висячих вершин,
p > 3 и есть единственный цикл, то G = Cp . Соединим любые две несмежные вершины
u и v ребром x (рисунок слева).

Имеем три цикла в G + x, что противоречит условию субцикличности. Если в G есть ви-
сячая вершина u, соединим её c любой несмежной с ней вершиной v ребром x. Вершина
v может принадлежать (рисунок в центре) или не принадлежать циклу (рисунок справа).
Теперь из u в v есть две или три простые цепи (одна или две цепи были раньше, так как
G — связный с одним простым циклом, и появилась цепь из ребра x). Имеем два, три или
более циклов в графе G + x, что противоречит условию субцикличности. 515 / 907
5.3.1. Свободные деревья (8/8)

Следствие. [1] В любом нетривиальном дереве имеются по крайней мере две висячие вер-
шины.
Доказательство. Рассмотрим дерево G(V, E). Дерево — связный граф, следовательно,
∀ vi ∈PV (d(vi ) > 1). Далее от противного. Пусть ∀ i ∈ 1..(p − 1) (d(vi ) > 1). Тогда
2q = pi=1 d(vi ) > 2(p − 1) + 1 = 2p − 1. Но q = p − 1, то есть 2q = 2p − 2. Имеем
противоречие: 2p − 2 > 2p − 1.
Замечание. Легко видеть, в частности, что висячими вершинами в дереве являются концы
любого диаметра.
Следствие. [2] Если в связном графе нет висячих вершин, то в нём есть цикл.
Доказательство. От противного. Если связный граф не имеет циклов, то он является де-
ревом и по следствию 1 обязан иметь висячие вершины.

516 / 907
5.3.2. Ориентированные деревья (1/9)
Ориентированным деревом (или oрдеревом, или корневым деревом) называется орграф
со следующими свойствами:
1) существует единственный узел r, полустепень захода которого равна 0, d+ (r) = 0;
он называется корнем ордерева;
+
 1, ∀ v ∈ V − r (d (v) = 1);
2) полустепень захода всех остальных узлов равна

3) каждый узел достижим из корня, ∀ v ∈ V − r ∃hr, vi .
Теорема. Ордерево обладает следующими свойствами:
1) ордерево древочисленно, q = p − 1;
2) если в ордереве забыть ориентацию дуг, то получится свободное дерево;
3) в ордереве нет контуров;
4) для каждого узла существует единственный путь, ведущий в этот узел из корня;
5) подграф, определяемый множеством узлов, достижимых из узла v , является ордере-
вом с корнем v (поддеревом узла v );
6) если в свободном дереве любую вершину назначить корнем, то получится ордерево.
517 / 907
5.3.2. Ориентированные деревья (2/9)
Доказательство.
[ 1 ] Каждая дуга входит в какой-то узел. Из определения имеем ∀ v ∈ V −r (d+ (v) = 1),
где r — корень. Следовательно, q = p − 1.
[ 2 ] Пусть G — ордерево, граф G0 получен из G забыванием ориентации рёбер, r —
корень. Тогда любые две вершины в G0 связаны с корнем, а значит связаны между собой
и граф G0 связен. Таким образом, учитывая п. 4. теоремы 5.3.1, G0 — дерево.
[ 3 ] Следует из п. 2.
[ 4 ] От противного. Если бы в G существовали два пути из r в v , то в G0 имелся бы цикл.
[ 5 ] Пусть Gv — правильный подграф, определяемый множеством узлов, достижимых из
v . Тогда d+ 0
Gv (v) = 0, иначе узел v был бы достижим из какого-то узла v ∈ Gv и, таким
образом, в Gv , а значит, и в G имелся бы контур, что противоречит п. 3. Далее имеем:
∀ v 0 ∈ Gv − v (d+ (v 0 ) = 1), так как Gv ⊂ G. Все узлы Gv достижимы из v по построению.
[ 6 ] Пусть вершина r назначена корнем и дуги последовательно ориентированы «от кор-
ня» обходом в глубину. Тогда d+ (r) = 0 по построению; ∀ v ∈ V − r (d+ (v) = 1), так как
входящая дуга появляется при первом посещении узла; все узлы достижимы из корня,
так как обход в глубину посещает все вершины связного графа. 518 / 907
5.3.2. Ориентированные деревья (3/9)
Сток ордерева называется листом. Множество листьев называется кроной. Путь из корня
в лист называется ветвью. Длина наибольшей ветви ордерева называется его высотой.
Уровень узла ордерева — это расстояние от корня до узла. Сам корень имеет уровень 0.
Узлы одного уровня образуют ярус ордерева.
Замечание. Наряду с «растительной» применяется ещё и «генеалогическая» терминоло-
гия. Узлы, достижимые из узла u, называются потомками узла u (потомки одного узла об-
разуют дерево). Если узел v является потомком узла u, то узел u называется предком уз-
ла v . Если в дереве существует дуга (u, v), то узел u называется отцом (или родителем)
узла v , а узел v называется сыном узла u. Сыновья одного отца называются братьями.
Отступление. Применительно к деревьям генеалогическая терминология неудачна, поскольку от-
ношение «родительства» не является иерархией. Родственные отношения точнее описываются ге-
неалогическими графами — бесконтурными орграфами, в которых все узлы разбиты на два мно-
жества M (мужчин) и F (женщин), так что в любой узел входит не более чем по одной дуге из
классов M и F .
519 / 907
5.3.2. Ориентированные деревья (4/9)
Ордереву можно дать другое определение. Ордерево T — это непустое конечное мно-
жество узлов, на котором определено разбиение, обладающее следующими свойствами:

1. Имеется один выделенный одноэлементный блок {r}, называемый корнем данного


ордерева.
2. Остальные узлы (исключая корень) содержатся в k (k > 0) блоках T1 , . . . , Tk , каждый
из которых, в свою очередь, является ордеревом и называется поддеревом:

Def
T = {{r}, T1 , . . . , Tk } .
Нетрудно видеть, что данное определение эквивалентно предыдущему определению.
Достаточно построить орграф, проводя дуги от заданного корня ордерева r к корням
поддеревьев T1 , . . . , Tk и далее повторяя рекурсивно этот процесс для каждого из под-
деревьев.
Если относительный порядок поддеревьев T1 , . . . , Tk в эквивалентном определении ор-
дерева фиксирован, то ордерево называется упорядоченным.
520 / 907
5.3.2. Ориентированные деревья (5/9)
Примеры. Ориентированные и упорядоченные ориентированные деревья интенсивно
используются в программировании.

1. Для представления выражений языков программирования, как правило, используются


ориентированные упорядоченные деревья. Пример представления выражения a + b ∗ c
показан на рисунке а.
2. Для представления блочной структуры программы и связанной с ней структуры об-
ластей определения идентификаторов часто используется ориентированное дерево (мо-
жет быть, неупорядоченное, так как порядок определения переменных в блоке в боль-
шинстве языков программирования считается несущественным). На рисунке б показана
структура областей определения идентификаторов a, b, c, d, e, причём для отображения
иерархии использованы вложенные области.
521 / 907
5.3.2. Ориентированные деревья (6/9)
3. Для представления иерархической структуры вложенности элементов данных и (или)
операторов управления часто используется техника отступов, показанная на рисунке в.
4. Структура вложенности каталогов и файлов в современных операционных системах
является упорядоченным ориентированным деревом. Обычно для изображения таких
деревьев применяется способ, показанный на рисунке г.
5. Различные «правильные скобочные структуры» (например, (a(b)(c(d)(e)))) являются
ориентированными упорядоченными деревьями.
Отступление. Тот факт, что большинство систем управления файлами использует ориентирован-
ные деревья, отражается даже в терминологии, например: «корневой каталог диска».
Замечание. Общепринятой практикой при изображении деревьев является соглашение о
том, что корень находится наверху и все дуги ориентированы сверху вниз, поэтому стрел-
ки можно не изображать. Диаграммы свободных, ориентированных и упорядоченных де-
ревьев оказываются графически неразличимыми, и требуется дополнительное уточне-
ние, дерево какого класса изображено на диаграмме.

522 / 907
5.3.2. Ориентированные деревья (7/9)
Теорема. В упорядоченном ордереве с p узлами существует такая нумерация узлов чис-
лами из диапазона 1..p, что номера потомков больше номеров предков и номера старших
братьев больше номеров младших братьев.
Доказательство. Применим к упорядоченному ордереву алгоритм обхода в глубину, на-
чиная с корня, причём узлы, смежные с данным, посещаются в порядке, определяемом
порядком поддеревьев. Присвоим узлам номера в порядке первого посещения. Тогда все
узлы получат уникальные номера из диапазона 1..p, и корень получит номер 1. Далее,
старшие братья получат номера, бо́льшие, чем номера младших братьев по условию об-
хода, а потомки получат номера бо́льшие, чем номера предков, поскольку алгоритм об-
хода в глубину посещает предков раньше, чем потомков.
Замечание. Указанный порядок обхода часто назы-
вают прямым.
Пример. Узлы упорядоченного ордерева на рисун-
ке при прямом обходе получат следующие номера:
a 7→ 1, b 7→ 2, c 7→ 5, d 7→ 3, e 7→ 4, f 7→ 6, g 7→ 7,
h 7→ 8, i 7→ 9. 523 / 907
5.3.2. Ориентированные деревья (8/9)
Замечание. Построенная нумерация не является единственной нумерацией, обладающей
указанными свойствами.
Пример. Можно обойти упорядоченное ордерево по ярусам. При этом узлы упорядочен-
ного ордерева на рисунке получат следующие номера: a 7→ 1, b 7→ 2, c 7→ 3, d 7→ 4,
e 7→ 5, f 7→ 6, g 7→ 7, h 7→ 8, i 7→ 9.
Бинарное (или двоичное) дерево — это непустое конечное множество узлов, на котором
определена структура, обладающая следующими свойствами:
1) имеется один выделенный узел r, называемый корнем данного бинарного дерева;
2) остальные узлы (исключая корень) содержатся в двух непересекающихся множе-
ствах (поддеревьях) — левом и правом, каждое из которых, в свою очередь, либо
пусто, либо является бинарным деревом.
На первый взгляд может показаться, что бинарное дерево — это частный случай упоря-
доченного ориентированного дерева, в котором у каждого узла не более двух смежных.
Но это не так, бинарное дерево не является упорядоченным ордеревом. Дело в том, что
даже если у некоторого узла бинарного дерева имеется только одно непустое поддере-
во, то всё равно известно, какое именно это поддерево: левое или правое. 524 / 907
5.3.2. Ориентированные деревья (9/9)
Пример. На рисунке приведены две диаграммы деревьев, которые изоморфны как упо-
рядоченные, ориентированные и свободные деревья, но не изоморфны как бинарные
деревья.

Замечание. Понятие двоичного дерева допускает обобщение. m-ичным деревом называ-


ется непустое конечное множество узлов, которое состоит из корня и m непересекаю-
щихся подмножеств, имеющих номера 1, . . . , m, каждое из которых, в свою очередь, ли-
бо пусто, либо является m-ичным деревом. Большая часть утверждений и алгоритмов для
двоичных деревьев может быть сравнительно легко распространена и на m-ичные дере-
вья (с соответствующими модификациями). Поэтому, хотя на практике m-ичные деревья
и используются достаточно часто, здесь мы ограничиваемся только двоичными деревья-
ми.
525 / 907
5.3.3. Представление свободных деревьев в программах (1/8)

Обсуждению представлений деревьев можно предпослать в точности те же рассуждения,


что предпосланы обсуждению представлений графов. Кроме того, следует подчеркнуть,
что задача представления деревьев в программе встречается гораздо чаще, чем задача
представления графов общего вида, а потому методы её решения оказывают ещё боль-
шее влияние на практику программирования.
Для представления деревьев можно использовать те же приёмы, что и для представле-
ния графов общего вида — матрицы смежности и инциденций, списки смежности и др.
Но, используя особенные свойства деревьев, можно предложить существенно более эф-
фективные представления.

526 / 907
5.3.3. Представление свободных деревьев в программах (2/8)

Рассмотрим следующее представление свободного дерева, известное как код Прюфера.


Допустим, что вершины дерева T (V, E) пронумерованы числами из интервала 1..p.
Построим последовательность A : array[1..p − 1]of1..p в соответствии со следующим ал-
горитмом упаковки.
Вход: дерево T (V, E) в любом представлении, вершины дерева пронумерованы числа-
ми 1..p произвольным образом.
Выход: массив A : array [1..p − 1] of 1..p – код Прюфера дерева T .
for i from 1 to p − 1 do
v ← min {k ∈ V | d(k) = 1} //выбираем висячую вершину v
A[i] ← Γ(v) //заносим в код номер вершины, смежной с v
V ← V − v //удаляем вершину v из дерева
end for

527 / 907
5.3.3. Представление свободных деревьев в программах (3/8)
По построенному коду можно восстановить исходное дерево с помощью следующего
алгоритма распаковки.
Вход: Массив A : array [1..p − 1] of 1..p – код Прюфера дерева T .
Выход: Дерево T (V, E), заданное множеством рёбер E , вершины дерева пронумерова-
ны числами 1..p.
E ← ∅ //в начале множество рёбер пусто
B ← 1..p //множество неиспользованных номеров вершин
for i from 1 to p − 1 do
v ← min {k ∈ B | ∀ j > i (k 6= A[j])}
//выбираем вершину v — неиспользованную вершину
//с наименьшим номером,
//который не встречается в остатке кода Прюфера
E ← E + (v, A[i]) //добавляем ребро (v, A[i])
B ← B − v //удаляем вершину v из списка неиспользованных
end for
528 / 907
5.3.3. Представление свободных деревьев в программах (4/8)

Обоснование. Код Прюфера действительно является представлением свободного дере-


ва. Чтобы убедиться в этом, покажем, что если T 0 — дерево, построенное алгоритмом рас-
паковки по коду A, который построен алгоритмом упаковки по дереву T , то T 0 ∼ T . Для
этого установим отображение f : 1..p → 1..p между номерами вершин в деревьях T и
T 0 по порядку выбора вершин в алгоритмах: если вершина v выбрана на i-м шаге алго-
ритма упаковки, то вершина f (v) выбрана на i-м шаге алгоритма распаковки. Заметим,
что Dom f = 1..p, поскольку висячие вершины есть в любом дереве и удаление висячей
вершины оставляет дерево деревом. Далее, Im f = 1..p, поскольку на i-м шаге алгорит-
ма распаковки использовано i − 1 число из p чисел и остаётся p − i + 1 чисел, а в хвосте
кода Прюфера занято не более p − i чисел. Более того, ∀ v (f (v) = v). Действительно,
номера вершин, которые являются висячими в исходном дереве, не появляются в коде
Прюфера (кроме, может быть, одной висячей вершины с наибольшим номером), а номе-
ра вершин, которые не являются висячими, обязательно появляются.

529 / 907
5.3.3. Представление свободных деревьев в программах (5/8)

Обоснование. (Окончание) Поскольку при выборе первой вершины v в алгоритме упа-


ковки все вершины с меньшими номерами не являются висячими, их номера будут при-
сутствовать в коде и, значит, не могут быть использованы на первом шаге алгоритма рас-
паковки. Таким образом, на первом шаге алгоритм распаковки выберет ту же вершину
v . Но после удаления вершины v на втором шаге снова имеется дерево, к которому при-
менимы те же рассуждения. Итак, f — тождественное и, значит, взаимно-однозначное
отображение. Заметим теперь, что для определения i-го элемента кода на i-м шаге ал-
горитма упаковки используется, а затем удаляется ребро (v, A[i]), и в точности то же
ребро добавляется в дерево T 0 на i-м шаге алгоритма распаковки. Следовательно, f —
взаимно-однозначное отображение, сохраняющее смежность и T ∼ T 0 .

530 / 907
5.3.3. Представление свободных деревьев в программах (6/8)
Пример. Для дерева, представленного на рисунке, код Прюфера 7, 9, 1, 7, 2, 2, 7, 1, 2, 5, 12.
На этом рисунке числа в вершинах — это их номера, а числа на рёбрах указывают по-
рядок, в котором выбираются висячие вершины и удаляются рёбра при построении кода
Прюфера.

Замечание. Код Прюфера — наиболее экономное по памяти представление дерева. Его


можно немного улучшить, если заметить, что существует всего одно дерево с двумя вер-
шинами — K2 , а потому информацию о «последнем ребре» можно не хранить, она вос-
станавливается однозначно. 531 / 907
5.3.3. Представление свободных деревьев в программах (7/8)
Пример. Для дерева, представленного на рисунке, код Прюфера 7, 9, 1, 7, 2, 2, 7, 1, 2, 5,
12. Рассмотрим протокол выполнения распаковки кода Прюфера:
i B A v A[i]
1 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12} [|7, 9, 1, 7, 2, 2, 7, 1, 2, 5, 12] 3 7
2 {1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12} [7, |9, 1, 7, 2, 2, 7, 1, 2, 5, 12] 4 9
3 {1, 2, 5, 6, 7, 8, 9, 10, 11, 12} [7, 9, |1, 7, 2, 2, 7, 1, 2, 5, 12] 6 1
4 {1, 2, 5, 7, 8, 9, 10, 11, 12} [7, 9, 1, |7, 2, 2, 7, 1, 2, 5, 12] 8 7
5 {1, 2, 5, 7, 9, 10, 11, 12} [7, 9, 1, 7, |2, 2, 7, 1, 2, 5, 12] 9 2
6 {1, 2, 5, 7, 10, 11, 12} [7, 9, 1, 7, 2, |2, 7, 1, 2, 5, 12] 10 2
7 {1, 2, 5, 7, 11, 12} [7, 9, 1, 7, 2, 2, |7, 1, 2, 5, 12] 11 7
8 {1, 2, 5, 7, 12} [7, 9, 1, 7, 2, 2, 7, |1, 2, 5, 12] 7 1
9 {1, 2, 5, 12} [7, 9, 1, 7, 2, 2, 7, 1, |2, 5, 12] 1 2
10 {2, 5, 12} [7, 9, 1, 7, 2, 2, 7, 1, 2, |5, 12] 2 5
11 {5, 12} [7, 9, 1, 7, 2, 2, 7, 1, 2, 5, |12] 5 12

532 / 907
5.3.3. Представление свободных деревьев в программах (8/8)
Алгоритм построения кода Прюфера применим к любому нумерованному свободному
дереву, и при этом для дерева с p вершинами код Прюфера, состоящий из p − 2 чисел,
определяется однозначно, что следует из однозначности алгоритма.
В то же время алгоритм восстановления дерева по коду Прюфера может быть применён
к любой последовательности p − 2 чисел, каждое из которых выбрано из диапазона 1..p.
При этом получается некоторое нумерованное свободное дерево с p вершинами.
Эти простые наблюдения позволяют сформулировать важную теорему.
Теорема. [формула Кэли] Существует pp−2 нумерованных свободных деревьев с p верши-
нами.
Доказательство. Действительно, множество нумерованных свободных деревьев взаимно
однозначно соответствует множеству последовательностей длины p − 2, составленных
из чисел из диапазона 1..p. Поскольку в каждую из p − 2 позиций в последовательности
можно поставить любое из p чисел, общее число последовательностей оказывается pp−2 .

Замечание. Формула Кэли даёт количество нумерованных свободных деревьев, но не


позволяет узнать количество классов изоморфных свободных деревьев, как абстрактных
533 / 907
5.3.4. Представление упорядоченных корневых деревьев (1/9)

В упорядоченных ордеревьях выделен корень и поддеревья упорядочены. Использование


этой информации позволяет построить ещё более компактное представление по сравне-
нию с кодом Прюфера для свободных деревьев. Пусть упорядоченное ордерево задано
списками смежности, причём узлы перенумерованы в соответствии с порядком прямого
обхода. Тогда следующий алгоритм построения кода упорядоченного ордерева сгенери-
рует битовую шкалу (код) из 2q разрядов, где q — число дуг в ордереве.
Вход: Нетривиальное упорядоченное ордерево T ,
заданное списками смежности Γ : array [1..p] of ↑N ,
где N = struct {v : 1..p ; n : ↑N }, причём узлы перенумерованы в прямом порядке.
Выход: Массив C : array [1..2q] of 0..1, являющийся кодом ордерева T .
i ← 0 //количество заполненных разрядов кода
TraverseTree(Γ[1]) //указатель на список смежности корня

534 / 907
5.3.4. Представление упорядоченных корневых деревьев (2/9)
Основная работа выполняется рекурсивной процедурой TraverseTree, для которой пе-
ременная i и массивы Γ и C глобальны.
Вход: d : ↑N — указатель на список исходящих дуг.
Выход: заполнение двух разрядов кода C .
while d 6= nil do
i ← i + 1; C[i] ← 1 //отмечаем вход в узел
TraverseTree(Γ[d.v]) //построение кода поддерева
i ← i + 1; C[i] ← 0 //отмечаем выход из узла
d ← d.n //выбор следующего узла в списке
end while
Замечание. Представленный алгоритм, в сущности, строит протокол выполнения алгорит-
ма обхода в глубину упорядоченного ордерева. Запись 1 отмечает вход в узел по един-
ственной входящей дуге, запись 0 отмечает возврат из узла по этой же дуге.
Восстановление упорядоченного ордерева по коду представлено в следующем алгоритме.
535 / 907
Вход: массив C : array [1..2q] of 0..1 — код ордерева T .
Выход: массив Γ : array [1..p] of ↑N , N = struct {v : 1..p; n : ↑N }
p ← 1 //счётчик узлов
Γ[1] ← nil //корень
n ← 1 //текущий узел
for i from 1 to 2q do
if C[i] = 1 then
p ← p + 1 //номер нового узла
Γ[p] ← nil //новый узел пока листовой
d ← NewNode(p, nil) //дуга от текущего узла к новому узлу
Append(Γ[n], d) //добавить узел в список смежности
n → S //положить номер текущего узла на стек
n ← p //перейти в новый узел
else
n ← S //снять со стека и перейти в новый узел
end if
end for 536 / 907
В алгоритме используются вспомогательный стек S для хранения номеров узлов и две
процедуры:
I NewNode(v : 1..p, n : ↑N ) : ↑N — функция, создающая новый элемент списка смеж-
ности с полями v и n и возвращающая указатель на него;
I Append(L, e : ↑N ) — процедура, присоединяющая элемент, указатель на который
задан параметром e, к списку, указатель на первый элемент которого задан пара-
метром L.
Обоснование. Массив C является представлением упорядоченного ордерева T , то есть
если к T применить алгоритм кодирования, а затем к результату применить алгоритм де-
кодирования, то получится то же самое упорядоченное ордерево T . Действительно, алго-
ритм декодирования интерпретирует протокол работы алгоритма кодирования. Каждый
раз, когда алгоритм упаковки входит по дуге в некоторый узел первый раз, он записывает
в протокол 1, и в точности в том же порядке алгоритм распаковки создаёт узлы. Каждый
раз, когда алгоритм упаковки возвращается на предыдущий уровень и записывает в про-
токол 0, алгоритм распаковки возвращается к родительскому узлу, снимая его номер со
стека.
537 / 907
5.3.4. Представление упорядоченных корневых деревьев (5/9)
Пример. Применение алгоритма к упорядоченному ордереву на рисунке даст код
1101001101011000.

Замечание. Наложенное здесь требование прямого порядка нумерации узлов не явля-


ется ограничением и используется только для упрощения изложения. Можно показать,
что при любой нумерации узлов ордерева алгоритм кодирования построит код, а алго-
ритм декодирования восстановит по этому коду изоморфное ордерево, отличающееся
разве что нумерацией узлов.
538 / 907
5.3.4. Представление упорядоченных корневых деревьев (6/9)
Представление упорядоченных ордеревьев, построенное в предыдущем подразделе, об-
ладает замечательным характеристическим свойством, позволяющим получить явную
формулу для числа упорядоченных ордеревьев.
Введём обозначения. Пусть b : array [1..n] of 0..1 — любая битовая шкала. Обозначим
через N0 (b, k) — количество нулей в отрезке шкалы b[1..k], k 6 n, и через N1 (b, k) —
количество единиц в отрезке шкалы b[1..k], k 6 n. Пусть теперь c : array [1..2q] of 0..1 —
битовая шкала, построенная по упорядоченному ордереву T алгоритмом кодирования.
Тогда по построению алгоритма имеем
N0 (c, 2q) = N1 (c, 2q) & ∀ k < 2q (N0 (c, k) 6 N1 (c, k)) . (∗)
Из алгоритма декодирования следует, что данное свойство является характеристическим,
то есть любая шкала, обладающая свойством (∗), является кодом некоторого дерева, при-
чём соответствие между деревьями и кодами взаимно-однозначно. Пусть Sn — множе-
ство битовых шкал длины 2n:
Def
Sn = {c = (a1 , . . . , a2n ) | ∀ i ∈ 1..2n (ai ∈ {0, 1})} .
539 / 907
5.3.4. Представление упорядоченных корневых деревьев (7/9)
Обозначим число тех битовых шкал c ∈ Sn , которые обладают свойством (∗), через C(n)
Def
(по определению C(0) = 1):
Def
C(n) = |{c ∈ Sn | N0 (c, 2n) = N1 (c, 2n) & ∀ k < 2n (N0 (c, k) 6 N1 (c, k))}| .
Пример. Ясно, что C(1) = |{(1, 0)}| = 1, C(2) = 2, C(3) = 4.
Лемма. Для числа C(n) выполняется следующее равенство:
n−1
X
C(n) = C(k)C(n − k − 1).
k=0
Доказательство. Рассмотрим подмножество кодов c ∈ Sn , удовлетворяющих более силь-
ному условию
N0 (c, 2q) = N1 (c, 2q) & ∀ k < 2q (N0 (c, k) < N1 (c, k)) , (∗0 )
и обозначим число таких кодов через C 0 (n). Ясно, что в любом коде, удовлетворяющем
условию (∗0 ), первый бит равен 1, а последний — 0. Если их отбросить, то оставшаяся
часть кода будет удовлетворять условию (∗), и поэтому C 0 (n) = C(n − 1), причём по
определению C 0 (1) = C(0) = 1.
540 / 907
5.3.4. Представление упорядоченных корневых деревьев (8/9)
Доказательство. (Продолжение) Пусть теперь s — наименьшее число, такое, что код c[1..s]
удовлетворяет условию (∗0 ). Сгруппируем все коды, удовлетворяющие условию (∗), по
значениям числа s. В группе, в которой s = n, имеется C 0 (n) кодов, а в группах, в которых
1 6 s 6 n − 1, имеется C 0 (s)C(n − s) кодов. Имеем
n−1
X n−1
X
0 0
C(n) = C (n) + C (s)C(n − s) = C(n − 1) · 1 + C(s − 1)C(n − s) =
s=1 s=1
n−2
X n−1
X
= C(n − 1)C(0) + C(k)C(n − k − 1) = C(k)C(n − k − 1),
k=0 k=0
где k ← s − 1.
Таким образом, для числа C(n) битовых шкал, удовлетворяющих условию (∗), выполня-
ется характеристическое рекуррентное соотношение чисел Каталана, откуда немедлен-
но следует
C(2q, q)
Теорема. Число ориентированных упорядоченных деревьев с q дугами равно .
q+1
541 / 907
5.3.4. Представление упорядоченных корневых деревьев (9/9)
Из характеристического свойства (∗) рассматриваемого представления упорядоченных
ордеревьев в качестве побочного, но полезного наблюдения можно извлечь эффектив-
ный алгоритм проверки правильности скобочной структуры.
Вход: строка s : array [1..n] of char, возможно, содержащая скобки «(» и «)».
Выход: число 0, если скобочная структура правильна, или число в диапазоне 1..(n + 1),
указывающее на позицию в строке, где скобочная структура нарушена.
p ← 0 //число прочитанных «(» минус число прочитанных «)»
for i from 1 to n do
if s[i] = ”(” then p ← p + 1 end if //прочли «(»
if s[i] = ”)” then p ← p − 1 end if //прочли «)»
if p < 0 then return i end if //лишняя закрывающая скобка
end for
if p = 0 then return 0 //скобочная структура правильна
else return n + 1 end if //не хватает закрывающих скобок

542 / 907
5.3.5. Представление бинарных деревьев (1/8)
Всякое свободное дерево можно ориентировать, назначив один из узлов корнем. Всякое
ордерево можно произвольно упорядочить. Для потомков одного узла (братьев) упорядо-
ченного ордерева определено отношение старше–младше (правее–левее). Всякое упо-
рядоченное дерево можно представить бинарным деревом, например, проведя правую
связь к старшему брату, а левую — к младшему сыну. Таким образом, достаточно рассмот-
реть представление в программе бинарных деревьев.
Пример. На рисунке приведены диаграммы упорядоченного и соответствующего ему би-
нарного деревьев.

543 / 907
5.3.5. Представление бинарных деревьев (2/8)
Замечание. Из данного представления следует, что множество бинарных деревьев
взаимно-однозначно соответствует множеству упорядоченных лесов упорядоченных ор-
деревьев. Действительно, в указанном представлении одиночному упорядоченному ор-
дереву всегда соответствует бинарное дерево, у которого правая связь корня пуста, а
упорядоченному лесу — бинарное дерево, у которого правая связь корня не пуста.
Обозначим через n(p) объём памяти, занимаемой представлением бинарного дерева,
где p — число узлов. Наиболее часто используются следующие представления бинарных
деревьев.
1. Списочные структуры: каждый узел представляется записью
типа N = struct {i : inf o; l, r : ↑N }, содержащей два поля (l и r) с указателями на левый
и правый узлы и еще одно поле i для хранения указателя на информацию об узле, где
тип inf o считается заданным. Дерево представляется указателем на корень. Для этого
представления n(p) = 3p.
Замечание. Поскольку в бинарном дереве, как и в любом другом, q = p − 1, то из 2p
указателей, отводимых для хранения дуг, p + 1 всегда хранит значение nil, т. е. половина
связей не используется. 544 / 907
5.3.5. Представление бинарных деревьев (3/8)
2. Упакованные массивы: узлы располагаются в массиве, так что все узлы поддерева дан-
ного узла располагаются вслед за этим узлом. Вместе с каждым узлом хранится индекс
узла, который является первым узлом правого поддерева данного узла. Дерево T опре-
деляется так: T : array [1..p] of struct {i : inf o; k : 1..p}, где тип inf o считается задан-
ным. Для этого представления n(p) = 2p.
3. Размеченная степень: аналогично упакованным массивам, но вместо связей фиксиру-
ется «размеченная степень» каждого узла. Например, 0 означает, что это лист, 1 — есть
правая связь, но нет левой, 2 — есть левая связь, но нет правой, 3 — есть обе связи. Для
представления размеченной степени в случае бинарных деревьев достаточно битовой
шкалы длины 2. Дерево T определяется так: T : array [1..p] of struct {i : inf o; d : 0..3},
где тип inf o считается заданным. Для этого представления n(p) = 2p.
4. Польская запись: Если степень узла известна из информации, хранящейся в самом
узле, то можно не хранить и степень. Такой способ представления деревьев называется
польской записью и обычно используется для представления выражений. В этом случае
представление дерева оказывается наиболее компактным: объём памяти n(p) = p.
545 / 907
5.3.5. Представление бинарных деревьев (4/8)
Пример. Рассмотрим бинарное дерево на рисунке и покажем, как выглядят в памяти би-
нарные деревья в разных представлениях. В приводимой ниже таблице первая группа
столбцов соответствует полям списочных структур, вторая — упакованным массивам и
третья — польской записи с явными размеченными степенями. Условные адреса — это
целые числа, а пустой указатель — 0.
Адрес i l r i k i d
1 a 2 0 a 0 a 2
2 b 3 5 b 5 b 3
3 d 0 4 d 4 d 1
4 e 0 0 e 0 e 0
5 c 6 0 c 0 c 2
6 f 0 7 f 7 f 1
7 g 0 8 g 8 g 1
8 h 9 0 h 0 h 2
9 i 0 0 i 0 i 0
546 / 907
5.3.5. Представление бинарных деревьев (5/8)
Большинство алгоритмов работы с деревьями основаны на обходах. Возможны следую-
щие основные обходы бинарных деревьев.
I Прямой (префиксный, левый) обход: попасть в узел, обойти левое поддерево, обойти
правое поддерево.
I Внутренний (инфиксный, симметричный) обход: обойти левое поддерево, попасть в
узел, обойти правое поддерево.
I Концевой (постфиксный, правый) обход: обойти левое поддерево, обойти правое
поддерево, попасть в узел.
Возможны еще три обхода, отличающихся порядком рассмотрения левых и правых под-
деревьев. Этим исчерпываются обходы, если в представлении есть только дуги, ведущие
от каждого узла к левому и правому поддеревьям, и не используются дополнительные
структуры данных.
Пример. Прямой обход дерева выражения a + b ∗ c даёт прямую польскую запись этого
выражения: +a ∗ bc. Концевой обход дерева выражения a + b ∗ c даёт обратную поль-
скую запись этого выражения: abc ∗ +. Внутренний обход дерева выражения a + b ∗ c
восстанавливает исходную запись выражения: a + b ∗ c. 547 / 907
5.3.5. Представление бинарных деревьев (6/8)

Программные реализации различных обходов бинарных деревьев однотипны.


В качестве примера рассмотрим инфиксный обход. Реализация обхода бинарного дерева
с помощью рекурсивной процедуры TraverseTree не вызывает затруднений.
Вход: бинарное дерево, представленное списочной структурой, q — указатель на узел,
при первом вызове это указатель на корень дерева.
Выход: последовательность узлов бинарного дерева в порядке симметричного обхода.
if q.l 6= nil then TraverseTree(q.l) end if //обойти левое поддерево
yield q //очередной узел при симметричном обходе
if q.r 6= nil then TraverseTree(q.r) end if //обойти правое поддерево
В некоторых случаях из соображений эффективности применение явной рекурсии ока-
зывается нежелательным. Следующий алгоритм реализует наиболее популярный симмет-
ричный обход без явной рекурсии, но с использованием стека.

548 / 907
5.3.5. Представление бинарных деревьев (7/8)

Вход: бинарное дерево, представленное списочной структурой, r — указатель на корень.


Выход: последовательность узлов бинарного дерева в порядке симметричного обхода.
T ← ∅; p ← r //вначале стек пуст и p указывает на корень дерева
repeat
if p = nil then
p ← T //левое поддерево обойдено
yield p //очередной узел при симметричном обходе
p ← p.r //начинаем обход правого поддерева
else
p → T //запоминаем текущий узел в стеке . . .
p ← p.l //. . . и начинаем обход левого поддерева
end if
until T = ∅ & p = nil

549 / 907
5.3.5. Представление бинарных деревьев (8/8)
Обоснование. Заметим, что при каждом повторении тела основного цикла стек T хранит
все узлы, которые находятся выше узла p и ещё не обойдены. Ясно, что условие
T = ∅ является необходимым условием окончания обхода. Однако, если при этом
p 6= nil, то условие пустоты стека не является достаточным, обход ещё не завершен, по-
скольку остались непройденные узлы, в частности узел p.
Замечание. Другие варианты обходов также могут быть запрограммированы с использо-
ванием вспомогательных структур данных и без использования рекурсии.
Как уже отмечено, в рассматриваемом представлении бинарных деревьев половина свя-
зей не используется. Деревья, в которых пустые поля l и r в структуре N используются
для хранения дополнительных связей, называются прошитыми деревьями.
Замечание. Если кроме связей «влево» и «вправо» в представлении есть другие связи,
то возможны другие обходы. В частности, деревья можно прошить таким образом, что
обходы выполняются без рекурсии и без дополнительных структур данных.

550 / 907
5.3.6. Кратчайший остов (1/10)
Задача отыскания кратчайшего остова графа является классической задачей теории гра-
фов. Методы решения этой задачи послужили основой для многих других важных ре-
зультатов.
Пусть G(V, E) — граф. Остовный подграф графа G(V, E) — это подграф, содержащий все
вершины. Остовный подграф, являющийся деревом, называется остовом или каркасом.
Если подграф, являющийся деревом, в то же время является остовным, то такое дерево
называется стягивающим деревом. Таким образом, стягивающее дерево и остов — это
одно и то же.
Замечание. Остов определяется множеством рёбер, поскольку вершины остова суть вер-
шины графа. Таким образом, всякий остов определяет разбиение множества рёбер гра-
фа на два множества: множество рёбер остова и множество хорд остова.
Несвязный граф не имеет остова. Связный граф может иметь много остовов. Но несвяз-
ный граф имеет остовный лес — множество остовов компонент связности. Если задать
длины рёбер, то можно поставить задачу нахождения кратчайшего остова.
Замечание. Существует множество различных способов найти какой-то остов графа.
Например, алгоритм поиска в глубину строит остов (по рёбрам возврата). 551 / 907
5.3.6. Кратчайший остов (2/10)
Замечание. Множество кратчайших путей из заданной вершины ко всем остальным также
образует остов. Однако этот остов может не быть кратчайшим.
Пример. На рисунке показаны диаграммы (слева направо) графа, дерева кратчайших пу-
тей из вершины v1 с суммарным весом 5 и двух кратчайших остовов этого графа с сум-
марным весом 4.

Отступление. Задача нахождения кратчайшего остова имеет множество практических интерпре-


таций. Например, пусть задан набор аэродромов и нужно определить минимальный (по сумме
расстояний) набор авиарейсов, который позволил бы перелететь с любого аэродрома на любой
другой. Решением этой задачи будет кратчайший остов полного графа расстояний между аэро-
дромами. 552 / 907
5.3.6. Кратчайший остов (3/10)
Рассмотрим следующую схему алгоритма построения кратчайшего остова. Пусть T —
множество непересекающихся деревьев, являющихся подграфами графа G. Вначале T
состоит из отдельных вершин графа G, в конце T содержит единственный элемент —
кратчайший остов графа G.
Вход: граф G(V, E), заданный матрицей длин рёбер C .
Выход: кратчайший остов T .
T ←V
while в T больше одного элемента do
взять любое поддерево из T
найти к нему ближайшее
соединить эти деревья в T
end while
Замечание. Различные способы выбора поддерева для наращивания на первом шаге
тела цикла дают различные конкретные варианты алгоритма построения M ST (Minimum
Spanning Tree — стандартное обозначение для кратчайшего остова).
553 / 907
5.3.6. Кратчайший остов (4/10)
Обоснование. Возьмём произвольное дерево Ti и выберем ближайшее к нему дерево Tj
в T , Ti ∩ Tj = ∅. Положим ∆i,j ← min d(ti , tj ). Так как с самого начала все вершины
ti ∈Ti ,tj ∈Tj
G покрыты деревьями из T , а Tj выбирается ближайшим к Ti , то ∆i,j всегда реализует-
ся на некотором ребре с длиной ci,j . Далее индукцией по шагам алгоритма покажем, что
все рёбра, включенные в деревья из T , принадлежат кратчайшему остову M ST . Вначале
выбранных рёбер нет, поэтому их множество включается в кратчайший остов. Пусть те-
перь все рёбра, добавленные в T , принадлежат M ST . Рассмотрим очередной шаг алго-
ритма. Пусть на этом шаге добавлено ребро (i, j), соединяющее поддерево Ti с подде-
ревом Tj . Если (i, j) 6∈ M ST , то, поскольку M ST является деревом и, стало быть, свя-
зен, ∃(i∗ , j ∗ ) ∈ M ST , соединяющее Ti с остальной частью M ST . Тогда удалим из M ST
ребро (i∗ , j ∗ ) и добавим ребро (i, j): M ST 0 ← M ST − (i∗ , j ∗ ) + (i, j). Полученный под-
граф M ST 0 является остовом, причём более коротким, чем M ST , что противоречит вы-
бору M ST .

554 / 907
5.3.6. Кратчайший остов (5/10)
Следующий алгоритм известен как алгоритм Краскала.
Вход: список E рёбер графа G с длинами, упорядоченный в порядке возрастания длин.
Выход: множество T рёбер кратчайшего остова.
T ← ∅; k ← 1 //номер рассматриваемого ребра
for i from 1 to p − 1 do
while z(T + E[k]) > 0 do
k ← k + 1 //пропустить это ребро
end while
T ← T + E[k] //добавить это ребро в M ST
k ← k + 1 //и исключить его из рассмотрения
end for
Обоснование. Для обоснования алгоритма Краскала достаточно показать, что выдержи-
вается схема алгоритма предыдущего параграфа. Действительно, поскольку в множестве
рёбер T нет циклов по построению, это множество суть совокупность рёбер некоторого
множества деревьев.
555 / 907
5.3.6. Кратчайший остов (6/10)

Обоснование. (Продолжение) Если множество T содержит более одного дерева, то суще-


ствует ребро, при добавлении которого не возникает цикла — оно соединяет два дерева
в T . Добавляемое ребро — кратчайшее возможное, значит, на нём реализуется расстоя-
ние между некоторыми деревьями в T . По построению в конце работы алгоритма мно-
жество рёбер T содержит p − 1 элемент, а значит, является искомым остовом.
В алгоритме Прима кратчайший остов порождается в процессе разрастания одного де-
рева, к которому присоединяются ближайшие одиночные вершины. Каждая одиночная
вершина является деревом, и схема алгоритма выполнена.
При этом для каждой вершины v , кроме начальной, используются две пометки: α[v] —
это ближайшая к v вершина, уже включённая в остов, а β[v] — это длина ребра, соеди-
няющего v с остовом. Если вершину v ещё нельзя соединить с остовом одним ребром, то
α[v] ← 0, β[v] ← ∞.

556 / 907
5.3.6. Кратчайший остов (7/10)
Вход: граф G(V, E), заданный матрицей длин рёбер C .
Выход: множество T рёбер кратчайшего остова.
select u ∈ V //выбираем произвольную вершину
S ←{u} //S — множество вершин, включённых в кратчайший остов
T ← ∅ //T — множество рёбер, включённых в кратчайший остов
for v ∈ V − u do
if v ∈ Γ(u) then
α[v] ← u //u — ближайшая вершина остова
β[v] ← C[u, v] //C[u, v] — длина соответствующего ребра
else
α[v] ← 0 //ближайшая вершина остова неизвестна
β[v] ← ∞ //и расстояние также неизвестно
end if
end for
557 / 907
for i from 1 to p − 1 do
x ← ∞ //начальное значение для поиска ближайшей вершины
for v ∈ V \ S do
if β[v] < x then
w ← v //нашли более близкую вершину
x ← β[v] //и расстояние до неё
end if
end for
S ← S + w //добавляем найденную вершину в остов
T ← T + (α[w], w) //добавляем найденное ребро в остов
for v ∈ Γ(w) do
if v ∈/ S then
if β[v] > C[v, w] then
α[v] ← w //изменяем ближайшую вершину остова
β[v] ← C[v, w] //и длину ведущего к ней ребра
end if
end if
end for
558 / 907
5.3.6. Кратчайший остов (9/10)

Отступление. Задача о нахождении кратчайшего остова принадлежит к числу немногих задач


теории графов, которые можно считать полностью решёнными. Между тем, если изменить усло-
вия задачи, на первый взгляд даже незначительно, то она оказывается гораздо более трудной.
Рассмотрим следующую задачу. Пусть задано множество городов на плоскости и нужно опреде-
лить минимальный (по сумме расстояний) набор железнодорожных линий, который позволил бы
переехать из любого города в любой другой. Кратчайший остов полного графа расстояний меж-
ду городами не будет являться решением этой (практически, очевидно, очень важной) задачи, из-
вестной как задача Штейнера. В задаче Штейнера допускается введение дополнительных вер-
шин, называемых точками Штейнера. Задача Штейнера на плоскости хорошо изучена, в част-
ности, известно много важных свойств точного решения. Например, известно, что каждая точка
Штейнера имеет степень 3 и отрезки в ней встречаются под углом 120◦ .
Тем не менее, до сих пор неизвестно достаточно эффективных алгоритмов решения данной за-
дачи, и она остаётся предметом интенсивных исследований.

559 / 907
5.3.6. Кратчайший остов (10/10)

Пример. На рисунке приведены, соответственно, диаграммы кратчайшего остова, наив-


ного «решения» задачи Штейнера и правильного решения для случая, когда города рас-
положены в вершинах квадрата.

560 / 907
5.4. Связность в графах и орграфх

В этом разделе обсуждается важное для приложений понятие связности. При этом сле-
дует подчеркнуть, что связность в графах и орграфах имеет различные свойства.
В начале раздела обсуждаются понятия, относящиеся к связности в графах и доказыва-
ется фундаментальная теорема — теорема Менгера. В конце раздела рассматривается
связность в орграфах и анализируются алгоритмы выделения компонент сильной связ-
ности.
В русском языке есть как слово «компонент» мужского рода, так и слово «компонента»
женского рода, оба варианта допустимы. В современной языковой практике чаще ис-
пользуется слово мужского рода. Однако исторически сложилось так, что «компонента
связности» имеет женский род, и в данном случае мы подчиняемся традиции.

561 / 907
5.4.1 Компоненты связности (1/5)
Напомним, что две вершины в графе связаны, если существует соединяющая их цепь.
Отношение связанности вершин является эквивалентностью и классы эквивалентности
этого отношения называются компонетами связности.
Лемма. В нетривиальном связном графе G(V, E) для любого разбиения множества вершин
V на непустые блоки U и W существует ребро, инцидентное вершинам из разных блоков.

∀ U, W ⊂ V (U 6= ∅ & W 6= ∅ & U ∩ W = ∅ & U ∪ W = V =⇒


=⇒ ∃ (u, w) ∈ E (u ∈ U & w ∈ W )).
Доказательство. Рассмотрим вершины u ∈ U , w ∈ W и цепь hu, wi, которые существуют
по условиям леммы. Если цепь hu, wi состоит из одного ребра, то это ребро — требуемое.
Если цепь состоит из нескольких рёбер, то рассмотрим вершину v на цепи hu, wi, смеж-
ную с вершиной u. Если v ∈ W , то ребро (u, v) — требуемое. В противном случае отще-
пим от цепи hu, wi ребро (u, v), положим u ← v и снова рассмотрим цепь hu, wi, которая
удовлетворяет условиям. Будем продолжать процесс отщеплений, пока не получим тре-
буемое ребро. Процесс отщеплений закончится, потому что исходная цепь конечна. 562 / 907
5.4.1 Компоненты связности (2/5)
Теорема. Граф связен тогда и только тогда, когда его нельзя представить в виде объеди-
нения двух графов.
Доказательство. [=⇒] От противного. Пусть k(G) = 1 и граф G является объединением
двух графов, то есть G = G1 (V1 , E1 ) ∪ G2 (V2 , E2 ), где V1 ∩ V2 = ∅, E1 ∩ E2 = ∅, V1 6= ∅,
V2 6= ∅. Возьмём v1 ∈ V1 , v2 ∈ V2 . Тогда ∃ hv1 , v2 i (v1 ∈ V1 & v2 ∈ V2 ). В этой цепи по
лемме ∃ e = (a, b) (a ∈ V1 & b ∈ V2 ). Но тогда e 6∈ E1 , e 6∈ E2 , следовательно, e 6∈ E .
[ ⇐= ] От противного. Пусть k(G) > 1. Тогда существуют две вершины, u и v , не соединён-
ные цепью. Следовательно, вершины u и v принадлежат разным компонентам связности.
Положим G1 — компонента связности для u, а G2 — все остальное. Имеем G = G1 ∪ G2 .

Замечание. Несвязный граф всегда можно представить как объединение связных ком-
понент. Эти компоненты можно рассматривать независимо. Поэтому во многих случаях
можно без ограничения общности предполагать, что рассматриваемый граф связен.
Очевидно, что все вершины в любом цикле связаны, и всякий цикл принадлежит одной
компоненте связности.
563 / 907
5.4.1 Компоненты связности (3/5)

Легко заметить, что инварианты p(G), q(G) и k(G) не являются независимыми.


Теорема. Пусть p — число вершин, q — число рёбер, k — число компонент связности графа.
Тогда p − k 6 q 6 (p − k)(p − k + 1)/2.
Доказательство.
[ p − k 6 q ] Индукция по p. База: p = 1, q = 0, k = 1. Пусть оценка верна для всех графов
с числом вершин меньше p. Рассмотрим граф G, p(G) = p. Удалим в G вершину v , которая
не является точкой сочленения: G0 ← G − v . Тогда если v — изолированная вершина, то
p0 = p − 1, k 0 = k − 1, q 0 = q . Имеем p − k = p0 − k 0 6 q 0 = q . Если v — не изолированная
вершина, то p0 = p − 1, k 0 = k , q 0 < q . Имеем p − k = 1 + p0 − k 0 6 1 + q 0 6 q .
[ q 6 (p − k)(p − k + 1)/2 ] Метод выделения «критических» графов. Число рёбер q графа
с p вершинами и k компонентами связности не превосходит числа рёбер в графе с p вер-
шинами и k компонентами связности, в котором все компоненты связности суть полные
графы.

564 / 907
5.4.1 Компоненты связности (4/5)
Доказательство. (Продолжение) Следовательно, достаточно рассматривать только графы,
в которых все компоненты связности полные. Среди всех графов с p вершинами и k пол-
ными компонентами связности наибольшее число рёбер имеет граф K fp , в котором все
рёбра сосредоточены в одной компоненте связности:
k−1
[
fp ← Kp−k+1 ∪
K K1 .
i=1

Действительно, пусть есть две компоненты связности, G1 и G2 , такие, что

1 < p1 = p(G1 ) 6 p2 = p(G2 ).

Если перенести одну вершину из компоненты связности G1 в компоненту связности G2 ,


то число рёбер изменится на ∆q = p2 − (p1 − 1) = p2 − p1 + 1 > 0.
Следовательно, число рёбер возросло. Таким образом, достаточно рассмотреть граф K
fp .
Имеем q(K fp ) = (p − k + 1)(p − k + 1 − 1)/2 + 0 = (p − k)(p − k + 1)/2.
565 / 907
5.4.1 Компоненты связности (5/5)

Следствие. [1] Если q > (p − 1)(p − 2)/2, то граф связен.


Доказательство. От противного. Пусть q > (p − 1)(p − 2)/2, но граф не связен, то есть
k > 2. Но тогда

(p − 1)(p − 2)/2 < q 6 (p − k)(p − k + 1)/2 6 (p − 2)(p − 1)/2

— противоречие.
Следствие.[2] В связном графе p − 1 6 q 6 p(p − 1)/2.
Доказательство. Следует из теоремы при k = 1.

566 / 907
5.4.2. Точки сочленения, мосты и блоки (1/11)
Вершина графа называется точкой сочленения, или разделяющей вершиной, если её уда-
ление увеличивает число компонент связности. Мостом называется ребро, удаление ко-
торого увеличивает число компонент связности. Блоком называется связный граф, не
имеющий точек сочленения.
Пример. В графе, диаграмма которого
представлена на рисунке, вершины u, v —
точки сочленения, и других точек сочле-
нения нет; ребро x — мост, и других мо-
стов нет; правильные подграфы {a, b, w},
{b, u, w}, {a, b, u, w}, {c, d, v}, {e, f, v} —
блоки, и других нетривиальных блоков нет.
Лемма. В любом нетривиальном графе есть по крайней мере две вершины, которые не
являются точками сочленения.
Доказательство. Например, это концы диаметра.
567 / 907
5.4.2. Точки сочленения, мосты и блоки (2/11)
Теорема. Пусть G(V, E) — связный граф и v ∈ V . Тогда следующие утверждения эквива-
лентны:
1. v — точка сочленения.
2. ∃ u, w ∈ V (u 6= w & ∀ hu, wiG (v ∈ hu, wiG )).
3. ∃ U, W (U ∩W = ∅ & U ∪W = V −v & ∀ u ∈ U, w ∈ W (∀ hu, wiG (v ∈ hu, wiG ))).
Доказательство.
[ 1=⇒3 ] Рассмотрим G0 ← G − v . Граф G0 не связен, k(G0 ) > 1, следовательно, G0 име-
ет по крайней мере две компоненты связности, то есть V − v = U ∪ W , где U — мно-
жество вершин одной из компонент связности, а W — все остальные вершины. Пусть
u ∈ U , w ∈ W . Тогда ¬∃hu, wiG0 . Но k(G) = 1, следовательно, ∃hu, wiG и, значит,
∀ hu, wiG (v ∈ hu, wiG ).
[ 3=⇒2 ] Тривиально.
[ 2=⇒1 ] Рассмотрим G0 ← G − v . Имеем ¬∃hu, wiG0 . Следовательно, k(G0 ) > 1, откуда
v — точка сочленения.
Пример. На рисунке в начале параграфа:
v — точка сочленения, при этом U = {a, b, u, w}, W = {c, d, e, f }. 568 / 907
5.4.2. Точки сочленения, мосты и блоки (3/11)
Следствие. Если вершина инцидентна мосту и не является висячей, то она является точ-
кой сочленения.
Доказательство. Пусть (u, v) — мост и d(v) > 1. Тогда v смежна с w, причём w 6= u. Далее
разбор случаев. Если ∃ hu, wi (v ∈ / hu, wi), то ребро (u, v) принадлежит циклу, что про-
тиворечит тому, что (u, v) — мост. Если же ¬∃ hu, wi (v ∈ / hu, wi), то ∀ hu, wi (v ∈ hu, wi)
и, значит, v — точка сочленения по пункту 2 теоремы.
Замечание. Отнюдь не всякая точка сочленения является концом моста.
Пример. В условиях предыдущего примера, при удалении моста x, вершина v остаётся
точкой сочленения и не является концом моста.
Следствие. Если граф G(V, E) связен, а вершина v не является точкой сочленения, то
для любых двух других вершин, u и w, существует простая hu, wi-цепь, не содержащая
вершину v .
Доказательство. Данное утверждение является отрицанием пункта 2 предыдущей теоре-
мы.
569 / 907
5.4.2. Точки сочленения, мосты и блоки (4/11)
Теорема. Если G(V, E) — связный граф и x ∈ E , то следующие утверждения эквивалентны:
1. x — мост.
2. x не принадлежит ни одному простому циклу.
3. ∃ u, w ∈ V (∀ hu, wiG (x ∈ hu, wiG )).
4. ∃ U, W (U ∩W = ∅ & U ∪W = V & ∀ u ∈ U (∀ w ∈ W (∀ hu, wiG (x ∈ hu, wiG )))).
Доказательство.
[ 1=⇒2 ] Рёбра любого цикла, очевидно, не являются мостами.
[ 2=⇒1 ] Если ребро x не принадлежит ни одному (простому) циклу, то концы x не свя-
заны в графе G0 ← G − x, а значит ребро x — мост.
[ 1=⇒4 ] Рассмотрим G0 ← G − x. Граф G0 не связен, k(G0 ) > 1, следовательно, G0 име-
ет по крайней мере две компоненты связности, то есть V = U ∪ W , где U — мно-
жество вершин одной из компонент связности, а W — все остальные вершины. Пусть
u ∈ U , w ∈ W . Тогда ¬∃hu, wiG0 . Но k(G) = 1, следовательно, ∃hu, wiG и, значит,
∀ hu, wiG (x ∈ hu, wiG ).
[ 4=⇒3 ] Тривиально.
[ 3=⇒1 ] Пусть G0 ← G−x. Имеем ¬∃hu, wiG0 . Следовательно, k(G0 ) > 1, откуда x — мост.
570 / 907
5.4.2. Точки сочленения, мосты и блоки (5/11)
Пример. В графе, диаграмма которого представлена на рисунке в начале параграфа, толь-
ко ребро x не входит в циклы и является мостом.
Графы K1 и K2 формально можно считать блоками, поскольку у них нет точек сочленения.
Эти блоки уместно назвать тривиальными, поскольку они удовлетворяют определению,
но не обладают свойствами, присущими нетривиальным блокам. В частности, нетрудно
видеть, что в нетривиальном блоке не только нет точек сочленения, но также нет мостов
и нет висячих вершин. Более того, все вершины блока связаны неединственным образом,
что устанавливает следующая теорема.
Теорема. Если граф G(V, E) связен и p(G) > 2, то следующие утверждения эквиваленты:
1) G — нетривиальный блок;
2) любые две вершины принадлежат одному простому циклу;
3) любые вершина и ребро принадлежат одному простому циклу;
4) любые два ребра принадлежат одному простому циклу;
5) для любых двух вершин и любого ребра существует простая цепь, соединяющая эти
вершины и содержащая это ребро;
6) для любых трёх вершин существует простая цепь, соединяющая две вершины и содер-
571 / 907
5.4.2. Точки сочленения, мосты и блоки (6/11)
Доказательство.
[ 1=⇒ 2 ] Пусть u и w — любые две вершины. Рассмотрим U — множество всех вершин,
входящих во все простые циклы, содержащие вершину u. Ясно, что U 6= ∅, поскольку
вершина u не является висячей, поэтому для любых двух вершин, u1 и u2 , смежных с
вершиной u, по следствию 2 к теореме 1 существует соединяющая их цепь, не содержа-
щая вершины u, и, значит, существует некоторый простой цикл, содержащий вершину u.
Положим W ← V \ U .

572 / 907
5.4.2. Точки сочленения, мосты и блоки (7/11)

Доказательство. (Продолжение) Далее от противного. Пусть W 6= ∅ и w ∈ W . Граф свя-


зен, и, значит, в нём есть ребро (s, t) такое, что s ∈ U , t ∈ W (лемма п. 5.4.1). Поскольку
u ∈ U и s ∈ U , обе эти вершины принадлежат некоторому простому циклу Z . По след-
ствию 2 существует простая hu, ti-цепь P , не содержащая вершину s. Обозначим через
v первую вершину, считая от вершины t, на цепи P , которая также принадлежит циклу
Z . Тогда рассмотрим следующую последовательность простых цепей: отрезок цепи P от
вершины t до вершины v , отрезок цикла Z от вершины v до вершины u, отрезок цикла Z
от вершины u до вершины s, ребро (s, t). Это цикл, причём простой, и вершины u и t обе
принадлежат этому циклу и входят в множество U , что противоречит выбору вершины t
и предположению w ∈ W .
[ 2=⇒3 ] Пусть u — любая вершина и (v, w) — любое ребро. Вершины u и v принадлежат
некоторому простому циклу Z . Если w ∈ Z , то требуемый цикл строится из ребра (v, w)
и из того отрезка цикла Z от v до w, который содержит вершину u.

573 / 907
5.4.2. Точки сочленения, мосты и блоки (8/11)
Доказательство. (Продолжение) Если же w 6∈ Z , то по следствию 2 существует простая
hu, wi-цепь P , не содержащая вершину v . Обозначим через s первую вершину, считая от
вершины w, на цепи P , которая также принадлежит циклу Z . Тогда рассмотрим следую-
щую последовательность простых цепей: отрезок цепи P от вершины w до вершины s,
отрезок цикла Z от вершины s до вершины v , содержащий вершину u, и ребро (v, w).
Это цикл, причём простой, содержащий вершину u и ребро (v, w).

574 / 907
5.4.2. Точки сочленения, мосты и блоки (9/11)
Доказательство. (Продолжение)
[ 3=⇒4 ] Пусть (u, w) и (s, t) — два любых ребра. По условию, ребро (u, w) и вершина
s принадлежат некоторому циклу Z1 , и в то же время ребро (u, w) и вершина t принад-
лежат некоторому циклу Z2 . Тогда рассмотрим следующую последовательность простых
цепей: ребро (u, w), отрезок цикла Z1 от вершины u до вершины s, ребро (s, t), отрезок
цикла Z2 от вершины t до вершины w.
Это цикл, причём простой, содержащий рёбра (u, w) и (s, t).

575 / 907
5.4.2. Точки сочленения, мосты и блоки (10/11)
Доказательство. (Продолжение)
[ 4=⇒5 ] Пусть u и w — любые две вершины и (s, t) — любое ребро. Граф связен, значит,
существует простая hu, wi-цепь P . Пусть P = (u, x, . . . , w). По условию, рёбра (u, x)
и (s, t) принадлежат некоторому простому циклу Z (см. рисунок). Обозначим через v
первую вершину, считая от вершины w, на цепи P , которая также принадлежит циклу Z
(может оказаться, что v = x). Тогда рассмотрим следующую последовательность простых
цепей: отрезок цикла Z от вершины u до вершины v , проходящий через ребро (s, t),
отрезок цепи P от вершины v до вершины w. Это цепь, причём простая, содержащая
ребро (s, t).

576 / 907
5.4.2. Точки сочленения, мосты и блоки (11/11)

Доказательство. (Окончание)
[ 5=⇒6 ] Пусть u, v , w — любые три вершины и (w, x) — некоторое ребро, инцидентное
вершине w. По условию существует простая hu, vi-цепь P , содержащая ребро (w, x) и,
значит, вершину w.
[ 6=⇒1 ] Пусть v — любая вершина. Покажем, что вершина v не является точкой сочле-
нения, то есть что граф G − v связен. Рассмотрим u и w — любые две вершины. По усло-
вию существует простая hu, vi-цепь P , проходящая через вершину w. Отрезок цепи P от
u до w обеспечивает связанность вершин u и w в графе G − v .

577 / 907
5.4.3. Вершинная и рёберная связность (1/3)
При взгляде на диаграммы связных графов возникает естественное впечатление, что
связный граф может быть «более» или «менее» связен. В этом параграфе рассматри-
ваются некоторые количественные меры связности.
Вершинной связностью графа G (обозначается κ(G)) называется наименьшее число вер-
шин, удаление которых приводит к несвязному или тривиальному графу.
Пример.

κ(G) = 0, если G несвязен;


κ(G) = 1, если G имеет точку сочленения;
κ(Kp ) = p − 1, если Kp — полный граф.

Граф G называется n-связным, если κ(G) = n.


Рёберной связностью графа G (обозначается λ(G)) называется наименьшее число рёбер,
удаление которых приводит к несвязному или тривиальному графу.
578 / 907
5.4.3. Вершинная и рёберная связность (2/3)
Пример.

λ(G) = 0, если G несвязен;


λ(G) = 1, если G имеет мост;
λ(Kp ) = p − 1, если Kp — полный граф.

Теорема. κ(G) 6 λ(G) 6 δ(G).


Доказательство.
[ κ 6 λ ] Если λ = 0, то κ = 0. Если λ = 1, то есть мост, а значит, либо есть точка
сочленения, либо G = K2 . В любом случае κ = 1. Пусть теперь λ > 2. Тогда, удалив
λ − 1 ребро, получим граф G0 , имеющий мост (u, v ). Для каждого из удаляемых λ − 1
рёбер удалим инцидентную вершину, отличную от u и v . Если после такого удаления
вершин граф несвязен, то κ 6 λ − 1 < λ. Если связен, то удалим один из концов моста —
u или v . Имеем κ 6 λ.
[ λ 6 δ ] Если δ = 0, то λ = 0. Пусть вершина v имеет наименьшую степень: d(v) = δ .
Удалим все рёбра, инцидентные v . Тогда λ 6 δ .
579 / 907
5.4.3. Вершинная и рёберная связность(3/3)
Пример. Слева κ = λ = δ = 2, в центре κ = 1, λ = δ = 2, справа κ = 1, λ = 2, δ = 3.

Особое значение имеют двусвязные графы по двум причинам. Во-первых, они особенно
часто встречаются в приложениях. Во-вторых, двусвязные графы являются частным слу-
чаем блоков, которые обладают многими полезными свойствами, часть из которых при-
ведена в предыдущем параграфе.
Замечание. Легко видеть, что любой двусвязный граф является блоком, поскольку не со-
держит точек сочленения. В то же время всякий нетривиальный блок является, по мень-
шей мере, двусвязным, но может быть и трёхсвязным, и вообще иметь произвольную ве-
личину вершинной связности, поскольку, например, всякий полный граф является бло-
ком.
580 / 907
5.4.4. Теорема Менгера (1/7)
Пусть G(V, E) — связный граф, u и v — две его несмежные вершины. Две цепи hu, vi на-
зываются вершинно-непересекающимися, если у них нет общих вершин, отличных от u и
v . Две цепи hu, vi называются рёберно-непересекающимися, если у них нет общих рёбер.
Если две цепи вершинно не пересекаются, то они и рёберно не пересекаются. Обозначим
через P (u, v) множество вершинно-непересекающихся цепей hu, vi. Множество S вер-
шин и (или) рёбер графа G разделяет две вершины, u и v , если u и v принадлежат раз-
ным компонентам связности графа G−S . Разделяющее множество рёбер называется раз-
резом. Разделяющее множество вершин для вершин u и v обозначим S(u, v).
Для заданных вершин u и v множества P (u, v) и S(u, v) можно выбирать различным
образом. Из определений следует, что при |P (u, v)| > 1 любое множество P (u, v) вер-
шинно-непересекающихся цепей обладает тем свойством, что
\
hu, vi = {u, v},
hu,vi∈P (u,v)

а любое разделяющее множество вершин S(u, v) обладает тем свойством, что


G − S = G1 ∪ G2 & v ∈ G1 & u ∈ G2 . 581 / 907
5.4.4. Теорема Менгера (2/7)
Замечание. Если u и v принадлежат разным компонентам связности графа G,
то |P (u, v)| = 0 и |S(u, v)| = 0. Поэтому без ограничения общности можно считать, что
G — связный граф.
Пример. В графе, диаграмма которого представлена на рисунке, можно выбрать мно-
жества вершинно-непересекающихся путей P1 = {hu, a, d, vi, hu, b, e, vi} и
P2 = {hu, b, d, vi, hu, c, e, vi}. Заметим, что путь hu, c, b, d, vi образует множество P3
вершинно-непересекающихся путей, состоящее из одного элемента. Множества вершин
S1 = {a, b, c} и S2 = {d, e} являются разделяющими для вершин u и v .

582 / 907
5.4.4. Теорема Менгера (3/7)
Теорема. [Менгера] Пусть u и v — несмежные вершины в графе G. Наименьшее число вер-
шин в множестве, разделяющем u и v , равно наибольшему числу вершинно-непересекающих-
ся простых hu, vi-цепей:
max |P (u, v)| = min |S(u, v)|.
Замечание. Пусть G — связный граф и вершины u и v несмежны. Пусть P ← P (u, v),
S ← S(u, v). Легко видеть, что |P | 6 |S|. Действительно, любая hu, vi-цепь проходит че-
рез S . Если бы |P | > |S|, то в S была бы вершина, принадлежащая более чем одной цепи
из P , что противоречит выбору P . Таким образом, ∀ P (∀ S (|P | 6 |S|)). Следовательно,
max |P | 6 min |S|. Утверждение теоремы состоит в том, что в любом графе существуют
такие P и S , что достигается равенство |P | = |S|.
Доказательство. Пусть G — связный граф, u и v — несмежные вершины. Совместная ин-
дукция по p и q . База: наименьший граф, удовлетворяющий условиям теоремы, состо-
ит из трёх вершин, u, w, v , и двух рёбер, (u, w) и (w, v). В нём P (u, v) = {hu, w, vi} и
S(u, v) = {w}. Таким образом, |P (u, v)| = |S(u, v)| = 1.
583 / 907
5.4.4. Теорема Менгера (4/7)
Доказательство. (Продолжение) Пусть утверждение теоремы верно для всех графов с
числом вершин меньше p и (или) числом рёбер меньше q . Рассмотрим граф G с p верши-
нами и q ребрами. Пусть u, v ∈ V , причём u, v — не смежны и S — некоторое наимень-
шее множество вершин, разделяющее u и v . Обозначим n ← |S|. Рассмотрим три случая.
[ 1 ] Пусть в S есть вершины, несмежные с u и несмежные с v . Тогда граф G − S состоит
из двух нетривиальных графов, G1 и G2 . Образуем два новых графа, Gu и Gv , стягивая
нетривиальные графы G1 и G2 к вершинам u и v : Gu ← G/G1 , Gv ← G/G2 .

S по-прежнему является наименьшим разделяющим множеством для u и v как в Gu , так


и в Gv . Так как G1 и G2 нетривиальны, то Gu и Gv имеют меньше вершин и (или) рёбер,
чем G.
584 / 907
5.4.4. Теорема Менгера (5/7)
Доказательство. (Продолжение) Следовательно, по индукционному предположению в Gu
и в Gv имеется n вершинно-непересекающихся простых цепей. Комбинируя отрезки этих
цепей от u до S и от S до v , получаем n непересекающихся простых цепей в G.
[ 2 ] Пусть все вершины S смежны с u или с v (пусть с u) и среди вершин S есть вершина
w, смежная одновременно с u и с v .

Рассмотрим граф G0 ← G − w. В нём S − w — разделяющее множество для u и v , при-


чём наименьшее. По индукционному предположению в G0 имеется |S − w| = n − 1
вершинно-непересекающихся простых цепей. Добавим к ним цепь hu, w, vi. Она простая
и вершинно не пересекается с остальными. Таким образом, имеем n вершинно-непересе-
кающихся простых цепей в G. 585 / 907
5.4.4. Теорема Менгера (6/7)
Доказательство. (Окончание)
[ 3 ] Пусть теперь все вершины S смежны с u или с v (пусть с u) и среди вершин S нет
вершин, смежных одновременно с вершиной u и с вершиной v . Рассмотрим кратчайшую
hu, vi-цепь hu, w1 , w2 , . . . , vi, w1 ∈ S , w2 6= v .

Рассмотрим граф G0 ← G/{w1 , w2 }, полученный из G склейкой вершин w1 и w2 в верши-


ну w1 . Имеем w2 6∈ S , в противном случае цепь hu, w2 , . . . , vi была бы ещё более корот-
кой. Следовательно, в графе G0 множество S по-прежнему является наименьшим, разде-
ляющим u и v , и граф G0 имеет по крайней мере на одно ребро меньше. По индукци-
онному предположению в G0 существуют n простых непересекающихся цепей. Но цепи,
которые не пересекаются в G0 , не пересекаются и в G. Получаем n цепей в G. 586 / 907
5.4.4. Теорема Менгера (7/7)

Теорема Менгера представляет собой весьма общий факт, который в разных формули-
ровках встречается в различных областях математики. Комбинируя вершинно- и рёберно-
непересекающиеся цепи, разделяя не отдельные вершины, а множества вершин, исполь-
зуя инварианты κ и λ, можно сформулировать и другие утверждения, подобные теореме
Менгера. Например:
Теорема. Для любых двух несмежных вершин u и v графа G наибольшее число рёберно-не-
пересекающихся hu, vi-цепей равно наименьшему числу рёбер в (u, v)-разрезе.
Теорема. Чтобы граф G был n-связным, необходимо и достаточно, чтобы любые две
несмежные вершины были соединены не менее чем n вершинно-непересекающимися про-
стыми цепями.
Другими словами, в любом графе G любые две несмежные вершины соединены не менее
чем κ(G) вершинно-непересекающимися простыми цепями.

587 / 907
5.4.5. Связность в орграфах (1/8)
Связность является одним из немногих понятий, которые не распространяются непосред-
ственно с графов на другие родственные объекты и требуют отдельного определения и
рассмотрения в каждом случае. В данном параграфе рассматривается связность в оргра-
фах, поскольку именно это понятие чаще всего применяется в программировании.
В неориентированном графе две вершины либо связаны (если существует соединяющая
их цепь), либо не связаны. В ориентированном графе отношение связанности узлов несим-
метрично, а потому определение связности различается.
Пусть G(V, E) — орграф, v1 и v2 — его узлы. Говорят, что два узла, v1 и v2 , сильно связаны
в орграфе G, если существует путь (ориентированная цепь) как из v1 в v2 , так и из v2 в v1 .
Говорят, что два узла, v1 и v2 , односторонне связаны в орграфе G, если существует путь
либо из v1 в v2 , либо из v2 в v1 . Говорят, что два узла, v1 и v2 , слабо связаны в орграфе G,
если они связаны в графе G0 , полученном из G забыванием ориентации дуг.
Если все вершины в орграфе сильно (односторонне, слабо) связаны, то орграф называет-
ся сильно (односторонне, слабо) связным. Сильная связность влечет одностороннюю связ-
ность, которая влечет слабую связность. Обратное, разумеется, неверно.
588 / 907
5.4.5. Связность в орграфах (2/8)
Пример. На рисунке показаны диаграммы сильно, односторонне и слабо связных оргра-
фов.

Лемма. В произвольном бесконтурном орграфе G(V, E) узлы можно перенумеровать так,


что у любой дуги номер начала меньше номера конца: ∀ (vi , vj ) ∈ E (i < j).
Доказательство. По теореме п. 5.2.4 отношение достижимости в бесконтурном графе есть
строгое частичное упорядочение на конечном множестве. Применяя алгоритм топологи-
ческой сортировки, получаем требуемую нумерацию узлов.
Пример. Левая диаграмма на рисунке содержит контур, и требуемая нумерация узлов
невозможна. Для других двух диаграмм приведены нумерации в условиях леммы.
589 / 907
5.4.5. Связность в орграфах (3/8)
Компонента сильной связности (употребляется аббревиатура КСС) орграфа G — это его
максимальный сильно связный подграф.
Каждый узел орграфа принадлежит только одной КСС. Если узел не связан сильно с дру-
гими, то считаем, что он сам образует КСС. Конденсацией G∗ орграфа G (или графом Герца,
или фактор-графом) называется орграф, который получается стягиванием в один узел
каждой КСС орграфа G.
Пример. На рисунке показаны диаграммы орграфа и его конденсации.

Замечание. Фактор-граф не содержит контуров.


590 / 907
5.4.5. Связность в орграфах (4/8)
Следующий алгоритм выделения компонент сильной связности, основанный на методе
поиска в глубину, находит все компоненты сильной связности орграфа.
Вход: орграф G(V, E), заданный списками смежности Γ(v).
Выход: список C компонент сильной связности, каждый элемент которого есть список
узлов, входящих в компоненту сильной связности.
C ←∅
for v ∈ V do
M [v] ←{v} //M [v] список узлов, входящих в ту же КСС, что и v
e[v] ← 0 //все узлы не рассмотрены
end for
while V 6= ∅ do
select v ∈ V ; v → T ; //взять v , положить в стек,
e[v] ← 1; KCC //отметить и вызвать процедуру KCC
end while
Рекурсивная процедура без параметров KCC:
591 / 907
if T = ∅ then return end if //негде выделять
v ← top T //v — верхний элемент стека
if Γ[v] = ∅ then
C ← C ∪ M [v]; V ← V − v ; v ← T //это КСС, удалить узел, снять узел v со стека
KCC //возврат из тупика
else
for u ∈ Γ[v] do
if e[u] = 0 then
u → T ; e[u] ← 1 //положить узел u в стек и отметить
else
repeat
w ← T ; V ← V − w; Γ[u] ← Γ[u] ∪ Γ[w]; M [u] ← M [u] ∪ M [w]
until u = w
w → T ; V ← V + w //чтобы не убрать узел, с которого начали
end if
KCC //поиск в глубину
end for
end if 592 / 907
5.4.5. Связность в орграфах (6/8)

Обоснование. Достаточно заметить, что любой контур принадлежит ровно одной КСС, и,
более того, если в КСС входит несколько узлов, то они обязательно принадлежат некото-
рым контурам. Поэтому, если при обходе в глубину мы попадаем в уже отмеченный узел
u, то это означает, что обнаружен контур, причём предшествующие узлы найденного кон-
тура находятся на стеке, начиная от вершины стека и до рассматриваемого отмеченного
узла u, который также присутствует в стеке. Все узлы найденного контура можно «скле-
ить». При склеивании узла w его список смежности и список уже найденных узлов той
КСС, которой принадлежит узел w, объединяются с соответствующими списками узла u.
После этого можно продолжить поиск в глубину от узла u, который для этой цели следует
оставить в стеке.
Следствие. Конденсация любого орграфа содержит источники.
Доказательство. Конденсация не может содержать контуров по алгоритму, и по теореме 3
п. 5.2.4 имеет хотя бы один узел, полустепень захода которого равна 0.

593 / 907
5.4.5. Связность в орграфах (7/8)
Множество узлов B орграфа G(V, E) называется порождающим, если любой узел оргра-
фа достижим из некоторого узла, принадлежащего этому множеству:
  →

∀v ∈ V ∃u ∈ B ∃hu, vi ∈ G .
Порождающее множество узлов называется базисом орграфа, если оно минимально по
включению.
Замечание. Узлы одного базиса недостижимы друг из друга.
Ясно, что порождающие множества, а значит и базисы, существуют у любого орграфа.
Лемма. Если орграф не имеет контуров, то имеет единственный базис, состоящий из
всех источников.
Доказательство. Любой источник входит в базис. Поскольку в орграфе нет контуров, лю-
бой узел достижим из некоторого источника. Действительно, чтобы найти этот источник,
достаточно двигаться из узла против направления входящих дуг.
Пример. На рисунке слева каждый узел обра-
зует базис, в центре базис состоит из одного
узла, а справа базис состоит из двух узлов. 594 / 907
5.4.5. Связность в орграфах (8/8)
Следствие. Конденсация любого орграфа имеет единственный базис, состоящий из источ-
ников.
Базисными компонентами сильной связности орграфа называются такие компоненты силь-
ной связности, которым соответствуют источники в конденсации этого орграфа.
Теорема. Подмножество узлов орграфа образует базис тогда и только тогда, когда оно
является трансверсалью базисных компонент сильной связности.
Доказательство.
[ =⇒ ] Пусть B — базис. Тогда узлы B принадлежат различным базисным КСС, посколь-
ку узлы базиса недостижимы друг из друга. В базис должен входить узел из каждой ба-
зисной КСС, в противном случае узлы «обделённой» КСС оказались бы недостижимы из
базиса. Таким образом, базис является трансверсалью базисных КСС.
[ ⇐= ] Любая трансверсаль базисных КСС образует базис, поскольку все узлы базисных
КСС достижимы из своих представителей в базисе ввиду сильной связности КСС, а любой
узел в другой КСС достижим из некоторой базисной КСС.
Следствие. Все базисы любого орграфа равномощны.
595 / 907
5.5. Паросочетания

Паросочетанием (или независимым множеством рёбер) называется множество рёбер, в


котором никакие два ребра не смежны. Паросочетание называется максимальным, ес-
ли никакое его надмножество не является независимым. Паросочетание называется наи-
большим, если оно включает наибольшее возможное число рёбер.
Задача отыскания паросочетаний имеет множество различных применений и интерпре-
таций, часть которых приведена в этом разделе.

596 / 907
5.5.1. Теорема Холла (1/7)
Рассмотрим три внешне различных задачи.
I Пусть имеется конечное множество юношей, каждый из которых знаком с некоторым
подмножеством конечного множества девушек. В каком случае всех юношей можно
женить так, чтобы каждый женился на знакомой девушке?
I Пусть S = {S1 , . . . , Sm } — семейство непустых подмножеств конечного множества
E . Подмножества Sk не обязательно различны и могут пересекаться. Системой раз-
личных представителей в семействе S (или трансверсалью в семействе S ) называет-
ся любое подмножество C = {c1 , . . . , cm } из m элементов множества E таких, что
∀ k ∈ 1..m (ck ∈ Sk ). В каком случае существует трансверсаль?
Замечание. Все элементы множества C различны, откуда и происходит название «си-
стема различных представителей».
I Пусть G(V1 , V2 , E) — двудольный граф. Совершенным паросочетанием из V1 в V2 назы-
вается паросочетание, покрывающее вершины V1 . В каком случае существует совер-
шенное паросочетание из V1 в V2 ?
Замечание. Совершенное паросочетание является максимальным и наибольшим.
597 / 907
5.5.1. Теорема Холла (2/7)
Вообще говоря, указанные задачи — это одна и та же задача. Задача о свадьбах сводит-
ся к задаче о паросочетаниях следующим образом. V1 — множество юношей, V2 — мно-
жество девушек, рёбра — знакомства юношей с девушками. В таком случае совершенное
паросочетание — искомый набор свадеб. Задача о трансверсали сводится к задаче о па-
росочетаниях следующим образом. Положим V1 ← S , V2 ← E , ребро (Sk , ei ) существует,
если ei ∈ Sk . В таком случае совершенное паросочетание — искомая трансверсаль. Все
задачи имеют общий ответ: в том и только том случае, когда
   
юношей знакомы с
любые k  подмножеств  в совокупности  содержат 
вершин из V1 смежны с
 
девушками
не менее чем k  элементов ,
вершинами из V2
что устанавливается теоремой Холла.
598 / 907
5.5.1. Теорема Холла (3/7)
Теорема. Пусть G(V1 , V2 , E) — двудольный граф. Совершенное паросочетание из V1 в V2
существует тогда и только тогда, когда ∀ A ⊂ V1 (|A| 6 |Γ(A)|).
Доказательство.
[ [⇒] ] Пусть существует совершенное паро-
сочетание из V1 в V2 . Тогда в Γ(A) входит |A|
вершин из V2 , парных к вершинам из множе-
ства A, и, возможно, еще что-то. Таким обра-
зом, |A| 6 |Γ(A)|.
[ [⇐] ] Добавим две новые вершины, u
и v , так что вершина u смежна со всеми
вершинами из V1 , а вершина v смежна
со всеми вершинами из V2 . Совершенное
паросочетание из V1 в V2 существует то-
гда и только тогда, когда существуют |V1 |
вершинно-непересекающихся простых
hu, vi-цепей. 599 / 907
5.5.1. Теорема Холла (4/7)
Доказательство. (Окончание) Ясно, что |P (u, v)| 6 |V1 | (так как V1 разделяет вершины u и
v ). По теореме Менгера, если S — наименьшее множество, разделяющее вершины u и v ,
то max |P (u, v)| = min |S(u, v)| = |S|. Имеем |S| 6 |V1 |. Покажем, что |S| > |V1 |. Пусть
S = A ∪ B , A ⊂ V1 , B ⊂ V2 . Тогда Γ(V1 \ A) ⊂ B , не считая вершин u, v . Действительно,
если бы Γ(V1 \ A) 6⊂ B , то существовал бы «обходной» путь hu, v1 , v2 , vi и S не было бы
разделяющим множеством для u и v . Имеем |V1 \A| 6 |Γ(V1 \A)| 6 |B|. Следовательно,
|S| = |A| + |B| > |A| + |V1 \ A| = |V1 |.
Следствие. В любом непустом регулярном двудольном графе G(V1 , V2 ) существует совер-
шенное паросочетание.
Доказательство. Пусть ∀ v (d(v) = r > 0). Возьмем произвольные k вершин первой до-
ли {u1 , . . . , uk } и смежные с ними n вершин второй доли {v1 , . . . , vn }. Рассмотрим по-
рожденный этими k + n вершинами подграф исходного графа. В полученном подграфе
∀ i (d(ui ) = r) и ∀ j (d(vj ) 6 r). Число рёбер двудольного графа равно сумме степеней
Pk Pn
вершин любой из его долей. Поэтому i=1 d(ui ) = kr = j=1 d(vj ) 6 nr, откуда k 6 n.

600 / 907
5.5.1. Теорема Холла (5/7)
Любопытным приложением теоремы Холла является известная комбинаторная голово-
ломка о латинских квадратах. Матрица L : array [1..m, 1..n] of M , где M ←{a1 , . . . , an }
называется латинским прямоугольником, если элементы каждой строки этой матрицы об-
разуют перестановку множества M , и в каждом столбце все элементы разные. По прин-
ципу Дирихле число строк латинского прямоугольника m не превосходит числа его столб-
цов n. В случае m = n латинский прямоугольник называют латинским квадратом поряд-
ка n.
Замечание. Латинские квадраты известны с античных времен. В настоящее время в ка-
честве множества M обычно берётся отрезок 1..n, однако Эйлер использовал буквы ла-
тинского алфавита, откуда латинские квадраты и получили своё название.
Построить латинский квадрат можно, например, так. Заполнить первую строку любой пе-
рестановкой, а каждую следующую строку получать из предыдущей сдвигом на одну по-
зицию вправо, перенося последний элемент в первую позицию.

601 / 907
5.5.1. Теорема Холла (6/7)
Теорема. Любой латинский прямоугольник array [1..m, 1..n] of 1..n, можно дополнить до
латинского квадрата порядка n приписыванием новых n − m строк.
Доказательство. Построим двудольный граф G(V1 , V2 ), в котором V1 есть множество столб-
цов латинского прямоугольника, а V2 = 1..n. Вершина i ∈ V1 и вершина j ∈ V2 соедине-
ны ребром тогда и только тогда, когда в i-м столбце прямоугольника нет числа j . Ясно,
что ∀ v ∈ V1 (d(v) = n − m). С другой стороны, любое число j встречается в m строках
исходного латинского прямоугольника m раз, значит оно появляется в m столбцах и от-
сутствует в n − m столбцах. Отсюда следует, что ∀ v ∈ V2 (d(v) = n − m). Таким обра-
зом, двудольный граф G(V1 , V2 ) является непустым и регулярным. По следствию к теоре-
ме Холла в непустом регулярном двудольном графе можно выделить совершенные паро-
сочетание, которое задаёт очередную новую строку латинского квадрата, и продолжить
с латинским прямоугольником, в котором на одну строку больше.
Отступление. Известная игра «судоку» тоже по сути является латинским квадратом.

602 / 907
5.5.1. Теорема Холла (7/7)

Два латинских квадрата L1 и L2 порядка n называются ортогональными, если все упо-


рядоченные пары (L1 [i, j], L2 [i, j]) различны.
Пример. Среди 36 офицеров поровну уланов, драгунов, гусаров, кирасиров, кавалергар-
дов и гренадеров и, кроме того, поровну генералов, полковников, майоров, капитанов,
лейтенантов и поручиков, причем каждый полк представлен офицерами шести рангов.
Можно ли выстроить этих офицеров в каре 6 на 6 так, чтобы в любой колонне и в любой
шеренге встречались офицеры всех полков и всех рангов?
Отступление. Эйлер не смог построить ортогональных латинских квадратов порядков 6 и 10, за-
тем высказал гипотезу, что не существует ортогональных квадратов для n = 4r + 2. В 1901 г. ги-
потеза была подтверждена для n = 6, а опровергнута в 1959 г. путём построения ортогональных
квадратов для n = 22. В 1960 г. с помощью ЭВМ было построено два ортогональных квадрата
для n = 10. Задача про офицеров оказалась удивительным исключением!

603 / 907
5.5.2. Устойчивые паросочетания (1/8)
Пусть имеется конечное множество мужчин и конечное множество женщин (равномощ-
ные). Элементы множества мужчин обозначим прописными буквами, а элементы множе-
ства женщин — строчными. Пусть также задано совершенное взаимно-однозначное па-
росочетание из множества мужчин в множество женщин и обратно (брачное отношение):
Aa, Bb и т. д. Пусть теперь у каждого мужчины есть список женщин, упорядоченный по
убыванию «привлекательности» для этого мужчины. А у каждой женщины — список муж-
чин, также упорядоченный по убыванию «привлекательности» для неё.
Паросочетание называется неустойчивым, если в нём найдутся мужчина X (женатый на
женщине x) и женщина y (замужем за мужчиной Y), предпочитающие друг друга своим
супругам, то есть:
1) X считает y привлекательней, чем x;
2) y считает X привлекательней, чем Y.

Паросочетание называется устойчивым, если таких пар в нём нет.


604 / 907
5.5.2. Устойчивые паросочетания (2/8)
Пример. Четверо мужчин (A, B, C, D) состоят в браке с четырьмя женщинами (a, b, c, d).
Порядок предпочтений представлен в таблицах.
Мужчины Предпочтения Женщины Предпочтения
A cbda a ABDC
B bacd b CABD
C bdac c CBDA
D cadb d BACD
Паросочетание (Aa, Bb, Cc, Dd) неустойчиво, так как C и b предпочитают друг друга своим
супругам.
Задача заключается в нахождении устойчивого паросочетания по данным спискам пред-
почтений. Иными словами, нужно в полном двудольном графе Kn,n найти совершенное
устойчивое паросочетание, если оно существует.
Решение задачи существует, как показывает следующий алгоритм, который называют ал-
горитмом отложенного согласия.
605 / 907
5.5.2. Устойчивые паросочетания (3/8)
В алгоритме используются следующие структуры данных.
1. Матрица предпочтений мужчин M : array [1..n, 1..n] of 1..n. Элемент M [m, p] означает
номер женщины, стоящей на месте p в списке предпочтений мужчины m.
2. Матрица предпочтений женщин W : array [1..n, 1..n] of 1..n. Элемент W [w, m] означа-
ет рейтинг мужчины m в списке предпочтений женщины w. Данные примера представ-
ляются следующими матрицами:
   
3 2 4 1 4 3 1 2
2 1 3 4 3 2 4 1
M =
2
, W = .
4 1 3 1 3 4 2
3 1 4 2 3 4 2 1

3. Список женихов B : array [1..n] of 0..n, где B[m] — номер невесты, помолвленной с
женихом m.
4. Список предложений P : array [1..n] of 0..n, где P [m] — количество предложений, уже
сделанных женихом m.
606 / 907
5.5.2. Устойчивые паросочетания (4/8)
5. Список невест G : array [1..n] of 0..n, где G[w] — номер жениха, помолвленного с
невестой w.
6. Текущий рейтинг R : array [1..n] of 0..n, где R[w] — рейтинг жениха, помолвленного с
невестой w.
Вход: n число мужчин и женщин, матрицы предпочтений M, W .
Выход: n сформированных пар в списках B, G.
k ← 0 //количество сформированных пар
for i from 1 to n do B[i] ← 0; G[i] ← 0; P [i] ← 0; end for
while k < n do
for m from 1 to n do
if B[m] = 0 then
//первый свободный жених m делает предложение невесте w
P [m] ← P [m] + 1; w ← M [m, P [m]]
exit for m //цикл не нужно продолжать
end if
end for 607 / 907
5.5.2. Устойчивые паросочетания (5/8)

if G[w] = 0 then
//первое предложение всегда принимается — помолвка
k ← k + 1; G[w] ← m, B[m] ← w; R[w] ← W [w, m]
next while k < n //следующий жених
end if
if W [w, m] > R[w] then
//новый жених лучше — прежнему отставка
B[G[w]] ← 0; B[m] ← w; R[w] ← W [w, m]; G[w] ← m
end if
end while

608 / 907
5.5.2. Устойчивые паросочетания (6/8)

Обоснование.
[ Завершаемость ] На каждой итерации рассматривается одно предложение, а всего воз-
можно не более n2 предложений.
[ Паросочетаемость ] На каждой итерации для ненулевых элементов инвариантно выпол-
няется условие: G[w] = m ⇐⇒ B[m] = w, пары образуют паросочетание.
[ Совершенность ] Всего создано n пар, значит паросочетание совершенное.
[ Устойчивость ] От противного. Пусть в найденном паросочетании Xx, Yy существует
неустойчивая комбинация X–y. Возможны два случая. Мужчина X не делал предложения
женщине y. Но это означает, что x предшествует y в списке предпочтений X, что противо-
речит неустойчивости. Мужчина X делал предложение женщине y и она ему отказала. Но
это означает, что Y предшествует X в списке предпочтений y, что противоречит неустой-
чивости.

609 / 907
5.5.2. Устойчивые паросочетания (7/8)
Пример. Для рассматриваемого примера
   
3 2 4 1 4 3 1 2
2 1 3 4 3 2 4 1
M =
2
, W = ,
4 1 3 1 3 4 2
3 1 4 2 3 4 2 1
алгоритм последовательно построит следующие паросочетания:
∅ 7→ {Ac} 7→ {Ac,Bb} 7→ {Ac, Cb} 7→ {Ac,Cb,Ba} 7→ {Cb, Ba, Dc} 7→ {Cb, Ba, Dc, Ad}.
Замечание. Алгоритм находит одно из многих возможных решений задачи. В данном слу-
чае алгоритм строит наилучший вариант для мужчин (для каждого мужчины выбранная
алгоритмом супруга наиболее привлекательна для него из всех возможных устойчивых
паросочетаний) и наихудший для женщин (выбранный супруг нравится каждой женщине
не больше, чем возможный супруг в любом другом устойчивом паросочетании).

610 / 907
5.5.2. Устойчивые паросочетания (8/8)

Отступление. Рассмотрим задачу об «устойчивом зачислении» n абитуриентов в m университетов.


Пусть университет с номером k может принять nk абитуриентов. Не ограничивая общности можно
считать, что n1 + n2 + . . . + nm = n, рассматривая, если нужно, самый нежелательный «никакой»
университет с неограниченным приёмом. Каждый абитуриент имеет свой рейтинг университетов,
каждый университет — свой рейтинг абитуриентов.
Можно говорить об «устойчивом зачислении», если никакой абитуриент A, не зачисленный в уни-
верситет a, но предпочитающий его своему ВУЗу, не окажется предпочтительнее для университе-
та a, чем кто-то из его студентов.

611 / 907
5.5.3. Наибольшее паросочетание (1/9)
Ясно, что наибольшее паросочетание является максимальным, но не всякое максималь-
ное паросочетание является наибольшим.
Пример. На рисунке показаны две диаграм-
мы графа, в котором паросочетание {(b, d)}
является максимальным, но не является наи-
большим, а паросочетание {(a, d), (c, b)} яв-
ляется наибольшим и максимальным.

Простая цепь называется альтернирующей относительно паросочетания M , если она по-


переменно содержит рёбра из M и не из M .
Пример. На рисунке цепь h(a, d), (d, b), (b, c)i является альтернирующей относительно
обоих паросочетаний.
Альтернирующая цепь называется аугментальной относительно паросочетания M , если
её крайние рёбра не принадлежат M .
Пример. На рисунке альтернирующая цепь h(a, d), (d, b), (b, c)i является аугментальной
только относительно паросочетания {(b, d)}.
612 / 907
5.5.3. Наибольшее паросочетание (2/9)
Вершины, инцидентные рёбрам паросочетания M естественно назвать занятыми в этом
паросочетании, а прочие вершины можно назвать свободными.
Пример. На рисунке на предыдущем слайде вершины a и c свободны в паросочетании
{(b, d)}, а в паросочетании {(a, d), (c, b)} все вершины заняты.
Лемма. Если существует аугментальная цепь, то паросочетание не наибольшее.
Доказательство. Пусть M — паросочетание, а P — аугментальная цепь. Здесь P рассмат-
ривается как множество рёбер, последовательность не имеет значения. Тогда никакое
ребро в множестве M \ (P ∩ M ) не может быть смежно ни с каким ребром в цепи P , по-
скольку две концевые вершины свободны по определению, и они не инцидентны ника-
ким рёбрам из M , а все остальные вершины заняты по построению, и они не могут быть
инциденты ещё каким-то рёбрам из паросочетания M . Следовательно, множество рёбер
M 0 ←(M \ (P ∩ M )) ∪ (P \ (P ∩ M )) = (M ∪ P ) \ (P ∩ M )
является паросочетанием. Но так как оба концевых ребра из P не лежат в M , то |P \(P ∩
M )| = |P ∩M |+1 и |M 0 | = |M |+1, так что M не является наибольшим паросочетанием.
613 / 907
5.5.3. Наибольшее паросочетание (3/9)
Замечание. Паросочетание M 0 получается из паросочетания M изменением «ролей»
всех рёбер в аугментальной цепи: те рёбра, которые входили в паросочетание, исключа-
ем из паросочетания, а те, которые не входили, наоборот, включаем.
Пример. В условиях предыдущих приме-
ров паросочетание {(a, d), (c, b)} полу-
чается из паросочетания {(b, d)} измене-
нием ролей рёбер в аугментальной цепи
h(a, d), (d, b), (b, c)i.
Наибольшее паросочетание может быть неединственным.
Пример. В верхней диаграмме наиболь-
шее паросочетание {(a, e), (b, d), (c, f )}
единственно, а в нижней диаграмме су-
ществуют два наибольших паросочетания:
{(a, d), (c, b)} и {(a, b), (c, d)}.
614 / 907
5.5.3. Наибольшее паросочетание (4/9)
Теорема. Паросочетание является наибольшим тогда и только тогда, когда для него не
существует аугментальной цепи.
Доказательство.
[ Необходимость ] Если паросочетание наибольшее, то аугментальная цепь не существует
по лемме.
[ Достаточность ] Пусть в графе G задано некоторое паросочетание M , для которого нет
ни одной аугментальной цепи, а M ∗ — наибольшее паросочетание в этом графе. Рассмот-
рим остовный подграф G0 (V, E 0 ), в который включим рёбра симметрической разности
паросочетаний, E 0 ←(M ∪ M ∗ ) \ (M ∩ M ∗ ). В графе G0 степени всех вершин не больше
двух, поскольку любая вершина инцидентна не более S чем одному ребру из M и не более
∗ 0
чем одному ребру из M . Таким образом, граф G = Gi , где каждый подграф Gi либо
изолированная вершина, либо простая цепь, либо простой цикл. При этом как цепи, так и
циклы являются альтернирующими как для M , так и для M ∗ . Заметим, что изолированные
вершины появляются, если M ∩ M ∗ 6= ∅.

615 / 907
5.5.3. Наибольшее паросочетание (5/9)
Доказательство. (Продолжение) Пусть N (Gi ) — число рёбер из M , а N ∗ (Gi ) — число
рёбер из M ∗ , входящих в подграф Gi . Если Gi — изолированная вершина, то N (Gi ) =
N ∗ (Gi ) = 0. Если Gi — альтернирующая цепь, то она не может быть аугментальной для M
по условию теоремы, и не может быть аугментальной для M ∗ по лемме. Значит, концевые
рёбра Gi принадлежат различным альтернативам, стало быть их чётное число, причём
N (Gi ) = N ∗ (Gi ). Если Gi — альтернирующий цикл, то он является чётным (иначе этот
цикл не был бы альтернирующим), следовательно, опять имеем N (Gi ) = N ∗ (Gi ). Таким
образом,
X X
|M | = |M ∩ M ∗ | + N (Gi ) = |M ∩ M ∗ | + N ∗ (Gi ) = |M ∗ |
i i

и паросочетание M — наибольшее.
Замечание. Паросочетание называется полным, если оно не оставляет свободных вер-
шин. Полное паросочетание, если оно существует, является наибольшим.
616 / 907
5.5.3. Наибольшее паросочетание (6/9)

На основании доказанной теоремы можно построить алгоритм отыскания наибольшего


паросочетания. Для этого достаточно взять какое-то паросочетание, например, пустое, и
далее попытаться найти аугментальную цепь. Если аугментальная цепь найдена, то па-
росочетание перестраивается в паросочетание содержащее на одно ребро больше теку-
щего. Если же аугментальной цепи нет, то текущее паросочетание наибольшее.
Замечание. В наибольшем паросочетании не более p/2 рёбер, так что искать аугменталь-
ные цепи потребуется не более, чем p/2 раз. Однако, только простых цепей в графе мо-
жет быть до p(p − 1)/2, и каждая цепь может содержать до p − 1 рёбер, так что поиск
наибольшего паросочетания может оказаться трудоёмким.
Алгоритм отыскания наибольшего паросочетания оказывается наиболее простым в слу-
чае двудольных графов. Пусть имеется двудольный граф G(V1 , V2 , E), причём |V1 | = p1 ,
|V2 | = p2 , p1 6 p2 и для каждой вершины v задано множество смежных вершин Γ(v).

617 / 907
5.5.3. Наибольшее паросочетание (7/9)
Алгоритм основан на идее поиска в глубину, для отметки вершин используется массив x:
array [1..p1 ] of bool. Паросочетание представлено массивом M : array [1..p2 ] of 0..p1 , где
M [u] = 0, если вершина u свободна в паросочетании, и M [u] = v , если ребро (v, u)
входит в паросочетание.
Вход: двудольный граф G(V1 , V2 , E).
Выход: наибольшее паросочетание M : array [1..p2 ] of 0..p1 .
for u from 1 to p2 do
M [u] ← 0 //паросочетание пусто
end for
//запускаем поиск в глубину из всех вершин первой доли
for v from 1 to p1 do
for w from 1 to p1 do
x[w] ← false //перед поиском всё не отмечено
end for
Aug(v) //поиск в глубину от вершины v
end for 618 / 907
5.5.3. Наибольшее паросочетание (8/9)
Поиск в глубину выполняется рекурсивной функцией Aug, которая так названа потому,
что ищет аугментальную цепь и перестраивает паросочетание, если находит такую цепь.
Вход: вершина v первой доли.
Выход: true, если аугментальная цепь найдена и паросочетание перестроено, false в
противном случае.
if x[v] then
return false //вершина занята
end if
x[v] ← true //занимаем вершину
for u ∈ Γ(v) do
if M [u] = 0 ∨ Aug(M [u]) then
M [u] ← v //добавляем ребро в паросочетание
return true //успех
end if
end for
return false //неудача 619 / 907
5.5.3. Наибольшее паросочетание (9/9)
Пример. Дан двудольный граф G = (V1 , V2 , E). V1 = {1, 2, 3}, V2 = {1, 2, 3},
E = {(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (3, 1)}. Паросочетания в процессе работы функции
Aug перестраиваются следующим образом: {(1, 1)} → {(1, 1), (1, 2)} → {(2, 1), (1, 2)} →
{(2, 1), (1, 2), (1, 3)} → {(2, 2), (1, 3)} → {(2, 2), (1, 3), (3, 1)}.
Отступление. Задача отыскания наибольшего паросочетания имеет множество интерпретаций,
которым соответствуют математические модели и алгоритмы различной сложности. Например,
рассмотренный алгоритм можно применить к решению следующей задачи: имеется множество
работников, каждый из которых может выполнять некоторое подмножество множества работ. Как
трудоустроить наибольшее количество работников? Рёбрам в графе могут быть назначены веса,
и тогда возникает задача найти паросочетание наибольшего суммарного веса, известная как «за-
дача о назначениях». Вес ребра можно интерпретировать как эффективность работника при вы-
полнении данной работы, и тогда решение задачи о назначениях означает наиболее эффектив-
ное распределение работ. Для решения задачи о назначениях был предложен «венгерский алго-
ритм», один из первых и самых известных алгоритмов оптимизации. В графах общего вида мо-
гут быть циклы нечётной длины, что привносит дополнительные сложности в отыскание паросо-
четаний (алгоритм Эдмондса) и т. д. 620 / 907
5.6. Кратчайшие пути

Задача нахождения кратчайшего пути в графе имеет столько практических применений и


интерпретаций, что читатель, без сомнения, может сам легко привести множество приме-
ров. Здесь рассматриваются несколько классических алгоритмов, которые обязан знать
каждый программист.

621 / 907
5.6.1. Взвешенные орграфы (1/8)
Орграф G(V, E) называется взвешенным, если задана числовая функция w : V × V → R,
называемая весом или длиной дуги.
Замечание. Если дуга e = (u, v) ∈ E ведёт из узла u в узел v , то записи w(e) и w(u, v)
обе считаются допустимыми и равноправными.

Если M = hs, ti — путь из узла s в узел t, то длиной пути называется величина
→ X
W (M ) = W (hs, ti) = W (s, t) = w(e),
e∈M

а длиной кратчайшего пути называется величина

Ω(s, t) = →min W (s, t).


hs,ti⊂E ∗

Замечание. Поскольку неориентированные графы являются частным случаем орграфов,


приведённые определения, утверждения и алгоритмы распространяются также и на гра-
фы. Поэтому изложение ведётся исключительно в терминах орграфов.
622 / 907
5.6.1. Взвешенные орграфы (2/8)
Теорема. Для взвешенных орграфов выполняется неравенство Ω(s, v) 6 Ω(s, u)+Ω(u, v)
(неравенство треугольника).
Доказательство. Пусть существует кратчайший путь из s в v . Тогда его длина не превы-

шает длины любого другого пути hs, vi и, в частности, пути, состоящего из кратчайшего
пути из s в u и кратчайшего пути из u в v .
Представим взвешенный орграф матрицей длин дуг W : array [1..p, 1..p] of R,
где W [i, j] ← if i = j then 0 elseif (i, j) ∈ E then w(i, j) else +∞ end if.
Для хранения информации о последовательности узлов в кратчайших путях использует-
ся матрица предшествования Π: array [1..p, 1..p] of 0..p, где Π[i, j] ← 0, если из узла i в
узел j нет пути, и Π[i, j] ← k , если k — узел, достигаемый на кратчайшем пути из i непо-
средственно перед узлом j .
Для хранения информации о длинах кратчайших путей используется матрица длин пу-
тей T : array [1..p, 1..p] of R, где T [i, j] = +∞, если из узла i в узел j нет пути, и
T [i, j] = Ω(i, j) в противном случае.
623 / 907
5.6.1. Взвешенные орграфы (3/8)
Отступление. Матрица Π размера O(p2 ) хранит информацию обо всех (кратчайших) путях в гра-
фе. Заметим, что всего в графе O(p2 ) путей, состоящих из O(p) узлов. Таким образом, непосред-
ственное представление всех путей потребовало бы памяти объема O(p3 ). Экономия памяти при
использовании матрицы предшествования достигается за счёт интерпретации представления,
то есть динамического вычисления некоторой части информации вместо её хранения в памяти. В
данном случае любой конкретный путь hu, vi легко извлекается из матрицы с помощью следую-
щего алгоритма.
w ← v ; yield w //последний узел
while w 6= u do
w ← Π[u, w];
yield w //предыдущий узел
end while
Здесь узлы пути выдаются в обратном порядке. Полученную последовательность можно обратить,
если это потребуется, и получить прямой порядок узлов пути.

624 / 907
5.6.1. Взвешенные орграфы (4/8)
Если требуется хранить информацию только о путях из одного узла s или, в частности,
о единственном пути между двумя узлами s и t, то матрицу предшествования можно со-
кратить до вектора Π : array [1..p] of 0..p, а матрицу длин путей можно сократить до век-
тора T : array [1..p] of R. Это возможно, поскольку первый индекс s является фиксирован-
ным.
Во многих алгоритмах данного раздела используются две процедуры — инициализации и
релаксации. Здесь приводятся реализации для случая векторов предшествования и длин
путей, реализации для случая матриц совершенно аналогичны.
Процедура инициализации Init(s) строит начальное состояние вектора длин путей и век-
тора предшествования.
Вход: узел s
Выход: заполненные векторы T : array [1..p] of R длин путей и Π : array [1..p] of 0..p
самих путей.
for v from 1 to p do T [v] ← +∞; Π[v] ← 0 end for
T [s] ← 0
625 / 907
5.6.1. Взвешенные орграфы (5/8)
Процедура ослабления или релаксации — Relax(s, v, u) проверяет, возможно ли улучшить
известный путь из узла s в узел v , проведя новый путь через узел u, и обновляет пути,
если это возможно.
Вход: узлы s, v , u, матрица W : array [1..p, 1..p] of R длин дуг, вектор T : array [1..p] of R
длин путей, вектор Π : array [1..p] of 0..p самих путей.
Выход: обновлённые векторы T, Π.
if T [v] > T [u] + W [u, v] then
T [v] ← T [u] + W [u, v]; Π[v] ← u //новый путь короче
end if
Здесь параметр s не используется в теле процедуры релаксации, и оставлен для едино-
образия с общим случаем использования матриц.
Замечание. Для случая использования матриц, тело процедуры релаксации достаточно
модифицировать следующим образом.
if T [s, v] > T [s, u] + W [u, v] then
T [s, v] ← T [s, u] + W [u, v]; Π[s, v] ← u //новый путь короче
end if 626 / 907
5.6.1. Взвешенные орграфы (6/8)
Процедура релаксации обладает рядом очевидных, но важных свойств.
1. Верхняя граница (безопасность)
Для всех пар узлов T [s, v] > Ω[s, v], причем T [s, v] не изменяется после того, как
станет равным Ω[s, v].
2. Отсутствие пути
Если из узла s в t нет пути, то T [s, t] = Ω(s, t) = +∞.
3. Сходимость
→ →
Если hs, ui, (u, v) — кратчайший путь hs, vi, и до ослабления Relax(s, v, u) выполня-
ется равенство T [s, u] = Ω(s, u), то после ослабления T [s, v] = Ω(s, v).
4. Ослабление пути

Если M = hs, v1 , ..., vk , ti — кратчайший путь hs, ti, и ослабление производится в
порядке Relax(s, s, v1 ), Relax(s, v1 , v2 ), . . . , Relax(s, vk , t), то T [s, t] = Ω(s, t), и это
свойство выполняется вне зависимости от других операций ослабления.

627 / 907
5.6.1. Взвешенные орграфы (7/8)

Замечание. Если в G есть контур с отрицательным весом, то на этом контуре можно «на-
кручивать» сколь угодно короткий путь (вплоть до −∞). В этой ситуации решение за-
дачи о поиске кратчайшего пути, вообще говоря, не определено. Однако, в зависимо-
сти от конкретной прикладной задачи, данная ситуация может быть интерпретирована
по-разному, как полное отсутствие решения, или как решение, содержащее путь беско-
нечного отрицательного веса, или ещё как-то.
В любом случае, способность предсказуемо реагировать на контуры отрицательного веса
является важной характеристикой алгоритмов поиска кратчайших путей.
Совокупность всех путей от узла s к узлу t образует сеть, точнее говоря, нагруженную
(s, t)-сеть (определение сети см. п. 5.1.8). В сети может встретиться контур C . Если W (C) >
0, то C не входит ни в какой кратчайший путь. Если W (C) = 0, то C не влияет на крат-
чайшие пути. Если W (C) < 0, то C препятствует построению кратчайших путей.

628 / 907
5.6.1. Взвешенные орграфы (8/8)
В любом случае контуры можно исключить из сети путей и не ограничивая общности
рассматривать только пути без самопересечений. Обозначим P (s, t) — множество всех
путей без самопересечений из узла s в узел t.
Источник s и сток t являются общими узлами для всех (s, t)-путей. Если исключить из
рассмотрения узлы s и t, то пути в (s, t)-сети называются:
I непересекающимися, если они не имеют общих узлов;
I пересекающимися, если они имеют общие узлы, но не имеют общих дуг;
I слипающимися, если они имеют общие дуги (а значит, и узлы).
Совокупность кратчайших путей от узла s к другим узлам образует корневое дерево в
смысле п. 5.3.2. Действительно, никакой определённый кратчайший путь не содержит
контуров. Всякий узел достижим из корня по построению. Если в узел ведет несколько
кратчайших пересекающихся или слипающихся путей одинаковой длины, всегда можно
выбрать один из них.
629 / 907
5.6.2. Кратчайшие пути в бесконтурном орграфе (1/2)
Существует эффективный алгоритм определения расстояний от источника, который поз-
воляет найти в орграфе дерево кратчайших путей, растущее из заданного узла, даже ес-
ли длины дуг могут быть отрицательными, но известно, что орграф не содержит конту-
ров.
Замечание. Так как орграф не имеет контуров, можно применить лемму п. 5.5.1 и пере-
нумеровать узлы так, что номер начала каждой дуги меньше номера конца.
Вход: взвешенный орграф G(V, E), списки предшествующих узлов Γ−1 ,
матрица весов W : array [1..p, 1..p] of R, источник s = 1.
Выход: вектор T : array [1..p] of R длин кратчайших путей от источника,
вектор Π : array [1..p] of 0..p самих путей.
Init(s)
for v from 2 to p do
for u ∈ Γ−1 (v) do
Relax(1, v, u)
end for
end for 630 / 907
5.6.2. Кратчайшие пути в бесконтурном орграфе (2/2)
Обоснование. Докажем индукцией по v , что основной цикл имеет инвариант
∀ u ∈ 1..v (T [u] = Ω(1, u)) .
База: если v = 1, то T [1] = 0 = Ω(1, 1). Пусть ∀ u < v (T [u] = Ω(1, v)). В кратчайшем

пути h1, vi все промежуточные узлы имеют номера больше 1 и меньше v по построению
орграфа, в частности, узел u, предшествующий v на кратчайшем пути, будет выбран во
внутреннем цикле, для него по индукционному предположению T [u] = Ω(1, u) и, зна-
чит, T [v] = Ω(1, v). Оценка времени работы алгоритма складывается из времени топо-
логической сортировки, которая выполняется за время O(p + q), инициализации — O(p)
и итераций двойного цикла, которых будет ровно q , следовательно время будет O(q). Так
получаем O(p+q) + O(p) + O(q) = O(p+q).
Замечание. В алгоритме используется множество «предшествования»
Def
Γ−1 (v) = {u | v ∈ Γ(u)} ,
которое совпадает со списками смежности Γ(v) для графов и не пересекается с Γ(v) для
направленных орграфов. 631 / 907
5.6.3. Алгоритм Беллмана–Форда (1/3)
Алгоритм Беллмана–Форда также решает задачу о построении дерева кратчайших путей,
но на взвешенных орграфах общего вида.
Вход: взвешенный орграф G(V, E), источник s,
матрица весов W : array [1..p, 1..p] of real.
Выход: вектор T : array [1..p] of real длин кратчайших путей от источника,
вектор Π : array [1..p] of 0..p самих путей.
Init(s)
for i from 1 to p − 1 do
for (u, v) ∈ E do
Relax(s, v, u)
end for
end for
for (u, v) ∈ E do
if T [v] > T [u] + W [u, v] then stop end if //найден контур отрицательного веса
end for
632 / 907
5.6.3. Алгоритм Беллмана–Форда (2/3)
Обоснование. Очевидно, что кратчайший путь содержит не более чем p−1 дугу при усло-
вии отсутствия контуров отрицательного веса, доступных из источника. Соответственно,
если провести релаксацию всех дуг взвешенного орграфа p − 1 раз, то по свойствам ре-
лаксации (в особенности по свойствам ослабления пути и безопасности) результатом ока-
жется дерево кратчайших путей. Если после этого провести дополнительную релаксацию
всех дуг, и при этом дерево кратчайших путей изменится, то этот факт по свойству без-
опасности войдёт в противоречие с отсутствием контуров отрицательного веса, и можно
за счёт этого выдавать предупреждение об их наличии.
Пример. На рисунке показано состояние после инициализации и начало последователь-
ности релаксаций некоторого орграфа.

633 / 907
5.6.3. Алгоритм Беллмана–Форда (3/3)
Замечание. В предыдущем примере дуги релаксировались в лексикографическом по-
рядке: (s, u), (s, w), (u, v), (u, w), (w, u), причём этот порядок случайно выбран настоль-
ко удачным, что все релаксации оказались результативными, и дерево кратчайших путей
построено уже на первой итерации, а последующие итерации ничего не меняют.
На основании такого наблюдения иногда может иметь смысл добавить в алгоритм про-
верку того, что изменений дерева на прошедшей итерации внешнего цикла не произо-
шло, и заканчивать алгоритм «досрочно».
Оценка времени работы алгоритма тривиальна.
Время инициализации — O(p). Процедура ослабления вызывается (p − 1)q раз, всего
имеем O(p) + (p − 1)q · O(1) = O(p) + O((p − 1)q) = O(p) + O(pq) = O(pq). Очевидно,
это медленнее, чем оценка O(p + q) алгоритма поиска на бесконтурном орграфе. Однако
следует напомнить, что алгоритм Беллмана–Форда корректно работает на любых оргра-
фах.

634 / 907
5.6.4. Алгоритм Дейкстры (1/3)
Алгоритм Дейкстры, безусловно, самый знаменитый алгоритм поиска кратчайших путей.
Вход: взвешенный орграф G(V, E), источник s,
матрица весов W : array [1..p, 1..p] of real.
Выход: вектор T : array [1..p] of real длин кратчайших путей от источника,
вектор Π : array [1..p] of 0..p самих путей.
Init(s) //инициализация векторов T и Π
Q ← V //вначале контейнер Q содержит все узлы
while Q 6= ∅ do
u ← ExtractMin(Q) //извлечение узла с минимальным T [u]
if T [u] = +∞ then stop end if //можно прервать
for v ∈ Γ(u) do
if v ∈ Q then
Relax(s, v, u) //релаксация дуг, ведущих из u в Q
end if
end for
end while 635 / 907
5.6.4. Алгоритм Дейкстры (2/3)

Алгоритм Дейкстры работает итеративно. На каждой итерации алгоритм выполняет опе-


рацию ExtractMin, извлекая узел u с наименьшей оценкой T [u] из контейнера Q, и вы-
полняет релаксацию дуг, исходящих из узла u и ведущих в узлы, ещё остающиеся в кон-
тейнере Q. Начнём с некоторых наблюдений относительно работы алгоритма Дейкстры.
[1] Алгоритм в любом случае начинает и заканчивает работу. Действительно, по край-
ней мере одна итерация выполняется в любом случае, поскольку при инициализации
T [s] ← 0 < +∞, и не более p итераций выполняется всего, поскольку на каждой итера-
ции из контейнера Q извлекается один элемент.
[2] Алгоритм может завершить работу досрочно. Действительно, если T [u] = +∞, то
∀ x ∈ Q (T [x] = +∞), а это означает, что ни разу не проводилась релаксация дуг, на-
правленных в узлы Q из уже рассмотренных узлов, а это, в свою очередь, означает, что
оставшиеся узлы в Q недостижимы из узла s, возможная часть дерева кратчайшихпутей
ужепостроенаиработу алгоритма можнопрервать.

636 / 907
5.6.4. Алгоритм Дейкстры (3/3)
[3] Алгоритм в любом случае строит ориентированное дерево, представленное массивом
Π с корнем в узле s. Действительно, поскольку при первой релаксации дуги, входящей
в узел v , когда оценка ∞ меняется на конечную величину, к дереву добавляется лист, а
при последующих релаксациях, когда оценка уменьшается, происходит переназначение
предка для узла v , причём вновь назначаемый предок не является потомком узла v по
построению, так что контуров появиться не может.
[4] Алгоритм не меняет оценку узлов, извлеченных из контейнера Q. Действительно, ре-
лаксируются только дуги, направленные в узлы контейнера Q, следовательно, могут ме-
няться оценки только узлов из Q.
Пример. На рисунке показана работа алгоритма Дейкстры.

637 / 907
5.6.5. Область применимости алгоритма Дейкстры (1/8)
Отступление. В своей оригинальной статье Дейкстра употребил термин «длина», применитель-
но к дугам и путям, подразумевая, что длина не может быть отрицательной. Действительно, в по-
ложительно взвешенном орграфе алгоритм Дейкстры всегда применим и находит решение, по-
скольку контуры отрицательного веса невозможны. Поэтому в литературе область применимости
алгоритма Дейкстры не обсуждается, и рассматриваются только положительно взвешенные гра-
фы и орграфы. На самом деле класс орграфов, в которых применим алгоритм Дейкстры, суще-
ственно шире, что видно из предыдущего примера.
→ →
Назовём рекордом пути M = hu, wi (обозначение R(hu, wi)) максимальный вес началь-
→ Def
ного отрезка этого пути, R(hu, wi) = max W (u, v). Отдельно отметим, что v 6= u, то
v∈M −u
есть рекорд не может достигаться в начальном узле по определению. Из определения
следует, что  
→ → →
∀ hu, wi R(hu, wi) > W (hu, wi) > Ω(u, w) .

638 / 907
5.6.5. Область применимости алгоритма Дейкстры (2/8)
Рассмотрим сеть путей P (s, t) из узла s в узел t. Заметим, что для любого промежуточного
узла v в сети P (s, t) определены сети P (s, v) и P (v, t), причём они являются сегментами
исходной сети:

∀ v ∈ hs, ti (P (s, v) ⊂ P (s, t) & P (v, t) ⊂ P (s, t)) .
Далее можно взять промежуточный узел в одном из сегментов и получить ещё два сег-
мента, причём один из них уже не будет инцидентен исходным узлам s и t. Таким обра-
зом можно декомпозировать сеть на сегменты вплоть до отдельных дуг.
Пути в сегментах могут не пересекаться, а могут пересекаться и даже слипаться. Если на-
чальный узел некоторого сегмента имеет только одну исходящую дугу, то такой сегмент
называется безальтернативным. Все пути безальтернативного сегмента слиплись в пер-
вой дуге. Если из начального узла исходит более одной дуги, то сегмент называется аль-
тернативным, или развилкой.
Замечание. При поиске кратчайших путей в сегменте безальтернативные участки путей
можно пропускать, и начинать поиск с первой развилки.
639 / 907
5.6.5. Область применимости алгоритма Дейкстры (3/8)
Теорема. Алгоритм Дейкстры на взвешенном орграфе без контуров отрицательного веса
строит дерево кратчайших путей с корнем в узле s тогда и только тогда, когда для
каждого узла t ∈ G − s, достижимого из узла s, в сети P (s, t) для каждой развилки P (w, t)

рекорд кратчайшего пути hw, ti строго меньше, чем рекорд любого не кратчайшего пути

hw, ti.
Доказательство. Заметим, что когда узел u извлечён из контейнера, все узлы на пути

hs, ui уже были извлечены ранее, и поэтому оценка извлечённого узла не превосходит

рекорда найденного пути к нему: T [u] 6 R(hs, ui).
[ Достаточность ] Покажем по индукции, что на каждой итерации при извлечении узла u

путь M0 = hs, ui, определяемый значением Π[u], кратчайший, то есть

W (hs, ui) = Ω(s, u).
Тем самым покажем, что на каждой итерации извлечённые узлы и пути к ним образуют
частичное дерево кратчайших путей из узла s, и по завершении работы алгоритма по-
строено дерево кратчайших путей из узла s ко всем достижимым узлам.
640 / 907
5.6.5. Область применимости алгоритма Дейкстры (4/8)
Доказательство. (Продолжение) База: на первой итерации всегда выбирается узел s, ко-
торый образует корень дерева. Длина кратчайшего пути Ω(s, s) = 0, поскольку конту-
ры запрещены. Индукционное предположение: пусть на предыдущих итерациях постро-
ено частичное дерево кратчайших путей и пусть из контейнера Q выбран узел u с оцен-
кой T [u] < ∞ и узел u получил свою оценку в результате релаксации дуги (v, u). Если

путь hs, . . . , v, ui не единственный, то в сети P (s, u) рассмотрим первую (считая от узла

s) развилку P (w, u) и возможные альтернативные пути: M0 = hw, . . . , v, ui, M1 , в кото-
ром все узлы, кроме последнего, уже исключены из Q на предыдущих итерациях, M2 , в
котором есть узлы, принадлежащие Q.

641 / 907
5.6.5. Область применимости алгоритма Дейкстры (5/8)

Доказательство. (Продолжение) В случае пути M1 дуги (v, u) и (z, u) уже участвовали в


релаксации, и в построенном дереве сохранена та, которая даёт меньшую оценку, по-
этому путь M1 не оказывает влияния на построенное дерево и его можно не учитывать.
→ →
Далее от противного. Пусть W (hs, . . . , w, M2 i) < W (hs, . . . , w, M0 i). По условию тео-
ремы это означает, что R(M2 ) < R(M0 ). Рассмотрим те узлы, на которых достигают-
ся рекорды этих путей. Пусть u0 ∈ M0 — место достижения рекорда пути M0 . Тогда
T [u0 ] = T [w]+R(M0 ) (узел u0 может быть узлом u, v или любым промежуточным узлом).
Рассмотрим ту итерацию, когда был выбран узел u0 , и пусть при этом u2 — первый ещё
не извлечённый узел на пути M2 (узел u2 может быть узлом y , x или любым промежуточ-
ным узлом). Тогда T [u0 ]−T [w] = R(M0 ) > R(M2 ) > T [u2 ]−T [w], то есть T [u0 ] > T [u2 ],
что противоречит тому, что узел u0 извлечён раньше узла u2 . Доказательство очевидным
образом распространяется на все последующие развилки.

642 / 907
5.6.5. Область применимости алгоритма Дейкстры (6/8)

Доказательство. (продолжение)
[ Необходимость ] Нужно показать, что если алгоритм построил дерево кратчайших пу-
тей, то в любой развилке рекорд кратчайшего пути меньше рекорда не кратчайшего пу-
ти, или, в контрапозитивной форме, если существует развилка, в которой рекорд крат-
чайшего пути больше либо равен рекорду не кратчайшего пути, то алгоритм «ошибётся»
и построенное дерево не будет деревом кратчайших путей.
Рассмотрим сначала случай, когда рекорд кратчайшего пути строго больше рекорда не
кратчайшего пути.
Пусть алгоритм Дейкстры построил дерево, и пусть сущеcтвует узел u, такой, что в него
0 0 0 0
ведут два пути: путь M0 — кратчайший, и M2 — не кратчайший, W (M0 ) < W (M2 ), и
P (w, u) — первая развилка этих путей, M0 и M2 — продолжения путей после развилки
соответственно, причём R(M0 ) > R(M2 ) (рисунок на следующем слайде).

643 / 907
5.6.5. Область применимости алгоритма Дейкстры (7/8)
Доказательство. (Продолжение)

Рассмотрим узел v ∈ M0 , в котором достигается рекорд, то есть T [v] = R(M0 ). Тогда


∀ x ∈ M2 (T [x] 6 R(w, x) < R(M0 ) = T [v]), и алгоритм выберет все узлы пути M2 ,

включая узел u, раньше, чем узел v , а значит какие-то дуги на пути hv, ui не будут участ-
вовать в релаксации и кратчайший путь не будет найден.
Рассмотрим теперь случай, когда рекорд кратчайшего пути равен рекорду не кратчайшего
пути. В такой ситуации корректность работы алгоритма Дейкстры зависит от воли случая,
то есть от того, какой из узлов с равными значениями оценки T будет выбран.
644 / 907
5.6.5. Область применимости алгоритма Дейкстры (8/8)
Доказательство. (Окончание) Например, в орграфе на рисунке ниже с начальным узлом
s на первом шаге оба узла u и v получают одинаковые оценки T [u] = T [v] = 1. Если на
втором шаге будет выбран узел v , то произойдет релаксация дуги (v, u) и будет найдет

кратчайший путь hs, v, ui. Если же на втором шаге будет выбран узел u, то релаксации
дуги (v, u) не произойдет и кратчайший путь не будет найден.

Мы считаем, что в тех случаях, когда мы не можем быть уверены в корректной работе
алгоритма, следует считать работу алгоритма некорректной.

645 / 907
5.6.6. Анализ алгоритма Дейкстры (1/3)
Пример. На рисунках приведены примеры работы алгоритма на орграфах с положитель-
ными и отрицательными весами дуг. На первом рисунке рекорд кратчайшего пути s, u, t
равен −4, в то время как рекорд пути s, v, t равен 0, и алгоритм работает правильно.

На втором рисунке рекорд кратчайшего пути s, u, t равен +1, но рекорд пути s, v, t равен
0, и алгоритм работает неправильно.

646 / 907
5.6.6. Анализ алгоритма Дейкстры (2/3)

Следствие. Алгоритм Дейкстры корректен на классе неотрицательно взвешенных оргра-


фов.
Доказательство. Неотрицательно взвешенный орграф очевидно не содержит контуров
отрицательного веса. Далее заметим, что из неотрицательности весов следует, что рекорд
любого пути достигается в его конечном узле, поэтому рекорд кратчайшего пути меньше
рекордов альтернативных или равен им в конечном узле.
Поскольку алгоритм Дейкстры не имеет в себе никакой разумной реакции на контуры
отрицательного веса, а анализ орграфов на выполнение необходимого и достаточного
условия обычно сложен, алгоритм повсеместно применяется только для неотрицательно
взвешенных орграфов, что покрывает подавляющее большинство прикладных задач по-
иска кратчайшего пути.

647 / 907
5.6.6. Анализ алгоритма Дейкстры (3/3)

Замечание. Алгоритмом Дейкстры можно найти кратчайший путь между двумя узлами.
Для этого достаточно после операции ExtractMin(Q) завершить работу, если извлечен-
ный узел u является целевым, поскольку T [u] для него больше не изменится.
Время работы алгоритма Дейкстры зависит от реализации контейнера Q и вектора T
с операциями построения Q ← V , уменьшения T [v] в процедуре релаксации и вызова
ExtractMin(Q). При работе алгоритма каждая дуга ослабляется не более чем один раз,
поскольку начальные узлы дуг u не повторяются, что в сумме произойдёт не более чем
q раз. Пусть Q — массив, тогда одна вставка выполняется за O(1), а все вставки — за
O(p), уменьшения значений T займут в сумме qO(1) = O(q), а pO(p) = O(p2 ). Итого
имеем O(p) + O(q) + O(p2 ) = O(p2 + q) = O(p2 ). Пусть ExtractMin и уменьшение T
выполняются за O(log p), а присваивание Q ← V — за O(p). Тогда
O(p) + pO(log p) + qO(log p) = O((p + q) log p)), что будет меньше O(p2 ),
если q < p2 / log p. Такими свойствами обладают неубывающие пирамиды.

648 / 907
5.6.7. Алгоритм Флойда–Уоршалла (1/3)
В отличие от предыдущих алгоритмов, алгоритм Флойда–Уоршалла решает задачу о по-
иске не дерева кратчайших путей, а всех кратчайших путей в оргафе, и делает это за вре-
мя O(p3 ).
Вход: матрица W [1..p, 1..p] длин дуг.
Выход: матрица T [1..p, 1..p] длин путей и матрица Π[1..p, 1..p] самих путей.
//инициализация
for i from 1 to p do
for j from 1 to p do
T [i, j] ← W [i, j]
if W [i, j] = ∞ then
Π[i, j] ← 0 //нет дуги из i в j
else
Π[i, j] ← j //есть дуга из i в j
end if
end for
end for 649 / 907
5.6.7. Алгоритм Флойда–Уоршалла (2/3)
for i from 1 to p do
for j from 1 to p do
for k from 1 to p do
if i 6= j & T [j, i] 6= ∞ & i 6= k & T [i, k] 6= ∞ &
& T [j, k] > T [j, i] + T [i, k] then
T [j, k] ← T [j, i] + T [i, k] //запомнить длину нового пути
Π[j, k] ← Π[j, i] //и сам путь
end if
end for
end for
for j from 1 to p do
if T [j, j] < 0 then
stop //узел j входит в цикл отрицательной длины
end if
end for
end for 650 / 907
5.6.7. Алгоритм Флойда–Уоршалла (3/3)
Обоснование. Алгоритм Флойда–Уоршалла является обобщением алгоритма Уоршалла
(п. 4.4.2). Покажем по индукции, что после выполнения i-го шага основного цикла эле-
менты матриц T [j, k] и Π[j, k] содержат, соответственно, длину кратчайшего пути и пер-
вый узел на кратчайшем пути из узла j в узел k , проходящем через промежуточные уз-
лы из диапазона 1..i. База: i = 0, то есть до начала цикла элементы матриц T и Π содер-
жат информацию о кратчайших путях (дугах!), не проходящих ни через какие промежу-
точные узлы. Пусть теперь перед началом выполнения тела цикла на i-м шаге T [j, k] со-
держит длину кратчайшего пути от j к k , а Π[j, k] содержит первый узел (если таковой
есть) на кратчайшем пути из узла j в узел k . В таком случае, если в результате добавле-
ния узла i к диапазону промежуточных узлов находится более короткий путь (в частно-
сти, если это первый найденный путь), то он записывается. Таким образом, после окон-
чания цикла, когда i = p, матрицы содержат кратчайшие пути, проходящие через про-
межуточные узлы 1..p, то есть искомые кратчайшие пути. Алгоритм не всегда выдаёт ре-
шение, поскольку оно не всегда определено. Дополнительный цикл по j служит для пре-
кращения работы в случае обнаружения контура с отрицательным весом.
651 / 907
5.6.8. Алгоритмы с предобработкой (1/6)

Как уже было сказано, алгоритм Дейкстры обычно применяется только к неотрицательно
взвешенным орграфам.
Однако, в некоторых случаях можно провести предобработку, то есть предварительное
преобразование данных задачи в более выгодный для решения вид.
В данном случае предобработка означает преобразование исходного орграфа к неотри-
цательно взвешенному орграфу, применение алгоритма Дейкстры и поиск кратчайшего
пути, а потом преобразование найденного пути в путь в исходном орграфе.
Отступление. Предобработка имеет смысл, если предстоит решать не разовую, а массовую задачу.
Скажем, искать кратчайшие пути на графе, представляющем карту автомобильных дорог. Такая
задача в навигационных приложениях должна решаться многие тысячи раз в день, поэтому за-
трат времени на предобработку не жаль, если предобработка позволяет ускорить выполнение ос-
новной задачи поиска кратчайшего пути.

652 / 907
5.6.8. Алгоритмы с предобработкой (2/6)
Одним из наиболее показательных алгоритмов с предобработкой является алгоритм
Джонсона, предложенный в 1977 году. В этом алгоритме поиска кратчайших путей между
всеми узлами орграфа используется предобработка типа «reweighting» («перевзвешива-
ние») — введение функции потенциала. Каждому узлу v присваивается потенциал h(v).
Веса дуг переопределяются. Для каждой дуги e = (u, v) новый вес определяется через
старый вес и потенциалы концов: w0 (e) ← w(e) + h(u) − h(v). Потенциалы определяют-
ся так, чтобы новые веса были неотрицательными. Можно показать, что такое преобра-

зование сохраняет отношение порядка весов путей hu, t1 , t2 , . . . , , vi из узла u в узел v :

W 0 (hu, vi) = w((u, p1 )) + h(u) − h(p1 ) + w((p1 , p2 )) + h(p1 ) − h(p2 ) + ...


+ w((pn , v)) + h(pn ) − h(v) =
= W (hu, vi) + h(u) − h(v) = W (hu, vi) + c
Поскольку прибавление константы c сохраняет отношение порядка весов путей, по ре-
зультатам работы алгоритма Дейкстры очевидным образом можно найти кратчайшие пу-
ти в исходном орграфе. 653 / 907
5.6.8. Алгоритмы с предобработкой (3/6)
Осталось приписать потенциалы узлам так, чтобы новые веса дуг стали неотрицательны-
ми. В своем алгоритме Джонсон предлагает следующий метод поиска требуемых потен-
циалов.
1. Фиктивный узел s дугами нулевого веса присоединить к реальным узлам орграфа.
2. Воспользоваться алгоритмом Беллмана–Форда для поиска кратчайших путей из уз-
ла s во все реальные узлы орграфа. Нетрудно понять, что для неотрицательно взве-
шенного орграфа веса всех таких путей будут нулевыми, в то время как для других
орграфов это, вообще говоря, не так.
3. Взять Ω(s, v) в качестве h(v), то есть искомых потенциалов, после чего удалить фик-
тивный узел и дуги.
Замечание. По наследству от алгоритма Беллмана–Форда, метод работоспособен для
всех взвешенных орграфов без циклов отрицательного веса и выдаёт предупреждение
в случае наличия таких циклов.
654 / 907
5.6.8. Алгоритмы с предобработкой(4/6)
Обоснование. Предложенный способ построения потенциальной функции корректен.
Действительно, если в неравенство треугольника Ω(s, v) 6 Ω(s, u)+w((u, v)) подставить
весовую функцию Джонсона h(v) = Ω(s, v), h(u) = Ω(s, u), получим
h(v) 6 h(u) + w((u, v)), и тогда w0 ((u, v)) = w((u, v)) + h(u) − h(v) > 0.
Пример. На следующем рисунке приведены диаграммы (слева направо): исходного ор-
графа с отрицательными дугами, дополнительного построения для предобработки, пере-

взвешенного орграфа. Кратчайшие пути hu, ti и дополнительные построения алгоритма
Джонсона выделены красным цветом.

655 / 907
5.6.8. Алгоритмы с предобработкой(5/6)
Замечание. Из орграфа с отрицательными дугами получитcя неотрицательно взвешен-
ный орграф, если просто увеличить веса всех дуг на величину c ← − mine∈E w(e). Однако
при таком тривиальном перевзвешивании алгоритм Дейкстры может дать неверный от-
вет. Нетрудно показать, что при тривиальном перевзвешивании алгоритм Дейкстры ра-

ботает правильно, только если для любой пары путей M1 ←hs, v1 , . . . , vm , ti и

M2 ←hs, u1 , . . . , un , ti, W (M1 ) 6 W (M2 ) оказывается, что если W (M1 ) < W (M2 ),
то W (M2 ) − W (M1 ) > c(m − n), а если W (M1 ) = W (M2 ), то m = n.
Пример. Слева приведен пример неудачного, а справа — удачного перевзвешивания.
Кратчайшие пути выделены красным цветом.

656 / 907
5.6.8. Алгоритмы с предобработкой (6/6)
Рассмотрим оценки трудоёмкости. Пусть алгоритм используется для поиска одного де-
рева кратчайших путей. Предварительная обработка алгоритмом Беллмана–Форда —
O(pq), алгоритм Дейкстры — O(p log p + q), обратное преобразование дерева — O(p). В
сумме имеем O(pq) + O(p log p + q) + O(p) = O(pq), что, очевидно, не дает никакого
выигрыша в сравнении с алгоритмом Беллмана–Форда.
Но если применить алгоритм для поиска p деревьев кратчайших путей, предварительную
обработку потребуется провести только один раз. В этом и есть главная идея предобра-
ботки!
1. Провести единственную предобработку.
2. Найти p деревьев кратчайших путей алгоритмом Дейкстры.
3. Сделать p обратных преобразований, выдать ответ.
Время работы алгоритма Джонсона (при «сложной» реализации алгоритма Дейкстры) —
O(pq)+O(p·(p log p+q))+pO(p) = O(p2 log p+pq), что получилось лучше, чем алгоритм
Флойда–Уоршалла (O(p3 )), если q асимптотически меньше, чем p2 .
657 / 907
5.7. Циклы

После рассмотрения кратчайших путей, которые не содержат циклов, естественно перей-


ти к рассмотрению графов с циклами.

658 / 907
5.7.1. Циклы и разрезы (1/5)
Цикл может входить только в одну компоненту связности графа G(V, E), а в несвязном
графе понятие разреза является вырожденным, поэтому без ограничения общности в
этом разделе граф G(V, E) считается связным.
Цикл не может содержать одно ребро более одного раза, поэтому в этом разделе цикл
рассматривается как множество рёбер. В связи с этим можно дать эквивалентное опре-
деление простого цикла: простым называется цикл, никакое собственное подмножество
которого циклом не является.
Напомним, что разрезом связного графа называется множество рёбер, удаление кото-
рых делает граф несвязным. Заметим, что любое разбиение множества вершин V на
два непустых подмножества, V1 V2 , V1 ∩ V2 = ∅, V1 ∪ V2 = V , определяет разрез
S ← {(v1 , v2 ) ∈ E | v1 ∈ V1 & v2 ∈ V2 }, поскольку правильные подграфы G1 и G2 , опре-
деляемые подмножествами V1 и V2 , являются, очевидно, компонентами связности гра-
фа G − S . Заметим далее, что множества V1 и V2 определяют друг друга: V1 = V \ V2 ,
V2 = V \ V1 , поэтому
 достаточно
 задать только одно из них. Естественно ввести обозна-
Def
чение ∀ U ⊂ V U = V \U .
659 / 907
5.7.1. Циклы и разрезы (2/5)
Введём обозначение E(V1 , V2 ) для множества рёбер, соединяющих два дизъюнктных
непустых подмножества вершин графа G(V, E):
Def
E(V1 , V2 ) = {(v1 , v2 ) ∈ E | v1 ∈ V1 & v2 ∈ V2 } ,

где V1 ⊂ V , V2 ⊂ V , V1 6= ∅, V2 6= ∅, V1 ∩ V2 = ∅. Заметим, что E(V1 , V2 ) = E(V2 , V1 ).


Разрез связного графа G(V, E), определяемый непустым подмножеством U множества
вершин V , называется правильным разрезом и обозначается S(U ):
Def 
S(U ) = (v1 , v2 ) ∈ E | v1 ∈ U & v2 ∈ U = E(U, U ).

Правильный разрез не содержит «лишних» рёбер, то есть таких рёбер, включение или
исключение которых не меняет компонент связности, получаемых при удалении рёбер
разреза. Ясно, что всякий разрез содержит некоторый правильный разрез. В этом разделе
разрез считается правильным, если не оговорено обратное.
660 / 907
5.7.1. Циклы и разрезы (3/5)
Лемма. Симметрическая разность двух различных правильных разрезов, определяемых
множествами V1 и V2 , является правильным разрезом, определяемым симметрической раз-
ностью множеств V1 и V2 :
V1 6= V2 =⇒ S(V1 ) M S(V2 ) = S(V1 M V2 ).
Доказательство. «Пересечение» правильных разрезов S(V1 ) и S(V2 ) образует разбиение
множества вершин V на четыре подмножества:
V11 ← V1 ∩ V2 , V10 ← V1 ∩ V2 , V01 ← V1 ∩ V2 , V00 ← V1 ∩ V2 .
В этих обозначениях
S(V1 ) = E(V11 , V01 ) ∪ E(V10 , V01 ) ∪ E(V11 , V00 ) ∪ E(V10 , V00 ),
S(V2 ) = E(V11 , V10 ) ∪ E(V01 , V10 ) ∪ E(V11 , V00 ) ∪ E(V01 , V00 ),
откуда, учитывая, что E(V10 , V01 ) = E(V01 , V10 ), имеем
S(V1 ) M S(V2 ) = E(V11 , V01 ) ∪ E(V10 , V00 ) ∪ E(V11 , V10 ) ∪ E(V01 , V00 ).
Заметим, что
V1 M V2 = (V1 ∩ V2 ) ∪ (V1 ∩ V2 ) = V10 ∪ V01 , V1 M V2 = (V1 ∩ V2 ) ∪ (V1 ∩ V2 ) = V11 ∪661
V00 .
/ 907
5.7.1. Циклы и разрезы (4/5)
Доказательство. (Продолжение) Поэтому

S(V1 M V2 ) = E(V10 , V11 ) ∪ E(V10 , V00 ) ∪ E(V01 , V11 ) ∪ E(V01 , V00 ),

и, учитывая, что E(V10 , V11 ) = E(V11 , V10 ) и E(V01 , V11 ) = E(V11 , V01 ), окончательно
имеем S(V1 ) M S(V2 ) = S(V1 M V2 ).

Простым разрезом называется минимальный разрез, то есть такой разрез, никакое соб-
ственное подмножество которого разрезом не является.
662 / 907
5.7.1. Циклы и разрезы (5/5)
Замечание. Всякий простой разрез является правильным, но не всякий правильный раз-
рез является простым.
Пример. Рассмотрим граф G, представленный на рисунке а. Разрез S = {(v1 , v2 ), (v1 , v3 ),
(v1 , v4 ), (v4 , v5 ), (v2 , v3 )} графа G не является правильным разрезом (рисунок б). Исключив
ребро (v2 , v3 ), получим S1 = {(v1 , v2 ), (v1 , v3 ), (v1 , v4 ), (v5 , v4 )} — правильный разрез
графа G (рисунок в), причём S1 не является простым разрезом. Правильный разрез S1
содержит в себе два простых разреза S11 = {(v1 , v2 ), (v1 , v3 ), (v1 , v4 )} и S12 = {(v5 , v4 )},
(рисунки г и д).

Замечание. Чем больше в графе циклов, тем труднее его разре́зать. В дереве, напротив,
каждое ребро само по себе является простым разрезом.
663 / 907
5.7.2. Фундаментальные системы циклов и разрезов (1/7)
Пусть T (V, ET ) — некоторый остов графа G(V, E). Кодеревом T ∗ (V, ET∗ ) остова T на-
зывается остовный подграф, такой, что ET∗ = E \ ET . (Кодерево не является деревом!)
Рёбра кодерева являются хордами остова. По теореме п 9.1.2 об основных свойствах де-
ревьев каждая хорда e ∈ T ∗ остова T порождает ровно один простой цикл, обозначим
Def
его Ze . Таким образом, имеем систему простых циклов Z = {Ze }e∈T ∗ , определяемых
выбранным остовом T , которая называется фундаментальной системой циклов. Циклы
фундаментальной системы называются фундаментальными, а количество циклов в (дан-
ной) фундаментальной системе называется циклическим рангом (или цикломатическим
числом) графа G и обозначается m(G).
Теорема. Любой цикл в связном графе G(V, E) можно представить как симметрическую
разность нескольких фундаментальных циклов из системы Z , определяемой произволь-
ным остовом T .
Доказательство. Если в графе G нет циклов, то это дерево, G = T , T ∗ = ∅, Z = ∅, и
утверждение теоремы тривиально. Рассмотрим цикл Z в графе G. Этот цикл содержит
хорды e1 , . . . , en ∈ T ∗ . Такие хорды в Z обязательно есть, в противном случае Z ⊂ T ,
что невозможно, поскольку T — дерево. 664 / 907
5.7.2. Фундаментальные системы циклов и разрезов (2/7)
Доказательство. (продолжение) Докажем индукцией по n, что Z = Ze1 M · · · M Zen . База:
пусть n = 1, тогда e1 6∈ T , Z − e1 ⊂ T и Z = Ze1 , так как если бы Z 6= Ze1 , то концы
e1 были бы соединены в T двумя цепями, что невозможно в дереве. Пусть (индукцион-
ное предположение) Z = Ze1 M . . . M Zem для всех циклов Z с числом хорд m < n.
Рассмотрим цикл Z с n хордами e1 , . . . , en ∈ T ∗ и цикл Zen .
Имеем Z 0 ← Z M Zen = (Z − en ) ∪ (Zen − en ) —
тоже цикл (возможно, не простой). Но Z 0 содержит
только n − 1 хорд e1 , . . . , en−1 . По индукционному
предположению Z 0 = Ze1 M . . . M Zen−1 . Имеем
Z = Z 0 M Zen = Ze1 M · · · M Zen−1 M Zen =
Ze1 M · · · M Zen−1 M Zen .

Следствие. Количество циклов в фундаментальной системе равно числу хорд остова:


m(G) = q − p + 1.
Доказательство. m(G) = q(T ∗ ) = q(G) − q(T ) = q − (p − 1) = q − p + 1.
665 / 907
5.7.2. Фундаментальные системы циклов и разрезов (3/7)
Пример. На рисунке представлена си-
стема фундаментальных циклов, опре-
деляемых некоторым остовом. Рёбра
остова выделены жирными линиями,
а соответствующие фундаментальные
циклы Z1 = {(v1 , v2 ), (v2 , v3 ), (v3 , v1 )},
Z2 = {(v2 , v5 ), (v5 , v3 ), (v3 , v2 )},
Z3 = {(v2 , v5 ), (v5 , v6 ), (v6 , v3 ), (v3 , v2 )},
Z4 = {(v2 , v4 ), (v4 , v5 ), (v5 , v2 )}, —
пунктирными контурами.
Пример. На рисунке нет фундаментальных циклов, не имеющих общих вершин. Симмет-
рическая разность трёх фундаментальных циклов, Z1 M Z3 M Z4 , даёт цикл
(v1 , v2 ), (v2 , v4 ), (v4 , v5 ), (v5 , v6 ), (v6 , v3 ), (v3 , v1 ) — «внешнюю границу» графа. Симметри-
ческая разность всех фундаментальных циклов Z1 M Z2 M Z3 M Z4 даёт эйлеров цикл
данного графа (см. п. 5.7.2).
666 / 907
5.7.2. Фундаментальные системы циклов и разрезов (4/7)
Замечание. Совокупность всевозможных симметрических разностей фундаментальных
циклов содержит множеств больше, чем нужно: в неё входят не только все циклы графа G,
но и некоторые объединения таких циклов. В частности, симметрическая разность двух
(фундаментальных) циклов, которые не имеют общих вершин, снова даёт два этих же
цикла. Иногда множество объектов, определяемое всевозможными циклическими раз-
ностями фундаментальных циклов, называют множеством циклических векторов.
Пусть опять T (V, ET ) — некоторый остов графа G(V, E). Рассмотрим ребро остова
e ∈ ET и определим разрез Se следующим образом. Так как ребро e — разрез дерева T ,
множество вершин V разбивается на два непустых подмножества, V1 и V2 , так что
V1 ⊂ V, V1 6= ∅, V2 ⊂ V, V2 6= ∅, V1 ∪ V2 = V, V1 ∩ V2 = ∅.
Включим в разрез Se ребро e и все хорды остова T , соединяющие вершины V1 с верши-
нами V2 :
Def
Se = e + {(v1 , v2 ) ∈ T ∗ | v1 ∈ V1 & v2 ∈ V2 } .
Тогда Se — это простой разрез.
667 / 907
5.7.2. Фундаментальные системы циклов и разрезов (5/7)
Def
Система разрезов S = {Se }e∈T называется фундаментальной системой разрезов. Разрезы
фундаментальной системы называются фундаментальными, а количество разрезов в (дан-
ной) фундаментальной системе называется коциклическим рангом (или коцикломатиче-
ским числом) графа G и обозначается m∗ (G).
Замечание. Между циклами и правильными разрезами существует определённая двой-
ственность, поэтому правильные разрезы иногда называют коциклами. Отсюда название
«фундаментальная система коциклов» и «коциклический ранг».
Теорема. Любой правильный разрез в связном графе G(V, E) можно представить как сим-
метрическую разность некоторых фундаментальных разрезов из системы S , определяе-
мой произвольным остовом T .
Доказательство. Действительно, любой разрез S содержит хотя бы одно ребро из остова
T , так как T — связный и содержит все вершины G. Пусть S — правильный разрез, кото-
рый содержит рёбра e1 , . . . , en ∈ T . Докажем индукцией по n, что S = Se1 M . . . M Sen .
База: пусть n = 1, тогда T − e1 = T1 ∪ T2 , где T1 и T2 — компоненты, получаемые из осто-
ва T удалением ребра e1 . Имеем Se1 ⊂ S , иначе S не был бы разрезом, и S ⊂ Se1 , иначе
S не был бы правильным разрезом. Таким образом, S = Se1 . 668 / 907
5.7.2. Фундаментальные системы циклов и разрезов (6/7)
Доказательство. (продолжение) Пусть теперь S = Se1 M . . . M Sem для всех правильных
разрезов S с числом рёбер остова m < n. Рассмотрим правильный разрез S с n рёбра-
ми e1 , . . . , en ∈ T . Положим S 0 ← S M Sen , то есть исключим из разреза S все рёбра фун-
даментального разреза Sen . Разрез S 0 — правильный по лемме п. 5.7.1 и содержит рёбра
e1 , . . . , en−1 , а значит, по индукционному предположению S 0 = Se1 M . . . M Sen−1 . Имеем
S = S 0 M Sen , и окончательно S = Se1 M . . . M Sen−1 M Sen .
Следствие. Количество разрезов в фундаментальной системе равно числу рёбер остова:
m∗ (G) = p − 1.
Доказательство. По определению.
Пример. На рисунке представлены все пять фундаментальных разрезов, соответствую-
щих графу и его остову, представленным на предыдущем рисунке.

669 / 907
5.7.2. Фундаментальные системы циклов и разрезов (7/7)
Замечание. Совокупность всевозможных симметрических разностей фундаментальных
разрезов содержит множеств меньше, чем может понадобиться: в неё входят только пра-
вильные разрезы; разрезы, не являющиеся правильными, в ней не содержатся. В част-
ности, разрез может содержать циклы, в правильном разрезе или симметрической раз-
ности правильных разрезов циклов быть не может, поэтому разрезов с циклами нам не
получить с помощью фундаментальной системы разрезов.
Пример. Обратимся ещё раз к приве-
дённому на рисунке графу. Рассмотрим
разрез S = {(v1 , v2 ), (v2 , v3 ), (v3 , v5 ),
(v5 , v6 ), (v6 , v3 ), (v3 , v1 )}. Этот разрез
графа не является правильным и его
нельзя представить в виде симметриче-
ской разности фундаментальных разре-
зов.
670 / 907
5.7.3. Эйлеровы циклы (1/7)
Здесь приведено исчерпывающее решение задачи о Кёнигсбергских мостах (см. п. 5.1.1),
приведшей к исторически первой успешной попытке развития теории графов как само-
стоятельного предмета.
Если связный граф имеет цикл (не обязательно простой), содержащий все рёбра графа,
то такой цикл называется эйлеровым циклом, а граф называется эйлеровым графом. Если
связный граф имеет цепь (не обязательно простую), содержащую все рёбра, то такая цепь
называется эйлеровой цепью, а граф называется полуэйлеровым графом. И эйлеров цикл
и эйлерова цепь содержат не только все рёбра, но и все вершины графа (возможно, по
нескольку раз).
Теорема. Если граф G связен и нетривиален, то следующие утверждения эквивалентны.
1. G — эйлеров граф.
2. Каждая вершина G имеет чётную степень.
3. Множество рёбер G можно разбить на простые циклы.

671 / 907
5.7.3. Эйлеровы циклы (2/7)
Доказательство.
[ 1=⇒ 2 ] Пусть Z — эйлеров цикл в G. Двигаясь по Z , подсчитаем степени вершин, по-
лагая их до начала подсчёта нулевыми. Прохождение каждой вершины вносит 2 в сте-
пень этой вершины. Поскольку Z содержит все рёбра, то, когда обход Z будет закончен,
будут учтены все рёбра, а степени всех вершин — чётные.
[ 2=⇒ 3 ] G — связный и нетривиальный граф, следовательно, ∀ vi (d(vi ) > 0). Степени
вершин чётные, следовательно, ∀ vi (d(vi ) > 2). Имеем
p
X
2q = d(vi ) > 2p =⇒ q > p =⇒ q > p − 1.
i=1
Следовательно, граф G — не дерево, а значит, граф G содержит (хотя бы один) простой
цикл Z1 . (Z1 — множество рёбер.) Тогда G − Z1 — остовный подграф, в котором опять все
степени вершин чётные. Исключим из рассмотрения изолированные вершины. Таким об-
разом, G − Z1 тоже удовлетворяет условию 2, следовательно, существует простойSцикл
Z2 ⊂ (G − Z1 ). Далее выделяем циклы Zi , пока граф не будет пуст. Имеем E = Zi и
T
Zi = ∅. 672 / 907
5.7.3. Эйлеровы циклы (3/7)
Доказательство. (Окончание)
[ 3=⇒1 ] Возьмем какой-либо цикл Z1 из данного разбиения. Если Z1 = E , то теорема
доказана. Если нет, то существует цикл Z2 , не имеющий общих рёбер с Z1 (см. рисунок),
такой, что ∃ v1 ((v1 ∈ Z1 & v1 ∈ Z2 )), так как G связен. Маршрут Z1 ∪Z2 является циклом
и содержит все свои рёбра по одному разу.
Если Z1 ∪ Z2 = E , то теорема доказана. Если нет, то существует цикл Z3 , такой, что
∃ v2 (v2 ∈ Z1 ∪ Z2 & v2 ∈ Z3 ). Далее будем наращивать эйлеров цикл, пока он не ис-
черпает разбиения.

673 / 907
5.7.3. Эйлеровы циклы (4/7)
Вход: эйлеров граф G(V, E), заданный списками смежности (Γ[v] — список вершин,
смежных с вершиной v ).
Выход: последовательность вершин эйлерова цикла.
S ← ∅ //стек для хранения вершин
select v ∈ V //произвольная вершина
v → S //положить v в стек S
while S 6= ∅ do
v ← top S //v — верхний элемент стека
if Γ[v] = ∅ then
v ← S ; yield v //очередная вершина эйлерова цикла
else
select u ∈ Γ[v] //взять первую вершину из списка смежности
u → S //положить u в стек
Γ[v] ← Γ[v] − u; Γ[u] ← Γ[u] − v //удалить ребро (v, u)
end if
end while 674 / 907
5.7.3. Эйлеровы циклы (5/7)
Обоснование. Начав с произвольной вершины v , строим путь, удаляя рёбра и запоминая
вершины в стеке, до тех пор, пока множество смежности очередной вершины не окажет-
ся пустым, что означает, что путь удлинить нельзя. Заметим, что при этом мы обязатель-
но придём в ту вершину, с которой начали. В противном случае вершина v имеет нечёт-
ную степень, что невозможно по условию. Таким образом, из графа были удалены рёбра
цикла, а вершины цикла были сохранены в стеке S , при этом степени всех вершин оста-
лись чётными. Далее вершина v выводится в качестве первой вершины эйлерова цикла,
а процесс продолжается с вершины, стоящей на вершине стека.
Замечание. В предыдущем разделе был установлен эффективный способ проверки нали-
чия эйлерова цикла в графе. А именно, для этого достаточно убедиться, что степени всех
вершин чётные, что нетрудно сделать при любом представлении графа. Приведённый ал-
горитм находит эйлеров цикл в графе, если известно, что граф эйлеров, то есть цикл за-
ведомо существует. Если же граф не эйлеров и цикла не существует, то алгоритм непри-
меним.
675 / 907
5.7.3. Эйлеровы циклы (6/7)
Пусть G(p) — множество всех графов с p вершинами, а E(p) — множество эйлеровых
графов с p вершинами.
Замечание. В этом параграфе речь идёт о числе нумерованных графов, то есть о числе
графов, в которых вершины перенумерованы. Считается, что если перенумеровать вер-
шины в другом порядке, то это будет другой граф. Очевидно, что нумерованных графов
(любого типа) больше, чем графов, определяемых как классы эквивалентности по отно-
шению изоморфизма, поэтому приводимые здесь оценки являются достаточно грубыми.
Теорема. Эйлеровых графов почти нет, то есть
|E(p)|
lim = 0.
p→∞ |G(p)|

Доказательство. Пусть E 0 (p) — множество графов с p вершинами и чётными степенями.


Тогда по предыдущей теореме E(p) ⊂ E 0 (p) и |E(p)| 6 |E 0 (p)|. В любом графе число
вершин нечётной степени чётно, следовательно, любой граф из E 0 (p) можно получить
из некоторого графа G(p − 1), если добавить новую вершину и соединить её со всеми
старыми вершинами нечётной степени.
676 / 907
5.7.3. Эйлеровы циклы (7/7)
Доказательство. (Продолжение) Следовательно, |E 0 (p)| 6 |G(p − 1)|. Но |G(p)| = 2C(p,2) ,
поскольку (нумерованный) граф с p вершинами определяется подмножеством включён-
ных в него рёбер, выбранных из множества всех возможных рёбер, а их C(p, 2). Заметим,
k(k − 1) (k − 1)(k − 2)
что C(k, 2) − C(k − 1, 2) = − = k − 1.
2 2
Далее имеем

|E(p)| 6 |E 0 (p)| 6 |G(p − 1)| = 2C(p−1,2) = 2C(p,2)−(p−1) = |G(p)|2−(p−1)

и
|E(p)| 1
6 p−1 ,
|G(p)| 2
откуда
|E(p)|
lim = 0.
p→∞ |G(p)|

677 / 907
5.7.4. Гамильтоновы циклы (1/9)
Название «гамильтонов цикл» произошло от за-
дачи «Кругосветное путешествие», придуманной
Гамильтоном в XIX веке: нужно обойти все верши-
ны графа, диаграмма которого показана на рисун-
ке (в исходной формулировке вершины были поме-
чены названиями столиц различных стран), по од-
ному разу и вернуться в исходную точку. Этот граф
представляет собой укладку додекаэдра.
Если граф имеет простой цикл, содержащий все вершины графа (по одному разу), то та-
кой цикл называется гамильтоновым циклом, а граф называется гамильтоновым графом.
Если граф имеет простую цепь, содержащую все вершины графа (по одному разу), то та-
кая цепь называется гамильтоновой цепью, а граф называется полугамильтоновым гра-
фом.
Гамильтонов цикл не обязательно содержит все рёбра графа. Ясно, что гамильтоновым
может быть только связный граф.
678 / 907
5.7.4. Гамильтоновы циклы (2/9)
Замечание. Любой граф G можно превратить в гамильтонов, добавив достаточное коли-
чество новых вершин и инцидентных им рёбер и не добавляя рёбер, инцидентных толь-
ко старым вершинам. Для этого, например, достаточно к вершинам v1 , . . . , vp графа G до-
бавить вершины u1 , . . . , up и множество рёбер {(vi , ui )}∪{(ui , vi+1 )}, считаем vp+1 = v1 .
Простые необходимые и достаточные условия гамильтоновости графа неизвестны.
Известны только некоторые достаточные условия, одно из которых приведено в следую-
щей теореме.
Теорема. Если p(G) > 3 и δ(G) > p/2, то граф G является гамильтоновым.
Доказательство. От противного. Пусть G — не гамильтонов. Добавим к G минимальное
количество новых вершин u1 , . . . , un , соединяя их со всеми вершинами G так, чтобы граф
G0 ← G + u1 + · · · + un был гамильтоновым. Пусть v, u1 , w, . . . , v — гамильтонов цикл в
графе G0 , причём v ∈ G, u1 ∈ G0 , u1 6∈ G. Такая пара вершин, v и u1 , в гамильтоновом
цикле обязательно найдется, иначе граф G был бы гамильтоновым. Тогда w ∈ G, w 6∈
{u1 , . . . , un }, иначе вершина u1 была бы не нужна. Более того, вершина v не смежна с
вершиной w, иначе вершина u1 была бы не нужна.
679 / 907
5.7.4. Гамильтоновы циклы (3/9)
Доказательство. (продолжение) Далее, если в цикле v, u1 , w, . . . , v 0 , w0 , . . . , v есть вер-
шина w0 , смежная с вершиной w, то вершина v 0 не смежна с вершиной v , так как ина-
че можно было бы построить гамильтонов цикл v, v 0 , . . . , w, w0 . . . v без вершины u1 , взяв
последовательность вершин w, . . . , v 0 в обратном порядке.

Отсюда следует, что число вершин графа G0 , не смежных с v , не менее числа вершин,
смежных с w. Но для любой вершины w графа G в графе G0 имеем d(w) > p/2 + n по
построению, в том числе d(v) > p/2 + n. Общее число вершин (смежных и не смежных
с v , за исключением самой вершины v ) составляет n + p − 1. Таким образом, имеем
n + p − 1 = d(v) + d(v) > d(w) + d(v) > p2 + n + p2 + n = 2n + p.
Следовательно, 0 > n + 1, что противоречит тому, что n > 0. 680 / 907
5.7.4. Гамильтоновы циклы (4/9)
Следствие. При p > 3 полный граф Kp гамильтонов.
Рассмотрим следующую задачу коммивояжёра. Имеется p городов, расстояния между ко-
торыми известны. Коммивояжёр должен посетить все p городов по одному разу, вернув-
шись в тот, с которого начал. Требуется найти маршрут движения, при котором суммарное
пройденное расстояние будет минимальным. Ясно, что задача коммивояжёра — это за-
дача отыскания кратчайшего гамильтонова цикла в нагруженном полном графе. Можно
предложить следующую простую схему решения задачи коммивояжёра: сгенерировать
все p! возможных перестановок вершин полного графа, подсчитать для каждой переста-
новки длину маршрута и выбрать из них кратчайший. Очевидно, такое вычисление по-
требует не менее O(p!) шагов. Как известно, p! — быстро растущая функция. Таким об-
разом, решение задачи коммивояжёра описанным методом полного перебора оказыва-
ется практически неосуществимым даже для сравнительно небольших p. Более того, из-
вестно, что задача коммивояжёра принадлежит к числу NP-полных задач.

681 / 907
5.7.4. Гамильтоновы циклы (5/9)
Отступление. Полезно сопоставить задачи отыскания эйлеровых и гамильтоновых циклов. Внешне
формулировки этих задач очень похожи, однако они оказываются принципиально различными с
точки зрения практического применения. Эйлером получено просто проверяемое необходимое
и достаточное условие существования в графе эйлерова цикла. Что касается гамильтоновых гра-
фов, то для них неизвестны простые необходимые и достаточные условия. На основе необходи-
мого и достаточного условия существования эйлерова цикла можно построить эффективные ал-
горитмы отыскания такого цикла. В то же время задача проверки существования гамильтонова
цикла оказывается NP-полной (так же, как и задача коммивояжёра). Далее, известно, что почти
нет эйлеровых графов, и эффективный алгоритм отыскания эйлеровых циклов редко оказывает-
ся применимым на практике. С другой стороны, можно показать, что почти все графы — гамиль-
тоновы, то есть
|H(p)|
lim = 1,
p→∞ |G(p)|
где H(p) — множество гамильтоновых графов с p вершинами, а G(p) — множество всех графов с
p вершинами. Таким образом, задача отыскания гамильтонова цикла или задача коммивояжёра
являются практически востребованными, но эффективный алгоритм решения для них неизвестен
(и, скорее всего, не существует). 682 / 907
5.7.4. Гамильтоновы циклы (6/9)
В степенной последовательности гамильтонова графа не может быть много вершин с
малыми степенями. Введём обозначение N= (G, n) числа вершин графа G степени n,
Def
0 6 n < p: N= (G, n) = |{v ∈ V | d(v) = n}| . В этих обозначениях
n
Def
X
N6 (G, n) = |{v ∈ V | d(v) 6 n}| = N= (G, i),
i=0
p−1
Def
X
N> (G, n) = |{v ∈ V | d(v) > n}| = N= (G, i),
i=n+1
N6 (G, n) + N> (G, n) = p.
Лемма. ∀ G(V, E) (∀ e 6∈ E (∀ 0 6 n < p (N6 (G + e, n) 6 N6 (G, n)))) .
Другими словами, добавление рёбер разве что уменьшает число вершин ограниченной
степени.
Следующая теорема даёт достаточное условие того, что граф является гамильтоновым.
Она обобщает результаты, полученные ранее Оре и Дираком, которые оказываются её
следствиями. 683 / 907
5.7.4. Гамильтоновы циклы (7/9)

Теорема. [Поша] Если G(V, E) — связный граф с числом вершин p > 3,


и ∀ n, 1 6 n < (p − 1)/2 (N6 (G, n) < n), и для нечётных p выполняется неравенство
N6 (G, (p − 1)/2) 6 (p − 1)/2, то граф G гамильтонов.
Доказательство. От противного. Пусть G — не гамильтонов граф с p вершинами, удовле-
творяющий условиям теоремы. Доказательство содержит три шага.
[ 1 ] По лемме добавление рёбер не нарушает неравенств в условии теоремы. Добавим
в G все возможные рёбра так, чтобы он оставался не гамильтоновым, то есть рассмот-
рим максимальный не гамильтонов надграф G. Тогда, поскольку добавление к перестро-
енному максимальному графу G произвольного ребра приводит к гамильтонову графу,
любые две несмежные вершины соединимы простой гамильтоновой (остовной, то есть
содержащей все вершины графа) цепью.

684 / 907
5.7.4. Гамильтоновы циклы (8/9)
Доказательство. (Продолжение)
[ 2 ] Покажем, что всякая вершина, степень которой не меньше (p − 1)/2, смежна с каж-
дой вершиной со степенью, большей чем (p − 1)/2. Допустим (не теряя общности), что
d(v1 ) > (p − 1)/2 и d(vp ) > p/2 > (p − 1)/2, но вершины v1 и vp не смежны. Тогда суще-
ствует гамильтонова цепь hv1 , v2 , . . . , vp i, соединяющая v1 и vp . Все вершины, смежные с
v1 , находятся в этой же цепи, поскольку цепь гамильтонова. Пусть v1 смежна с vj . Тогда
вершина vp не смежна с вершиной vj−1 , поскольку иначе в G был бы гамильтонов цикл
v1 , v2 , . . . , vj−1 , vp , vp−1 , . . . , vj , v1 .

Положим n ← d(v1 ) 6 (p − 1)/2. Тогда среди всех p вершин по меньшей мере n вер-
шин, предшествующих на гамильтоновом пути вершинам, смежным с v1 , не смежны с vp .
Имеем противоречие: p/2 6 d(vp ) 6 p − 1 − n 6 p − 1 − (p − 1)/2 = (p − 1)/2.
685 / 907
5.7.4. Гамильтоновы циклы (9/9)
Доказательство. (Окончание) [3] Если ∀ v ∈ V (d(v) > p/2), то граф гамильтонов. Значит
в G есть вершины со степенями меньше, чем p/2. Пусть U ← {v ∈ V | d(v) < p/2} 6= ∅
и W ← V \ U . Заметим, что ∀ w ∈ W (d(w) > p/2). Выберем вершину v1 ∈ U так,
что m ← d(v1 ) = maxu∈U d(u). По условию теоремы |U | = N6 (G, m) < m < p/2, и
значит |W | > p/2 и среди вершин W есть вершина vp не смежная с v1 . Тогда существует
гамильтонова цепь hv1 , v2 , . . . , vp i, соединяющая v1 и vp . Как показано в п. 2 vj−1 6∈ Γ(vp ),
в противном случае нашёлся бы гамильтонов цикл. Но тогда m < (p − 1)/2, потому что
если m > (p − 1)/2, то имеем
p/2 6 d(vp ) 6 p − 1 − m 6 p − 1 − (p − 1)/2 = (p − 1)/2.
По условию теоремы N6 (G, m) < m и значит хотя бы одна из вершин vj−1 , предшеству-
ющих вершинам, смежным с v1 , имеет степень больше p/2, d(vj−1 ) > p/2. Получили па-
ру несмежных вершин, vj−1 и vp , таких, что d(vj−1 ) > p/2 и d(vp ) > p/2. Это противоре-
чит п. 2.
Следствие. Если p > 3 и d(u) + d(v) > p для любой пары u и v несмежных вершин графа
G, то G — гамильтонов граф.
686 / 907
5.8. Независимые и покрывающие множества

В этом разделе вводятся определения и рассматриваются основные свойства независи-


мых и покрывающих множеств вершин и рёбер. Эти определения и свойства использу-
ются в последующих разделах.
Значительное количество экстремальных задач в различных предметных областях сво-
дится к отысканию наибольших независимых или наименьших покрывающих множеств
вершин и рёбер в графах, входящих в модели этих предметных областей. Поэтому дан-
ный раздел теории графов имеет множество практических приложений.
Обсуждение переборных алгоритмов решения экстремальных задач представляет особый
интерес.

687 / 907
5.8.1. Независимые и покрывающие множества вершин и рёбер (1/8)
Говорят, что вершина покрывает инцидентные ей рёбра, а ребро покрывает инцидент-
ные ему вершины. Множество вершин, которые в совокупности покрывают все рёбра,
называется вершинным покрытием. Вершинное покрытие называется минимальным, ес-
ли никакое его подмножество не является вершинным покрытием. Вершинное покрытие
называется наименьшим, если число элементов в нём наименьшее возможное, а мощ-
ность такого покрытия называется числом вершинного покрытия и обозначается α0 .
Примеры.
1. α0 (Kp ) = p − 1, если Kp — полный граф.
2. α0 (Km,n ) = min(m, n), если Km,n — полный двудольный граф.
3. α0 (K p ) = 0, если K p — вполне несвязный граф.
4. α0 (G1 ∪ G2 ) = α0 (G1 ) + α0 (G2 ), если G1 и G2 — компоненты несвязного графа.
Отступление. Задача поиска наименьшего вершинного покрытия имеет наглядную практическую
интерпретацию: пусть граф описывает план охраняемого объекта, при этом рёбрам соответствуют
просматриваемые пространства, например, коридоры, а вершинам — возможные точки наблю-
дения (блокпосты). Необходимо расставить минимальное количество охранников на блокпостах
так, чтобы ими контролировались все коридоры. 688 / 907
5.8.1. Независимые и покрывающие множества вершин и рёбер (2/8)
Множество рёбер, которые в совокупности покрывают все вершины, называется рёбер-
ным покрытием. Рёберное покрытие называется минимальным, если никакое его под-
множество не является рёберным покрытием. Рёберное покрытие называется наимень-
шим, если число элементов в нём наименьшее возможное, а мощность такого покрытия
называется числом рёберного покрытия и обозначается α1 .
Замечание. Для графа с изолированными вершинами α1 не определено.
Примеры.
1. α1 (C2n ) = n, если C2n — чётный цикл.
2. α1 (C2n+1 ) = n + 1, если C2n+1 — нечётный цикл.
3. α1 (K2n ) = n, если K2n — полный граф с чётным числом вершин.
4. α1 (K2n+1 ) = n + 1, если K2n+1 — полный граф с нечётным числом вершин.
5. α1 (Km,n ) = max(m, n), если Km,n — полный двудольный граф.

689 / 907
5.8.1. Независимые и покрывающие множества вершин и рёбер (3/8)
Множество вершин называется независимым (или внутренне устойчивым), если никакие
две из них не смежны. Независимое множество вершин называется максимальным, если
никакое его надмножество не является независимым. Независимое множество вершин
называется наибольшим, если число элементов в нём наибольшее возможное, а мощность
такого множества называется вершинным числом независимости и обозначается β0 .
Примеры.
1. β0 (Kp ) = 1, если Kp — полный граф.
2. β0 (Km,n ) = max(m, n) , если Km,n — полный двудольный граф.
3. β0 (K p ) = p, если K p — вполне несвязный граф.
4. β0 (G1 ∪ G2 ) = β0 (G1 ) + β0 (G2 ) , если G1 и G2 — компоненты несвязного графа.
Замечание. Практической интерпретацией этого понятия может служить следующий при-
мер: пусть имеется множество ресурсов и множество проектов, каждому из которых тре-
буется некоторое подмножество ресурсов для выполнения. Построим граф, в котором
вершины будут отвечать проектам, а ребра будут обозначать наличие общих ресурсов у
проектов. Тогда наибольшее независимое множество вершин графа будет представлять
наибольшее множество проектов, которые можно выполнить одновременно. 690 / 907
5.8.1. Независимые и покрывающие множества вершин и рёбер (4/8)
Ясно, что множество вершин S является независимым тогда и только тогда, когда
∀ v ∈ S (Γ(v) ∩ S = ∅) .
Множество рёбер называется независимым (или паросочетанием), если никакие два из
них не смежны. Наибольшее число рёбер в независимом множестве рёбер называется
рёберным числом независимости и обозначается β1 . (Понятия максимального и наиболь-
шего паросочетания введены в разделе 5.5).
Примеры.
1. β1 (C2n ) = n, если C2n — чётный цикл.
2. β1 (C2n+1 ) = n, если C2n+1 — нечётный цикл.
3. β1 (K2n ) = n, если K2n — полный граф с чётным числом вершин.
4. β1 (K2n+1 ) = n, если K2n+1 — полный граф с нечётным числом вершин.
5. β1 (Km,n ) = min(m, n), если Km,n — полный двудольный граф.
Замечание. Индексы 0 и 1 в обозначениях α0 , α1 , β0 , β1 имеют следующую мнемонику.
Индекс 0 соответствует вершинам, так как вершина нульмерна, а 1 — рёбрам, так как
ребро одномерно.
691 / 907
5.8.1. Независимые и покрывающие множества вершин и рёбер (5/8)
Ясно, что наибольшее независимое множество вершин или рёбер является максималь-
ным, а наименьшее покрывающее множество вершин или рёбер является минимальным.
Обратное неверно: независимое множество может быть максимальным, не будучи наи-
большим, а покрывающее множество может быть минимальным, не будучи наименьшим.
Пример. На диаграмме слева вершины {v1 , v4 } образуют наименьшее покрытие, а вер-
шины {v2 , v3 , v5 } образуют наибольшее независимое множество. Cправа вершины {v1 , v4 }
образуют максимальное, но не наибольшее независимое множество, а вершины
{v2 , v3 , v5 } образуют минимальное, но не наименьшее покрывающее множество.

692 / 907
5.8.1. Независимые и покрывающие множества вершин и рёбер (6/8)
Приведённые примеры наводят на мысль, что числа независимости и покрытия связаны
друг с другом и с количеством вершин p.
Теорема. Для любого нетривиального связного графа

α0 + β0 = p = α1 + β1 .
Доказательство. Докажем четыре неравенства, из которых следуют два требуемых ра-
венства.
[ α0 +β0 > p ] Пусть M0 — наименьшее вершинное покрытие, то есть |M0 | = α0 . Рассмот-
рим V \ M0 . Тогда V \ M0 — независимое множество, так как если бы в множестве V \ M0
были смежные вершины, то M0 не было бы покрытием. Имеем |V \ M0 | 6 β0 , следова-
тельно, p = |M0 | + |V \ M0 | 6 α0 + β0 .
[ α0 +β0 6 p ] Пусть N0 — наибольшее независимое множество вершин, то есть |N0 | = β0 .
Рассмотрим V \N0 . Тогда V \N0 — вершинное покрытие, так как нет рёбер, инцидентных
только вершинам из N0 , стало быть, любое ребро инцидентно вершине (или вершинам)
из V \ N0 . Имеем |V \ N0 | > α0 , следовательно, p = |N0 | + |V \ N0 | > β0 + α0 .
693 / 907
5.8.1. Независимые и покрывающие множества вершин и рёбер (7/8)
Доказательство. (Продолжение)
[ α1 +β1 > p ] Пусть M1 — наименьшее рёберное покрытие, то есть |M1 | = α1 . Множество
M1 не содержит цепей длиной больше 2. Действительно, если бы в M1 была цепь длиной
3, то среднее ребро этой цепи можно было бы удалить из M1 и это множество все равно
осталось Pбы покрытием. Следовательно, M1 состоит из звёзд. Пусть этих звёзд m. Имеем
m
|M1 | = i=1 ni , где ni — число рёбер в i-й звезде. Заметим, что звезда из ni рёбер
покрывает nP i + 1 вершину.
m Pm
Имеем p = i=1 (ni +1) = m+ i=1 ni = m+|M1 |. Возьмём по одному ребру из каждой
звезды и составим из них множество X . Тогда |X| = m, множество X — независимое,
то есть |X| 6 β1 . Следовательно, p = |M1 | + m = |M1 | + |X| 6 α1 + β1 .
[ α1 + β1 6 p ] Пусть N1 — наибольшее независимое множество рёбер, то есть |N1 | = β1 .
Построим рёберное покрытие Y следующим образом. Множество N1 покрывает 2|N1 |
вершин. Добавим по одному ребру, инцидентному непокрытым p−2|N1 | вершинам, таких
рёбер p − 2|N1 |. Тогда множество Y — рёберное покрытие, |Y | = |N1 | + p − 2|N1 | =
p − |N1 | и |Y | > α1 . Имеем p = p − |N1 | + |N1 | = |Y | + |N1 | > α1 + β1 .
694 / 907
5.8.1. Независимые и покрывающие множества вершин и рёбер (8/8)

Замечание. Условия связности и нетривиальности гарантируют, что все четыре инвари-


анта определены. Хотя это условие является достаточным, оно не является необходимым.
Например, для графа Kn ∪ Kn заключение теоремы остается справедливым, хотя усло-
вие не выполнено.
Отступление. Задача отыскания экстремальных независимых множеств возникает во многих слу-
чаях. Например, пусть дано множество процессов, использующих неразделяемые ресурсы.
Соединим рёбрами вершины, соответствующие процессам, которым требуется один и тот же ре-
сурс. Тогда β0 определяет количество возможных параллельных процессов.

695 / 907
5.8.2. Оценка числа вершинной независимости (1/4)
X 1
Теорема. Для любого графа G(V, E) справедливо неравенство: β0 (G) > .
v∈V
1 + d(v)
Доказательство. Заметим, что если G = Kp , то β0 (Kp ) = 1 и
X 1 X 1
= = 1, то есть достигается равенство. Далее индукция по p.
v∈V
1 + d(v) v∈V 1 + p − 1
База для p = 1 проверена. Ввиду того, что для полных графов достигается равенство,
можно считать, что G 6= Kp . Пусть теперь p > 2 и для всех графов с числом вершин мень-
ше p неравенство выполнено. Рассмотрим в графе G вершину u минимальной степени:
d(u) = δ(G). Так как G 6= Kp , имеем Γ∗ (u) 6= V . Удалим вершину u и её окрестность
из множества вершин V 0 ← V \ Γ∗ (u), и рассмотрим граф G0 , который является правиль-
ным подграфом графа G, определяемым множеством V 0 . Степень вершины в графе G0
обозначим d0 . Заметим, что ∀ v ∈ V 0 (d0 (v) 6 d(v)) и ∀ v ∈ V 0 ((1+d0 (v))−1 > (1+d(v))−1 ).
Далее, если M — независимое множество вершин в графе G0 , то M + u — независимое
множество вершин в графе G, и β0 (G) > β0 (G0 ) + 1.

696 / 907
5.8.2. Оценка числа вершинной независимости (2/4)
Доказательство.
X (Продолжение)
X Заметим теперь, что в силу выбора вершины u имеем
−1
(1 + d(v)) 6 (1 + d(u))−1 = 1. Окончательно получаем
v∈Γ∗ (u) v∈Γ∗ (u)
X
β0 (G) > β0 (G0 ) + 1 > (1 + d0 (v))−1 + 1 >
v∈V 0
X X X
> (1 + d(v))−1 + 1 > (1 + d(v))−1 + (1 + d(v))−1 >
v∈V 0 v∈V 0 v∈Γ∗ (u)
X
> (1 + d(v))−1 .
v∈V

Замечание. Полезно выделить крайние случаи для пустого и полного графа:


p p
X 1 X 1
β0 (Kp ) = = p, β0 (Kp ) = = 1.
i=1
1 i=1
1+p−1
697 / 907
5.8.2. Оценка числа вершинной независимости (3/4)
¯ Def 1X
Рассмотрим среднюю степень графа: d(G) = d(v).
p v∈V
p
Следствие. Для любого графа G(V, E) справедливо неравенство: β0 (G) > .
1 + d¯
Доказательство. Известно неравенство Коши–Буняковского
n
!2 n
! n
!
X X X
ai b i 6 a2i b2i .
i=1 i=1 i=1
p p
Положим ai ← (1 + d(vi ))−1 , bi ← 1 + d(vi ). Тогда

p
s !2 p
!
X 1 + d(vi ) X
p2 = 6 β0 (1 + d(vi )) ,
i=1
1 + d(vi ) i=1

¯ , то есть p 6 β0 (1 + d)
и p2 6 β0 (p + pd) ¯.
698 / 907
5.8.2. Оценка числа вершинной независимости (4/4)
Теорема. [Кёнига] В любом двудольном графе β1 (G) = α0 (G).
Доказательство. Добавим к вершинам графа G две вершины u и v и соединим с u все
вершины левой доли, а с v — правой доли. В полученном графе G0 любое подмножество
вершин разделяет вершины u и v тогда и только тогда, когда оно покрывает все рёб-
ра исходного графа (белые вершины на рисунке). Следовательно, min |S(u, v)| = α0 (G).
Кроме того, любое множество вершинно-непересекающихся простых hu, vi-цепей об-
разует некоторое паросочетание в графе G (жирные рёбра), а любое паросочетание в
графе G может быть продолжено до множества вершинно-непересекающихся простых
hu, vi-цепей. Следовательно, max |P (u, v)| = β1 (G). Тогда, по теореме Менгера:
β1 (G) = α0 (G).

699 / 907
5.8.3. Построение независимых множеств вершин (1/8)

Этот раздел фактически является вводным обзором методов решения переборных за-
дач. Методы рассматриваются на примере задачи отыскания наибольшего независимо-
го множества вершин графа. Наш обзор не претендует на полноту, но описание осново-
полагающих идей и терминов в нём присутствует.
Задача отыскания наибольшего независимого множества вершин (и тем самым опреде-
ления вершинного числа независимости β0 ) принадлежит к числу трудоёмких. Эту зада-
чу можно поставить следующим образом. Пусть задан граф G(V, E). Найти такое множе-
ство вершин X , X ⊂ V , что
Def
|X| = max |Y |, E = {Y ⊂ V | ∀ u, v ∈ Y ((u, v) 6∈ E)} .
Y ∈E

700 / 907
5.8.3. Построение независимых множеств вершин (2/8)
Нижняя оценка числа вершинной независимости β0 , полученная в п. 5.8.2 оказывается
точным значениям для крайних случаев — для полных и для пустых графов. На первый
взгляд кажется разумным предположить, что эта оценка «достаточно точна» и для других
графов. В таком случае, на основе конструктивного доказательства нижней оценки, воз-
никает соблазн предложить эффективный эвристический алгоритм поиска независимого
множества, «близкого» к наибольшему.
Вход: граф G(V, E).
Выход: наибольшее независимое множество X .
X ← ∅ //вначале независимое множество пусто
while G 6= ∅ do
select u ∈ V & d(u) = δ(G) //u имеет минимальную степень
X ← X + u //помещаем её в независимое множество
G ← G \ Γ∗ (u) //удаляем вершину u вместе с её окрестностью
end while
701 / 907
5.8.3. Построение независимых множеств вершин (3/8)
Пример. На рисунке слева приведена диаграмма графа, для которого эвристический ал-
горитм находит точное решение β0 = 2, а справа приведена диаграмма графа, для кото-
рого алгоритм даёт ответ 2, в то время, как наибольшим независимым множеством явля-
ется доля в центре и β0 = 3.

Приведённый пример легко обобщить. Рассмотрим граф K m + Kn и добавим к нему од-


ну вершину, соединив её с вершинами доли K m . Тогда при n > m > 2 наибольшим неза-
висимым множеством является средняя доля K m и β0 = m, в то время как эвристиче-
ский алгоритм по-прежнему выдаёт ответ 2. Эвристический алгоритм может дать ответ,
сколь угодно далёкий от точного решения!
702 / 907
5.8.3. Построение независимых множеств вершин (4/8)
Даже если для решения задач, подобных поставленной в предыдущем параграфе, не уда-
ётся найти эффективного алгоритма, остаётся возможность попробовать найти решение
«полным перебором» всех возможных вариантов, просто в силу конечности числа воз-
можностей. Например, наибольшее независимое множество можно найти по следующей
схеме.
Вход: граф G(V, E).
Выход: наибольшее независимое множество X .
m ← 0 //наилучшее известное значение β0
for Y ∈ 2V do
if Y ∈ E & |Y | > m then
m := |Y |; X ← Y //наилучшее известное значение X
end if
end for
Замечание. Для выполнения этого алгоритма потребуется O(2p ) шагов.
703 / 907
5.8.3. Построение независимых множеств вершин (5/8)
При решении переборных задач большое значение имеет способ организации перебора
(в нашем случае — способ построения и последовательность перечисления множеств Y ).
Наиболее популярным является следующий способ организации перебора, основанный
на идее поиска в глубину и называемый поиском с возвратами.
Замечание. Иногда употребляется термин «бэктрекинг» (транслитерация английского на-
звания этого метода — backtracking). Буквальный перевод английского названия — об-
ратное прослеживание — явно неудачен, поскольку в методе нет ничего «обратного», и
непонятно, что «прослеживается».
Идея поиска с возвратами состоит в следующем. Находясь в некоторой ситуации, пробу-
ем изменить её допустимым образом в надежде найти решение. Если изменение не при-
вело к успеху, то возвращаемся в исходную ситуацию (отсюда название «поиск с возвра-
тами») и пробуем изменить её другим образом, и так до тех пор, пока не будут перебра-
ны все возможности.

704 / 907
5.8.3. Построение независимых множеств вершин (6/8)
Вход: граф G(V, E).
Выход: наибольшее независимое множество X .
m ← 0 //наилучшее известное значение β0
X ← ∅ //наибольшее известное независимое множество X
BT(∅, V ) //вызов рекурсивной процедуры BT
Основная работа выполняется рекурсивной процедурой BT.
Вход: S — текущее независимое множество вершин, T — оставшиеся вершины графа.
Выход: изменение глобальной переменной X , если текущее множество не может быть
расширено (является максимальным).
if |S| > m then
X := S; m := |S| //наибольшее известное независимое множество
end if
for v ∈ T do
if S + v ∈ E then
BT(S + v, T \ Γ∗ (v)) //пробуем добавить v
end if
end for 705 / 907
5.8.3. Построение независимых множеств вершин (7/8)
Обоснование. Для рассматриваемой задачи отыскания наибольшего независимого мно-
жества вершин метод поиска с возвратами реализован с помощью указанного рекурсив-
ного алгоритма.
По построению вершина v добавляется в множество S только при сохранении независи-
мости расширенного множества. В алгоритме это обстоятельство указано в форме усло-
вия S + v ∈ E . Проверить сохранение условия независимости нетрудно, например, с по-
мощью следующей функции.
Вход: независимое множество S и проверяемая вершина v .
Выход: true, если множество S + v независимое, false — в противном случае.
for u ∈ S do
if (u, v) ∈ E then
return false //множество S + v зависимое
end if
end for
return true //множество S + v независимое
706 / 907
5.8.3. Построение независимых множеств вершин (8/8)

Обоснование. (Окончание) Этот цикл не включен в явном виде в рекурсивную процедуру


BT, чтобы не загромождать основной текст и не затуманивать идею поиска с возвратами.
Таким образом, множество S , а следовательно, и множество X — независимые. В тот мо-
мент, когда множество S нельзя расширить, оно максимально по определению. Перемен-
ная m глобальна, поэтому среди всех максимальных независимых множеств в конце ра-
боты алгоритма построенное множество X является наибольшим независимым множе-
ством вершин.
Отступление. Алгоритм, трудоёмкость которого (число шагов) ограничена полиномом от харак-
терного размера задачи, принято называть эффективным, в противоположность неэффективным
алгоритмам, трудоёмкость которых ограничена функцией, растущей быстрее, например, экспо-
нентой. Таким образом, жадный алгоритм эффективен, а полный перебор — нет.

707 / 907
5.8.4. Улучшенный перебор (1/6)

Применение метода поиска с возвратами не гарантирует эффективности — трудоём-


кость поиска с возвратами имеет тот же порядок, что и другие способы перебора (в худ-
шем случае). Используя конкретную информацию о задаче, в некоторых случаях мож-
но существенно сократить трудоёмкость выполнения каждого шага перебора или умень-
шить количество перебираемых возможностей в среднем (при сохранении оценки коли-
чества шагов в худшем случае). Такие приёмы называются методами улучшения перебо-
ра. Например, может оказаться, что некоторые варианты заведомо не могут привести к
решению, а потому их можно не рассматривать.
Замечание. Рекурсивная форма метода поиска с возвратами удобна для понимания, но
не является самой эффективной. По сути, рекурсия здесь используется для сохранения
контекста — то есть информации, характеризующей текущий рассматриваемый вариант.
Если использовать другие методы сохранения контекста, то поиск с возвратами может
быть реализован без явной рекурсии, а значит, более эффективно.

708 / 907
5.8.4. Улучшенный перебор (2/6)
Рассмотрим методы улучшения перебора на примере задачи отыскания всех максималь-
ных независимых множеств вершин.
Идея: начинаем с пустого множества и пополняем его вершинами с сохранением неза-
висимости (пока возможно).
Пусть Sk — уже полученное множество из k вершин, Qk — множество вершин, которое
можно добавить к Sk , то есть Sk ∩ Γ(Qk ) = ∅. Среди вершин Qk будем различать те, ко-
торые уже использовались для расширения Sk (обозначим их множество Q− k ), и те, кото-
рые еще не использовались (Q+ k ). Тогда общая схема нерекурсивной реализации поиска
с возвратами будет состоять из следующих шагов.
Шаг вперед от k к k + 1 состоит в выборе вершины x ∈ Q+ k:

Sk+1 ← Sk + x,
Q− − +
k+1 ← Qk \ Γ (x),

Q+ +
k+1 ← Qk \ Γ (x).

709 / 907
5.8.4. Улучшенный перебор (3/6)
Шаг назад от k + 1 к k :

Sk ← Sk+1 − x,
Q+ +
k ← Qk − x,
Q− −
k ← Qk + x.


Если Sk — максимальное, то Q+
k = ∅. Если Qk 6= ∅, то Sk было расширено раньше и не
является максимальным. Таким образом, проверка максимальности задается следующим

условием: Q+k = Qk = ∅.
Перебор можно улучшить, если заметить следующее.
Пусть x ∈ Q− + − −
k и Γ(x) ∩ Qk = ∅. Эту вершину x никогда не удалить из Qk , так как из Qk
+
удаляются только вершины, смежные с Qk . Таким образом, существование x, такого, что
x ∈ Q− +
k и Γ(x) ∩ Qk = ∅, является достаточным условием для возвращения. Кроме того,
k 6 p − 1.
710 / 907
5.8.4. Улучшенный перебор (4/6)
Приведённый алгоритм построения независимых множеств, обоснование которого дано
в предыдущем параграфе, строит все максимальные независимые множества вершин
заданного графа.
Вход: граф G(V, E), заданный списками смежности Γ[v].
Выход: последовательность максимальных независимых множеств.
k ← 0 //количество элементов в текущем независимом множестве
S[k] ← ∅ //S[k] — независимое множество из k вершин
Q− [k] ← ∅ //Q− [k] уже использованы для расширения S[k]
Q+ [k] ← V //Q+ [k] ещё не использованы для расширения S[k]
M 1 : //шаг вперед
select v ∈ Q+ [k] //расширяющая вершина
X[k] ← v //запоминаем расширяющую вершину
S[k + 1] ← S[k] ∪ {v} //расширенное множество
Q− [k + 1] ← Q− [k] \ Γ[v] //вершина v использована для расширения
Q+ [k + 1] ← Q+ [k] \ (Γ[v] ∪ {v}) //не могут быть использованы
k←k + 1 711 / 907
5.8.4. Улучшенный перебор (5/6)
M 2 : // проверка
for u ∈ Q− [k] do
if Γ[u] ∩ Q+ [k] = ∅ then goto M 3 end if //возврат
end for
if Q+ [k] = ∅ then
if Q− [k] = ∅ then yield S[k] end if //S[k] максимально
goto M 3 //можно возвращаться
else
goto M 1 //можно идти вперед
end if
M 3 : //шаг назад
k←k − 1
S[k] ← S[k + 1] − X[k + 1]
Q− [k] ← Q− [k] + X[k + 1] //вершина v уже добавлялась
Q+ [k] ← Q+ [k] − X[k + 1]
712 / 907
5.8.4. Улучшенный перебор (6/6)

if k = 0 & Q+ [k] = ∅ then


stop //перебор завершён
else
goto M 2 //переход на проверку
end if
Пример. Известная задача о восьми ферзях (расставить на шахматной доске 8 ферзей так,
чтобы они не били друг друга) является задачей об отыскании максимальных независи-
мых множеств. Действительно, достаточно представить доску в виде графа с 64 верши-
нами (соответствующими клеткам доски), которые смежны, если клетки находятся на од-
ной вертикали, горизонтали или диагонали.

713 / 907
5.8.5. Доминирующие множества (1/6)

Задача о наименьшем покрытии (сокращённо ЗНП) является примером общей экстре-


мальной задачи, к которой прямо или косвенно сводятся многие практические задачи.
Эта задача является классической, хорошо изучена и часто используется в качестве теста
для сравнения и оценки различных общих методов решения трудоёмких задач.
В этом разделе ЗНП формулируется в общем виде, а также на основе решения задач,
связанных с покрытиями графа, в частности, поиска доминирующих множеств.

714 / 907
5.8.5. Доминирующие множества (2/6)
Множество вершин S ⊂ V графа G(V, E) называется доминирующим множеством (или
внешне устойчивым), если S ∪ Γ(S) = V , то есть

∀ v ∈ V (v ∈ S ∨ ∃ s ∈ S ((s, v) ∈ E)) .

Очевидно, что множество S доминирует тогда и только тогда, когда

∀ v 6∈ S (Γ(v) ∩ S 6= ∅) ,

что равносильно утверждению ∀ v ∈ V (∃ s ∈ S (d(v, s) 6 1)).


Доминирующее множество называется минимальным, если никакое его подмножество
не является доминирующим. Доминирующее множество называется наименьшим, если
число элементов в нём наименьшее возможное.
Пример. Известная задача о пяти ферзях (расставить на шахматной доске 5 ферзей так,
чтобы они били всю доску) является задачей об отыскании наименьших доминирующих
множеств.
715 / 907
5.8.5. Доминирующие множества (3/6)

Множество рёбер D ⊂ E графа G(V, E) называется доминирующим множеством (или


внешне устойчивым), если

∀ e ∈ E (e ∈ D ∨ ∃ d = (v1 , v2 ) ∈ D (e ∈ (Λ(v1 ) ∪ Λ(v2 )))) .

Аналогично доминирующему множеству вершин множество ребёр D доминирует тогда


и только тогда, когда

∀ e = (v1 , v2 ) 6∈ D ((Λ(v1 ) ∪ Λ(v2 )) ∩ D 6= ∅) .

Понятия минимального и наименьшего доминирующих множеств рёбер вводятся так же,


как и для доминирующего множества вершин.

716 / 907
5.8.5. Доминирующие множества (4/6)
Доминирование тесно связано с вершинной независимостью.
Теорема. Независимое множество вершин является максимальным тогда и только тогда,
когда оно является доминирующим.
Доказательство.
[ =⇒ ] Пусть множество вершин S ⊂ V — максимальное независимое. Допустим, что оно
не доминирующее. Тогда существует вершина v , находящаяся на расстоянии большем 1
от всех вершин множества S . Эту вершину можно добавить к S с сохранением независи-
мости, что противоречит максимальности.
[ ⇐= ] Пусть S — независимое доминирующее множество. Допустим, что оно не макси-
мальное. Тогда существует вершина v , не смежная ни с одной из вершин множества S ,
то есть находящаяся на расстоянии больше 1 от всех вершин множества S . Это противо-
речит тому, что множество S — доминирующее.
Независимое доминирующее множество вершин — ядро графа.
Пример. В полном графе Kp каждая из p вершин является ядром и других ядер нет.
717 / 907
5.8.5. Доминирующие множества (5/6)
Следствие. Любой граф имеет ядро.
Доказательство. Следующий простой алгоритм, основанный на доказательстве предыду-
щей теоремы, строит некоторое ядро S .
S ← ∅ //ядро
while V 6= ∅ do
select v ∈ V //любая нерассмотренная вершина
S ← S + v //расширяем множество S
V ← V \ Γ∗ (v) //удаляем вершины, которые не могут быть использованы для расширения
end while
Понятия независимости, доминирования и ядра применимы как к графам, так и к оргра-
фам. Множество узлов S орграфа называется независимым, если ∀ v ∈ S (Γ(v) ∩ S = ∅),
и называется доминирующим, если ∀ v 6∈ S (Γ(v) ∩ S 6= ∅). Независимое доминирующее
множество узлов в орграфе называется ядром.
Замечание. Существуют орграфы, не имеющие ядра. Например, контур C3 не имеет ядра.
Более того, задача выделения ядра в произвольном орграфе оказывается NP-полной.
718 / 907
5.8.5. Доминирующие множества (6/6)

Теорема. Паросочетание является максимальным тогда и только тогда, когда множество


его рёбер является доминирующим.
Доказательство.
[ =⇒ ] Пусть паросочетание M ⊂ E — максимальное. Допустим, что оно не доминиру-
ющее, то есть существует ребро e 6∈ M , не смежное ни одному ребру из множества M .
Следовательно при добавлении этого ребра в множество M независимость сохранится,
что противоречит максимальности паросочетания.
[ ⇐= ] Пусть M — доминирующее множество рёбер, образующее паросочетание.
Допустим, что оно не максимальное. Тогда существует ребро e 6∈ M , не смежное ни од-
ному из рёбер множества M , что противоречит тому, что множество M — доминирую-
щее.

719 / 907
5.8.6. Задача о наименьшем покрытии (1/9)
Задача о наименьшем покрытии является весьма общей задачей, к которой сводятся мно-
гие задачи, в том числе и задача отыскания наименьших доминирующих множеств.
Данная задача получила такое название благодаря следующей формулировке на языке
теории множеств:
Пусть имеется конечное множество V = {v1 , . . . , vp } и семейство подмножеств этого
множества E = {E1 , . . . , Et }, ∀ i ∈ 1..t (Ei ⊂ V ). Каждому подмножеству Ei приписан
вес. Найти покрытие E 0 (E 0 ⊂ E ) наименьшего веса.
Эту задачу можно сформулировать также как задачу целочисленного программирования.
Пусть A : array [1..p, 1..t] of 0..1, где A[i, j] ←(vi ∈ Ej )) — матрица, отражающая при-
надлежность элементов подмножествам, а c : array [1..t] of integer — вектор весов под-
множеств. Тогда нужно найти такой вектор x : array [1..t] of 0..1, где x[i] := (Ei ⊂ E 0 ),
что

min (cx|(Ax)j >= 1).


720 / 907
5.8.6. Задача о наименьшем покрытии (2/9)

Замечание. Условие (Ax)j >= 1 вводится для того, чтобы каждый элемент множества
попал хотя бы в одно из выбранных подмножеств — тогда подмножества, попавшие в
E 0 будут образовывать покрытие. Таким образом обе формулировки оказываются полно-
стью эквивалентными.
Известно, что ЗНП относится к числу трудоёмких задач, и для её решения применяются
переборные алгоритмы с теми или иными улучшениями.

721 / 907
5.8.6. Задача о наименьшем покрытии (3/9)
Рассмотрим следующую задачу. Пусть каждой вершине сопоставлена некоторая цена.
Требуется выбрать доминирующее множество с наименьшей суммарной ценой. Покажем,
что это ЗНП, сформулированная на языке теории графов. Пусть V = {v1 , . . . , vp } — мно-
жество вершин графа, а Ei = Γ∗ (vi ). Тогда, если Ei ⊂ E 0 , то вершина vi принадлежит
искомому доминирующему множеству.
Чтобы показать эквивалентность ЗНП на языке теории графов и задачи целочисленного
программирования, нужно принять матрицу A равной матрице смежности графа с еди-
ницами на главной диагонали. Тогда, если x[i] = 1, то вершина vi войдёт в доминирую-
щее множество вершин.
Замечание. Если принять веса всех подмножеств тождественно равными единицами, то
мы получим так называемую ЗНП с единичными весами, которая также является задачей
отыскания обычного доминирующего множества вершин.
Замечание. Если в качестве A взять матрицу смежности рёбер (т.е. A[i][j] = 1 в том слу-
чае, если ребро ei смежно ребру ej ), то в результате решения ЗНП мы найдём наимень-
шее доминирующее множество рёбер.
722 / 907
5.8.6. Задача о наименьшем покрытии (4/9)
Задача о выборе переводчиков. Организации нужно нанять переводчиков для перевода
с определённого множества языков. Каждый из переводчиков владеет некоторыми ино-
странными языками и требует определённую зарплату. Требуется определить, каких пе-
реводчиков следует нанять, чтобы сумма расходов на зарплату была минимальной. Эта
задача сводится к ЗНП следующим образом.Рассмотрим двудольный граф с долями V1 и
V2 , где доля V1 соответствует множеству переводчиков, а доля V2 — множеству языков.
Вершины v1 ∈ V1 и v2 ∈ V2 смежны, если переводчик v1 владеет языком v2 . Требуется
найти наименьшее доминирующее множество такое, что S ⊂ V1 .
Задача о развозке. Поставщику нужно доставить товары своим потребителям. Имеется
множество возможных маршрутов, каждый из которых позволяет обслужить определён-
ное подмножество потребителей и требует определённых расходов. Требуется опреде-
лить, какие маршруты следует использовать, чтобы минимизировать расходы и обслу-
жить всех потребителей. Задача о развозке сводится к ЗНП аналогичным образом. Здесь
V1 — множество маршрутов, V2 — множество потребителей и вершины v1 ∈ V1 и v2 ∈ V2
смежны, если маршрут v1 обслуживает потребителя v2 .
723 / 907
5.8.6. Задача о наименьшем покрытии (5/9)

Задача нахождения наибольшего независимого множества вершин так же может быть


интерпретирована как частный случай ЗНП. Для этого будем составлять матрицу A таким
образом, что её строкам будут соответствовать рёбра графа, а столбцам — вершины:

A[i, j] ←(ei ∈ Λ(vj )).

Тогда, если X ∗ — полученное при решении данной ЗНП множество вершин, то V \ X ∗


будет наибольшим независимым множеством вершин. Это верно благодаря тому, что X ∗
получается наименьшим вершинным покрытием, то есть каждое ребро графа инцидентно
хотя бы одной вершине из X ∗ , а значит никакие две вершины из V \ X ∗ не могут быть
смежны. Более того X ∗ имеет наименьшую мощность, а значит V \X ∗ имеет наибольшую
мощность.

724 / 907
5.8.6. Задача о наименьшем покрытии (6/9)
Замечание. Легко заметить, что аналогично наименьшему вершинному покрытию можно
находить наименьшее рёберное покрытие: для этого достаточно сопоставлять строкам
матрицы A вершины графа, а столбцам — рёбра.
Но неверно считать, что наибольшее паросочетание в графе можно найти аналогично
наименьшему доминирующему множеству рёбер — просто вычитая из множества всех
рёбер полученное наименьшее рёберное покрытие. На приведённом на рисунке графе
пунктирными линиями изображено множество рёбер, полученное таким образом, и оно
паросочетанием не является.

725 / 907
5.8.6. Задача о наименьшем покрытии (7/9)
Есть ещё одна распространённая экстремальная задача на графах — поиск наибольшей
клики. На самом деле данная задача эквивалентна задаче поиска наибольшего незави-
симого множества вершин. Действительно: рассмотрим дополнение к графу G(V, E) и
наибольшее независимое множество вершин G. Заметим, что в графе G это же множе-
ство вершин будет образовывать полный подграф, при этом мощность этого множества
будет наибольшей. На рисунке приведён граф G и его дополнение G. Закрашенные вер-
шины (наибольшее независимое множество в G) образуют в графе G клику наибольшего
размера.

726 / 907
5.8.6. Задача о наименьшем покрытии (8/9)

В данном разделе рассмотрены способы свести ЗНП к решению различных экстремаль-


ных задач. На схеме, приведённой на следующем слайде, показаны связи ЗНП и некото-
рых других задач на графах. На этой схеме стрелка от задачи A к задаче B означает, что
решение задачи A влечет за собой решение задачи B .
Можно заметить, что не все связи, изображённые на схеме, были разобраны. Наибольшее
паросочетание в графе G можно найти, как наибольшее независимое множество вершин
в рёберном графе, соответствующем G. Также, задачи наименьшего рёберного покрытия
и наибольшего паросочетания оказываются эквивалентными, и, решив одну из этих за-
дач, можно получить решение другой.

727 / 907
5.8.6. Задача о наименьшем покрытии (9/9)

728 / 907
5.9. Раскраска и планарность графов

Задача раскрашивания графов, которая на первый взгляд кажется просто праздной голо-
воломкой, имеет неожиданно широкое применение в программировании, особенно при
решении фундаментальных теоретических проблем (см., например, книгу А.П. Ершова
«Введение в теоретическое программирование»).
Обсуждение планарности в этом разделе позволяет решить вторую историческую задачу
из перечисленных в п. 5.1.1, а также подготавливает результаты, необходимые для дока-
зательства теоремы о пяти красках.

729 / 907
5.9.1. Хроматическое число графа и его оценки (1/3)
Раскраской графа G называется такое приписывание цветов (натуральных чисел) его вер-
шинам, что никакие две смежные вершины не получают одинаковый цвет.
Замечание. Часто добавляют уточняющее прилагательное и говорят правильная или до-
пустимая раскраска. Здесь никаких иных раскрасок не рассматривается, а потому при-
лагательное опускается.
Если задана допустимая раскраска графа, использующая m цветов, то говорят, что граф
m-раскрашиваемый. Наименьшее возможное количество цветов в раскраске называется
хроматическим числом и обозначается χ(G).
Примеры. χ(K p ) = 1, χ(Kp ) = p, χ(Km,n ) = 2, χ(C2n ) = 2, χ(C2n+1 ) = 3, χ(T ) = 2, где
T — свободное дерево.
Очевидно, что существует m-раскраска графа G для любого m в диапазоне
χ(G) 6 m 6 p. Множество вершин, покрашенных в один цвет, называется одноцветным
классом. Одноцветные классы образуют независимые множества вершин, то есть никакие
две вершины в одноцветном классе не смежны.
Способ явного выражения хроматического числа через другие стандартные инварианты
графа неизвестен. Известны только некоторые оценки, часть из которых приведена ниже.
730 / 907
5.9.1. Хроматическое число графа и его оценки (2/3)
Теорема. χ(G) 6 1 + ∆(G).
Доказательство. Индукция по p:
p = 1 =⇒ χ(G) = 1 & ∆(G) = 0. Пусть ∀ G (p(G) < p =⇒ χ(G) 6 ∆(G) + 1). Рассмот-
рим граф G, p(G) = p. Тогда ∀ v ∈ V (χ(G − v) 6 ∆(G − v) + 1 6 ∆(G) + 1). Но
d(v) 6 ∆(G), значит, хотя бы один цвет в (∆(G) + 1)-раскраске графа G − v свобо-
ден для v . Покрасив вершину v в этот цвет, получаем (∆(G) + 1)-раскраску графа G.
Теорема. p/β0 (G) 6 χ(G) 6 p − β0 (G) + 1.
Доказательство.
[ p/β0 (G) 6 χ(G) ] Пусть χ(G) = n и V = V1 ∪ · · · ∪ Vn , где Vi — одноцветные классы.
Vi — независимое множество вершин, следовательно, |Vi | 6 β0 (G). Имеем
n
P
p= |Vi | 6 nβ0 (G) =⇒ p/β0 6 χ.
i=1
[ χ(G) 6 p−β0 (G)+1 ] Пусть S ⊂ V — наибольшее независимое множество, |S| = β0 (G).
Тогда χ(G − S) 6 |V − S| = p − β0 (G). Из n-раскраски графа G − S можно получить
(n + 1)-раскраску графа G, так как все вершины из S можно покрасить в один новый
цвет. Следовательно, χ(G) = χ(G − S) + 1 6 p − β0 + 1. 731 / 907
5.9.1. Хроматическое число графа и его оценки (3/3)

Нахождение хроматического числа является нетривиальной и практически востребован-


ной задачей.
Пример. Предположим, что у каждой студенческой группы свой список экзаменов, кото-
рые необходимо сдать в сесиию. Если группы соответствуют разным направлениям под-
готовки, то списки сдаваемых предметов не совпадают, хотя, возможно, пересекаются.
Нужно так составить расписание сессии, чтобы экзамены для каждой группы были на-
значены в разные дни, а число экзаменационных дней было бы минимальным.
Для решения задачи построим такой граф G: множество вершин совпадает с множеством
предметов, а вершины соединены ребром, если хотя бы одна группа сдаёт оба предмета.
Тогда χ(G) определит минимальное количество экзаменационных дней.

732 / 907
5.9.2. Хроматические числа графа и его дополнения (1/2)
Хроматические числа графа G и его дополнения G связаны: если в G сравнительно мало
рёбер, то и χ(G) будет невелико, но тогда в G — много рёбер и χ(G) будет близко к p.
Теорема. Пусть χ ← χ(G), χ ← χ(G). Тогда
 2
√ p+1
2 p 6 χ + χ 6 p + 1, p 6 χχ 6 .
2

Доказательство.
n
P
[ p 6 χχ ] Пусть χ(G) = n, V1 , . . . , Vn — одноцветные классы, pi ← |Vi |. Тогда pi = p,
i=1
n
следовательно, max pi > p/n. Но Vi — независимые множества в G, следовательно, Vi —
i=1
n
клики в G. Значит, χ > max pi > p/n. Имеем χχ > n · p/n = p.
√ i=1
[ 2 p 6 χ + χ ] Известно, что среднее геометрическое двух чисел не превосходит сред-
√ √ √
него арифметического: (a + b)/2 > ab. Следовательно, χ + χ > 2 χχ > 2 p.
733 / 907
5.9.2. Хроматические числа графа и его дополнения (2/2)
Доказательство. (Продолжение)
[ χ + χ 6 p + 1 ] Индукция по p. База: p = 1 =⇒ χ = 1 & χ = 1. Пусть χ + χ 6 p для всех
графов с p − 1 вершинами. Рассмотрим граф G с p вершинами и вершину v ∈ V . Тогда,
очевидно, χ(G) 6 χ(G − v) + 1 и χ(G) 6 χ(G − v) + 1. Если χ(G) < χ(G − v) + 1 или
χ(G) < χ(G−v)+1, то χ+χ = χ(G)+χ(G) < χ(G−v)+1+χ(G−v)+1 < p+2 6 p+1.
Следовательно, χ + χ 6 p + 1. Пусть теперь χ(G) = χ(G − v) + 1 и χ(G) = χ(G − v) + 1.
Положим d ← d(v) в графе G, тогда d = p − d − 1 — степень вершины v в графе G.
Имеем d > χ(G − v). Действительно, χ(G) = χ(G − v) + 1, и если бы d < χ(G − v),
то вершину v можно было бы покрасить в любой из свободных χ(G − v) − d цветов
и получить χ(G − v)-раскраску графа G. Аналогично, d = p − d − 1 > χ(G − v). Таким
образом,

χ + χ = χ(G) + χ(G) = χ(G − v) + 1 + χ(G − v) + 1 6 d + 1 + p − d − 1 + 1 = p + 1.


√ 2
[ χχ 6 ((p + 1)/2)2 ] Имеем 2 χχ 6 χ + χ 6 p + 1. Следовательно, ((p + 1)/2) > χχ.

734 / 907
5.9.3. Точный алгоритм раскрашивания (1/2)
Поскольку точная формула для хроматического числа неизвестна, задача нахождения
наилучшей раскраски графа оказывается, как и следовало ожидать, труднорешаемой.
Рассмотрим следующую схему рекурсивной процедуры P :
1. Выбрать в графе G некоторое максимальное независимое множество вершин S .
2. Покрасить вершины множества S в очередной цвет.
3. Применить процедуру P к графу G − S .
На псевдокоде процедура P может быть записана так.
Вход: граф G(V, E), номер свободного цвета i.
Выход: раскраска, заданная массивом C[V ], — номера цветов, приписанные вершинам.
if V = ∅ then return end if //раскраска закончена
S ← Selectmax(G) //S — максимальное независимое множество
C[S] ← i //раскрашиваем вершины множества S в цвет i
P (G − S, i + 1) //рекурсивный вызов
Замечание. Функция Selectmax может быть реализована, например, на основе алгоритма
нахождения максимальных независимых множеств.
735 / 907
5.9.3. Точный алгоритм раскрашивания (2/2)
Теорема. Если граф G — k -раскрашиваемый, то существует такая последовательность
выборов множества S на шаге 1 процедуры P , что применение процедуры P к графу G
построит не более чем k -раскраску графа G.
Доказательство. Пусть имеется некоторая k -раскраска графа G(V, E). Перестроим её в
не более чем k -раскраску, которая может быть получена процедурой P . Пусть V1 ⊂ V —
множество вершин в данной k -раскраске, покрашенных в цвет 1. Множество V1 — неза-
висимое, но, может быть, не максимальное. Рассмотрим множество V1 0 , такое, что
V1 ∪V1 0 — максимальное независимое множество (может оказаться, что V1 0 = ∅). Вершины
из V1 0 не смежны с V1 , значит, вершины из V1 0 можно перекрасить в цвет 1. Пусть далее
V2 ⊂ V \ (V1 ∪ V1 0 ) — множество вершин, покрашенных в цвет 2. Аналогично рассмотрим
множество V2 0 , такое, что V2 ∪ V2 0 — максимальное независимое в G\(V1 ∪ V1 0 ), покрасим
вершины V2 ∪ V2 0 в цвет 2 и т. д. Всего в исходной раскраске было k независимых мно-
жеств. При перекраске их число не возрастёт (но может уменьшиться, если χ(G) < k ).
На каждом шаге алгоритма рассматривается одно из непустых множеств, следовательно,
процесс закончится.
736 / 907
5.9.4. Приближённые алгоритмы раскрашивания (1/5)

В предыдущем параграфе некоторый алгоритм точного раскрашивания был построен на


основе алгоритма выделения максимальных независимых множеств вершин, который
имеет переборный характер. Таким образом, предложенный алгоритм точного раскра-
шивания также имеет переборный характер. Можно показать, что это не случайно и за-
дача построения минимальной раскраски является N P -полной. При практическом ре-
шении N P -полных задач целесообразно рассматривать приближённые алгоритмы, кото-
рые не всегда находят точное решение задачи (иногда они находят только приближение
к нему, и мы не можем знать этого заранее), но зато достаточно эффективны. Здесь по-
нятие приближённого алгоритма имеет более широкий смысл по сравнению с тем, ко-
торый обычно подразумевается в вычислительной математике при проведении числен-
ных расчётов. В вычислительной математике приближённый алгоритм, например, чис-
ленное решение уравнения, находит приближение к корню с заданной точностью: x ± δ .
Увеличивая число итераций, можно уменьшать δ .

737 / 907
5.9.4. Приближённые алгоритмы раскрашивания (2/5)

Приближённые алгоритмы решения переборных задач находят решение с той точно-


стью, с какой умеют — дополнительные вычисления не улучшают решения. Поэтому при-
ближённый алгоритмы решения переборных задач характеризуются двумя параметрами:
насколько далеко найденное решение может отстоять от точного решения, и насколько
меньшие трудозатраты по сравнению с полным перебором при этом требуются.
Рассмотрим следующий алгоритм последовательного раскрашивания.
Идея состоит в том, чтобы красить вершины последовательно, выбирая среди допустимых
цвет с наименьшим номером.
Обоснование. В основном цикле рассматриваются все вершины, и каждая из них получа-
ет допустимую раскраску. Таким образом, процедура строит допустимую раскраску.

738 / 907
5.9.4. Приближённые алгоритмы раскрашивания (3/5)
Вход: граф G.
Выход: раскраска графа — массив C : array [1..p] of 1..p.
for v ∈ V do
C[v] ← 0 //все вершины не раскрашены
end for
for v ∈ V do
A ←{1, . . . , p} //все цвета
for u ∈ Γ(v) do
A ← A \ {C[u]} //занятые для вершины v цвета
end for
C[v] ← min A //свободный цвет с наименьшим номером
end for
Улучшенный алгоритм последовательного раскрашивания строит допустимую раскраску,
применяя такую эвристику: начинать раскрашивать следует с вершин наибольшей степе-
ни, поскольку если их раскрашивать в конце процесса, то более вероятно, что для них не
найдётся свободного цвета и придётся использовать ещё один. 739 / 907
5.9.4. Приближённые алгоритмы раскрашивания (4/5)
Вход: граф G.
Выход: раскраска графа — массив C : array [1..p] of 1..p.
Sort(V ) //упорядочить вершины по невозрастанию степени
c ← 1 //первый цвет
for v ∈ V do C[v] ← 0 end for //все не раскрашены
while V 6= ∅ do
for v ∈ V do
for u ∈ Γ+ (v) do
if C[u] = c then
next for v //вершину v нельзя покрасить в цвет c
end if
end for
C[v] ← c; V ← V \ {v} //красим вершину v в цвет c и удаляем её из рассмотрения
end for
c ← c + 1 //следующий цвет
end while 740 / 907
5.9.4. Приближённые алгоритмы раскрашивания (5/5)

Обоснование. Заметим, что данный алгоритм отличается от предыдущего тем, что основ-
ной цикл идет не по вершинам, а по цветам: сначала всё, что можно, красим в цвет 1, за-
тем в оставшемся красим всё, что можно, в цвет 2 и т. д. В остальном алгоритмы анало-
гичны, и данный алгоритм заканчивает свою работу построением допустимой раскраски
по тем же причинам, что и предыдущий.
Отступление. Улучшенный алгоритм последовательного раскрашивания несколько сложнее пер-
вого алгоритма и основан на остроумной эвристике. Можно было бы ожидать, что он даст суще-
ственно лучшие результаты. Однако прямые вычислительные эксперименты показывают, что эти
алгоритмы почти во всех случаях работают одинаково хорошо (или плохо). Таким образом, про-
граммистские «хитрости» далеко не всегда дают практически значимые результаты.

741 / 907
5.9.5. Хроматический полином (1/6)
Раскраски (допустимые) нетривиальных графов не являются единственными.
Обозначим P (G, n) — число раскрасок графа G в n цветов. Положим ∀ G (P (G, 0) ← 0).
Ясно, что ∀ n ∈ 0..(χ(G) − 1) (P (G, n) = 0) и ∀ n ∈ χ(G)..p (P (G, n) > 0). Для n > p
число P (G, n) не имеет естественного смысла, а потому обычно не рассматривается.
Примеры.
1. P (K1 , 1) = 1. Действительно, единственную изолированную вершину можно рас-
красить единственным образом.
2. P (K2 , 1) = 0, P (K2 , 2) = 2. Действительно, пару смежных вершин можно раскра-
сить в два цвета двумя способами.
3. P (K3 , 1) = 0, P (K3 , 2) = 0, P (K3 , 3) = 6. Действительно, первую вершину можно
покрасить в любой из трёх цветов, вторую вершину можно покрасить в один из двух
оставшихся цветов, а цвет третьей вершины определяется однозначно.
Лемма. ∀ G (max {n ∈ 0..p | P (G, n)} = P (G, p) = p!).
Доказательство. По принципу Дирихле при раскраске p вершин в p цветов каждая вер-
шина получает свой цвет, а число раскрасок равно числу перестановок. При уменьшении
числа цветов число раскрасок также уменьшается. 742 / 907
5.9.5. Хроматический полином (2/6)
Пример. P (Kp , p) = p! и ∀ i < p (P (Kp , i) = 0).
Лемма. P (G1 ∪ G2 , n) = P (G1 , n)P (G2 , n).
Доказательство. Раскраски компонент связности независимы, и значит, применимо пра-
вило произведения.
Отступление. Здесь подразумеваются нумерованные графы, вершины которых отличимы. Если
определить допустимую раскраску с точностью до изоморфизма, то подсчёт числа допустимых
раскрасок существенно усложняется. Представим себе, что диаграмма графа K2 нарисована на
листе бумаги и левая вершина покрашена в красный цвет, а правая — в синий. Тогда следует ли
считать, что это уже другая раскраска, если повернуть лист на 180 градусов? Ведь физически рису-
нок диаграммы не перекрашен! Допустим, что ответ на предыдущий вопрос отрицательный и со-
гласуется с «физическим здравым смыслом». При таком подходе треугольник K3 можно раскра-
сить всего двумя способами, которые устойчивы по отношению к поворотам изображения диа-
граммы. Однако диаграмму треугольника можно нарисовать на прозрачном стекле, и тогда ока-
зывается, что существует всего одна правильная раскраска, и всё зависит от того, с какой стороны
смотреть на диаграмму. Учёт подобных тонкостей не входит в базовые концепции языка теории
графов, и относится, скорее, к вычислительной геометрии. 743 / 907
5.9.5. Хроматический полином (3/6)
Очевидно, что χ(G) = min {n ∈ 0..p | P (G, n) > 0}, поэтому, зная числа P (G, n), нетруд-
но найти хроматическое число χ(G). В обратную сторону это рассуждение не работает:
по хроматическому числу в общем случае невозможно определить даже число мини-
мальных раскрасок.
Возникает вопрос: как найти компактное описание множества {n ∈ 0..p | P (G, n)}?
Далее в этом параграфе рассматривается один из популярных ответов на этот вопрос.
Пусть дан (p, q)-граф G. Полином PG (x) такой, что ∀ n ∈ 0..p (PG (n) = P (G, n)) назы-
вается хроматическим полиномом графа G.
Из математического анализа известно, что существует единственный интерполяционный
k
полином степени не выше k , проходящий через множество точек {(xi , yi ))}i=0 , если xi
различны. Для хроматического полинома PG (x) имеем множество точек с целочислен-
p
ными координатами {(n, P (G, n))}n=0 , а значит для любого графа G существует един-
ственный хроматический полином PG (x). В общем случае метод построения хроматиче-
ского полинома для произвольного графа неизвестен, однако в некоторых случаях хро-
матический полином удаётся построить.
744 / 907
5.9.5. Хроматический полином (4/6)
Пример. Для полного графа Kp имеем ∀ n ∈ 0..(p−1) (P (Kp , n) = 0) и
P (Kp , p) = p!, то есть искомый полином PKp (x) имеет корни 0, 1, . . . , p − 1. Из матема-
тического анализа известно, что в таком случае PKp (x) = x(x − 1) . . . (x − (p − 1)). В
частности, PK3 (x) = x(x − 1)(x − 2) и PK3 (3) = 3(3 − 1)(3 − 2) = 6, что согласуется с
предыдущими наблюдениями.
Замечание. Поскольку значение хроматического полинома требуется вычислять только
при значениях n ∈ 0..p, иногда записывают полином в следующей форме:
x!
PKp (x) = x(x − 1) . . . (x − (p − 1)) = .
(x − p)!
Следует быть осторожными при использовании подобных вольностей в обозначениях:
эта запись имеет смысл и даёт правильный результат только при значении x = p.
Удаление рёбер в графе разве что увеличивает число раскрасок.
Пример. Рассмотрим пустой граф Kp . Любую вершину можно покрасить в любой цвет,
поэтому число раскрасок — это число размещений (п. 5.1.1) и P (Kp , n) = np . Значит
PKp (x) = xp > x(x − 1) . . . (x − (p − 1)) = PKp (x).
745 / 907
5.9.5. Хроматический полином (5/6)
Теорема. [редукции] Пусть e = (u, v) — любое ребро в графе G.
Тогда PG (x) = PG−e (x) − PG/e (x).
Доказательство. Все раскраски графа G − e в n цветов можно разбить на два блока:
в один блок входят такие раскраски, в которых вершины u и v окрашены в один цвет,
в другой блок входят раскраски, в которых эти вершины покрашены в разные цвета.
Тогда в первом блоке P (G/e, n) раскрасок, а во втором блоке P (G, n) раскрасок. Это
справедливо для любого n ∈ 0..p, а значит PG−e (x) = PG (x) + PG/e (x).
Пример. Рассмотрим граф K2 . Если редуцировать ребро, то по теореме получаем
PK2 (x) = PK2 −e (x)−PK2 /e (x). Но PK2 −e (x) = PK1 ∪K1 (x) = x2 и PK2 /e (x) = PK1 (x) = x.
Поэтому PK2 (x) = x2 − x = x(x − 1).
Следствие. Если ребро e = (u, v) не входит в граф G, то PG (x) = PG+e (x) + PG/e (x).
Доказательство. Пусть G1 = G + e. Заметим, что G1 /e = G/e, так как при стягива-
нии ребра e оно исчезает. По теореме редукции PG1 (x) = PG1 −e (x) − PG1 /e (x). Тогда
PG+e (x) = PG (x) − PG/e (x).
Имея запас хроматических полиномов для простейших графов, построим хроматические
полиномы для более сложных графов по индукции, используя теорему редукции. 746 / 907
5.9.5. Хроматический полином (6/7)
Примеры. 1. Для простой цепи Pn из n вершин имеем по теореме редукции крайнего
ребра PPn (x) = PPn −e (x) − PPn /e (x) = PPn−1 ∪K1 (x) − PPn−1 (x) = xPPn−1 x − PPn−1 (x) =
= (x − 1)PPn−1 (x). Учитывая, что PP2 (x) = x(x − 1), получаем что PPn (x) = x(x − 1)n−1 .
2. Для простого цикла Cn из n вершин PCn (x) = (x − 1)n + (−1)n (x − 1). Доказательство
по индукции. PC3 (x) = PK3 (x) = x(x − 1)(x − 2) = (x − 1)3 + (−1)3 (x − 1). По теореме
редукции PCn+1 (x) = PCn+1 −e (x) − PCn+1 /e (x) = PPn (x) − PCn (x) =
= x(x − 1)n − (x − 1)n − (−1)n (x − 1) = (x − 1)n+1 + (−1)n+1 (x − 1).
3. Для свободного дерева Tn c n вершинами PTn (x) = x(x−1)n−1 . Доказательство ин-
дукцией по числу рёбер. База K2 = P2 = T2 проверена. При удалении ребра в дере-
ве оно разбивается на два дерева, а при стягивании ребра остаётся деревом с меньшим
числом вершин. Имеем по теореме редукции PTn (x) = PTk ∪Tn−k (x) − PTn−1 (x) =
= x(x−1)k−1 · x(x−1)n−k−1 − x(x−1)n−2 = x2 (x−1)n−1 − x(x−1)n−2 = x(x−1)n−1 .
Отступление. Помимо вершинной раскраски существует рёберная, т.е. при которой никакие два
смежных ребра не имеют один и тот же цвет. Реберное хроматическое число графа G равно
вершинному хроматическому числу его реберного графа I(G).
747 / 907
5.9.6. Укладка графов (1/2)
Граф укладывается на некоторой поверхности, если его можно нарисовать на этой по-
верхности так, чтобы рёбра графа при этом не пересекались. Граф называется планар-
ным, если его можно уложить на плоскости. Плоский граф — это граф, уже уложенный на
плоскости.
Область, ограниченная ребрами в плоском графе, называется гранью. Грань не содержит
других граней. Число граней плоского графа G обозначается f (G).
Замечание. Внешняя часть плоскости также образует грань.
Пример. На рисунке показаны диаграммы планарного графа K4 и две его укладки на
плоскости. Этот граф имеет 4 грани.

748 / 907
5.9.6. Укладка графов (2/2)

Отступление. Точное определение некоторых понятий, используемых в этом разделе, в частности,


таких понятий, как «поверхность», «область», «граница», выходит далеко за рамки этого учебни-
ка и стандартного курса дискретной математики. Мы полагаемся на геометрическую интуицию
читателя и не даём никаких определений. Для понимания простейших рассуждений этого разде-
ла достаточно неформальных интуитивных представлений. Однако читателю следует иметь в ви-
ду, что при решении сложных практических задач, например из вычислительной геометрии, ин-
туитивных представлений может оказаться недостаточно.

749 / 907
5.9.7. Эйлерова характеристика (1/3)

Для графов, уложенных на некоторой поверхности, справедливо определённое соотно-


шение между числом вершин, рёбер и граней графов, которые укладываются на этой по-
верхности.
Теорема. [формула Эйлера] Для связного планарного графа справедливо следующее со-
отношение: p − q + f = 2.
Замечание. Число в правой части этого соотношения называется эйлеровой характери-
стикой поверхности.
Доказательство. Индукция по q . База: q = 0 =⇒ p = 1 & f = 1. Пусть теорема верна для
всех графов с q рёбрами: p−q+f = 2. Добавим еще одно ребро. Если добавляемое ребро
соединяет существующие вершины, то легко видеть, что q 0 = q + 1, p0 = p, f 0 = f + 1 и
p0 − q 0 + f 0 = p − q − 1 + f + 1 = p − q + f = 2. Если добавляемое ребро соединяет
существующую вершину с новой, то p0 = p + 1, q 0 = q + 1, f 0 = f и
p0 − q 0 + f 0 = p + 1 − q − 1 + f = p − q + f = 2.

750 / 907
5.9.7. Эйлерова характеристика (2/3)

Следствие. [1] Если G — связный планарный граф (p > 3), то q 6 3p − 6.


Доказательство. Каждая грань ограничена по крайней мере тремя ребрами, каждое реб-
ро ограничивает не более двух граней, отсюда 3f 6 2q . Имеем
2 = p − q + f 6 p − q + 2q3
=⇒ 3p − 3q + 2q > 6 =⇒ q 6 3p − 6.
Следствие. [2] Графы K5 и K3,3 не планарны.
Доказательство.
[ K5 не планарен ] Имеем p = 5, q = p(p − 1)/2 = 10. Если K5 планарен, то по предыду-
щему следствию q = 10 6 3p − 6 = 3 · 5 − 6 = 9 — противоречие.
[ K3,3 не планарен ] Имеем p = 6, q = 9. В этом графе нет треугольников, значит, если этот
граф планарен, то в его плоской укладке каждая грань ограничена не менее чем четырьмя
ребрами и, следовательно, 4f 6 2q или 2f 6 q . По формуле Эйлера 6 − 9 + f = 2, откуда
f = 5. Имеем 2f = 2 · 5 = 10 6 q = 9 — противоречие.

751 / 907
5.9.7. Эйлерова характеристика (3/3)
Замечание. Операция подразбиения ребра x = (u, v) состоит в замене его двумя рёб-
рами, (u, w) и (w, v), где w — новая вершина. Два графа называются гомеоморфны-
ми, если они могут быть получены из одного графа подразбиением рёбер. Граф плана-
рен тогда и только тогда, когда он не содержит подграфов, гомеоморфных K5 или K3,3 .
Доказательство достаточности этого утверждения (теоремы Куратовского) выходит за
рамки данного курса.
Следствие. [3] В любом планарном графе существует вершина, степень которой не боль-
ше 5.
Доказательство. От противного. Пусть ∀ v ∈ V (d(v) > 6). Тогда
X
6p 6 d(v) = 2q =⇒ 3p 6 q,
v∈V

но q 6 3p − 6. Имеем 3p 6 3p − 6 — противоречие.
Отступление. Для случая многогранников формулу Эйлера вывел Декарт. Действительно, каркас
многогранника — это плоский граф, и обратно, связному плоскому графу (при f > 3) соответству-
ет многогранник.
752 / 907
5.9.8. Теорема о пяти красках (1/2)
Теорема. Всякий планарный граф можно раскрасить пятью красками.
Доказательство. Достаточно рассматривать связные графы, потому что компоненты связ-
ности можно раскрашивать независимо.
n
!
[ n
χ Gi = max χ (Gi ) .
i=1
i=1
Индукция по p. База: если p 6 5, то χ 6 p 6 5. Пусть теорема верна для всех связных
планарных графов с p вершинами. Рассмотрим граф G с p + 1 вершинами. По третьему
следствию к формуле Эйлера ∃ v ∈ V (d(v) 6 5). По индукционному предположению
χ(G − v) 6 5. Нужно раскрасить вершину v . Если d(v) < 5, то в 5-раскраске графа G − v
существует цвет, свободный для вершины v . Если d(v) = 5 и для Γ+ (v) использованы не
все пять цветов, то в 5-раскраске графа G − v существует цвет, свободный для вершины
v.
Остался случай, когда d(v) = 5 и все пять цветов использованы. Пусть G13 — правильный
подграф графа G − v , порожденный всеми вершинами, покрашенными в цвета 1 или 3 в
5-раскраске графа G − v . 753 / 907
5.9.9. Теорема о пяти красках (2/2)
Доказательство. (Продолжение)
Если v1 и v3 принадлежат разным ком-
понентам связности графа G13 , то в той
компоненте, в которой находится вер-
шина v1 , произведём перекраску 1 ↔ 3.
При этом получится 5-раскраска графа
G−v , но цвет 1 будет свободен для вер-
шины v .

В противном случае существует простая цепь, соединяющая v1 и v3 и состоящая из вер-


шин, покрашенных в цвета 1 и 3. Тогда вершины v2 и v4 принадлежат разным компонен-
там связности подграфа G24 (так как граф G — планарный). Перекрасим вершины 2 ↔ 4
в той компоненте связности графа G24 , которой принадлежит v2 , и получим 5-раскраску
графа G − v , в которой цвет 2 свободен для вершины v .

754 / 907
Часть III. Математическая логика и теория алгоритмов

755 / 907
6. Булевы функции (1/2)

Занимаясь исследованием законов мышления, английский математик Джордж Буль при-


менил в логике систему формальных обозначений и правил, близкую к математической.
Так возникла алгебра логики, или булева алгебра. Значение логической алгебры долгое
время игнорировалось, поскольку она не находила применения в науке и технике то-
го времени. С появлением электронной техники операции, введённые Булем, оказались
весьма полезны. Они изначально ориентированы на работу только с двумя сущностями —
истина и ложь, что хорошо согласуется с двоичным кодом, который в современных ком-
пьютерах также представляется всего двумя сигналами — ноль и единица.

756 / 907
6. Булевы функции (2/2)

Данная глава имеет двойное назначение. С одной стороны, помимо основных фактов из
теории булевых функций здесь затрагиваются весьма общие понятия, такие как реализа-
ция функций формулами, нормальные формы, двойственность, полнота. Эти понятия за-
труднительно описать исчерпывающим образом на выбранном элементарном уровне из-
ложения, но знакомство с ними необходимо. Поэтому рассматриваются частные случаи
указанных понятий на простейшем примере булевых функций. С другой стороны, мате-
риал этой главы служит для «накопления фактов» и овладения базисной логической тех-
никой, что должно создать у читателя необходимый эффект «узнавания знакомого» при
изучении довольно абстрактного и формального материала следующей главы.

757 / 907
6.1. Элементарные булевы функции

Подобно тому как в классической математике знакомство с основами анализа начинают с


изучения элементарных функций (рациональные функции вещественной переменной x,
ex , ln x, прямые и обратные тригонометрические функции и их суперпозиции), изложение
теории булевых функций естественно начать с выделения, идентификации и изучения
элементарных булевых функций (дизъюнкция, конъюнкция и т. д.).

758 / 907
6.1.1. Функции алгебры логики (1/3)
Def
Функции f : E2n → E2 , где E2 = {0, 1}, называются функциями алгебры логики, или буле-
выми функциями от n переменных. Элементы множества E2 называются истинностными
значениями. Множество булевых функций от n переменных обозначим Pn ,
Def
Pn = {f | f : E2n → E2 }.
Булеву функцию от n переменных можно задать таблицей истинности :
x1 . . . xn−1 xn f (x1 , . . . , xn )
0 ... 0 0 f (0, . . . , 0, 0)
0 ... 0 1 f (0, . . . , 0, 1)
0 ... 1 0 f (0, . . . , 1, 0)
... ... ... ... ...
1 ... 1 1 f (1, . . . , 1, 1)
Если число переменных равно n, то в таблице истинности имеется 2n строк, соответству-
ющих всем различным комбинациям значений переменных. Следовательно, существует
n
22 различных столбцов, каждый из которых определяет булеву функцию от n перемен-
ных.
759 / 907
6.1.1. Функции алгебры логики (2/3)
Если нужно задать несколько (например, k ) булевых функций от n переменных, то это
удобно сделать с помощью одной таблицы, использовав несколько столбцов:

x1 ... xn f1 (x1 , . . . , xn ) ... fk (x1 , . . . , xn )


0 ... 0 f1 (0, . . . , 0) ... fk (0, . . . , 0)
... ... ... ... ... ...
1 ... 1 f1 (1, . . . , 1) ... fk (1, . . . , 1)

Такая таблица имеет 2n строк, n столбцов для значений переменных и ещё k столбцов для
значений функций. Вообще говоря, значения переменных можно не хранить, если при-
нять соглашение о перечислении наборов переменных в определённом порядке. Далее
во всех таблицах истинности переменные всегда перечисляются в лексикографическом
порядке, а кортежи булевых значений — в порядке возрастания целых чисел, задавае-
мых кортежами как двоичными шкалами, что совпадает с лексикографическим порядком
на кортежах. Такой порядок здесь называется установленным.
760 / 907
6.1.1. Функции алгебры логики (3/3)
Из предшествующих наблюдений вытекает теорема.
n
Теорема. |Pn | = 22 .
Если k > 2n (что, как показывает предыдущая формула, не редкость), то таблицу истин-
ности удобно «транспонировать», выписывая наборы значений в столбцах, а значения
функций — в строках:

x1 0 ... 1
... ... ... ...
xn 0 ... 1
f1 f1 (0, . . . , 0) . . . f1 (1, . . . , 1)
... ... ... ...
fk fk (0, . . . , 0) . . . fk (1, . . . , 1)

Именно такой способ записи таблицы истинности использован в пп. 6.1.3 и 6.1.4.
761 / 907
6.1.2. Существенные и несущественные переменные (1/3)
Булева функция f ∈ Pn существенно зависит от переменной xi , если существует такой
набор значений a1 , . . . , ai−1 , ai+1 , . . . , an , что

f (a1 , . . . , ai−1 , 0, ai+1 , . . . , an ) 6= f (a1 , . . . , ai−1 , 1, ai+1 , . . . , an ).


В этом случае xi называют существенной переменной, в противном случае xi называют
несущественной (фиктивной) переменной.
Пример. Пусть булевы функции f1 (x1 , x2 ) и f2 (x1 , x2 ) заданы таблицей истинности:

x1 x2 f1 f2
0 0 0 1
0 1 0 1
1 0 1 0
1 1 1 0

Для этих функций переменная x1 — существенная, а переменная x2 — несущественная.


762 / 907
6.1.2. Существенные и несущественные переменные (2/3)
Пусть заданы две булевы функции, f1 (x1 , . . . , xn−1 ) и f2 (x1 , . . . , xn−1 , xn ), и пусть пере-
менная xn — несущественная для функции f2 , а при одинаковых значениях остальных
переменных значения функций совпадают:

∀ a1 , . . . , an−1 , an (f1 (a1 , . . . , an−1 ) = f2 (a1 , . . . , an−1 , an )) .


В таком случае говорят, что f2 получается из f1 введением несущественной переменной
xn , а f1 получается из f2 удалением несущественной переменной xn .
Замечание. Процедурно введение и удаление несущественных переменных выполняют-
ся достаточно просто. Чтобы ввести несущественную переменную, нужно продублиро-
вать каждую строку таблицы истинности, добавить новый столбец и заполнить этот стол-
бец чередующимися значениями 0 и 1 (или 1 и 0, что несущественно). Удаление несу-
щественной переменной выполняется аналогично: нужно отсортировать таблицу истин-
ности так, чтобы она состояла из пар строк, различающихся только в разряде несуще-
ственной переменной, после чего удалить столбец несущественной переменной и уда-
лить каждую вторую строку таблицы.
763 / 907
6.1.2. Существенные и несущественные переменные (3/3)

Всюду в дальнейшем булевы функции рассматриваются с точностью до несуществен-


ных переменных. Это позволяет считать, что все булевы функции (в данной системе функ-
ций) зависят от одних и тех же переменных. Для этого в данной системе булевых функ-
ций можно сначала удалить все несущественные переменные, а потом добавить несуще-
ственные переменные так, чтобы уравнять количество переменных у всех функций.

764 / 907
6.1.3. Булевы функции одной переменной

В следующей таблице собраны все булевы функции одной переменной. Две из них, фак-
тически, являются константами, поскольку их значения не зависят от значения аргумен-
та.
Переменная x 0 1
Название Обозначение Несущественные
Нуль 0 0 0 x
Тождественная x 0 1
0
Отрицание ¬x, x̄, x , ∼ x 1 0
Единица 1 1 1 x

765 / 907
6.1.4. Булевы функции двух переменных (1/2)
В следующих двух таблицах собраны все булевы функции двух переменных. Из них две
являются константами, четыре зависят от одной переменной, и только десять существен-
но зависят от обеих переменных.
Переменная x 0 0 1 1
Переменная y 0 1 0 1
Название Обозначение Несущественные
Нуль 0 0 0 0 0 x, y
Конъюнкция ·, & , ∧ 0 0 0 1
0 0 1 0
0 0 1 1 y
0 1 0 0
0 1 0 1 x
Сложение по модулю 2 +, +2 , 6≡, ⊕, M 0 1 1 0
Дизъюнкция ∨ 0 1 1 1

766 / 907
6.1.4. Булевы функции двух переменных (2/2)
Переменная x 0 0 1 1
Переменная y 0 1 0 1
Название Обозначение Несущественные
Стрелка Пирса ↓ 1 0 0 0
Эквивалентность ≡ 1 0 0 1
1 0 1 0 x
1 0 1 1
1 1 0 0 y
Импликация →, ⇒, ⊃ 1 1 0 1
Штрих Шеффера | 1 1 1 0
Единица 1 1 1 1 1 x, y
Замечание. Пустоты в столбцах «Название» и «Обозначение» в предыдущих таблицах
означают, что булева функция редко используется, а потому не имеет специального на-
звания и обозначения.
767 / 907
6.1.5. Функции k -значной логики (1/3)

Рассмотрим множество Ek = {0, 1, . . . , k − 1} и множество функций Pk,n , имеющих n ар-


гументов типа Ek и возвращающих значение типа Ek . Такие функции называются функ-
циями k -значной логики и являются обобщением функций алгебры логики: P2,n = Pn .
Функции k -значной логики можно задавать таблицами, подобными таблицам истинно-
сти для обычной двузначной логики, причём в таблицах используются элементы из мно-
n
жества Ek , а не из множества E2 . Нетрудно видеть, что |Pk,n | = k k . Число функций
k -значной логики растет ещё быстрее, чем число булевых функций. Так, уже для трёх-
значной логики аналог таблицы п. 6.1.4 для всех функций двух переменных содержит
39 = 19 683 строк и не может быть помещён в книгу или на слайды.

768 / 907
6.1.5. Функции k -значной логики (2/3)
Функцию k -значной логики можно представить как систему функций обычной двузнач-
ной логики следующим образом. Функция f (x1 , . . . , xn ) ∈ Pk,n представляется системой
функций {g1 (y11 , . . . , y1m , . . . , yn1 , . . . , ynm ), . . . , gm (y11 , . . . , y1m , . . . , yn1 , . . . , ynm )}, где
m = dlog ke. Здесь значения функции f и переменных xi принадлежат множеству Ek , а
значения функций gj и переменных yij принадлежат множеству E2 .
При этом, если значение переменной xi имеет двоичный код ai1 . . . aim , то значение
функции f (x1 , . . . , xn ) имеет двоичный код
g1 (a11 , . . . , a1m , . . . , an1 , . . . , anm ) . . . gm (a11 , . . . , a1m , . . . , an1 , . . . , anm ). Другими слова-
ми, функция gj вычисляет j -ю цифру в двоичном представлении числа f (x1 , . . . , xn ).
Таким образом, хотя k -значная логика может быть сведена к двузначной логике, и мно-
гие полезные утверждения двузначной логики распространяются на случай k -значной
логики, но вычислительные процедуры во всех случаях являются существенно более тру-
доёмкими для функций k -значной логики.

769 / 907
6.1.5. Функции k -значной логики (3/3)
Пример. В трёхзначной логике x1 y11 y12 x2 y21 y22 x1 & x2 g1 g2
E3 = {0, 1, 2}, k = 3 и m = dlog 3e = 2. 0 00 0 00 0 00
Рассмотрим функцию «трёхзначная 0 00 1 01 0 00
конъюнкция», которую можно опре- 0 00 2 10 0 00
делить, например, как минимум ис- 1 01 0 00 0 00
тинностных значений аргументов: 1 01 1 01 1 01
x1 & x2 ← min(x1 , x2 ). 1 01 2 10 1 01
В таком случае таблица истинности име- 2 10 0 00 0 00
ет вид, показанный справа. 2 10 1 01 1 01
2 10 2 10 2 10
Таким образом, конъюнкцию представляет следующая система функций:
g1 (y11 , y12 , y21 , y22 ) = y11 & y21 ,
g2 (y11 , y12 , y21 , y22 ) = y12 & y22 ∨ y12 & y21 ∨ y11 & y22 .
Функции k -значной логики далее в этом курсе не рассматриваются.
770 / 907
6.2. Формулы

В этом разделе обсуждается целый ряд важных понятий, которые часто считаются само-
очевидными, а потому их объяснение опускается. Такими понятиями являются, в частно-
сти, само понятие формулы, реализация функций формулами, интерпретация формул для
вычисления значений функций, равносильность формул, подстановка и замена в форму-
лах. Между тем программная реализация работы с формулами требует учёта некоторых
тонкостей, связанных с данными понятиями, которые целесообразно явно указать и об-
судить.

771 / 907
6.2.1. Реализация функций формулами (1/8)
Начнём обсуждение с привычного понятия формулы. Вообще говоря, формула — это це-
почка символов, имеющих заранее оговорённый смысл. Обычно формулы строятся по
определённым правилам из обозначений объектов и вспомогательных символов — раз-
делителей. Применительно к рассматриваемому случаю объектами являются перемен-
ные и обозначения булевых функций, перечисленные в таблицах пп. 6.1.3 и 6.1.4, а раз-
делителями — скобки «(», «)» и запятая «,». Мы считаем, что обозначения всех объектов
определены и отличимы друг от друга и от разделителей, а правила составления формул
известны.
Замечание. Для обозначения объектов используются как отдельные символы, так и груп-
пы символов, в том числе со специальным начертанием: верхние и нижние индексы, на-
клон шрифта и т. п. Допущение о синтаксической различимости остаётся в силе для всех
таких особенностей.
Пример. Операцию сложения чисел принято обозначать знаком «+», а функцию «си-
нус» — словом «sin», которое записывается прямым шрифтом и считается одним сим-
волом.
772 / 907
6.2.1. Реализация функций формулами (2/8)
Отступление. В математических текстах часто используется нелинейная форма записи формул,
при которой формула не является цепочкой символов. Примерами могут служить дроби, радика-
лы, суммы, интегралы. Подобные нелинейные формы записи формул привычны и удобны. Исполь-
зование нелинейной записи формул не является принципиальным расширением языка формул.
Можно ограничиться только линейными цепочками символов, что блестяще подтверждает систе-
ма TeX, с помощью которой подготовлены эти слайды.
Пусть F = {f1 , . . . , fm } — некоторое множество булевых функций от n переменных.
Формулой F над F называется выражение (цепочка символов) вида

F[F ] = f (t1 , . . . , tn ),

где f ∈ F и ti — либо переменная, либо формула над F . Множество F называется ба-


зисом, функция f называется главной (внешней) операцией (функцией), а ti называются
подформулами.

773 / 907
6.2.1. Реализация функций формулами (3/8)

Если базис F ясен из контекста, то его обозначение опускают.


Множество всех формул над базисом F здесь обозначается F[F ].
Замечание. Обычно при записи формул, составленных из элементарных булевых функ-
ций, обозначения бинарных булевых функций записываются как знаки операций в ин-
фиксной форме, отрицание записывается как знак унарной операции в префиксной фор-
ме, тождественные функции записываются как константы 0 и 1, устанавливается приори-
тет операций (¬, & , ∨ , →), и лишние скобки опускаются.
Всякой формуле F однозначно соответствует некоторая функция f . Это соответствие за-
даётся приведённым на следующем слайде алгоритмом интерпретации, который поз-
воляет вычислить значение формулы F при заданных значениях переменных.
Алгоритм интерпретации реализован рекурсивной функией Eval.

774 / 907
6.2.1. Реализация функций формулами (4/8)
Вход: формула F , множество F функций базиса, значения переменных x1 , . . . , xn .
Выход: значение формулы F на значениях x1 , . . . , xn или значение fail, если значение
формулы не может быть определено.
if F = 0 xi 0 return xi end if //значение переменной задано
if F = 0 f (t1 , . . . , tn )0 then
if f 6∈ F return fail end if //функция не входит в базис
for i ∈ 1..n do
yi ← Eval (ti , F, x1 , . . . , xn ) //значение i-го аргумента
if yi = fail then
return fail //аргумент не может быть вычислен
end if
end for
return f (y1 , . . . , yn ) //вычисленное значение главной операции
end if
return fail //это не формула
775 / 907
6.2.1. Реализация функций формулами (5/8)

Некоторые программистские замечания по поводу процедуры Eval.


Замечание.
1. При программной реализации алгоритма интерпретации формул важно учитывать, что
в общем случае результат вычисления значения формулы может быть не определён (fail).
Это имеет место, если формула построена синтаксически неправильно или если в ней ис-
пользуются функции (операции), способ вычисления которых не задан, то есть они не вхо-
дят в базис. Таким образом, необходимо либо проверять правильность формулы до на-
чала работы алгоритма интерпретации, либо предусматривать невозможность вычисле-
ния значения в самом алгоритме.
2. Это не единственный возможный алгоритм вычисления значения формулы, более того,
он не самый лучший. Для конкретных классов формул, например, для некоторых классов
формул, реализующих булевы функции, известны более эффективные алгоритмы (см.,
например, п. 6.5.3)

776 / 907
6.2.1. Реализация функций формулами (6/8)
3. Сама идея этого алгоритма: «сначала вычисляются значения аргументов, а потом зна-
чение функции», — не является догмой.
Например, можно построить такой алгоритм интерпретации, который вычисляет значе-
ния только некоторых аргументов, а потом вычисляет значение формулы, в результа-
те чего получается новая формула, реализующая функцию, которая зависит от меньшего
числа аргументов. Такой алгоритм интерпретации называется смешанными вычисления-
ми.
4. Порядок вычисления аргументов считается неопределённым, то есть предполагает-
ся, что базисные функции не имеют побочных эффектов. Если же базисные функции
имеют побочные эффекты, то результат вычисления значения функции может зависеть
от порядка вычисления значений аргументов. Побочные эффекты могут иметь различ-
ные причины. Наиболее частая: использование глобальных переменных. Например, ес-
Def Def
ли f (x) = a ← a + 1; return x + a, g(x) = a ← a ∗ 2; return x ∗ a, причём переменная
a глобальна, то (если a 6= 6) f (2) + g(3) 6= g(3) + f (2).
777 / 907
6.2.1. Реализация функций формулами (7/8)
Если формула F и базис F заданы, то процедура Eval(F, F, x1 , . . . , xn ) является некото-
рой булевой функцией f переменных x1 , . . . , xn . В этом случае говорят, что формула F
реализует функцию f , и записывают это так: func F = f .
Замечание. Для обозначения реализуемости применяют и другие приёмы. Выбранное
обозначение обладает тем достоинством, что согласовано с другими обозначениями в
слайдах.
Зная таблицы истинности для функций базиса, можно вычислить таблицу истинности той
функции, которую реализует данная формула.
Примеры. 1. F1 ←(x1 ∧ x2 ) ∨ ((x1 ∧ x2 ) ∨ (x1 ∧ x2 ))
x1 x2 x1 ∧ x2 x1 ∧ x2 (x1 ∧ x2 ) ∨ (x1 ∧ x2 ) x1 ∧ x2 F1
0 0 0 0 0 0 0
0 1 0 1 1 0 1
1 0 1 0 1 0 1
1 1 0 0 0 1 1
Таким образом, формула F1 реализует дизъюнкцию.
778 / 907
6.2.1. Реализация функций формулами (8/8)
2. F2 ←(x1 ∧ x2 ) → x1
x1 x2 x 1 ∧ x2 F2
0 0 0 1
0 1 0 1
1 0 0 1
1 1 1 1
Таким образом, формула F2 реализует константу 1.

3. F3 ←((x1 ∧ x2 ) + x1 ) + x2
x1 x2 x1 ∧ x2 (x1 ∧ x2 ) + x1 ((x1 ∧ x2 ) + x1 ) + x2
0 0 0 0 0
0 1 0 0 1
1 0 0 1 1
1 1 1 0 1
Таким образом, формула F3 также реализует дизъюнкцию.

779 / 907
6.2.2. Равносильные формулы (1/2)
Функция может иметь несколько реализаций над данным базисом. Формулы, реализую-
щие одну и ту же функцию, называются равносильными:
Def
F1 = F2 = ∃ f (func F1 = f & func F2 = f ). Отношение равносильности формул явля-
ется эквивалентностью. Имеют место, в частности, следующие равносильности.
1. a ∨ a = a, a ∧ a = a.
2. a ∨ b = b ∨ a, a ∧ b = b ∧ a.
3. a ∨ (b ∨ c) = (a ∨ b) ∨ c, a ∧ (b ∧ c) = (a ∧ b) ∧ c.
4. (a ∧ b) ∨ a = a, (a ∨ b) ∧ a = a.
5. a ∨ (b ∧ c) = (a ∨ b) ∧ (a ∨ c), a ∧ (b ∨ c) = (a ∧ b) ∨ (a ∧ c).
6. a ∨ 1 = 1, a ∧ 0 = 0.
7. a ∨ 0 = a, a ∧ 1 = a.
8. ¬¬a = a.
9. ¬(a ∧ b) = ¬a ∨ ¬b, ¬(a ∨ b) = ¬a ∧ ¬b.
10. a ∨ ¬a = 1, a ∧ ¬a = 0.
Все указанные равносильности могут быть легко проверены построением соответствую-
щих таблиц истинности. Таким образом, hE2 ; ∨ , ∧, ¬i — булева алгебра.
780 / 907
6.2.2. Равносильные формулы (2/2)
Замечание. Если некоторая бинарная операция ассоциативна, то в формуле, построен-
ной с применением такой операции, порядок выполнения операций не важен и скобки
можно опустить. Другими словами, ассоциативная бинарная операция определяет груп-
повую операцию, применимую не только к паре, но и к любому набору аргументов. В этом
случае употребляют также термины кратная операция и вариаргументная операция. Если
же операция вдобавок коммутативна, то не только скобки можно опустить, но и аргумен-
ты групповой операции можно записывать в любом порядке. Ввиду выполнения равно-
сильностей 2 и 3, можно определить кратные операции дизъюнкции и конъюнкции, для
которых используются следующие обозначения:
n n
Def Def Def
_ ^
xi = x1 ∨ . . . ∨ xn , x i = x 1 ∧ · · · ∧ x n = x 1 . . . xn .
i=1 i=1

Аналогичными свойствами обладают сложение и умножение чисел, объединение и пере-


сечение множеств.
781 / 907
6.2.3. Подстановка и замена (1/4)
Если в формулу F входит переменная x, то это обстоятельство обозначается так:
F(. . . x . . . ). Соответственно, запись F(. . . G . . . ) обозначает, что в формулу F входит
подформула G .
Вместо подформулы (в частности, вместо переменной) в формулу можно подставить дру-
гую формулу (в частности, переменную), в результате чего получится новая правильно
построенная формула.
Если подстановка формулы G производится вместо всех вхождений заменяемой пере-
менной x (или подформулы), то результат подстановки обозначается следующим обра-
зом: F(. . . x . . . )[G/x]. Если же подстановка производится вместо некоторых вхождений
(в том числе вместо одного), то результат подстановки не имеет общепринятого обозна-
чения. В этом курсе принято дублировать знак подстановки и писать между знаками спи-
сок номеров вхождений, подлежащих замене. При этом если номера не указываются, то
подразумевается некоторое одно вхождение.

782 / 907
6.2.3. Подстановка и замена (2/4)
Примеры.
1. Замена всех вхождений переменной: x ∨ ¬x[y ∧ z/x] = (y ∧ z) ∨ ¬(y ∧ z).
2. Замена всех вхождений подформулы: x ∨ y ∨ z[¬x/y ∨ z] = x ∨ ¬x.
3. Замена первого вхождения переменной: x ∨ ¬x[y/1/x] = y ∨ ¬x.
4. Замена первого вхождения подформулы: x ∨ y ∨ z[¬x/1/y ∨ z] = x ∨ ¬x.
Известны два правила: правило подстановки и правило замены, которые позволяют пре-
образовывать формулы с сохранением равносильности.
Теорема. [Правило подстановки] Если в двух равносильных формулах вместо всех вхож-
дений некоторой переменной x подставить одну и ту же формулу, то получатся равно-
сильные формулы:

∀G F1 (. . . x . . . ) = F2 (. . . x . . . ) =⇒ F1 (. . . x . . . )[G/x] = F2 (. . . x . . . )[G/x] .

783 / 907
6.2.3. Подстановка и замена (3/4)
Доказательство. Чтобы доказать равносильность двух формул, нужно показать, что они
реализуют одну и ту же функцию. А это можно сделать, если взять произвольный набор
значений переменных и убедиться, что значения, полученные при вычислении формул,
совпадают.
Рассмотрим произвольный набор значений a1 , . . . , ax , . . . , an переменных
x1 , . . . , x, . . . , xn . Обозначим a ← Eval(G, F, a1 , . . . , ax , . . . , an ). По определению алго-
ритма интерпретации
Eval(F1 [G/x], F, a1 , . . . , ax , . . . , an ) = Eval(F1 , F, a1 , . . . , a, . . . , an )
и, аналогично,
Eval(F2 [G/x], F, a1 , . . . , ax , . . . , an ) = Eval(F2 , F, a1 , . . . , a, . . . , an ).
Но F1 = F2 и, значит,
Eval(F1 , F, a1 , . . . , ax , . . . , an ) = Eval(F2 , F, a1 , . . . , ax , . . . , an ),
откуда Eval(F1 [G/x], F, a1 , . . . , ax , . . . , an ) = Eval(F2 [G/x], F, a1 , . . . , ax , . . . , an ).
784 / 907
6.2.3. Подстановка и замена (4/4)

Замечание. В правиле подстановки условие замены всех вхождений существенно: напри-


мер, x ∨ ¬x = 1 и x ∨ ¬x[y/x] = y ∨ ¬y = 1, но x ∨ ¬x[y/1/x] = y ∨ ¬x 6= 1.
Теорема. [Правило замены] Если в формуле заменить некоторую подформулу равносиль-
ной формулой, то получится формула, равносильная исходной:

∀ F(. . . G1 . . . ) (G1 = G2 =⇒ F(. . . G1 . . . ) = F(. . . G1 . . . )[G2 //G1 ]) .

Доказательство. Рассмотрим произвольный набор значений a1 , . . . , an переменных


x1 , . . . , xn . Имеем G1 = G2 и, значит, Eval(G1 , F, a1 , . . . , an ) = Eval(G2 , F, a1 , . . . , an ),
откуда Eval(F[G1 //G1 ], F, a1 , . . . , an ) = Eval(F[G2 //G1 ], F, a1 , . . . , an ).
Пусть F = {f1 , . . . , fm } и G = {g1 , . . . , gm }. Тогда говорят, что формулы F[F ] и G[G]
имеют одинаковое строение, если F совпадает с результатами подстановки в формулу G
функций fi вместо функций gi : F[F ] = G[G][fi /gi ]m i=1 .

785 / 907
6.2.4. Алгебра булевых функций (1/3)
Булевы функции ∨ , ∧, ¬ (и любые другие) могут рассматриваться как операции на мно-
жестве булевых функций, ∨ , ∧ : Pn × Pn → Pn , ¬ : Pn → Pn . Действительно, пусть фор-
мулы F1 и F2 равносильны и реализуют функцию f , а формулы G1 и G2 равносильны и
реализуют функцию g : func F1 = f , func F2 = f , func G1 = g , func G2 = g . Тогда, приме-
няя правило замены нужное число раз, имеем

F1 ∨ G1 = F2 ∨ G2 , F1 ∧ G1 = F2 ∧ G2 , ¬F1 = ¬F2 .

Таким образом, если взять любые формулы F и G , реализующие функции f и g соответ-


ственно, то каждая из формул F ∧ G , F ∨ G и ¬F реализует одну и ту же функцию, неза-
висимо от выбора реализующих формул F и G . Следовательно, функции, которые реа-
лизуются соответствующими формулами, можно по определению считать результатами
применения соответствующих операций. Другими словами, если func F = f , func G = g ,
Def Def Def
то f ∧ g = func(F ∧ G), f ∨ g = func(F ∨ G), ¬f = func(¬F). Алгебраическая струк-
тура hPn ; ∨ , ∧, ¬i называется алгеброй булевых функций.
786 / 907
6.2.4. Алгебра булевых функций (2/3)
Теорема. Алгебра булевых функций является булевой алгеброй.
Доказательство. Действительно, пусть равносильности, перечисленные в п. 6.2.3, прове-
рены путем построения таблиц истинности. Ясно, что эти таблицы не зависят от того, отку-
да взялись значения a, b, c. Таким образом, вместо a, b, c можно подставить любые функ-
ции, а значит, любые реализующие их формулы, поскольку выполнено правило подста-
новки. Следовательно, аксиомы булевой алгебры выполнены в алгебре hPn ; ∨ , ∧, ¬i.
Пусть [F] — множество формул, равносильных F (то есть класс эквивалентности по отно-
шению равносильности). Рассмотрим множество K классов эквивалентности по отноше-
нию равносильности. Пусть операции ∨ , ∧ : K × K → K, ¬ : K → K определены следу-
Def Def Def
ющим образом: [F1 ] ∨ [F2 ] = [F1 ∨ F2 ], [F1 ] ∧ [F2 ] = [F1 ∧ F2 ], ¬[F1 ] = [¬F1 ].
Тогда функция func, сопоставляющая формуле булевскую функцию, которую она реали-
зует, является гомоморфизмом относительно операций ∧, ∨, ¬, и к ней можно применить
теорему о гомоморфизме (п. 4.7.6). В этом случае Im func ⊂ Pn и Dom func = F[∨, ∧, ¬].

787 / 907
6.2.4. Алгебра булевых функций (3/3)
Замечание. В пп. 6.4.3 и 6.6.4 показано, что func(F[∨, ∧, ¬]) = Pn , то есть достаточно
рассматривать только формулы, построенные над базисом {∨, ∧, ¬}.
Применение теоремы о гомоморфизме гласит

F[∨, ∧, ¬]/ ker func ∼ hPn ; ∨, ∧, ¬i .

Другими словами, алгебра классов равносильных формул (алгебра Линденбаума–Тарского)


изоморфна алгебре булевых функций и, следовательно, является булевой алгеброй.
Носитель этой алгебры — множество классов формул.
Отступление. На практике мы говорим о функциях, а пишем формулы, хотя формулы и функ-
ции — разные вещи. Например, формул бесконечно много, а функций (булевых функций n пере-
менных) — только конечное число, и свободная алгебра формул не изоморфна алгебре функций.
Но алгебра функций изоморфна алгебре классов равносильных формул, что позволяет манипули-
ровать формулами, имея в виду функции.

788 / 907
6.3. Двойственность и симметрия

Понятия двойственности и симметрии с успехом применяется в самых разных областях


математики. Мы рассматриваем двойственность и симметрию на простейшем примере
булевых функций.

789 / 907
6.3.1. Двойственные и самодвойственные функции (1/3)
Пусть f (x1 , . . . , xn ) ∈ Pn — булева функция. Тогда функция f ∗ (x1 , . . . , xn ), определённая
следующим образом:
Def
f ∗ (x1 , . . . , xn ) = f (x1 , . . . , xn ),
называется двойственной к функции f . Из определения видно, что двойственность ин-
волютивна: f ∗∗ = f , и по этой причине отношение «быть двойственной к» на множестве
булевых функций симметрично, то есть если f ∗ = g , то g ∗ = f . Если в таблице истин-
ности булевой функции f инвертировать все значения, то получим таблицу истинности
двойственной функции f ∗ .
Пример.
x1 x2 x1 ∧ x2 x1 x2 (x1 ∧ x2 )∗ x1 x2 (x1 ∧ x2 )∗
0 0 0 1 1 1 0 0 0
0 1 0 1 0 1 = 0 1 1
1 0 0 0 1 1 1 0 1
1 1 1 0 0 0 1 1 1
Таким способом можно определить двойственную функцию для любой булевой функции.
790 / 907
6.3.1. Двойственные и самодвойственные функции (2/3)
Замечание. Если функции двойственны, то их отрицания также двойственны.
Пример. В таблице ниже приведены все пары двойственных функций двух переменных.
Для каждой функции указан вектор значений при установленном порядке перечисления
кортежей и обозначение, если оно введено в таблице п. 6.1.4.

f 0000 0001 0010 0011 0100 0101 0110 1000 1010 1100
0 x&y x y x +2 y x↓y ¬y ¬x
1 x∨y x y x≡y x|y ¬y ¬x
f∗ 1111 0111 1011 0011 1101 0101 1001 1110 1010 1100

Функция называется самодвойственной, если f ∗ = f .


Пример. Тождественная функция и отрицание самодвойственны, все функции двух суще-
ственных переменных, а также константы не самодвойственны.
Замечание. Если функция самодвойственна, то ее отрицание также самодвойственно.
791 / 907
6.3.1. Двойственные и самодвойственные функции (3/3)
n−1
Теорема. Существует 22 самодвойственных функций n переменных.
Доказательство. Из алгоритма построения двойственной функции следует, что функция
самодвойственна тогда и только тогда, когда вектор значений функции в таблице истин-
ности является зеркально инверсным относительно своей середины. Получается, что пер-
вая половина вектора значений самодвойственной функции однозначно задаёт вторую.

Пример. Функция «голосования» m(x, y, z) (эту функцию называют также мажоритар-


ной) принимает значение 1, если большинство переменных принимают значение 1. Из
приведённой таблицы истинности функции голосования видно, что она самодвойствен-
на.
x 0 0 0 0 1 1 1 1
y 0 0 1 1 0 0 1 1
z 0 1 0 1 0 1 0 1
m 0 0 0 1 0 1 1 1

792 / 907
6.3.2. Реализация двойственной функции
Формула, реализующая двойственную функцию, определённым образом связана с фор-
мулой, реализующей исходную функцию.
Def
Замечание. Далее используется обозначение f (· · · ) = f (· · · ).
Теорема. Если функция ϕ(x1 , . . . , xn ) реализована формулой
f (f1 (x1 , . . . , xn ), . . . , fn (x1 , . . . , xn )),
то формула
f ∗ (f1∗ (x1 , . . . , xn ), . . . , fn∗ (x1 , . . . , xn ))
реализует функцию ϕ∗ (x1 , . . . , xn ).
Доказательство.
ϕ∗ (x1 , . . . , xn ) = ϕ(x1 , . . . , xn ) = f (f1 (x1 , . . . , xn ), . . . , fn (x1 , . . . , xn )) =
= f (f1 (x1 , . . . , xn ), . . . , (fn (x1 , . . . , xn )) =
= f (f1∗ (x1 , . . . , xn ), . . . , fn∗ (x1 , . . . , xn )) =
= f ∗ (f1∗ (x1 , . . . , xn ), . . . , fn∗ (x1 , . . . , xn )).
793 / 907
6.3.3. Принцип двойственности (1/2)
Принцип двойственности устанавливает связь между структурами формул, реализующих
пару двойственных функций. Рассмотрим две системы булевых функций, F = {f1 , . . . , fm }
и F ∗ = {f1∗ , . . . , fm

}, и введём обозначение
Def
F ∗ [F ∗ ] = F[F ][fi∗ /fi ]m
i=1 .

Теорема.[Принцип двойственности] Пусть F = {f1 , . . . , fm } — система булевых функ-


ций, а F ∗ = {f1∗ , . . . , fm

} — система двойственных функций. Тогда если формула F над
базисом F реализует функцию f , то формула F ∗ над базисом F ∗ , полученная заменой
функций fi двойственными функциями fi ∗ , реализует функцию f ∗ :
func F[F ] = f =⇒ func F ∗ [F ∗ ] = f ∗ .
Доказательство. Индукция по структуре формулы F . База: если формула F имеет вид
f (x1 , . . . , xn ), где f ∈ F , то формула F ∗ = f ∗ (x1 , . . . , xn ) реализует функцию f ∗ по
определению. Индукционный переход по теореме п. 6.3.2.
Следствие. F1 = F2 =⇒ F1 ∗ = F2 ∗ .
794 / 907
6.3.3. Принцип двойственности (2/2)

Пример. Из x1 ∧ x2 = x1 ∨x2 по принципу двойственности сразу имеем x1 ∨ x2 = x1 ∧x2 .


Отступление. Хорошо известен принцип математической индукции для натуральных чисел:

(P (1) & (P (n) =⇒ P (n + 1))) =⇒ ∀ n ∈ N (P (n)) .

Этот принцип является справедливым и для других множеств, упорядоченных более сложным
образом, нежели натуральные числа. Например, в доказательстве предыдущей теоремы был ис-
пользован принцип индукции в следующей форме.
Пусть задана некоторая иерархия. Предположим, что 1) некоторое утверждение P справедливо
для всех узлов иерархии нижнего уровня; 2) из того, что утверждение P справедливо для всех
узлов, подчинённых данному узлу, следует, что утверждение P справедливо для данного узла.
Тогда утверждение P справедливо для всех узлов иерархии.

795 / 907
6.3.4. Симметрические функции (1/2)

Булева функция n переменных называется симметрической, если её значение инвари-


антно относительно перестановок значений аргументов. Заметим, что при перестановке
значений в наборе общее количество нулей и единиц сохраняется. Понятие симметри-
ческой функции применимо только к функциям двух и большего числа переменных.
Примеры. Конъюнкция, сложение по модулю 2, дизъюнкция, стрелка Пирса, эквивалент-
ность и штрих Шеффера являются симметрическими булевыми функциями. Других сим-
метрических булевых функций двух существенных переменных нет.
Отступление. Симметрические функции изучаются и используются во многих разделах матема-
тики. Например, обычные сложение и умножение в арифметике уже являются симметрическими
функциями. Формула
p Герона площади треугольника
S(a, b, c) = p(p − a)(p − b)(p − c), где p ←(a + b +pc)/2 и формула определения расстояния
между точкой и началом координат R(x1 , x2 , x3 ) = x21 + x22 + x23 являются примерами сим-
метрических функций в элементарной геометрии.

796 / 907
6.3.4. Симметрические функции (2/2)

Теорема. Существует 2n+1 различных симметрических булевых функций n переменных.


Доказательство. Ясно, что на любом наборе значений n переменных, в котором содер-
жится k значений 1 (и, соответственно, n − k значений 0), симметрическая функция при-
нимает одно и то же значение (1 или 0). Таким образом, симметрическую функцию f от n
переменных можно задать булевским вектором (f0 , f1 , . . . , fn ), где fi — значение функ-
ции на наборах значений, содержащих i единиц. Всего существует 2n+1 таких наборов.

Примеры.
1. Функция голосования является симметрической.
2. Формула ¬x ∧ y ∧ z ∨ x ∧ ¬y ∧ z ∨ x ∧ y ∧ ¬z реализует функцию, которая также
является симметрической.

797 / 907
6.4. Нормальные формы

В данном разделе на примере булевых функций обсуждается важное понятие нормаль-


ная форма, то есть синтаксически однозначный способ записи формулы, реализующей
заданную функцию.

798 / 907
6.4.1. Разложение булевых функций по переменным (1/2)
Def
Положим xy = x ∧ y ∨ x ∧ y . Очевидно, что

xy = x ≡ y = if y then x else x end if = if x = y then 1 else 0 end if.

Теорема. [О разложении булевой W


функции по переменным]
f (x1 , . . . , xm , xm+1 , . . . , xn ) = xσ1 1 ∧ . . . ∧ xσmm ∧ f (σ1 , . . . , σm , xm+1 , . . . , xn ), где
(σ1 ,...,σm )
дизъюнкция берётся по всем возможным наборам (σ1 , . . . , σm ).
Доказательство. Рассмотрим значение формулы в правой части на наборе
!значений
xσ1 1 ∧ . . . ∧ xσmm ∧ f (σ1 , . . . , σm , xm+1 , . . . , xn ) (a1 , . . . , an ) =
W
a1 , . . . , an . Имеем
(σ1 ,...,σm )
aσ1 1 ∧ . . . ∧ aσmm ∧ f (σ1 , . . . , σm , am+1 , . . . , an ). Все конъюнкции, в которых
W
=
(σ1 ,...,σm )
∃ i (ai 6= σi ), равны 0, и их можно опустить, поэтому остаётся только одно слагаемое, для
которого ∀ i ∈ 1..m (ai = σi ), значит
aa11 ∧ . . . ∧ aamm ∧ f (a1 , . . . , am , am+1 , . . . , an ) = f (a1 , . . . , an ).
799 / 907
6.4.1.Разложение булевых функций по переменным (2/2)
Замечание. Здесь доказывается, что некоторая формула реализует заданную функцию.
Для этого достаточно взять произвольный набор значений аргументов функции, вычис-
лить на этом наборе значение формулы, и если оно окажется равным значению функции
на этом наборе аргументов, то из этого следует доказываемое утверждение.
Следствие. [Разложение булевой функции по одной переменной]

f (x1 , . . . , xn−1 , xn ) = (xn ∧ f (x1 , . . . , xn−1 , 1)) ∨ (xn ∧ f (x1 , . . . , xn−1 , 0)) .

Следствие. [Разложение булевой функции по всем переменным]


_
f (x1 , . . . , xn ) = xσ1 1 ∧ . . . ∧ xσnn .
{(σ1 ,...,σn )|f (σ1 ,...,σn )=1}

Пример. Разложение функции голосования по переменной x:


m(x, y, z) = (x ∧ m(1, y, z)) ∨ (x ∧ m(0, y, z)) = (x ∧ (y ∨ z)) ∨ (x ∧ (y ∧ z)).
800 / 907
6.4.2. Минимальные термы (1/2)
Выражение вида xσ1 1 ∧· · ·∧xσnn имеет большое значение в теории булевых функций и но-
сит специальное название: минимальный терм, или совершенный одночлен, или консти-
туента единицы, или, наиболее коротко, минтерм. Нетрудно видеть, что минтерм — это
реализация булевой функции n переменных, которая имеет значение 1 ровно на одном
наборе значений переменных, а именно на наборе (σ1 , . . . , σn ). Отсюда вытекает еще
одно следствие к теореме о разложении булевой функции по переменным.
Следствие. Любую булеву функцию, кроме 0, можно представить как дизъюнкцию некото-
рых минтермов.
Ясно, что при фиксированном n имеется ровно 2n различных минтермов. Обычно мин-
терм обозначают mi , где i ∈ 0..2n − 1, i называется номером минтерма, или прямо ука-
зывают булевский вектор (σ1 , . . . , σn ), на котором минтерм принимает значение 1. Из
структуры формулы, задающей минтерм, следует, что двоичное представление номера
минтерма задаёт тот набор значений (в установленном порядке), на котором минтерм
имеет значение 1.
801 / 907
6.4.2. Минимальные термы (2/2)
Говорят, что система булевых функций ортогональна, если их конъюнкция есть тожде-
ственный ноль.
Пример. Система {x, x} ортогональна.
Лемма.[1] Любое множество различных минтермов ортогонально.
Доказательство. Не существует такого набора значений, на котором два различных мин-
терма принимают значение 1.
Говорят, что система булевых функций выполнима, если их дизъюнкция не есть тожде-
ственный ноль.
Пример. Система {x, x} выполнима.
Лемма.[2] Любое множество минтермов выполнимо.
Доказательство. Дизъюнкция выполняется на всех наборах, на которых какой-либо из
минтермов имеет значение 1.
Двойственным к минтерму является макстерм — булева функция, которая принимает зна-
чение 0 на единственном наборе значений переменных. Ясно, что макстерм реализуется
формулой xσ1 1 ∨ . . . ∨ xσnn . Используя принцип двойственности, на макстермы нетрудно
распространить все наблюдения для минтермов. 802 / 907
6.4.3. Совершенные нормальные формы (1/4)
Говорят, что некоторый класс формул K имеет нормальную форму, если задан другой
класс формул K0 , которые называются нормальными формами, такой, что любая форму-
ла класса K имеет единственную равносильную формулу из класса K0 . Если задан ал-
горитм, позволяющий для любой формулы построить её нормальную форму, то наличие
у класса формул нормальной формы обеспечивает разрешимость, то есть наличие алго-
ритма проверки равносильности. Действительно, в этом случае достаточно сравнить нор-
мальные формы двух формул. Один и тот же класс K может иметь несколько различных
нормальных форм, то есть несколько различных классов K0 .
Рассмотрим понятие нормальной формы применительно к булевым функциям. Cовершен-
ной дизъюнктивной нормальной формой W
(СДНФ) называется реализация булевой функции
f (x1 , . . . , xn ) в виде формулы xσ1 1 ∧ . . . ∧ xσnn .
{(σ1 ,...,σn )|f (σ1 ,...,σn )=1}
Замечание. СДНФ называется совершенной, потому что каждое слагаемое в дизъюнкции
включает все переменные; дизъюнктивной, потому что главная операция — дизъюнкция;
нормальной, потому что СДНФ единственна, как показано в следующей теореме.
803 / 907
6.4.3. Совершенные нормальные формы (2/4)
Теорема. Всякая булева функция имеет единственную СДНФ.
Доказательство. По следствию к теореме о разложении булевой функции по переменным
имеем _
σ σ
f (x1 , . . . , xn ) = x1 1 ∧ . . . ∧ xnn .
{(σ1 ,...,σn )|f (σ1 ,...,σn )=1}

Если при записи СДНФ используется установленный порядок, то СДНФ однозначно опре-
деляет множество наборов значений переменных, на которых функция, реализуемая
СДНФ, принимает значение 1. Тем самым СДНФ однозначно определяет таблицу истин-
ности реализуемой функции, откуда любые две различные СДНФ над одним набором пе-
ременных неравносильны.
Примеры.
1. СДНФ конъюнкции: x ∧ y = x1 ∧ y 1 .
2. СДНФ дизъюнкции: x ∨ y = x0 ∧ y 1 ∨ x1 ∧ y 0 ∨ x1 ∧ y 1 .
3. СДНФ импликации: x → y = x0 ∧ y 0 ∨ x0 ∧ y 1 ∨ x1 ∧ y 1 .
804 / 907
6.4.3. Совершенные нормальные формы (3/4)

Замечание. При рассмотрении


W V дизъюнктивных и конъюнктивных форм мы имеем дело
с формулами вида Si и Si , где I — некоторое множество индексов, а Si — некото-
i∈I i∈I
рые формулы. Множество индексов может быть пусто. В этом случае удобно считать, что
пустая дизъюнкция имеет значение 0, а пустая конъюнкция — значение 1:
_ ^
I = ∅ =⇒ Si = 0, I = ∅ =⇒ Si = 1.
i∈I i∈I

Следствие. Всякая булева функция может быть выражена через дизъюнкцию, конъюнкцию
и отрицание:
∀ f ∈ Pn (∃ F ∈ F[∨, ∧, ¬] (f = func F)) .
Замечание. Если f = 0, то {(σ1 , . . . , σn ) | f (σ1 , . . . , σn ) = 1} = ∅. В соответствии с со-
глашением предыдущего замечания пустая формула считается СДНФ нуля.

805 / 907
6.4.3. Совершенные нормальные формы (4/4)
Теорема. Всякая булева функция имеет единственную совершенную конъюнктивную нор-
мальную форму (СКНФ):
^
f (x1 , . . . , xn ) = xσ1 1 ∨ . . . ∨ xσnn .
{(σ1 ,...,σn )|f ∗ (σ1 ,...,σn )=1}

Доказательство. По принципу двойственности из предыдущей теоремы.


Примеры. Нормальные формы существуют у различных формул.
1. СДНФ и СКНФ являются нормальными формами для булевых формул над любым
базисом. Pn
2. Формулы вида i=0 ai xi и (. . . (an x+an−1 )x+. . .+a1 )x+a0 являются нормальными
формами для полиномов одной переменной степени n.
3. Множество формул, построенных суперпозицией из рациональных функций одной
переменной, ex , ln x, прямых и обратных тригонометрических функций (то есть мно-
жество формул, реализующих элементарные функции математического анализа),
нормальной формы не имеет. Доказательство последнего утверждения выходит да-
леко за рамки этого курса.
806 / 907
6.4.4. Эквивалентные преобразования (1/8)
Используя уже доказанные равносильности, можно преобразовывать по правилу замены
одни формулы в другие, равносильные им. Преобразование формулы в равносильную ей
называется эквивалентным преобразованием.
Пример. Используя равносильности из п. 6.2.2, покажем, что имеет место правило склеи-
вания/расщепления: (x & y) ∨ (x & ¬y) = x. Действительно,
5 10 7
(x & y) ∨ (x & ¬y) = x & (y ∨ ¬y) = x & 1 = x.

Замечание. Если равносильность из предыдущего примера применяется для уменьшения


числа операций в формуле, то говорят, что производится склеивание, а если наоборот, то
расщепление.
Теорема. Для любых двух равносильных формул F1 и F2 существует последовательность
эквивалентных преобразований из F1 в F2 , получаемая посредством равносильностей,
указанных в п. 6.2.2.

807 / 907
6.4.4. Эквивалентные преобразования (2/8)

Доказательство. Любую формулу (кроме тех, которые реализуют 0) можно преобразовать


в СДНФ с помощью равносильностей из п. 6.2.2 и правила расщепления из предыдущего
примера по следующему алгоритму.
[ 1. Элиминация операций ] Любая булева операция реализуется формулой над базисом
{∧, ∨ , ¬} (например, в виде СДНФ). Таким образом, любая присутствующая в форму-
ле подформула с главной операцией, отличной от дизъюнкции, конъюнкции и отрица-
ния, может быть заменена подформулой, содержащей только три базисные операции.
Например, элиминация импликации выполняется с помощью равносильности
x1 → x2 = ¬x1 ∨ x2 . В результате первого шага в формуле остаются только базисные
операции.
[ 2. Протаскивание отрицаний ] С помощью инволютивности отрицания и правил де Моргана
отрицание «протаскивается» к переменным. В результате второго шага отрицания могут
присутствовать в формуле только непосредственно перед переменными.

808 / 907
6.4.4. Эквивалентные преобразования (3/8)
Доказательство. (Продолжение)
[ 3. Раскрытие скобок ] По дистрибутивности конъюнкции относительно дизъюнкции рас-
крываются все скобки, являющиеся операндами конъюнкции.
W В результате третьего ша-
га формула приобретает вид дизъюнктивной формы: (Ai ∧ · · · ∧ Aj ), где Ak — это либо
переменная, либо отрицание переменной.
[ 4. Удаление нулей ] Если в слагаемое дизъюнктивной формы входят переменная и её
отрицание (x & ¬x), то такое слагаемое удаляется. Если при этом формула оказывается
пустой, то процесс прерывается и считается завершённым (исходная формула реализует
0).
[ 5. Расщепление переменных ] По правилу расщепления в каждую конъюнкцию, которая
содержит не все переменные, добавляются недостающие. В результате пятого шага фор-
мула становится «совершенной», то есть в каждой конъюнкции содержатся все перемен-
ные.

809 / 907
6.4.4. Эквивалентные преобразования (4/8)
Доказательство. (Окончание)
[ 6. Приведение подобных ] С помощью идемпотентности конъюнкции удаляются повтор-
ные вхождения переменных в каждую конъюнкцию, а затем с помощью идемпотентно-
сти дизъюнкции удаляются повторные вхождения одинаковых конъюнкций в дизъюнк-
цию. В результате шестого шага формула не содержит «лишних» переменных и «лиш-
них» конъюнктивных слагаемых.
[ 7. Сортировка ] С помощью коммутативности переменные в каждой конъюнкции, а затем
конъюнкции в дизъюнкции сортируются в установленном порядке. (см. пп. 6.1.1 и 6.4.3).
В результате седьмого шага формула приобретает вид СДНФ.
Заметим, что все указанные преобразования обратимы. Преобразуем F1 7→ S1 и
F2 7→ S2 этим алгоритмом. Если S1 6= S2 , значит, формулы не равносильны и эквивалент-
ное преобразование одной в другую невозможно. Если же S1 = S2 , то, объединяя после-
довательность преобразований F1 7→ S1 и обратных преобразований S2 7→ F2 , имеем
искомую последовательность.
810 / 907
6.4.4. Эквивалентные преобразования (5/8)

Пример. Покажем, что формулы ¬((y ∨ ¬z) → (¬y & ¬z)) → x и


(x ∨ y) → ((¬x → y) & ¬(¬x & y)) равносильны. Для этого приведем первую формулу
к СДНФ, используя шаги 1–7 из доказательства теоремы.
1. Элиминация импликации: ¬¬(¬(y ∨ ¬z) ∨ (¬y & ¬z)) ∨ x
2. Протаскивание отрицаний: ((¬y & z) ∨ (¬y & ¬z)) ∨ x
3. Раскрытие скобок: (¬y & z) ∨ (¬y & ¬z) ∨ x
4. Удаления нулей: нет
5. Расщепление переменных: (¬y & z & x) ∨ (¬y & z & ¬x) ∨ (¬y & ¬z & x) ∨
∨ (¬y & ¬z & ¬x) ∨ (x & ¬y & ¬z) ∨ (x & ¬y & z) ∨ (x & y & ¬z) ∨ (x & y & z)
6. Приведение подобных: (¬y & z & x) ∨ (¬y & z & ¬x) ∨ (¬y & ¬z & x) ∨
∨ (¬y & ¬z & ¬x) ∨ (x & y & ¬z) ∨ (x & y & z)
7. Сортировка: (¬x & ¬y & ¬z) ∨ (¬x & ¬y & z) ∨ (x & ¬y & ¬z) ∨ (x & ¬y & z) ∨
∨ (x & y & ¬z) ∨ (x & y & z)

811 / 907
6.4.4. Эквивалентные преобразования (6/8)

Пример. Аналогично обрабатывается вторая формула


(x ∨ y) → ((¬x → y) & ¬(¬x & y)).
1. Элиминация импликации: ¬(x ∨ y) ∨ ((¬¬x ∨ y) & ¬(¬x & y))
2. Протаскивание отрицаний: (¬x & ¬y) ∨ ((x ∨ y) & (x ∨ ¬y))
3. Раскрытие скобок: (¬x & ¬y) ∨ (x & x) ∨ (x & ¬y) ∨ (y & x) ∨ (y & ¬y)
4. Удаления нулей: (¬x & ¬y) ∨ (x & x) ∨ (x & ¬y) ∨ (y & x)
5. Расщепление переменных: (¬x & ¬y & ¬z) ∨ (¬x & ¬y & z) ∨ (x & x & ¬y & ¬z) ∨
∨ (x & x & ¬y & z) ∨ (x & x & y & ¬z) ∨ (x & x & y & z) ∨ (x & ¬y & ¬z) ∨
∨ (x & ¬y & z) ∨ (y & x & ¬z) ∨ (y & x & z)
6. Приведение подобных: (¬x & ¬y & ¬z) ∨ (¬x & ¬y & z) ∨ (x & ¬y & ¬z) ∨
∨ (x & ¬y & z) ∨ (x & y & ¬z) ∨ (x & y & z)
7. Сортировка: нет.
Таким образом, формулы равносильны.

812 / 907
6.4.4. Эквивалентные преобразования (7/8)

Приведённый пример показывает, что, хотя построение последовательности эквивалент-


ных преобразований за счёт приведения формул к нормальной форме всегда возможно,
это не всегда рационально.
Пример. В условиях предыдущего примера для формул ¬((y ∨ ¬z) → (¬y & ¬z)) → x
и (x ∨ y) → ((¬x → y) & ¬(¬x & y)) можно провести следующие эквивалентные
преобразования:
¬((y ∨ ¬z) → (¬y & ¬z)) → x = ¬¬(¬(y ∨ ¬z) ∨ (¬y & ¬z)) ∨ x =
= ((¬y & z) ∨ (¬y & ¬z)) ∨ x = (¬y ∨ (z & ¬z)) ∨ x = ¬y ∨ x.
С другой стороны, (x ∨ y) → ((¬x → y) & ¬(¬x & y)) =
= ¬(x ∨ y) ∨ ((¬¬x ∨ y) & ¬(¬x & y)) =
= (¬x & ¬y) ∨ (x & (y ∨ ¬y)) = (¬x & ¬y) ∨ x =
= (¬x ∨ x) & (¬y ∨ x) = ¬y ∨ x.

813 / 907
6.4.4. Эквивалентные преобразования (8/8)

Отступление. Эквивалентные преобразования, рассмотренные здесь, являются частным случаем


системы подстановок термов, или системы правил переписывания. В общем случае в такой си-
стеме задаётся класс формул и набор правил преобразования этих формул. Правила могут быть
обратимыми и всегда применимыми (как в случае эквивалентных преобразований булевых фор-
мул), но могут не иметь обратных и быть обусловленными. С этими системами связан целый ряд
проблем теории алгоритмов. Например, для заданной системы правил и двух заданных формул
определить, можно ли преобразовать одну формулу в другую и найти кратчайшую последова-
тельность преобразований. Системы подстановок термов нашли множество практически важных
применений в математической логике, в теории алгоритмов и в практическом программирова-
нии. Заметим, однако, что построение эффективного алгоритма отыскания кратчайшей последо-
вательности эквивалентных преобразований является непростой задачей даже для булевых фор-
мул, не говоря уже о других классах математических объектов и других системах переписывания.

814 / 907
6.4.5. Минимальные дизъюнктивные формы (1/3)

Булева функция может быть задана бесконечным числом различных, но равносильных


формул. Возникает естественная задача: для данной булевой функции найти реализую-
щую формулу, обладающую теми или иными свойствами.
Практически наиболее востребованной оказалась задача минимизации: найти минималь-
ную формулу, реализующую функцию. Но и в этой постановке задача имеет множество
вариантов:
1) найти реализующую формулу, содержащую наименьшее количество переменных;
2) найти реализующую формулу, содержащую наименьшее количество определённых
операций;
3) найти реализующую формулу, содержащую наименьшее количество подформул опре-
делённого вида.

815 / 907
6.4.5. Минимальные дизъюнктивные формы (2/3)
Кроме того, могут быть наложены ограничения на синтаксический вид искомой форму-
лы, набор операций, которые разрешается использовать в формуле, и т. д. Из всего это-
го разнообразия наиболее детально, по-видимому, изучена задача отыскания дизъюнк-
тивных форм, минимальных по числу вхождений переменных. Эту задачу мы бегло рас-
сматриваем в заключительных параграфах данного раздела.
Дизъюнктивной формой называется формула вида
k
_ mi
^ σ
Ki , где Ki = xjpp .
i=1 p=1

Формула Ki называется элементарной конъюнкцией, переменные в элементарную конъ-


юнкцию входят в установленном порядке (хотя и не обязательно все n). Количество пе-
ременных в конъюнкции называется её рангом (обозначение |Ki |).

816 / 907
6.4.5. Минимальные дизъюнктивные формы (3/3)

n
Теорема. Число различных дизъюнктивных форм n переменных равно 23 .
Доказательство. Переменная либо не входит в элементарную конъюнкцию, либо входит
с отрицанием, либо входит без отрицания. Таким образом, существует 3n элементарных
конъюнкций, а каждое подмножество множества элементарных конъюнкций даёт дизъ-
юнктивную форму.
Из этой теоремы можно извлечь два практических вывода, важных для рассматриваемой
задачи минимизации дизъюнктивной формы. Во-первых, существует тривиальный алго-
ритм решения задачи: перебрать все формы (их конечное число) и выбрать минималь-
ную. Во-вторых, количество дизъюнктивных форм с ростом n растёт очень быстро, и уже
при небольших n полный перебор практически неосуществим.

817 / 907
6.4.6. Геометрическая интерпретация (1/2)
При обсуждении задач, связанных с булевыми функциями, очень полезна следующая
геометрическая интерпретация.
Двоичным наборам из n элементов можно
взаимно-однозначно сопоставить вершины n-мерного единичного гиперкуба E n . При
этом булева функция f (x1 , . . . , xn ) задаётся подмножеством N вершин гиперкуба, на
Def
которых её значение равно единице: N = {(a1 , . . . , an ) | f (a1 , . . . , an ) = 1}.
Пример. В этом и последующих x y z g(x, y, z)
примерах рассматривается бу- 0 0 0 1
лева функция g(x, y, z), задан- 0 0 1 1
ная таблицей истинности, пока- 0 1 0 1
занной в середине. На рисунке 0 1 1 0
справа выделены вершины ку- 1 0 0 0
ба, соответствующие функции 1 0 1 0
g(x, y, z). Для функции g име- 1 1 0 1
ем N = {(0, 0, 0), (0, 0, 1), 1 1 1 0
(0, 1, 0), (1, 1, 0)}. 818 / 907
6.4.6. Геометрическая интерпретация (2/2)
Элементарной конъюнкции K = xσi11 ∧ . . . ∧ xσikk соответствует множество вершин ги-
перкуба, у которых xi1 = σ1 , . . . , xik = σk , а значения остальных координат произволь-
ны. Другими словами, элементарной конъюнкции K сопоставляется множество вершин
{(a1 , . . . , an ) ∈ E n | K(a1 , . . . , an ) = 1}. Мы обозначаем одной и той же буквой и эле-
ментарную конъюнкцию, и то множество вершин, на котором она принимает значение
1. Легко видеть, что элементарная конъюнкция k переменных образует (n − k)-мерную
грань гиперкуба E n .
Примеры. 1. Элементарной конъюнкции ¬x ∧ ¬y соответствует ребро ((0, 0, 0), (0, 0, 1)):
на рисунке это ребро выделено.
2. Элементарной конъюнкции z соответствует верхняя грань куба.
Теперь ясен геометрический смысл задачи минимизации дизъюнктивной формы. Дано
подмножество N вершин гиперкуба E n . Требуется найти такой
Skнабор гиперграней Ri ,
чтобы они в совокупности образовывали покрытие N (N = i=1 Ki ) и сумма рангов
Pk
i=1 |Ki | была бы минимальна.

819 / 907
6.4.7. Сокращённые дизъюнктивные формы (1/3)

Известно несколько различных методов решения задачи минимизации дизъюнктивной


формы. Все они используют одну и ту же идею: уменьшить по возможности множество
рассматриваемых элементарных конъюнкций и затем найти минимальную дизъюнктив-
ную форму, перебирая оставшиеся конъюнкции. Рассмотрим один из самых простых ме-
тодов этого типа.
Пусть функция f задана множеством N вершин единичного гиперкуба E n . Если K ⊂ N ,
то конъюнкция K называется допустимой для функции f . Ясно, что в минимальную (да и
любую другую) дизъюнктивную форму функции f могут входить только допустимые конъ-
юнкции. Если K ∩ (E n \ N ) 6= ∅, то K — недопустимая конъюнкция. Поэтому для каждо-
го набора (a1 , . . . , an ) из множества E n \ N следует удалить из множества всех 3n конъ-
юнкций те 2n конъюнкций, которые можно построить из сомножителей {xa11 , . . . , xann }.

820 / 907
6.4.7. Сокращённые дизъюнктивные формы (2/3)
Пример. Для функции g имеем
g(x, y, z) = 0 Недопустимые конъюнкции
(0, 1, 1) 1 ¬x y z ¬x ∧ y ¬x ∧ z y∧z ¬x ∧ y ∧ z
(1, 0, 0) 1 x ¬y ¬z x ∧ ¬y x ∧ ¬z ¬y ∧ ¬z x ∧ ¬y ∧ ¬z
(1, 0, 1) 1 x ¬y z x ∧ ¬y x∧z ¬y ∧ z x ∧ ¬y ∧ z
(1, 1, 1) 1 x y z x∧y x∧z y∧z x∧y∧z
Удаляя из множества всех 27 конъюнкций те, которые не являются допустимыми, полу-
чаем следующий список допустимых конъюнкций:
y ∧ ¬z, ¬x ∧ ¬y, ¬x ∧ ¬z, x ∧ y ∧ ¬z, ¬x ∧ y ∧ ¬z, ¬x ∧ ¬y ∧ z, ¬x ∧ ¬y ∧ ¬z.
Конъюнкция K называется максимальной для функции f , если
K ⊂ N & (K ⊂ K 0 ⊂ N =⇒ K 0 = K) .
Очевидно, что всякая допустимая конъюнкция содержится в некоторой максимальной.
Поэтому совокупность всех максимальных конъюнкций образует покрытие множества
N , то есть дизъюнктивную форму, которая называется сокращённой дизъюнктивной нор-
мальной формой.
821 / 907
6.4.7. Сокращённые дизъюнктивные формы (3/3)

Сокращённая дизъюнктивная нормальная форма определена для функции f однозначно


(с учётом установленного порядка переменных).
Пример. Для функции g сокращённая дизъюнктивная нормальная форма имеет вид
(¬x ∧ ¬y) ∨ (¬x ∧ ¬z) ∨ (y ∧ ¬z), что существенно короче, чем СДНФ этой функции:
(¬x ∧ ¬y ∧ ¬z) ∨ (¬x ∧ ¬y ∧ z) ∨ (¬x ∧ y ∧ ¬z) ∨ (x ∧ y ∧ ¬z).
Теорема. Минимальная дизъюнктивная форма является подформулой сокращённой дизъ-
юнктивной нормальной формы.
Доказательство. От противного. Пусть минимальная форма содержит не максимальную
конъюнкцию. Тогда эту конъюнкцию можно заменить соответствующей максимальной,
при этом покрытие сохранится, а сумма рангов уменьшится, что противоречит минималь-
ности формы.
Пример. Для функции g минимальная дизъюнктивная форма имеет вид ¬x∧¬y ∨ y ∧¬z .

822 / 907
6.5. Представление булевых функций в программах

Для представления булевых функций можно использовать стандартные методы пред-


ставления функций, а также некоторые специальные приёмы, и эти идеи часто оказы-
ваются применимыми для представления других, более сложных объектов.

823 / 907
6.5.1. Табличные представления (1/3)

Область определения и область значений у булевой функции конечна, поэтому булева


функция может быть представлена массивом. Самое бесхитростное представление пря-
мо воспроизводит таблицу истинности. Если условиться, что кортежи в таблице всегда
идут в установленном порядке, то для представления булевой функции f (x1 , . . . , xn ) до-
статочно хранить столбец значений: F1 : array [0..(2n − 1)] of 0..1
Пример. Для булевой функции g(x, y, z) имеем
F1 (g) : array [0..7] of 0..1 ← (1, 1, 1, 0, 0, 0, 1, 0)
Данное представление — не самое эффективное. В частности, если набор аргументов
задан массивом x : array [1..n] of 0..1, то для вычисления значения функции f с помо-
щью представления F1 необходимо сначала вычислить индекс d (то есть номер кортежа
в установленном порядке), чтобы затем получить значение F1 [d]. Индекс d нетрудно вы-
числить, например, с помощью следующего алгоритма вычисления номера кортежа.

824 / 907
6.5.1. Табличные представления (2/3)
Алгоритм вычисления номера кортежа в установленном порядке.
Вход: кортеж x : array [1..n] of 0..1 значений переменных.
Выход: номер d кортежа x при перечислении кортежей в установленном порядке.
d ← 0 //начальное значение индекса
for i from 1 to n do
d ← d ∗ 2 + x[i] //сдвигаем влево и добавляем разряд
end for
Обоснование. Если рассматривать кортеж булевых значений как двоичную запись числа,
то это число — номер кортежа в установленном порядке. Значение числа d, заданного в
позиционной двоичной системе счисления цифрами x1 . . . xn , определяется следующим
образом: nX
d = x1 2n−1 + . . . + xn 20 = xi 2n−i = 2(2(. . . (2x1 + x2 ) . . . ) + xn−1 ) + xn .
i=1
Цикл в алгоритме непосредственно вычисляет последнюю формулу, которая является
частным случаем схемы Горнера.
825 / 907
6.5.1. Табличные представления (3/3)
Замечание. По схеме Горнера можно определить значение числа d по записи x1 . . . xn в
любой позиционной системе счисления с основанием b следующим образом:

d = b(b(. . . (bx1 + x2 ) . . . ) + xn−1 ) + xn .

Более эффективным представлением таблицы истинности является использование


n-мерного массива: F2 : array [0..1, . . . , 0..1] of 0..1
В случае использования представления F2 значение функции f (x1 , . . . , xn ) задаётся вы-
ражением F2 [x1 , . . . , xn ].
Пример. Для функции g имеем
F2 : array [0..1, 0..1, 0..1] of 0..1 = (((1, 1), (1, 0)), ((0, 0), (1, 0))).
Замечание. Мы принимаем, что многомерные массивы располагаются в линейной памяти
«по строкам».
Представления булевой функции n переменных в виде массива занимают память объё-
мом O(2n ).
826 / 907
6.5.2. Строковые представления (1/3)
Булеву функцию можно представить с помощью реализующей её формулы. Существует
множество способов представления формул, но наиболее удобной для человека является
запись в виде цепочки символов на некотором формальном языке.
Как уже указывалось, для любой булевой функции существует бесконечно много различ-
ных реализующих её формул. Однако булевы функции имеют нормальные формы, в част-
ности СДНФ, и при установленном порядке переменных СДНФ единственна.
СДНФ булевой функции может быть построена по заданной таблице истинности с помо-
щью следующего алгоритма построения СДНФ
Вход: вектор x : array [1..n] of string идентификаторов переменных,
вектор F1 : array [0..(2n − 1)] of 0..1 значений функции при установленном порядке
кортежей.
Выход: последовательность символов, образующих запись формулы СДНФ для задан-
ной функции.

827 / 907
6.5.2. Строковые представления (2/3)
f ← false //признак присутствия левого операнда дизъюнкции
for i from 0 to 2n − 1 do
if F1 [i] = 1 then
if f then yield 0 ∨0 else f ← true end if //знак дизъюнкции
g ← false //признак присутствия левого операнда конъюнкции
for j from 1 to n do
if g then yield 0 ∧0 else g ← true end if //знак конъюнкции
v ←(i div 2j−1 ) mod 2 //j -й разряд i-го кортежа
if v = 0 then
yield 0 ¬0 //знак отрицания
end if
yield x[j] //добавление в формулу переменной
end for
end if
end for
828 / 907
6.5.2. Строковые представления (3/3)
Обоснование. Данный алгоритм буквально воспроизводит словесную запись следующего
правила: для каждой строки таблицы истинности, для которой значение функции равно 1,
построить дизъюнктивное слагаемое, включающее все переменные, причём те перемен-
ные, которые имеют значение 0 в этой строке, входят со знаком отрицания. Остальное
в этом алгоритме — мелкие программистские «хитрости», которые полезно один раз по-
смотреть, но не стоит обсуждать.
Пример. Для функции g , используемой в примерах данного раздела, алгоритм построит
строку
¬x ∧ ¬y ∧ ¬z ∨ ¬x ∧ ¬y ∧ z ∨ ¬x ∧ y ∧ ¬z ∨ x ∧ y ∧ ¬z.

Представление функции в виде формулы, выраженной как строка символов, совершен-


но необходимо при реализации интерфейса пользователя в системах компьютерной ал-
гебры, но крайне неудобно при выполнении других манипуляций с формулами. В следу-
ющем параграфе рассматривается представление СДНФ, более удобное, например, для
вычисления значения функции.
829 / 907
6.5.3. Алгоритм вычисления значения булевой функции (1/3)

Некоторые классы формул допускают более эффективную интерпретацию по сравнению


с алгоритмом Eval (п. 6.2.1). Рассмотрим алгоритм вычисления значения булевой функ-
ции, заданной в виде СДНФ, для заданных значений переменных x1 , . . . , xn . В этом ал-
горитме используется следующее представление данных.
СДНФ задана массивом F3 : array [1..k, 1..n] of 0..1, где строка F3 [i, ∗] содержит набор
значений σ1 , . . . , σn , для которого f (σ1 , . . . , σn ) = 1, i ∈ 1..k .
Пример. Для функции g F3 : array [1..4, 1..3] of 0..1 = ((0, 0, 0), (0, 0, 1), (0, 1, 0), (1, 1, 0)).

830 / 907
6.5.3. Алгоритм вычисления значения булевой функции (2/3)

Вход: массив, представляющий СДНФ: f : array [1..k, 1..n] of 0..1;


множество значений переменных x : array [1..n] of 0..1.
Выход: 0..1 — значение булевой функции.
for i from 1 to k do
for j from 1 to n do
if f [i, j] 6= x[j] then
σ
next for i //xj 6= σj =⇒ xj j = 0 =⇒ x1 σ1 ∧ . . . ∧ xn σn = 0
end if
end for
return 1 //x1 σ1 & . . . & xn σn = 1 =⇒ (σ1 ,...,σn ) xσ1 1 ∧ . . . ∧ xσnn = 1
W

end for
return 0 //все слагаемые в дизъюнкции равны нулю

831 / 907
6.5.3. Алгоритм вычисления значения булевой функции (3/3)

Обоснование. Алгоритм основан на следующих правилах. Можно прекратить вычисле-


ние конъюнкции, как только получен конъюнктивный сомножитель, равный 0 (вся конъ-
юнкция имеет значение 0). Можно прекратить вычисление дизъюнкции, как только полу-
чено дизъюнктивное слагаемое, равное 1 (вся дизъюнкция имеет значение 1).
Этот алгоритм в худшем случае выполняет k·n сравнений, а в среднем — гораздо меньше.
Таким образом, он существенно эффективнее общего алгоритма интерпретации.
Отступление. Быстрое вычисление значения СДНФ имеет, помимо теоретического, большое прак-
тическое значение. Например, во многих современных программах с графическим интерфейсом
для составления сложных логических условий используется наглядный бланк в виде таблицы: в
клетках записываются условия, причём клетки одного столбца считаются соединёнными конъ-
юнкцией, а столбцы — дизъюнкцией, то есть образуют ДНФ (или наоборот, в таком случае полу-
чается КНФ). В частности, так устроен графический интерфейс QBE (Query-by-Example), применя-
емый для формулировки логических условий при запросе к СУБД.

832 / 907
6.5.4. Представление булевых функций арифметическими полиномами (1/8)

Существует удобное представление булевых функций, простое в понимании и эффектив-


ное в реализации, основанное на применении обычных арифметических операций к бу-
левским значениям 0 и 1.
Пример. Нетрудно убедиться, что ¬x = 1 − x.
Возникает вопрос: можно ли представить произвольную булеву функцию таким образом?
Арифметическим полиномом P (x1 , . . . , xn ) для функции f (x1 , . . . , xn ) называется поли-
ном n переменных x1 , . . . , xn c целыми коэффициентами такой, что

∀ x1 , . . . , xn (P (x1 , . . . , xn ) = f (x1 , . . . , xn )) .

Константы (булевские значения) являются своими арифметическими полиномами. Ариф-


метический полином тождественной функции совпадает с ней, а арифметический поли-
ном отрицания построен в примере выше.

833 / 907
6.5.4. Представление булевых функций арифметическими полиномами (2/8)
Пример. Рассмотрим булеву функцию, реализуемую формулой (x ∨ y) & z , и полином
xz +yz −xyz . Прямое вычисление, проведенное в таблице, показывает, что этот полином
является реализующим для данной функции.
x y z (x ∨ y) & z xz + yz − xyz
0 0 0 0 0
0 0 1 0 0
0 1 0 0 0
0 1 1 1 1
1 0 0 0 0
1 0 1 1 1
1 1 0 0 0
1 1 1 1 1
Арифметические полиномы для всех булевых функций двух существенных переменных
также построены и приведены в таблице на следующем слайде.

834 / 907
6.5.4. Представление булевых функций арифметическими полиномами (3/8)
Переменная x 0 0 1 1
Переменная y 0 1 0 1
Название Формула Полином
Конъюнкция x∧y 0 0 0 1 xy
x ∧ ¬y 0 0 1 0 x − xy
¬x ∧ y 0 1 0 0 y − xy
Сложение по модулю 2 x +2 y 0 1 1 0 x + y − 2xy
Дизъюнкция x∨y 0 1 1 1 x + y − xy
Стрелка Пирса x↓y 1 0 0 0 1 − x − y + xy
Эквивалентность x≡y 1 0 0 1 1 − x − y + 2xy
x ∨ ¬y 1 0 1 1 1 − y + xy
Импликация x→y 1 1 0 1 1 − x + xy
Штрих Шеффера x|y 1 1 1 0 1 − xy

835 / 907
6.5.4. Представление булевых функций арифметическими полиномами (4/8)

Теорема. Для любой булевой функции существует реализующий её арифметический по-


лином.
Доказательство. Любую булеву функцию можно выразить через дизъюнкцию, конъюнк-
цию и отрицание, см. п. 6.4.3. Тогда полином можно построить, подставляя арифметиче-
ские полиномы для каждой операции формулы, начиная с внешней, а затем упростить
получившийся полином, раскрыв скобки, вычислив степени и приведя подобные.
Замечание. Поскольку ∀ n > 0 (1n = 1 & 0n = 0), вычисление степеней сводится к от-
брасыванию показателей степени перед дальнейшими упрощениями.
Отступление. Представление булевых функций арифметическими полиномами может
быть выгодно, так как вычисление значений линейных полиномов программно весьма просто,
ибо сводится к суммированию коэффициентов при переменных не равных нулю.

836 / 907
6.5.4. Представление булевых функций арифметическими полиномами (5/8)

Пример. Представим арифметическим полиномом функцию g (пример в п. 6.4.6), рас-


сматриваемую в предыдущих параграфах. Из примера в п. 6.4.7 известно, что её мини-
мальная дизъюнктивная форма имеет вид: (¬x ∧ ¬y) ∨ (y ∧ ¬z). Далее
(1 − x)(1 − y) + y(1 − z) − (1 − x)(1 − y)y(1 − z) =
= 1 − x − y + xy + y − yz − (1 − x − y + xy)(y − yz) =
= 1 − x − y + xy + y − yz − y + xy + y 2 − xy 2 + yz − xyz − y 2 z + xy 2 z =
= 1 − x − y + xy + y − yz − y + xy + y − xy + yz − xyz − yz + xyz =
= 1 − x + xy − yz.
Рассмотрим ещё один способ реализации булевой функции, основанный на той же идее.
Пусть булева функция f задана формулой F в базисе {∧, ∨, ¬} некоторой дизъюнктив-
ной формой. Выполним в формуле следующие замены логических операций арифмети-
ческими: ¬x 7→ 1 − x; x ∧ y 7→ xy ; x ∨ y 7→ x + y .

837 / 907
6.5.4. Представление булевых функций арифметическими полиномами (6/8)

Такие замены уместно назвать буквальными. Получится арифметическое выражение A(F ),


которое реализует некоторую функцию f1 . В общем случае функции f и f1 различны.
Пример.
x y F =x∨y A(F ) = x + y
0 0 0 0
0 1 1 1
1 0 1 1
1 1 1 2
Однако, если формула F предварительно ортогонализирована, то есть эквивалентно пре-
образована к такому виду, когда все элементарные конъюнкции ортогональны, то значе-
ния F и A(F ) при буквальных заменах совпадают.
Замечание. Ортогонализация сводится к систематическому применению тождества
a ∨ b = a ∧ b ∨ ¬a ∧ b ∨ a ∧ ¬b.

838 / 907
6.5.4. Представление булевых функций арифметическими полиномами (7/8)
Пример.
x y F = x ∧ y ∨ ¬x ∧ y ∨ x ∧ ¬y A(F ) = xy + (1 − x)y + x(1 − y)
0 0 0 0
0 1 1 1
1 0 1 1
1 1 1 1
Ортогонализация усложняет исходную формулу, но позволяет упростить замены при по-
строении арифметического полинома.
Имеется способ избежать ортогонализации и при этом сохранить буквальную просто-
ту преобразования логической формулы в арифметическую. Для этого достаточно заме-
тить, что ортогонализация, фактически, позволяет отбросить в арифметическом полино-
ме дизъюнкции x + y − xy слагаемое xy , поскольку оно всегда равно нулю в ортогона-
лизированной формуле.

839 / 907
6.5.4. Представление булевых функций арифметическими полиномами (8/8)

Отбрасываемое слагаемое неотрицательное, поэтому F = (A(F ) > 0), то есть в каче-


стве значения функции можно брать знак значения арифметического выражения, полу-
ченного буквальными заменами.
Пример. Пусть некоторая функция задана неортогонализированной дизъюнктивной фор-
мой x∧y∨y∧z . Общий алгоритм даёт арифметический полином xy+yz−xyz . Буквальная
замена даёт более простое выражение xy + yz , знак которого совпадает со значением
арифметического полинома и функции.
Замечание. Если исходная булева функция симметрическая, то и реализующий арифме-
тический полином оказывается симметрическим.

840 / 907
6.5.5. Карты Карно и матрицы минтермов (1/7)

Карта Карно (используется также термин диаграмма Вейча) — это замечательное пред-
ставление булевой функции, позволяющее наглядно и эффектно описать и реализовать
многие, в том числе сложные, операции с булевыми функциями и реализующими их фор-
мулами. В картах Карно применяются сразу несколько понятий, рассматриваемых в этом
курсе: код Грея (п. 1.3.4), булевы матрицы (п. 1.4.9), таблицы истинности (п. 6.1.1), минтер-
мы (п. 6.4.2), единичный гиперкуб (п. 6.4.6), табличные представления булевой функции
(п. 6.5.1).
Карта Карно для представления функций n переменных является прямоугольной табли-
цей, которая содержит 2n ячеек. Положим k ← n div 2. Если n чётное, то таблица содер-
жит 2k строк и 2k столбцов, а если нечётное, то для удобства отображения обычно при-
нимают, что таблица содержит 2k строк и 2k+1 столбцов. Обозначим число строк в табли-
це r(n) ← 2k , число столбцов в таблице c(n) ← 2k+n mod 2 .

841 / 907
6.5.5. Карты Карно и матрицы минтермов (2/7)
Поскольку всего существует 2n минтермов для n переменных, можно считать, что каждая
ячейка карты Карно символизирует один минтерм, а вся карта в целом символизирует
перечисление минтермов.
Вообще говоря, существует 2n ! способов сопоставить минтермы ячейкам карты Карно.
Например, следующий алгоритм заполняет матрицу минтермами в установленном по-
рядке.
Вход: число переменных n.
Выход: матрица минтермов
M : array [0..(r(n) − 1), 0..(c(n) − 1)] of array [1..n] of 0..1
m←0
for i from 0 to r(n) − 1 do
for j from 0 to c(n) − 1 do
M [i, j] ← B(m) //B(m) — двоичный код числа m
m←m + 1
end for
end for 842 / 907
6.5.5. Карты Карно и матрицы минтермов (3/7)
Замечание. Полезно сопоставить этот алгоритм с алгоритмом перечисления подмножеств
некоторого множества в п. 1.3.3. В приведённом алгоритме не имеет значения, индекси-
ровать массив начиная с 0 или с 1. Мы начинаем здесь с 0, чтобы сохранить единство
обозначений со следующим алгоритмом, где это существенно.
Использование более сложных алгоритмов перечисления минтермов позволяет постро-
ить матрицу (таблицу) минтермов, обладающую двумя полезными свойствами.
1) Прямоугольную таблицу можно рассматривать как развертку тора, то есть считать верх-
нюю сторону смежной с нижней, а правую — с левой. В этом случае у каждой ячейки име-
ются четыре соседа.
2) Можно расположить минтермы так, что любые два соседних отличаются ровно в одном
разряде, как коды Грея и смежные вершины единичного гиперкуба.
Зафиксируем один из возможных способов построения матрицы минтермов с такими
свойствами.

843 / 907
6.5.5. Карты Карно и матрицы минтермов (4/7)
Разобьём множество переменных на две группы, в одной r(n) переменных, а в другой
c(n) переменных. Множество кортежей значений переменных каждой группы перечис-
лим не в установленном порядке, а в порядке, задаваемом алгоритмом п. 1.3.4 (код Грея).
Эти коды отмечают строки и столбцы матрицы минтермов, а минтерм в ячейке получает-
ся конкатенацией кодов строки и столбца.
Вход: число переменных n.
Выход: матрица минтермов
M : array [0..(r(n) − 1), 0..(c(n) − 1)] of array [1..n] of 0..1
for i from 0 to r(n) − 1 do
for j from 0 to c(n) − 1 do
M [i, j] ← G(i)G(j) //конкатенация кодов
end for
end for
Здесь G(i) — левый зеркальный код Грея (п. 1.3.4), а операция конкатенации кодов никак
не обозначается (п. 1.1.5).
844 / 907
6.5.5. Карты Карно и матрицы минтермов (5/7)
Замечание. Удобнее индексировать матрицу начиная с 0, поскольку G(0) как раз даёт
нулевой код.
Приведённый способ построения матрицы минтермов далеко не единственный. Можно
варьировать приведённый алгоритм: разбивать переменные на две группы произволь-
ным образом, а не по порядку, использовать различные коды Грея, а не только левый
зеркальный, различным образом сцеплять разряды кодов строки и столбца, а не только
конкатенировать их. Во всех случаях получаются матрицы, в которых соседние минтер-
мы отличаются ровно в одном разряде. Далее в этом курсе указанный способ заполне-
ния считается фиксированным и приведены матрицы минтермов для n = 2, n = 3, n = 4
и n = 5.
n=2 x2 n=3 x2 , x3
0 1 00 01 11 10
x1 0 00 01 x1 0 000 001 011 010
1 10 11 1 100 101 111 110

845 / 907
6.5.5. Карты Карно и матрицы минтермов (6/7)

n=4 x3 , x4
00 01 11 10
x1 , x2 00 0000 0001 0011 0010
01 0100 0101 0111 0110
11 1100 1101 1111 1110
10 1000 1001 1011 1010
n=5 x3 , x4 , x5
000 001 011 010 110 111 101 100
x1 , x2 00 00000 00001 00011 00010 00110 00111 00101 00100
01 01000 01001 01011 01010 01110 01111 01101 01100
11 11000 11001 11011 11010 11110 11111 11101 11100
10 10000 10001 10011 10010 10110 10111 10101 10100

846 / 907
6.5.5. Карты Карно и матрицы минтермов (7/7)
Хранить в программе информацию, представленную в этих таблицах, совершенно не
обязательно, поскольку при фиксированном способе заполнения матрицы легко вычис-
лить минтерм, находящийся в клетке M [i, j]. Другими словами, функция K(i, j), достав-
ляющая код минтерма в ячейке M [i, j], вычисляется так:

K(i, j) ← G(i)G(j) = (B(i) +2 (B(i) div 2))(B(j) +2 (B(j) div 2)),

где функция G(i) доставляет i-й зеркальный код Грея (см. теорему п. 1.3.4), функция B(i)
доставляет двоичный код числа i, а операция конкатенации битовых шкал никак не обо-
значается.
Замечание. Ячейка в матрице имеет четыре соседних, поэтому для n = 4 матрица мин-
термов сохраняет то же степень наглядности, что и гиперкуб для n = 3: смежные ячейки
являются соседними. Однако уже для n = 5 наглядность несколько утрачивается: сосед-
ние ячейки остаются смежными, но не все смежные являются соседними.
Пример. В таблице на предыдущем слайде минтерм 00000 и смежные с ними подчёрк-
нуты, минтерм 11111 и смежные с ним надчёркнуты.
847 / 907
6.5.6. Булевы функции и карты Карно (1/5)
Поскольку всякая булева функция представляется дизъюнкцией минтермов (п. 6.4.2), ука-
зание некоторого подмножества ячеек матрицы минтермов является представлением бу-
левой функции.
Рассмотрим булеву матрицу K : array [0..(r(n) − 1), 0..(c(n) − 1)] of 0..1 того же размера,
что и матрица минтермов. Каждой строке таблицы истинности булевой функции f соот-
ветствует некоторый минтерм. Если значение в этой строке равно 1, то записываем 1 в
соответствующую ячейку матрицы, в противном случае записываем 0. Фактически, эле-
менты вектора значений таблицы истинности булевой функции раскладываются по ячей-
кам булевой матрицы, а правило раскладывания задаётся матрицей минтермов. Булеву
матрицу K назовём картой Карно булевой функции f .
Пример. Функция g(x, y, z), заданная в примере п. 6.5.1, имеет сле- 1 1 0 1
дующее представление картой Карно 0 0 0 1
F4 (g) : array [0..1, 0..3] of 0..1 ←((1, 1, 0, 1), (0, 1, 0, 0)).

848 / 907
6.5.6. Булевы функции и карты Карно (2/5)
Карта Карно действительно является представлением булевой функции, поскольку с её
помощью можно выполнять основную присущую функциям операцию: вычислять значе-
ние функции по заданным значениям аргументов. Вообще говоря, если булева функция
представлена картой Карно и задан набор значений переменных σ1 , . . . , σn , то ответ по-
лучается за один шаг: значение функции на заданном наборе содержится в ячейке, соот-
ветствующей минтерму (xσ1 1 & . . . & xσnn ).
Вход: карта Карно K : array [0..(r(n) − 1), 0..(c(n) − 1)] of 0..1, массив значений пере-
менных x : array [1..n] of 0..1.
Выход: значение булевой функции 0 или 1.
r ← n div 2 //длина кода Грея номера строки
c ← r + n mod 2 //длина кода Грея номера столбца
i ← Grey2Int(r, x[1..r]) //номер строки
j ← Grey2Int(c, x[(r + 1)..n]) //номер столбца
return K[i, j] //возвращаемое значение

849 / 907
6.5.6. Булевы функции и карты Карно (3/5)
Рекуррентные поразрядные вычисления выполняются в функции Grey2Int, которая вы-
числяет целое число — номер заданного кода Грея заданной длины.
Вход: n — длина кода Грея, G : array [1..n] of 0..1 — код Грея.
Выход: целое неотрицательное число — номер кода.
d ← 0 //вычисляемое значение числа
p ← 0 //значение предыдущего разряда двоичного кода числа
for i from 1 to n do
b ← G[i] +2 p //очередной разряд двоичного кода числа
p ← b //предыдущий разряд двоичного кода числа
d ← d ∗ 2 //сдвиг числа влево на 1 разряд
if b = 1 then
d ← d + 1 //добавляем единицу в число
end if
end for
return d
850 / 907
6.5.6. Булевы функции и карты Карно (4/5)

Обоснование. При выбранном способе заполнения матрицы минтермов код Грея номера
строки располагается в левых r разрядах, а код Грея номера столбца в правых c разрядах.
В цикле по следствию 2 теоремы п. 1.3.4 определяется очередной разряд двоичного кода
и по схеме Горнера вычисляется значение числа d (см. п. 6.5.1).
Наряду с вычислением значений, карты Карно позволяют строить различные формуль-
ные представления для булевых функций и их комбинаций.
Карта Карно для одной заданной функции очевидным образом задаёт её СДНФ — до-
статочно соединить знаками дизъюнкции минтермы, указанные ячейками, содержащими
1.
Столь же просто можно построить СДНФ для отрицания, дизъюнкции и конъюнкции за-
данных функций. Для получения СДНФ отрицания достаточно просто инвертировать мат-
рицу.

851 / 907
6.5.6. Булевы функции и карты Карно (5/5)

Для получения СДНФ конъюнкции или дизъюнкции произвольного числа k булевых функ-
ций можно поступить следующим образом. Взять матрицу, заполненную нулями, и доба-
вить в каждую ячейку независимо 0 или 1 для каждой функции. При этом в некоторых
ячейках окажется 0, в некоторых 1, а в некоторых какие-то числа вплоть до k . Все нену-
левые ячейки образуют СДНФ дизъюнкции, все ячейки, равные k , образуют СДНФ конъ-
юнкции.

852 / 907
6.5.7. Минимизация формул картами Карно (1/8)

Карты Карно являются наглядным средством решения задачи минимизации дизъюнктив-


ных форм, обсуждаемой в пп. 6.4.5–6.4.7.
Пусть булева функция представлена картой Карно. Если при этом в соседних ячейках ока-
зались 1, то по основному свойству карт Карно соответствующие минтермы отличаются
точно в одном разряде, и значит, к ним можно применить правило склеивания (п. 6.4.4). В
таком случае дизъюнкцию данных минтермов можно заменить элементарной конъюнк-
цией (п. 6.4.5) ранга n − 1. На карте Карно соответствующие ячейки можно объединить,
показывая, что они образуют компактную группу. Результат склеивания двух минтермов
обычно также обозначают минтермом, причём в позиции разряда, по которому проведе-
но склеивание, поставлен прочерк.
Пример. Результат склеивания минтермов (0101) и (0111) обозначается (01-1).

853 / 907
6.5.7. Минимизация формул картами Карно (2/8)

Операция склеивания является эквивалентным преобразованием (см. п. 6.4.4), сохраня-


ет дизъюнктивность формы и при этом сокращает количество вхождений переменных,
поэтому операция склеивания и выделение компактных групп — основное средство ми-
нимизации дизъюнктивных форм.
Если получились две смежные непересекающиеся компактные группы, образующие пря-
моугольник, их можно по правилу склеивания объединить в компактную группу, соот-
ветствующую элементарной конъюнкции ранга n − 2 и т.д. Компактная группа, которая
не входит ни в какую другую компактную группу, называется максимальной. Компактные
группы могут включаться друг в друга, могут пересекаться, могут примыкать другу к дру-
гу, но не образовывать новой компактной группы при этом.

854 / 907
6.5.7. Минимизация формул картами Карно (3/8)

Каждая прямоугольная компактная группа из 2k смежных ячеек, содержащих 1, соответ-


ствует элементарной конъюнкции ранга n − k . В частности, если ячейка содержащая 1
изолированная (нет смежных ячеек содержащих 1), то эта ячейка образует компактную
группу, соответствующую минтерму, то есть элементарной конъюнкции ранга n. Таким об-
разом, задача минимизации дизъюнктивной формы сводится к отысканию покрытия всех
ячеек, содержащих 1 на карте Карно, минимальным количеством компактных групп.
Замечание. Элементарную конъюнкцию, соответствующую компактной группе, часто на-
зывают импликантой, поскольку если g — элементарная конъюнкция, соответствующая
некоторой компактной группе на карте Карно функции f , то имеет место импликация
g → f.

855 / 907
6.5.7. Минимизация формул картами Карно (4/8)
Пример. На рисунке показаны три компактных группы, которые имеются на карте Карно
функции g(x, y, z) из примера п. 6.5.1. Компактные группы (00-) и (-10) не пересекаются,
а компактные группы (0-0) и (-10), а также (00-) и (0-0), напротив, пересекаются. Все три
компактные группы являются максимальными. Хотя все четыре единицы на этом рисунке
находятся в соседних ячейках, компактную группу они не образуют, поскольку форма не
прямоугольная. Минимальное покрытие на карте Карно содержит два элемента: (00-) и
(-10), что соответствует дизъюнктивной форме ¬x & ¬y ∨ y & ¬z .

856 / 907
6.5.7. Минимизация формул картами Карно (5/8)
Пример. Рассмотрим карту Карно, приведённую на рисунке слева.

На этой карте имеется 14 компактных групп ранга 3 (рисунок в центре) и еще 3 компакт-
ных группы ранга 2 (рисунок справа). Других компактных групп нет.
Определить компактные группы, покрывающие все ячейки, содержащие 1 на карте Карно,
можно многими различными способами, в этом и состоит трудность задачи минимизации
дизъюнктивной формы.
857 / 907
6.5.7. Минимизация формул картами Карно (6/8)

Известны различные алгоритмы нахождения минимальных дизъюнктивных форм с по-


мощью карт Карно. Все эти алгоритмы переборные и используют методы сокращения пе-
ребора, основанные на фактах, устанавливаемых в следующих леммах.
Лемма. [1] Достаточно рассматривать только максимальные компактные группы.
Доказательство. Максимальные компактные группы соответствуют максимальным конъ-
юнкциям, то есть сокращённой ДНФ, далее по теореме п. 6.4.7.
Если какая-то 1 на карте Карно покрывается только одной компактной группой, то гово-
рят, что эта группа входит в ядро (данного покрытия).
Лемма. [2] Всякая компактная группа, входящая в ядро сокращённой ДНФ, входит в мини-
мальную ДНФ.
Доказательство. По лемме 1 достаточно рассматривать сокращённую ДНФ.

858 / 907
6.5.7. Минимизация формул картами Карно (7/8)

Замечание. Если все максимальные компактные группы оказались в ядре, то сокращён-


ная ДНФ является минимальной.
Компактную группу называют избыточной (в данном покрытии), если её можно удалить
из покрытия без потери эквивалентности исходной СДНФ. Покрытие (и, соответственно,
ДНФ) называется тупиковым, если оно не содержит избыточных компактных групп.
Лемма. [3] Минимальная ДНФ является тупиковой.
Доказательство. В противном случае ДНФ не была бы минимальной.
Отсюда вытекает основная идея метода минимизации: построить сокращённую ДНФ, по-
строить её ядро, перебрать все тупиковые ДНФ и найти минимальную.

859 / 907
6.5.7. Минимизация формул картами Карно (8/8)
Пример. Максимальные компактные группы для рассматриваемой функции приведены
на рисунке в центре. Компактные группы, показанные на рисунке слева, образуют по-
крытие, но соответствующая ДНФ не является минимальной (она содержит 6 · 3 = 18 ли-
тералов). Справа приведена одна из трёх минимальных ДНФ данной функции, содержа-
щая 3 · 2 + 2 · 3 = 12 литералов.

860 / 907
6.5.8. Деревья решений (1/7)

Наиболее эффективными с точки зрения экономии памяти и времени оказываются пред-


ставления, которые не имеют прямой связи с «естественными» представлениями функ-
ции в виде графика (массива) или формулы (выражения), но специально ориентированы
на выполнение операций.
Начнём с простого наблюдения. Таблицу истинности булевой функции n переменных
можно представить в виде полного бинарного дерева высоты n + 1.
Замечание. Бинарные деревья, равно как и другие виды деревьев, а также способы их
представления в программах и соответствующая терминология, рассматриваются в гла-
ве 9.
Ярусы дерева соответствуют переменным, дуги дерева соответствуют значениям пере-
менных, скажем, левая дуга — 0, а правая — 1. Листья дерева на последнем ярусе хранят
значение функции на кортеже, соответствующем пути из корня в этот лист. Такое дерево
называется деревом решений (или семантическим деревом).

861 / 907
6.5.8. Деревья решений (2/7)

Дерево решений можно сократить, если заменить корень каждого поддерева, все листья
которого имеют одно и то же значение, этим значением. Иногда такое сокращение зна-
чительно уменьшает объём дерева.
Пример. На рисунке слева представлено дерево решений для функции g , а справа пред-
ставлено сокращённое дерево решений для функции g .

862 / 907
6.5.8. Деревья решений (3/7)
Алгоритм вычисления значения функции осуществляется проходом по дереву решений.
При этом тип узла дерева N = struct {i : 0..1; l, r : ↑ N }.
Вход: указатель T : ↑ N на корень дерева решений,
массив x : array [1..n] of 0..1 значений переменных.
Выход: 0..1 — значение булевой функции.
i ← 0 //номер переменной
while true do
if T.l = nil & T.r = nil then return T.i end if
//листовой узел — возвращаем значение
i ← i + 1 //следующая переменная
if x[i] then
T ← T.r //1 — переход вправо
else
T ← T.l //0 — переход влево
end if
end while 863 / 907
6.5.8. Деревья решений (4/7)

Дерево решений можно сделать ещё компактнее, если отказаться от древовидности свя-
зей, то есть допускать несколько дуг, входящих в узел. В таком случае мы получаем би-
нарную диаграмму решений. Бинарная диаграмма решений получается из бинарного де-
рева решений тремя последовательными преобразованиями:
1) отождествляются листовые узлы, содержащие 0 и содержащие 1;
2) в диаграмме выделяются изоморфные поддиаграммы и заменяются единственным
их экземпляром;
3) исключаются узлы, обе исходящие дуги которых ведут в один узел.
Интерпретация бинарной диаграммы решений (вычисление значения функции) произ-
водится в точности так же, как и для дерева решений, то есть по указанному выше алго-
ритму.
На следующем слайде показан результат преобразования для функции g(x, y, z).

864 / 907
6.5.8. Деревья решений (5/7)

865 / 907
6.5.8. Деревья решений (6/7)
Пример. На рисунке показаны последовательность преобразований и окончательная диа-
грамма решений для функции g в том случае, когда переменные рассматриваются в сле-
дующем порядке: y, x, z .

866 / 907
6.5.8. Деревья решений (7/7)
Таким образом, результат преобразования дерева решений в диаграмму решений суще-
ственно зависит от того, в каком порядке рассматриваются переменные при построении
исходного полного дерева решений.
Полученная в последнем примере диаграмма компактнее: вычисление значения функции
g требует всего двух операций. Фактически, диаграмма показывает, что функция g может
быть реализована следующим условным выражением:

if y then ¬z else ¬x end if.

Отступление. Последний разобранный пример свидетельствует, что иногда можно построить та-
кое специальное представление функции, которое позволяет хранить меньше информации и при
этом производить вычисления быстрее, чем это в принципе возможно при использовании уни-
версальных математических методов представления функций с помощью графиков (массивов) и
формул (выражений). Советуем читателям обдумать этот факт.

867 / 907
6.6. Полные системы булевых функций

В типичной современной цифровой вычислительной машине цифрами являются 0 и 1.


Следовательно, команды, которые выполняет процессор, суть булевы функции. Выше по-
казано, что любая булева функция реализуется через конъюнкцию, дизъюнкцию и отри-
цание. Следовательно, можно построить нужный процессор, имея в распоряжении эле-
менты, реализующие конъюнкцию, дизъюнкцию и отрицание. Этот раздел посвящён от-
вету на вопрос: существуют ли (и если существуют, то какие) иные системы булевых функ-
ций, обладающих тем свойством, что с их помощью можно выразить все другие функции.

868 / 907
6.6.1. Замкнутые классы (1/5)
Пусть F = {f1 , . . . , fm }, ∀ i ∈ 1..m (fi ∈ Pn ). Замыканием F (обозначается [F ]) называ-
ется множество всех булевых функций, реализуемых формулами над F :
Def
[F ] = {f ∈ Pn | f = func F & F ∈ F[F ]} .
Отметим следующие свойства замыкания (см. также 2.1.2).
1. F ⊂ [F ].
2. [[F ]] = [F ].
3. F1 ⊂ F2 =⇒ [F1 ] ⊂ [F2 ].
4. ([F1 ] ∪ [F2 ]) ⊂ [F1 ∪ F2 ].
Класс функций F называется замкнутым, если [F ] = F .
Рассмотрим следующие классы функций.
Def
Класс функций, сохраняющих 0: T0 = {f | f (0, . . . , 0) = 0} .
Def
Класс функций, сохраняющих 1: T1 = {f | f (1, . . . , 1) = 1} .
Def
Класс самодвойственных функций: T∗ = {f | f = f ∗ } .
869 / 907
6.6.1. Замкнутые классы (2/5)
Def
Класс монотонных функций: T6 = {f | α 6 β =⇒ f (α) 6 f (β)}, где α = (a1 , . . . , an ),
Def
β = (b1 , . . . , bn ), ai , bi ∈ E2 , α 6 β = ∀ i (ai 6 bi ).
Def
Класс линейных функций: TL = {f | f = c0 + c1 x1 + · · · + cn xn }, где + обозначает сло-
жение по модулю 2, а знак & опущен.
Примеры. 1. Рассмотрим отрицание и введём обозначение ϕ(x) ← x. Имеем ϕ 6∈ T0 , так
как ϕ(0) = 1, ϕ 6∈ T1 , так как ϕ(1) = 0, ϕ 6∈ T6 , так как 0 < 1, но ϕ(0) > ϕ(1). С другой
стороны, ϕ ∈ T∗ , так как ϕ∗ (x) = ϕ(x) = ¬ϕ(¬x) = ¬¬x = x = ϕ(x), и ϕ ∈ TL , так как
ϕ(x) = x + 1.
2. Рассмотрим конъюнкцию и введём обозначение ψ(x, y) ← x ∧ y . Имеем: ψ ∈ T0 , так
как 0 ∧ 0 = 0, ψ ∈ T1 , так как 1 ∧ 1 = 1, ψ ∈ T6 , так как ψ(1, 1) = 1, и
∀ (a, b) 6= (1, 1) ((a, b) 6 (1, 1) & ψ(a, b) = 0). С другой стороны, ψ 6∈ T∗ , так как
ψ ∗ (x, y) = x ∨ y , и ψ 6∈ TL . Действительно, от противного, пусть ψ(x, y) = ax + by + c.
Тогда имеем: если x, y = 0, 0, то a0 + b0 + c = 0 =⇒ c = 0; если x, y = 0, 1, то
a0 + b1 + 0 = 0 =⇒ b = 0; если x, y = 1, 0, то a1 + 0 · 0 + 0 = 0 =⇒ a = 0; если
x, y = 1, 1, то 0 · 1 + 0 · 1 + 0 = 1, и, значит, 0 = 1 — противоречие.
870 / 907
6.6.1. Замкнутые классы (3/5)

Теорема. Классы T0 , T1 , T∗ , T6 , TL замкнуты.


Доказательство. Чтобы доказать, что некоторый класс F замкнут, достаточно показать,
что если функция реализована в виде формулы над F , то она принадлежит F . Доказать,
что произвольная формула обладает заданным свойством, можно с помощью индукции
по структуре формулы (см. п. 6.3.3). База индукции очевидна: функции из F реализованы
как тривиальные формулы над F . Таким образом, осталось обосновать индукционные
переходы для пяти рассматриваемых классов.
[ T0 ] Пусть f, f1 , . . . , fn ∈ T0 и Φ = f (f1 (x1 , . . . , xn ), . . . , fn (x1 , . . . , xn )).
Тогда Φ(0, . . . , 0) = f (f1 (0, . . . , 0), . . . , fn (0, . . . , 0)) = f (0, . . . , 0) = 0.
Следовательно, Φ ∈ T0 .
[ T1 ] Пусть f, f1 , . . . , fn ∈ T1 и Φ = f (f1 (x1 , . . . , xn ), . . . , fn (x1 , . . . , xn )).
Тогда Φ(1, . . . , 1) = f (f1 (1, . . . , 1), . . . , fn (1, . . . , 1)) = f (1, . . . , 1) = 1.
Следовательно, Φ ∈ T1 .

871 / 907
6.6.1. Замкнутые классы (4/5)

Доказательство. (Продолжение)
[ T∗ ] Пусть f, f1 , . . . , fn ∈ T∗ и Φ = f (f1 (x1 , . . . , xn ), . . . , fn (x1 , . . . , xn )). Тогда
Φ∗ = f ∗ (f1∗ (x1 , . . . , xn ), . . . , fn∗ (x1 , . . . , xn )) = f (f1 (x1 , . . . , xn ), . . . , fn (x1 , . . . , xn )) = Φ.
Следовательно, Φ ∈ T∗ .
[ T6 ] Пусть f, f1 , . . . , fn ∈ T6 и Φ = f (f1 (x1 , . . . , xn ), . . . , fn (x1 , . . . , xn )).
Тогда α 6 β =⇒ (f1 (α), . . . , fn (α)) 6 (f1 (β), . . . , fn (β)) =⇒
=⇒ f (f1 (α), . . . , fn (α)) 6 f (f1 (β), . . . , fn (β)) =⇒ Φ(α) 6 Φ(β).
Следовательно, Φ ∈ T6 .
[ TL ] Пусть f, f1 , . . . , fn ∈ TL и Φ = f (f1 (x1 , . . . , xn ), . . . , fn (x1 , . . . , xn )).
Тогда f = c0 + c1 x1 + . . . + cn xn , f1 = c10 + c11 x1 + . . . + c1n xn , . . . ,
fn = cn0 + cn1 x1 + . . . + cnn xn . Подставим эти формулы в формулу для Φ. Имеем
Φ(x1 , . . . , xn ) = c0 + c1 (c10 + c11 x1 + . . . + c1n xn ) + . . . + cn (cn0 + cn1 x1 + . . . + cnn xn ) =
= d0 + d1 x1 + . . . + dn xn . Следовательно, Φ ∈ TL .

872 / 907
6.6.1. Замкнутые классы (5/5)
T0 T1 T∗ T6 TL Пример. Слева представлена таблица
0 + − − + + принадлежности булевых функций двух
x&y + + − + − переменных рассмотренным выше за-
x + + + + + мкнутым классам. Плюс указывает, что
y + + + + + функция принадлежит классу, минус
x +2 y + − − − + указывает, что функция не принадлежит
x∨y + + − + − классу. В каждой строке, и в каждом
x↓y − − − − − столбце таблицы есть как плюсы, так и
x≡y − + − − + минусы. Таким образом, рассмотренные
¬y − − + − + классы T0 , T1 , T∗ , T6 , TL попарно раз-
¬x − − + − + личны, не пусты и не совпадают с Pn .
x→y − + − − − Замечание. Две функции, штрих
x|y − − − − − Шеффера и стрелка Пирса, не принад-
1 − + − + + лежат ни одному из рассматриваемых
замкнутых классов.
873 / 907
6.6.2. Полные системы функций (1/2)
Класс функций F называется полным, если его замыкание совпадает с Pn : [F ] = Pn .
Другими словами, множество функций F образует полную систему, если любая функция
реализуема в виде формулы над F .
Теорема. Пусть заданы две системы функций: F = {f1 , . . . , fm } и G = {g1 , . . . , gk }. Тогда,
если система F полна и все функции из F реализуемы формулами над G, то система G
также полна:
([F ] = Pn & ∀ i ∈ 1..m (fi = func Gi [G])) =⇒ [G] = Pn .
Доказательство. Пусть h — произвольная функция, h ∈ Pn .
Тогда [F ] = Pn =⇒ h = func F[F ] =⇒ F[Gi /fi ] — формула над G.
Следовательно, h = func G[G].
Примеры. Система { ∨ , ∧, ¬} — полная (п. 6.4.3). Следовательно:
1) система {¬, ∧} полная, так как x1 ∨ x2 = ¬(¬x1 ∧ ¬x2 );
2) система {¬, ∨} полная, так как x1 ∧ x2 = ¬(¬x1 ∨ ¬x2 );
3) система {|} полная, так как ¬x = x | x, x1 ∧ x2 = ¬(x1 | x2 ) = (x1 | x2 ) | (x1 | x2 ).
874 / 907
6.6.2. Полные системы функций (2/2)
Cистема {0, 1, ∧, +} полная, так как ¬x = x + 1 (здесь + означает сложение по моду-
лю 2). Представление булевой функции над базисом {0, 1, ∧, +} называется полиномом
Жегалкина. P
Таким образом, всякая булева функция представима в виде ai1 ,...,is xi1 · . . . · xis , где
(i1 ,...,is )
P
— сложение по модулю 2, знак · обозначает конъюнкцию
P и ai1 ,...,is ∈ E2 . P
Замечание. Фактически, в полиноме Жегалкина ai1 ,...,is xi1 · . . . · xis = xi 1 · · · xi s ,
поскольку если ai1 ,...,is = 1, то этот коэффициент можно опустить, а если ai1 ,...,is = 0, то
можно опустить всё слагаемое. Знак конъюнкции обычно также опускают.
Пример. ¬x = x + 1, x ∨ y = xy + x + y , x ≡ y = x + y + 1.
Замечание. Если в полиноме Жегалкина произвести следующие замены логических опе-
раций арифметическими: x ∧ y 7→ xy ; x +2 y 7→ x + y − 2xy , то получится арифметиче-
ский полином, который можно упростить и использовать для вычисления значения буле-
вой функции.

875 / 907
6.6.3. Полнота двойственной системы

Теорема. Если система F = {f1 , . . . , fk } полна, то система двойственных функций F ∗ =


{f1∗ , . . . , fk∗ } также полна.
Доказательство. Пусть h — произвольная функция, h ∈ Pn . Рассмотрим двойственную
функцию h∗ . Система F полна, так что h∗ = func H[F ]. По принципу двойственности
h = func H∗ [F ∗ ].
Пример. Система {0, 1, ∧, +} полна, следовательно, система {1, 0, ∨, ≡} также полна.

876 / 907
6.6.4. Теорема Поста (1/5)
Теорема Поста устанавливает необходимые и достаточные условия полноты системы бу-
левых функций.
Теорема. Система булевых функций F полна тогда и только тогда, когда она содержит
хотя бы одну функцию, не сохраняющую нуль, хотя бы одну функцию, не сохраняющую еди-
ницу, хотя бы одну несамодвойственную функцию, хотя бы одну немонотонную функцию
и хотя бы одну нелинейную функцию:

[F ] = Pn ⇐⇒ ¬(F ⊂ T0 ∨ F ⊂ T1 ∨ F ⊂ T∗ ∨ F ⊂ T6 ∨ F ⊂ TL ).

Доказательство.
[ Необходимость ] От противного. Пусть [F ] = Pn и

F ⊂ T0 ∨ F ⊂ T1 ∨ F ⊂ T∗ ∨ F ⊂ T6 ∨ F ⊂ TL .

Введём обозначение: i — один из индексов, 0, 1, ∗, 6 или L.


Тогда Ti = [Ti ] =⇒ [F ] ⊂ Ti =⇒ Pn ⊂ Ti =⇒ Pn = Ti , но Pn 6= Ti по таблице из п. 6.6.1.
877 / 907
6.6.4. Теорема Поста (2/5)
Доказательство. (Продолжение 1)
[ Достаточность ] Пусть ¬(F ⊂ T0 ∨ F ⊂ T1 ∨ F ⊂ T∗ ∨ F ⊂ T6 ∨ F ⊂ TL ). Тогда

∃ F 0 = hf0 , f1 , f∗ , f6 , fL i (f0 6∈ T0 & f1 6∈ T1 & f∗ 6∈ T∗ & f6 6∈ T6 & fL 6∈ TL ) .

Функции f0 , f1 , f∗ , f6 , fL не обязательно различны и не обязательно исчерпывают F .


Покажем, что отрицание и конъюнкция реализуются в виде формул над F 0 . Тем самым
теорема будет доказана (см. п. 6.6.2). Построение проводится в три этапа: на первом стро-
ятся формулы, реализующие константы 0 и 1, которые нужны на третьем этапе. На вто-
ром этапе строится формула, реализующая отрицание. На третьем этапе строится фор-
мула, реализующая конъюнкцию.
[ Константы ] Построим формулу, реализующую 1. Пусть ϕ(x) ← f0 (x, . . . , x). Тогда
ϕ(0) = f0 (0, . . . , 0) 6= 0 =⇒ ϕ(0) = 1. Возможны два случая: ϕ(1) = 1 или ϕ(1) = 0.
Пусть ϕ(1) = 1. В этом случае формула ϕ реализует 1. Пусть ϕ(1) = 0. В этом случае
формула ϕ реализует отрицание.
878 / 907
6.6.4. Теорема Поста (3/5)
Доказательство. (Продолжение 2) Тогда рассмотрим функцию f∗ . Имеем

f∗ 6∈ T∗ =⇒ ∃ a1 , . . . , an f∗ (a1 , . . . , an ) 6= f∗ (a1 , . . . , an ) .

Следовательно, f∗ (a1 , . . . , an ) = f∗ (a1 , . . . , an ). Пусть теперь ψ(x) ← f∗ (xa1 , . . . , xan ). Тогда

ψ(0) = f∗ (0a1 , . . . , 0an ) = f∗ (a1 , . . . , an ) = f∗ (a1 , . . . , an ) = f∗ (1a1 , . . . , 1an ) = ψ(1).

Таким образом, ψ(0) = ψ(1), откуда ψ = 1 или ψ = 0. Если ψ = 1, то требуемая константа


1 построена. В противном случае ψ реализует 0, и, значит, ϕ(ψ(x)) = ψ(x) реализует 1.
Построение 0 аналогично, только вместо f0 нужно использовать f1 .
[ Отрицание ] Построим формулу, реализующую отрицание. Рассмотрим функцию f6 .
Имеем f6 6∈ T6 =⇒ ∃ α = (a1 , . . . , an ), β = (b1 , . . . , bn ) (α 6 β & f6 (α) > f6 (β)).
Тогда α 6 β =⇒ ∀ i (ai = bi ∨ ai = 0 & bi = 1). Но f6 (α) 6= f6 (β) =⇒ α 6= β =⇒
=⇒ ∃ J ⊂ 1..n (j ∈ J =⇒ aj = 0 & bj = 1). Другими словами, J — это множество ин-
дексов j , для которых aj 6= bj .
879 / 907
6.6.4. Теорема Поста (4/5)
Доказательство. (Продолжение 3) Пусть ϕ(x) ← f6 (c1 , . . . , cn ), где cj ← x, если j ∈ J , и
cj ← aj (= bj ), если j ∈
/ J . Тогда

ϕ(0) = f6 (c1 , . . . , cn )[0/x] = f6 (α) > f6 (β) = f6 (c1 , . . . , cn )[1/x] = ϕ(1).

Имеем ϕ(0) > ϕ(1) =⇒ ϕ(0) = 1 & ϕ(1) = 0 =⇒ ϕ(x) = x.


[ Конъюнкция ] Построим формулу, реализующую конъюнкцию. Рассмотрим функцию fL .
P
Имеем fL ∈ Pn =⇒ fL = ai1 ,...,is xi1 · . . . · xis . Но fL ∈
/ TL , следовательно, в полино-
i1 ,...,is
ме Жегалкина существует нелинейное слагаемое, содержащее конъюнкцию по крайней
мере двух переменных. Пусть, для определённости, это x1 и x2 . Тогда
fL = x1 · x2 · fa (x3 , . . . , xn ) + x1 · fb (x3 , . . . , xn ) + x2 · fc (x3 , . . . , xn ) + fd (x3 , . . . , xn ),
причём fa (x3 , . . . , xn ) 6= 0. Следовательно, ∃ a3 , . . . , an (fa (a3 , . . . , an ) = 1).
Пусть b ← fb (a3 , . . . , an ), c ← fc (a3 , . . . , an ), d ← fd (a3 , . . . , an )
и ϕ(x1 , x2 ) ← fL (x1 , x2 , a3 , . . . , an ) = x1 · x2 + b · x1 + c · x2 + d.
880 / 907
6.6.4. Теорема Поста (5/5)

Доказательство. (Окончание) Пусть далее ψ(x1 , x2 ) ← ϕ(x1 + c, x2 + b) + b · c + d. Тогда


ψ(x1 , x2 ) = (x1 + c) · (x2 + b) + b · (x1 + c) + c · (x2 + b) + d + b · c + d =
= x1 · x2 + c · x 2 + b · x1 + b · c + b · x1 + b · c + c · x2 + b · c + d + b · c + d = x1 · x2 .
Функции x + a выразимы, так как x + 1 = x, x + 0 = x, а константы 0, 1 и отрицание уже
построены.
Пример.
1. В системе {¬, ∧} отрицание не сохраняет констант и немонотонно, а конъюнкция
несамодвойственна и нелинейна.
2. Функция штрих Шеффера (также как функция стрелка Пирса) не сохраняет констант,
несамодвойственна, немонотонна и нелинейна, а потому сама по себе образует пол-
ную систему.

881 / 907
Предметный указатель
Автоморфизм Джонсона, 652
графов, 431 Евклида, 34
Азбука Морзе, 212 Краскала, 554
Аксиома Прима, 555
выбора, 414 Уоршалла, 358
метрики, 245 Фано, 220
регулярности, 296 Флойда–Уоршалла, 648
симметрии, 245 Хаффмена, 229
тождества, 245 Эдмондса, 619
Алгебра, 301 взаимного вычитания, 35
подмножеств, 325 восстановления упорядоченного ордере-
Алгоритм ва по коду, 534
Беллмана–Форда, 631 выделения компонент сильной связно-
Дейкстры, 634 сти, 590
882 / 907
генерации перестановок, 110 множеств, 710
генерации подмножеств, 137 построения эйлерова цикла, 674
неэффективный, 706 приближённый, 736
определения расстояний от источника, распаковки кода Прюфера, 527
629 топологической сортировки, 403
поиска эвристический, 700
в глубину, 483 эффективный, 706
в ширину, 483 Алгоритм
с возвратами, 703 проверки правильности скобочной струк-
последовательного раскрашивания, 737 туры, 541
последовательного раскрашивания Алфавит, 299
(улучшенный), 738 Арифметика, 301
построения кода Прюфера, 526 модулярная, 65
построения кода упорядоченного орде- Ассоциативность
рева, 533 объединения, 329
построения кратчайшего остова, 552 пересечения, 329
построения максимальных независимых Атака
883 / 907
циклическая, 284 Вектор, 298
Базис циклический, 666
орграфа, 593 Величина
Беспорядок, 174 случайная, 101
Биграф, 459 Вероятность, 98, 99
Бином Ньютона, 123 апостериорная, 103
Бит чётности, 238 априорная, 103
Блок подмножества, 99
графа, 566 распределение, 98
разбиения, 153, 320 равномерное, 98
тривиальный, 570 условная, 103
Блок сообщения, 237 Вершина
Брат узла, 518 висячая, 437
Буква, 299 графа, 421
Булеан, 325 достижимая, 498
Бэктрекинг (backtracking), 703 изолированная, 437
Валентность вершины, 436 концевая, 437
884 / 907
откладывание, 451 Геодезическая, 444
покрывающая, 687 Гиперграф, 427
разделяющая, 566 Гипердуга, 427
связанная, 442 Гиперорграф, 427
центральная, 447 Гомоморфизм, 385
Вес Граница
дуги, 621 верхняя, 406
Ветвь ордерева, 518 нижняя, 406
Включение множеств, 302 Грань графа, 747
Вложение Граф, 421
множеств, 304 n-связный, 577
Вместимость отношения, 341 субциклический, 508
Вхождение, 299 Герца, 589
Высота абстрактный, 431
дерева, 518 ациклический, 440, 508
множества, 399 взвешенный, 621
Гамма шифра, 274 вполне несвязный, 442
885 / 907
гамильтонов, 677 полугамильтонов, 677
геодезический, 444 полуэйлеров, 670
гомеоморфный, 751 помеченный, 421, 427
двудольный, 459 пустой, 458
двусвязный, 579 равенство, 421
древочисленный, 508 регулярный, 436
звёздный, 463 рёберный, 473
инциденций, 502 с петлями, 426
к-дольный, 462 связный, 442
нагруженный, 427 тривиальный, 458
несвязный, 442 чётный, 459
нумерованный, 427, 675 эйлеров, 670
ориентированный, 426 График
планарный, 747 отношения, 338
плоский, 747 Двойственность, 331, 402
полный, 458 Декодирование, 201
полный двудольный, 459 Делитель, 14, 17
886 / 907
Дерево, 508 Венна, 317
m-ичное, 524 Хассе, 366
И/ИЛИ, 505 графа, 423
бинарное, 523 Диаметр графа, 446
двоичное, 523 Дистанция редактирования, 246
игры, 505 Дистрибутивность
корневое, 516 объединения относительно пересечения,
кратчайших путей, 629 329
ориентированное, 516 пересечения относительно объединения,
прошитое, 549 329
свободное, 508 Дисциплина имён, 36
упорядоченное, 519 Длина
Дешифрация, 272 дуги, 621
Дешифрование, 272 кратчайшего пути, 621
Диагональ маршрута, 444
прямого произведения, 341 набора, 335
Диаграмма последовательности, 399
887 / 907
пути, 621 NP-полная, 680
слова, 299 Штейнера, 558
цикла, 348, 440 комбинаторная, 85
Добавление коммивояжёра, 680
вершины, 468 о Кёнигсбергских мостах, 417
ребра, 468 о восьми ферзях, 712
Доля, 459 о выборе переводчиков, 722
Дополнение о наименьшем покрытии, 713, 719
множества, 316 о пяти ферзях, 714
Достоверность декодирования, 242 о свадьбах, 596
Дробь о трёх домах и трёх колодцах, 418
непрерывная, 48 о четырёх красках, 419
периодическая, 51 переборная, 140
подходящая, 49 сортировки, 109
цепная, 48 Задача (problem)
Дуга, 426 о развозке (transshipment), 722
Задача Законы де Моргана, 329
888 / 907
Замыкание, 355 рёберный, 431
отношения, 356 Инвариант
Зашифровка, 272 графа, 430
Звезда, 463 цикла, 77
Звено Инверсия, 109
цепной дроби , 48 Инволютивность
Золотое сечение, 195 дополнения, 329
Идемпотентность Индикатор, 297
объединения, 329 Интерпретация
пересечения, 329 представления, 623
Изграф, 435 Инфимум, 406
Измельчение разбиения, 153 Инцидентность, 422
Изоморфизм, 386 Искусственный интеллект, 505
вполне упорядоченных множеств, 412 Источник, 466
графов, 429 Канал
линейно упорядоченных множеств, 411 двоичный симметричный, 241
множеств, 386 пропускная способность, 242
889 / 907
связи Код
с помехами, 234 Прюфера, 526
Каркас, 550 Хэмминга, 264
Карта, 419 сообщения, 201
Квадрат элементарный, 205
латинский, 600 Кодерево, 663
ортогональный, 602 Кодирование, 201
Квазипорядок, 391 m-ичное, 201
Класс, 292 алфавитное, 205
вычетов, 59 безызбыточное, 254
толерантности, 383 двоично-десятичное, 205
эквивалентности, 373 двоичное, 201
Класс (class) длина, 217
одноцветный (unicolored), 729 однозначное, 202
Клика, 459 оптимальное , 218
Ключ побуквенное , 205
шифра, 272 помехоустойчивое, 235
890 / 907
равномерное, 218 Конденсация орграфа, 589
с исправлением ошибок, 235 Конец цепи, 439
с минимальной избыточностью, 218 Контекст (context), 707
самокорректирующееся, 235 Контур, 441
систематическое, 261 Конфигурация комбинаторная, 86
цена, 217 Координаты
Кодовое слово, 205 Декартовы, 200
Комбинаторика, 84 Корень ордерева, 516
Комментарий, 36 Кортеж, 334, 341
Коммутативность Котинуум-гипотеза
объединения, 329 обобщенная, 328
пересечения, 329 Коцикл, 667
Композиция Коэффициент
отношений, 342 Безу, 39
Компонента биномиальный, 123
связности, 442, 561 расширенный, 141
сильной связности, 589 мультиномиальный, 146
891 / 907
полинома, 74 инциденций, 480
Криптография, 273 порождающая, 259
Криптостойкость, 273 предшествования, 622
Крона ордерева, 518 проверочная, 260
Лес, 508 смежности, 479
остовный, 550 Матрёшка, 93
Лист ордерева, 518 Медиана
Маршрут, 439 множества, 220
замкнутый, 439 Метод
открытый, 439 Ферма, 28
Массив включений и исключений, 167
дуг, 482 Метрика, 245
рёбер, 482 Многочлен, 74
Математическое ожидание, 101 Множество, 291
Матрица бесконечное, 294, 307
длин дуг, 622 вершин
длин путей, 622 внешне устойчивое, 714
892 / 907
внутренне устойчивое, 689 рёбер
доминирующее, 714 внешне устойчивое, 715
независимое, 689 доминирующее, 715
разделяющее, 580 независимое, 595, 690
вполне упорядоченное, 410 разделяющее, 580
заданное смежности, 422
перечислением элементов, 293 счётное, 309
порождающей процедурой, 293 узлов
характеристическим предикатом, 293 доминирующее, 717
конечное, 294, 307 независимое, 717
линейно полное, 407 порождающее, 593
линейно упорядоченное, 394 уровня, 382
минимальное, 714, 715 частично упорядоченное, 394
наименьшее, 714, 715 Моном, 76
несчётное, 309 Мост, 566
пометок, 427 Мощность
пустое, 291 множества, 306, 327
893 / 907
мультимножества, 297 мультимножества, 297
Мощность множества, 314 Нумерация множества, 315
Мультиграф, 426 Область значений
Мультимножество, 297 отношения, 339
Мультиорграф, 426 Область определения
Набор, 334 отношения, 339
Надмножество, 302 Область отправления
собственное, 303 отношения, 338
Наибольший общий делитель, 17 Область прибытия
Наилучшее приближение, 54 отношения, 338
Наименьшее общее кратное, 18 Обход дерева
Неполное частное, 13 внутренний, 546
Неравенство инфиксный, 546
Коши-Буняковского, 697 концевой, 546
Макмиллана, 208 левый, 546
треугольника, 245, 622 постфиксный, 546
Носитель, 301 правый, 546
894 / 907
прямой, 522, 546 подразбиения (subpartition), 751
симметричный, 546 Орбита, 106
Объединение Орграф, 426
графов, 467 антисимметричный, 466
множеств, 316 направленный, 466
Окрестность Ордерево, 516
вершины, 422 Ослабление, 625
метрическая, 245 Основание
Операция, 301 системы счисления, 31, 65
групповая, 319 Остаток, 13
добавления элемента, 294 Остов, 550
конкатенации, 300 кратчайший, 550
пересечения, 300 Ось
сравнения, 301 числовая, 397
сцепления, 300 Отец узла, 518
удаления элемента, 294 Отношение
Операция (operation) n-арное, 341
895 / 907
n-местное, 341 строгого, 393
антирефлексивное, 344 частичного, 393
антисимметричное, 344 равномощности, 306
ациклическое, 349 рефлексивное, 344
бинарное, 338 симметричное, 344
дополнительное, 340 тождественное, 341
изоморфности, 387 транзитивное, 344
линейное, 344 универсальное, 340
на множестве, 339 функциональное, 376
обратное, 340 частичное, 344
однозначное, 376 эквивалентности, 57, 373
полное, 344 Отображение
порядка, 393 натуральное, 380
антилексикографического, 110 Отступ, 36
лексикографического, 110 Ошибка
линейного, 393 исправление, 238
нестрогого, 393 обнаружение, 238
896 / 907
Парадокс, 295 Плотность
Кантора, 328 графа, 459
Паросочетание, 595, 690 Поглощение, 329
максимальное, 595, 690 Подграф, 435
наибольшее, 595, 690 остовный, 435, 550
неустойчивое, 603 правильный, 435
полное, 615 собственный, 435
устойчивое, 603 Поддерево, 516
Паросочетание Подмножество, 302
совершенное, 596 собственное, 303
Переменная, 74 Подстановка, 106
Пересечение Поиск
множеств, 316 в глубину, 483
Перестановка в ширину, 483
Стирлинга, 116 Показатель элемента , 297
циклическая, 107 Покрытие
Петля, 107, 349, 426 вершинное, 687
897 / 907
минимальное обратная, 546
вершинное, 687 Польская запись
рёберное , 688 прямая, 546
множества, 320 Помехоустойчивость, 202
наименьшее Порядок
вершинное, 687 строгий, 392
рёберное, 688 Последовательность, 298
рёберное, 688 возрастающая, 399
Полином, 74 графовая, 449
неприводимый, 82 конечная, 334
примитивный, 82 остаточная, 451
разреженный, 76 степенная, 449
хроматический, 743 строго монотонно возрастающая, 399
Полный перебор, 680 Постфикс, 300
Полустепень захода, 437 Потомок узла, 518
Полустепень исхода, 437 Правило
Польская запись, 544 сложения, 87
898 / 907
умножения, 88 Прямоугольник
Предок узла (ancestor node), 518 латинский, 600
Предпорядок, 391 Псевдограф, 426
Представление Путь, 441
минимальное, 360 Равенство
Префикс, 300 множеств, 302
Принадлежность, 291, 302 упорядоченных пар, 334
Принцип Радиус графа, 446
Дирихле, 89, 314 Разбиение
индукции, 413 множества, 320
Проекция Разложение
каноническая, 380 функции, 380
Произведение Размножение вершины, 468
декартово, 336 Разность
прямое, 336 множеств, 316
Пространство симметрическая, 316
поиска, 140 Разрез, 580
899 / 907
фундаментальный, 667 Расшифровка, 272
Разрез (cut), 658 Расшифровывание, 272
правильный (regular), 659 Ребро
простой (simple), 661 графа, 421
Разряд кратное, 426
информационный, 261 покрывающее, 687
контрольный, 255, 261 Редукция, 355
проверочный, 261 транзитивная, 360
Ранг Рекорд пути, 637
коциклический, 667 Рекуррентное соотношение, 132
циклический, 663 Релаксация, 625
Раскраска графа, 729 Родитель узла, 518
Расстояние, 245, 444 Ряд
Левенштейна, 246 гармонический, 189
Хэмминга, 248 Связанность узлов
евклидово, 245 односторонняя, 587
кодовое, 249 сильная, 587
900 / 907
слабая, 587 вычетов
Связность, 561 полная, 60
вершинная, 577 приведённая, 72
односторонняя, 587 остаточных классов, 65
рёберная , 577 различных представителей, 596
сильная, 587 разрезов
слабая, 587 фундаментальная, 667
Семейство циклов
дизъюнктное, 320 фундаментальная, 663
множеств, 291 Система счисления
равномощных подмножеств, 326 позиционная, 31
Сеть, 466 десятичная , 200
Сжатие Слово, 299
с потерями, 242 начало, 300
Символ, 299 окончание(postfix), 300
Синдром, 264 пустое, 299
Система Смежность
901 / 907
вершин, 422 по модулю, 56
рёбер, 422 Степень
Соединение графов, 467 вершины, 436
Сокращение, 355 максимальная, 436
транзитивное, 360 минимальная, 436
Сообщение, 201 множества, 337
шифрованное, 272 отношения, 348
Соответствие, 304 полинома, 74
взаимно-однозначное, 305 средняя, 697
Соотношение Стиль программирования, 36
Безу, 39 Сток, 466
Состав Стрелка Пирса, 331
мультимножества, 297 Стягивание подграфа, 468
последовательности, 144 Субфакториал, 174
Список смежности, 481 Супремум, 406
Сравнение Схема
линейное, 63 Горнера, 32, 78
902 / 907
кодирования, 205 Штейнера, 558
префиксная, 207 неподвижная, 106
разделимая, 206 подвижная, 106
Сын узла, 518 сочленения, 566
Таблица Трансверсаль, 596
кодов, 205 Транспозиция, 107
Тайнопись, 273 Трансфинитность, 315
Теорема Треугольник, 349
Кантора–Бернштейна, 324 Белла, 163
Куратовского, 751 Паскаля, 125
Менгера, 582 расширенный, 142
Теория Турнир, 466
вероятности, 99 Удаление
информации, 242 вершины, 467
Тип, 299 ребра, 467
Толерантность, 383 Узел, 426
Точка Укладка графа, 747
903 / 907
Улучшение перебора (search improvement), Бине, 194
707 Коши, 120
Универсум, 295 Эйлера, 749
Упорядоченная пара, 334 включений и исключений, 170
Уравнение Функция
диофантово, 46 Эйлера, 68
Уровень узла, 518 аддитивная, 69
Фактор-граф, 589 индуцированная, 380
Факториал монотонная, 408
возрастающий, 97 монотонно возрастающая, 408
двойной, 115 монотонно убывающая, 408
убывающий, 91 мультипликативная, 69
Факторизация, 380 односторонняя, 278
Фактормножество, 379 отождествления, 380
Форма записи производящая, 186
инфиксная, 339 строго монотонная, 408
Формула строго монотонно возрастающая, 408
904 / 907
строго монотонно убывающая, 408 в перестановке, 106
Характеристика канала, 237 гамильтонов, 677
Хорда, 508, 663 длина, 107
Центр простой, 440, 658
графа, 447 тривиальный, 107
звезды, 463 фундаментальный, 663
Цепочка, 299, 399 эйлеров, 670
множеств, 93 Цифра, 31
полная, 93 Цифровая подпись, 285
Цепь, 439 Цифры
вершинно-непересекающаяся, 580 римские, 200
гамильтонова, 677 Часть графа, 435
простая, 439 Числа
рёберно-непересекающаяся, 580 взаимно простые, 17
эйлерова, 670 Число
Цикл, 440 Белла, 162
в отношении, 348 Каталана, 196
905 / 907
Моргана, 156 рёберное независимости, 690
Стирлинга, 153 совершенное, 16
Фибоначчи, 43, 192 сочетаний, 94
вершинного покрытия, 687 сочетаний с повторениями, 96
вершинное независимости, 689 треугольное, 16
вещественное, 291 хроматическое, 729
инверсий, 109 целое, 291
кардинальное, 315 цикломатическое, 663
кликовое, 459 Шар, 245
коцикломатическое, 667 Шифр, 272
натуральное, 291 асимметричный, 273
перестановок, 93 надёжный, 273
простое, 291 раскрытие, 272
псевдослучайное, 274 с открытым ключом, 279
размещений, 90 симметричный, 273
размещений без повторений, 91 Шифрование, 272
рёберного покрытия, 688 Шифровка, 272
906 / 907
Шкала множества, 291
ошибок, 264 наибольший, 402
Штрих Шеффера, 331 наименьший, 401
Эйлерова характеристика, 749 Ядро
Экземпляр класса, 471 графа, 716
Эксцентриситет орграфа, 717
вершины, 446 отношения, 352
Электронная подпись, 285 Язык, 300
Элемент Ярус, 445
максимальный, 402 дерева, 518
минимальный, 400

907 / 907

Вам также может понравиться