Конспект лекций
Ф. А. Новиков
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.
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:
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 — противоречие.
h2 6 a < (h + 1)2 .
называется схемой Горнера. Эта схема позволяет, зная последовательность цифр и осно-
вание системы счисления, вычислить значение числа наиболее эффективным способом,
выполнив 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)
34 / 907
1.2. Алгоритм Евклида
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 ). Имеем
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
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.
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)
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)!
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)
101 / 907
2.1.7. Дискретная вероятность (4/7)
Случайная величина — это тотальная функция ϕ : X → R, причём на множестве X зада-
ны вероятности элементов. Математическим ожиданием случайной величины при рас-
пределении вероятности PX = (p1 , . . . , pn ) называется число
n
X
Eϕ = ϕ(xk )pk = ϕ(x1 )p1 + . . . + ϕ(xn )pn .
k=1
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 ).
113 / 907
2.2.3. Генерация перестановок (4/5)
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. Биномиальные коэффициенты
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
. . . . . .
126 / 907
2.3.3. Треугольник Паскаля (2/7)
Для случая рекурсивного вычисления C(m, n), получаем 2n сложений, так как на каждом
шаге рекурсии количество вычислений увеличивается в два раза, а всего шагов n. А для
нерекурсивного метода имеем n сложений, то есть рекурсивный метод экспоненциально
хуже нерекурсивного.
127 / 907
2.3.3. Треугольник Паскаля (3/7)
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)
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 для используемого представления чисел в компьютере.
Использование формулы
136 / 907
2.3.4. Применение рекуррентного соотношения (5/5)
Асимптотическая сложность первого алго-
ритма O(n ∗ (m − n)), а второго — O(n).
Но не стоит слепо доверять асимптотической
оценке — на реальное быстродействие алго-
ритмов влияют и другие факторы, в частно-
сти, скорость выполнения арифметических
операций. Известно, что, в сравнении со сло-
жением, операции умножения и особенно
деления являются более затратными по вре-
мени выполнения. График справа отража-
ет минимальное (из двух) время, затрачен-
ное для нахождения значений биномиаль-
ных коэффициентов. Черная кривая обозна-
чает границу, ниже которой квадратичный
алгоритм справляется с поставленной зада-
чей быстрее линейного!
137 / 907
2.3.5. Генерация подмножеств (1/4)
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)
140 / 907
2.3.5. Генерация подмножеств (4/4)
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
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)
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. Разбиения
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
B1 ← {X ∈ B | ∃ B ∈ X (B = {m})} , B2 ← {X ∈ B | ¬∃ B ∈ X (B = {m})} ,
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 ∩ BB00 = ∅, если 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)
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
встаёт вопрос о хранении уже посчитанных чисел Стирлинга, необходимых для проме-
жуточных вычислений, а также многократного перевычисления одних и тех же чисел в
случае прямого использования рекурсии.
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)
169 / 907
2.5.1. Объединение конфигураций(2/2)
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
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
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
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)
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
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. Разделимые схемы
Рассмотрим схему алфавитного кодирования σ и различные слова, составленные из эле-
ментарных кодов. Схема σ называется разделимой, если
∃ i, j (i 6= j & βi = β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→∞
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
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 }. Имеем
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, то кодирование со схемой
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 ,
239 / 907
3.3.2. Возможность исправления всех ошибок (1/6)
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 .
241 / 907
3.3.2. Возможность исправления всех ошибок (3/6)
Таким образом, сама возможность исправления ошибок зависит от трёх факторов: мно-
жества сообщений, применяемого кодирования и характеристики канала. Как правило,
множество сообщений и характеристика канала считаются заданными, и задача состоит
в том, чтобы подобрать по возможности эффективное помехоустойчивое кодирование.
Однако в некоторых практических случаях исправление всех ошибок невозможно.
Пример. Рассмотрим канал, в котором в любом передаваемом разряде может происхо-
дить ошибка типа замещения с вероятностью p, причём замещения различных разря-
дов статистически независимы. Такой канал называется двоичным симметричным. В этом
случае любое слово может быть преобразовано в любое другое слово той же длины за-
мещениями разрядов. Таким образом, исправить все ошибки в двоичном симметричном
канале невозможно даже при сколь угодно малом p > 0.
242 / 907
3.3.2. Возможность исправления всех ошибок (4/6)
Отступление. Для различных моделей со случайными ошибками (в том числе для двоичного сим-
метричного канала) средствами теории вероятностей рассматривается и решаются, в частности,
такие задачи как:
Все эти вопросы являются предметом теории информации, которая здесь не рассматривается.
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)
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)
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
Другими словами, исправление ошибок типа δ возможно тогда и только тогда, когда ко-
довые слова схемы не лежат в δ -окрестностях друг друга.
Следствие. Рассмотрим схему равномерного кодирования σ = 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)
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)
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)
j1 = c1 + c3 + c5 + . . . = b1 + b3 + b5 + . . . = 0
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)
276 / 907
3.4.2. Криптостойкость (1/2)
Ti ← Ci +2 Si ,
и далее вся правая часть гаммы шифра определяется по указанной формуле датчика
псевдослучайных чисел.
Замечание. На практике часть сообщения вполне может быть известна злоумышленнику.
Например, многие текстовые редакторы помещают в начало файла документа одну и ту
же служебную информацию. Если злоумышленнику известно, что исходное сообщение
подготовлено в данном редакторе, то он сможет легко дешифровать сообщение.
277 / 907
3.4.2. Криптостойкость (2/2)
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)
280 / 907
3.4.4 Шифрование с открытым ключом (2/5)
Шифрование с открытым ключом производится следующим образом.
1. Получателем сообщений производится генерация открытого ключа (пара чисел n и
e) и закрытого ключа (число d). Для этого:
I выбираются два простых числа, p и q ;
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)
Шифр с открытым ключом позволяет выполнять и многие другие полезные операции,
помимо шифрования и посылки сообщений в одну сторону. Прежде всего, для организа-
ции многосторонней секретной связи каждому из участников достаточно сгенерировать
свою пару ключей (открытый и закрытый), а затем сообщить всем партнёрам свой откры-
тый ключ.
Заметим, что операции зашифровки и расшифровки, по существу, одинаковы, и разли-
чаются только показателем степени, а потому коммутируют:
287 / 907
3.4.6. Цифровая подпись (3/3)
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} .
Примеры. 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} .
При этом, однако, нет полной уверенности в том, что не обнаружатся другие противоре-
чия. Полноценным выходом из ситуации являлось бы аксиоматическое построение тео-
рии множеств и доказательство непротиворечивости построенной формальной теории.
Однако исследование парадоксов и непротиворечивости систем аксиом является техни-
чески трудной задачей и уводит далеко в сторону от программистской практики, для ко-
торой важнейшими являются конечные множества. Поэтому здесь мы ограничиваемся
наивной теорией множеств.
297 / 907
4.1.4. Мультимножества
Мультимножеством X b называется совокупность элементов множества X , в которую эле-
мент xi входит ai раз, ai > 0. Мультимножество обозначается одним из следующих спо-
собов:
∀ n ∈ 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 ∈
321 / 907
4.2.7. Разбиения и покрытия (2/5)
Доказательство. Выберем произвольный элемент i0 ∈ I и построим семейство
B = {Bi }i∈I следующим образом:
[
Bi0 ← M \ Ei , ∀ i ∈ I − i0 (Bi ← Ei ) .
i∈I−i0
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.
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)
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 .
Примеры. Простейший цикл длины 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)
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 .
355 / 907
4.4. Замыкание и сокращение отношений
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
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. Отношения эквивалентности
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, противоречие.
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)
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 )) .
391 / 907
4.6.1. Предпорядок (1/2)
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)
396 / 907
4.6.2. Частичный и линейный порядок (4/7)
∀ a, b (a 6= b =⇒ (aRb ⇐⇒ ¬(bRa))) .
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 )).
413 / 907
4.6.8. Индукция (1/2)
Важность вполне упорядоченных множеств определяется тем, что для них можно обоб-
щить принцип индукции, применяемый обычно для множества натуральных чисел.
Теорема. [Индукция по вполне упорядоченному множеству] Пусть X — вполне упорядо-
ченное множество, x0 — его минимальный элемент, а P — некоторый предикат, завися-
щий от элементов X . Тогда если
то
∀ 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)
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 .
Пример. На рисунке показаны диаграммы графа, правильного подграфа, неправильного
подграфа и остовного подграфа.
Если степень вершины равна нулю (то есть 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.
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)
449 / 907
5.1.6. Степенные последовательности (1/9)
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.
453 / 907
5.1.6. Степенные последовательности (5/9)
454 / 907
5.1.6. Степенные последовательности (6/9)
Доказательство. (Продолжение) Такими построениями получаем граф G0 такой, что
Γ(w) = S , причём граф G0 − w реализует последовательность D0 = (d0 1 , . . . , d0 p−1 ).
Вход: указатель на начало списка 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)
462 / 907
5.1.7. Виды графов (5/9)
Следствие. Ациклические графы двудольны.
Пример. На рисунке представлены диаграммы всех ациклических связных двудольных
графов с пятью вершинами.
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)
478 / 907
5.2.1. Представление графов в компьютере (2/6)
Представления иллюстрируются на конкретных примерах графа G и орграфа D, диа-
граммы которых представлены на рисунке.
479 / 907
5.2.1. Представление графов в компьютере (3/6)
Представление графа с помощью квадратной булевой матрицы
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)
496 / 907
5.2.3. Орграфы и бинарные отношения (5/6)
497 / 907
5.2.3. Орграфы и бинарные отношения (6/6)
Примеры. На рисунке слева представлена диаграмма орграфа для функции x mod 9 + 1,
а справа — функции x mod 4 + 1, действующих на множестве {1, 2, 3, 4, 5, 6, 7, 8, 9}. Так
как функции тотальные, каждый узел имеет ровно одну исходящую дугу.
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.
505 / 907
5.2.5. Граф инциденций (4/5)
Таким образом, граф инциденций гиперграфа — это двудольный граф без ограничений
на степени вершин.
Аналогичные построения легко провести для гиперорграфов.
Отступление. Не следует думать, что гиперграфы и гиперорграфы — это какая-то экзотика. Напротив
такие конструкции часто встречаются в реальных приложениях. Например, игровые деревья, из-
вестные также как деревья И/ИЛИ, которые являются основной структурой данных в игровых про-
граммах в символическом искусственном интеллекте, фактически являются гиперорграфами спе-
циального вида.
Другим примером являются блок-схемы, диаграммы UML, диаграммы «сущность-связь» и тому
подобное.
506 / 907
5.2.5. Граф инциденций (5/5)
507 / 907
5.3. Деревья
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.
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 — это непустое конечное мно-
жество узлов, на котором определено разбиение, обладающее следующими свойствами:
Def
T = {{r}, T1 , . . . , Tk } .
Нетрудно видеть, что данное определение эквивалентно предыдущему определению.
Достаточно построить орграф, проводя дуги от заданного корня ордерева r к корням
поддеревьев T1 , . . . , Tk и далее повторяя рекурсивно этот процесс для каждого из под-
деревьев.
Если относительный порядок поддеревьев T1 , . . . , Tk в эквивалентном определении ор-
дерева фиксирован, то ордерево называется упорядоченным.
520 / 907
5.3.2. Ориентированные деревья (5/9)
Примеры. Ориентированные и упорядоченные ориентированные деревья интенсивно
используются в программировании.
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)
Пример. На рисунке приведены две диаграммы деревьев, которые изоморфны как упо-
рядоченные, ориентированные и свободные деревья, но не изоморфны как бинарные
деревья.
526 / 907
5.3.3. Представление свободных деревьев в программах (2/8)
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)
529 / 907
5.3.3. Представление свободных деревьев в программах (5/8)
530 / 907
5.3.3. Представление свободных деревьев в программах (6/8)
Пример. Для дерева, представленного на рисунке, код Прюфера 7, 9, 1, 7, 2, 2, 7, 1, 2, 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 .
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.
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)
548 / 907
5.3.5. Представление бинарных деревьев (7/8)
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.
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)
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)
559 / 907
5.3.6. Кратчайший остов (10/10)
560 / 907
5.4. Связность в графах и орграфх
В этом разделе обсуждается важное для приложений понятие связности. При этом сле-
дует подчеркнуть, что связность в графах и орграфах имеет различные свойства.
В начале раздела обсуждаются понятия, относящиеся к связности в графах и доказыва-
ется фундаментальная теорема — теорема Менгера. В конце раздела рассматривается
связность в орграфах и анализируются алгоритмы выделения компонент сильной связ-
ности.
В русском языке есть как слово «компонент» мужского рода, так и слово «компонента»
женского рода, оба варианта допустимы. В современной языковой практике чаще ис-
пользуется слово мужского рода. Однако исторически сложилось так, что «компонента
связности» имеет женский род, и в данном случае мы подчиняемся традиции.
561 / 907
5.4.1 Компоненты связности (1/5)
Напомним, что две вершины в графе связаны, если существует соединяющая их цепь.
Отношение связанности вершин является эквивалентностью и классы эквивалентности
этого отношения называются компонетами связности.
Лемма. В нетривиальном связном графе G(V, E) для любого разбиения множества вершин
V на непустые блоки U и W существует ребро, инцидентное вершинам из разных блоков.
Замечание. Несвязный граф всегда можно представить как объединение связных ком-
понент. Эти компоненты можно рассматривать независимо. Поэтому во многих случаях
можно без ограничения общности предполагать, что рассматриваемый граф связен.
Очевидно, что все вершины в любом цикле связаны, и всякий цикл принадлежит одной
компоненте связности.
563 / 907
5.4.1 Компоненты связности (3/5)
564 / 907
5.4.1 Компоненты связности (4/5)
Доказательство. (Продолжение) Следовательно, достаточно рассматривать только графы,
в которых все компоненты связности полные. Среди всех графов с p вершинами и k пол-
ными компонентами связности наибольшее число рёбер имеет граф K fp , в котором все
рёбра сосредоточены в одной компоненте связности:
k−1
[
fp ← Kp−k+1 ∪
K K1 .
i=1
— противоречие.
Следствие.[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 формально можно считать блоками, поскольку у них нет точек сочленения.
Эти блоки уместно назвать тривиальными, поскольку они удовлетворяют определению,
но не обладают свойствами, присущими нетривиальным блокам. В частности, нетрудно
видеть, что в нетривиальном блоке не только нет точек сочленения, но также нет мостов
и нет висячих вершин. Бол