Академический Документы
Профессиональный Документы
Культура Документы
Коченюк Анатолий
20 декабря 2020 г.
0.1 Введение
Связаться:
• stankev@gmail.com Собирать культуру общения: указывать Фамилию,
Имя
• Телеграм @andrewzta (для немедленного ответа. Если нет, оно утонет).
• +79219034426 (для катастрофических ситуаций, ожидается, что зво-
нить никто не будет) (ни в коем случае не писать смс)
Обращаться можно по методическим вопросам. Если проблема группы –
пишет староста.
Не писать по учебно-методическим проблемам (общежитие, медосмотр, ар-
мия ..) для этого есть зам. декана Харченко (легко найти контакты в ису)
Про отчётность будет на первой практике.
Лекции есть в ютубе andrewzta
2
Глава 1
1 курс
1.1 Фундамент
Множество – неопределяемое понятие. Множество состоит из элементов.
a ∈ A а-маленькое принадлежит множеству А-большое
A = {2, 3, 9}
A = {n | n чётно, n ∈ N} – фильтр
A, B :
• A ∪ B = {a | a ∈ A или a ∈ B}
• A ∩ B = {a | a ∈ A и a ∈ B}
• A \ B = {a|a ∈ A и a 6∈ B}
A=U \A
A\B =A∩B
• A4B = A ⊕ B = (A ∪ B) \ (A ∩ B)
A = {a|a – множество, a 6∈ a}
3
Определение 1 (Пара). A, B – множества. Мы можем рассмотреть
множество пар, где первый элемент из A, а второй из B
A × B = {(a, b)|a ∈ A, b ∈ B}
A × A = A2
Пример. A = 2, 3, 9 -> A × A = {(2, 2), (2, 3), (2, 9), (3, 2), (3, 3), . . .}
4 ГЛАВА 1. 1 КУРС
∅⊂A
A⊂U
B A – множество функций из A в B
|A| = a, |B| = b |A × B| = a · b |B A | = ba
|A∅ | = 1 эфемерная функция, которой ничего не передать
∅A = ∅, A 6= ∅
∅∅ = 1
ГЛАВА 1. 1 КУРС 5
RC(R) – рефлексивное замыкание, включаем все пары (a, a)
2. антирефлексивные ∀a ¬aRa
{{1, 4, 7, 10, . . .)
{2, 5, 8, 11, . . .)}
{3, 6, 9, 12, . . .)}}
.
R⊂X ×X
X, Y, Z R:X ×Y S :Y ×Z
6 ГЛАВА 1. 1 КУРС
Определение 10. Композиция отношений:
T =R◦S xT y ⇐⇒ ∃z : xRz и zSy
т.е. есть z, через который можно пройти, чтобы попасть в y из x
Замечание. R ⊆ X × X S ⊆X ×X
R◦S ⊆X ×X
R ◦ R ⊆ X × X – пройти два раза по стрелкам
R3 = R ◦ R2 = R2 ◦ R – пути длины ровно 3
S ◦ T ◦ U – идём по стрлке из S в T , а потом в U
∞
R∗ = Rk = R+ ∪ R0 – если между двумя вершинами существует
S
k=0
какой-либо путь
Замечание. ∀T : T – транзитивно. T ⊂ R =⇒ T + ⊂ R
Доказательство. По индукции:
База: R1 ⊂ T – дано
Переход: Ri ⊂ T =⇒ Ri+1 ⊂ T
xRi+1 y =⇒ x(R ◦ Ri )y =⇒ ∃z : xRz&zRi y =⇒ xT z&zT y =⇒ xT y (по
транзитивности T )
ГЛАВА 1. 1 КУРС 7
void – ничего, константная функция
B = {0, 1}
f : A1 × A2 × . . . × An → B – функция от нескольких аргументов. Из одного,
но декартового произведения
Булева функция: f : Bn → B
n = 0 – ноль аргументов B0 = {[]}
0, 1
n=1
x 0 id ¬ 1
0 0 0 1 1
1 0 1 0 1
x y 0 ∧ 6→ P1 6← P2 ⊕ ∨ ↓ = ¬P2 ← ¬P1 → ↑ 1
0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
0 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
1 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
8 ГЛАВА 1. 1 КУРС
{f1 , f2 , .., fn } – базисные.
строка – формула. fi (x1 , . . . , xk ) – формула
ГЛАВА 1. 1 КУРС 9
Доказательство. G → F → ∀ =⇒ G → ∀ – то, что нужно доказать
фиксируем функцию h ∈ BF . Она каким-то деревом разбора выражается
через функции f ∈ F . Каждая функция f выражается через g ∈ G, то-
гда подставим выражения функций f через g в узлах дерева и получим
выражение функции h через G, значит люая функция выражается через
G =⇒ G = BF
Пример. {⊕, ∧, 1}
x∧y = x∧y ¬x = x⊕1 – такая запись называется полиномом жегалкина
x ∨ y = (x ∧ y) ⊕ x ⊕ y
x ∧ y = xy ⊕ y ⊕ x – ∧ опускают
(x ⊕ y)(y ⊕ z) = xy ⊕ y ⊕ xz ⊕ yz
(x ⊕ 1)(y ⊕ 1) = xy ⊕ x ⊕ y ⊕ 1
a ∧ a = a – идемпотентность
n
Доказательство. булевых функций от n аргументов – 22
Мономов – 2n . Каждый из них мы можем взять или не взять =⇒ всего
n
22 − 1, -1 из случая, где мы рассматриваем пустую сумму.
Есть инъекция из булевых функций в полиному Жегалкина. Это инъеция
между равномощными множествами =⇒ это биекция.
10 ГЛАВА 1. 1 КУРС
Доказательство. x1 ⊕ x2 ⊕ x3
x7 ⊕ x8 = (x1 ⊕ x2 ⊕ x3 ) . . . Заменяем и получаем всё ещё сумму переменных
или 1
Если формально, строим дерево, заменяем узлы на линейные фукнции, за-
меняем повторы, раскрываем скобки (пользуемся ассоциативностью ⊕) и
получаем линейную функцию.
f (x1 , x2 , . . . , xn ) 6 f (y1 , y2 , . . . , yn ).
Классы Поста:
1. F0 – сохраняющие 0
2. F1 – сохраняющее 1
3. Fl – линейные
4. Fm – монотонные
5. Fs – самодвойственные
ГЛАВА 1. 1 КУРС 11
Лемма 3. F ⊆ Fi , i ∈ {0, 1, l, m, s} =⇒ F ⊆ Fi
Следствие 1. F – не полно
12 ГЛАВА 1. 1 КУРС
c(z) = fm (y1 , . . . yi−1 , z, xi+1 , . . . , xn ) здесь вместо x и y подставлены
константы
c(z) = ¬z
2b fs x1 , x2 , . . . , xn : fs (x1 , x2 , . . . , xn ) = ¬f (¬x1 , . . . , ¬xn ) = t
(
x1 x2 xn y x ,y = 1
d(z) = fs (z , z , . . . , z ) x =
¬x , y = 0
d(0) = t, d(1) = t
(
t = 1 =⇒ d(t) = 1
t = 0 =⇒ d(t) = 0
Итак мы получили 1, 0, ¬
Воспользуемся нелинейной функцией: fl среди нелинейных членов в по-
линоме Жегалкина выберем тот, в котором меньше всего переменных. Не
умаляя общности скажем, что он выглядит как xyu1 . . . uk k + 2 > 2
h(x, y) = fl (x, y, 1, 1, . . . , 1i, 0, 0, . . . 0) Вместо uk подставляем 1, а вместо
остальных 0
h(x, y) = xy[⊕x][⊕y][⊕1] – восемь вариантов.
Если есть ⊕1, напишем ¬
xy[⊕x][⊕y]
xy = x ∧ y
xy ⊕ x ⊕ y = x ∨ y
xy ⊕ x h(x, ¬y) = x(y ⊕ 1) ⊕ x = xy
xy ⊕ y h(¬x, y) = (x ⊕ 1)y ⊕ y = xy
Определение 16 (Доминирование). ~a 6 ~b ⇐⇒ ∀i ai 6 bi
ГЛАВА 1. 1 КУРС 13
0 0 0 ... f00...0
0 0 ... 1 f00...1
Таблица истинности:
1 1 ... 1 f11...1
n
f ∈ B2
~a = M f~ f~ = M~a
Mxs = [s 6 x]
1 0 0 0
1 1 0 0
Преобразование Мёбиуса – матрица M =
1
0 1 0
1 1 1 1
L L L L L
Доказательство. fx = as = as = [(#x : s 6 x 6
x6t x6t s6x s,x:s6x6t S
t)%2]as = at
1. s 66 t =⇒ #x = 0
2. s = t =⇒ #x = 1, s = x = t
3. s 6 t1 s 6= ts – нечётное число раз ксориться. z различных разрядов,
z 6 1 2z
1
1
Пример.
1 a11 = 1, a01 = 0, a10 = 0, a00 = 1
0
xy ⊕ 1 – штрих Шефера
14 ГЛАВА 1. 1 КУРС
Теорема 6. Ациклический ориентированный граф имеет топологиче-
скую сортировку.
x1
∧ ¬
x2
x3 h. . .i
out
1 ∨
=⇒
xn
2
x ⊕ y = (x ∧ ¬y) ∨ (¬x ∧ y)
Дерево разбора легко превращается в схему.
ГЛАВА 1. 1 КУРС 15
∼
Теорема 7. Не существует формулы len(φ) = O(n) для ⊕n в {∧, ∨, ¬}
Теорема 9. B1 , B2 – базисы.
∃c ∀f sizeB1 (f ) 6 c · sizeB2 (f )
Доказательство. B2 = {b1 , b2 , . . . , bn }
bi выразим через B1
C 6 max sizeB1 (bi )
bi ∈B2
16 ГЛАВА 1. 1 КУРС
1.7 Конкретные схемы для логических опера-
ций
Числа храниться в виде двоичного кода. Занумеруем в двух числах биты:
x0 , . . . , xn , y0 , . . . , yn
z0 = x0 ∧ y0 . . . zn = xn ∧ yn
Сложение двух битов: заведём два выходных бита: low = a⊕b high = a∧b.
Такая схема называется неполным сумматором. Неполным, потому что из
него не собрать сумматор для целых чисел. Для второго бита понадобиться
сложить биты чисел и ещё бит переноса. Но сумма трёх битов, к счастью,
все ещё помещается в два бита 1 + 1 + 1 = 3 = 112
size = n depth = n
x y 0
x0 y0 ⊕
x1 y1 c1
⊕
ГЛАВА 1. 1 КУРС 17
0 0 0 k (kill)
0 1 x p (propogate)
1 0 x p
1 1 1 g (generate)
1\ 2 k g p
k k g k
a(bc) = (ab)c = abc – композиция ассоциативна!
g k g g
p k g p
(Дальше жесть, которую я не могу нарисовать, но суть в том, что раз оно
ассоциативное, то мы можем запилить двоичное дерево и делать всё за
радостный логарифм.)
1 0 1 1
1 1 0 1
1 0 1 1
0 0 0 0
1 0 1 1
1 0 1 1
xn+1 = x2 ∨ x7
xn+2 = ¬x4
xn+3 = xn+1 ∧ xn+2
..
.
.
Пример. Сделаем ⊕
x1 , x2
x3 = ¬x1
x4 = ¬x2
x5 = x1 ∧ x4
x6 = x2 ∧ x3
x7 = x5 ∨ x6
.
ГЛАВА 1. 1 КУРС 19
( (
x3 = ¬x1 x3 = ¬x2
и приводят к одному результату и одной схеме,
x4 = ¬x2 x4 = ¬x1
но это различные линейные программы
{↓} – базис.
n2 · (n + 1)2 · . . . · (n + t − 1)2 6 (n + t)2t
n 2·2n
(n+ 23n ) 3n
2n
α6 22n
– для функций, которые можно реализовать за 3n элементов
2n
2 2n 2 2n 2
log2 α 6 3n log2 n + 3n − 2n = 2n 3n log2 n + 3n − 1 6 2n 3n · n − 1 6
− 31 2n
1 n
2n
α 6 2− 3 2 6 1
√
3
2
→ 0, n → ∞
2n
∃n0 : n > n0 =⇒ n + 3n 6 2n
n
2
Теорема 12. ∀c > 0 g(n) 6 3n ∃n0 : n > n0 , то (доля функций от
n аргументов, которые можно реализовать с помощью g(n)) 6 c
Или (доля функций . . .) → 0, n → ∞
20 ГЛАВА 1. 1 КУРС
Теперь возьмём мультиплексор ( n входов, 2n выходов, 1 на выходе с числом
(x1 . . . xn )2 ). Выделим в нём полосу j, в неё проorим те значения, которые
могут быть 1
p
W
f (x1 . . . xk , yk+1 . . . yn ) = gjmcj
j=1
2k 2n
Суммарно: 2k + 2k+s + 2n−k + 2n−k ·
s + 2n−k + 2n−k = O 2k+s + s
∞
Последовательность символов: Σ2 Σ3 . . . Σk =: Σ∗ – множество всех
S
k=0
слов (или подстрочек) над алфавитом Σ
Σ0 = {ε}
α, β – два слова.
Свойства конкатенации:
1. (αβ)γ = α(βγ)
2. αε = α = α
ϕ : Σ∗ → Π∗ .
ГЛАВА 1. 1 КУРС 21
Определение 24. Код называется декодируемым (или однозначным),
если α 6= β =⇒ ϕ(α) 6= ϕ(β)
Или, что то же самое, ϕ – инъективная функция.
• Префиксный код
• код Хаффмана
• неравенство Крафта-МакМиллана
22 ГЛАВА 1. 1 КУРС
Определение 26. ϕ – префиксный код, если
a 0
Пример. b 00 Это не префиксный код, потому что a префикс b
c 11
a 0
b 00
c 11
Это уже префиксный код
0 0 10 10 11 11 11 10 0
a a b b c c c b a
0 1
a
0 1
b c
ГЛАВА 1. 1 КУРС 23
Лемма 7 (1). ∃ дерево оптимального, когда два символа с минималь-
ным pi являются братьями на максимальной глубине.
lt0 pt =
P P
lt pi + pj lk + pj ll + pk li + pl lj
t t6=i,j,k,l
a b c
Пример.
2 2 3
a = x0 b = x1
Пусть мы объединили a и b в один символ x
aabbcccc = xxxxccc
P P P P
pi li = pi li + px lx = pi li + pa (la − 1) + pb (lb − 1) = pi li −
a,b→x i6=x i6=x i(a,b)отдельно
pa − pb
Доказательство.
⇐= l1 6 l2 6 . . . lk
2−l1 > 2−l2 > . . . > 2−lk
24 ГЛАВА 1. 1 КУРС
a b c d e
1 2 2 3 7
0 1 0 1
3 5
1
0
1
8
0
13
1 → aba
c2 → ab
..
. → aa
cn → bbb
Подставим a = 12 b = 21 в равенство
ГЛАВА 1. 1 КУРС 25
Если сумма слева > 1, то там растущае экспонента и она обгонит
линейно растущую, значит сумма 6 1, что и требовалось.
0 1
1
2
−
fi
pi = L
4 2 1
abacaba pa = 7 pb = 7 pc = 7
26 ГЛАВА 1. 1 КУРС
1. 2−q 6 r − l
⇐= −q 6 log2 (l − r)
⇐= q > − log2 (l − r)
Но также q 6 d− log2 (l − r)e
QL Q L
L pi
l − r = i=1 pci = p
i=1 i
Q n
L
ppi i = −L
P
− log2 (l − r) = −L log2 i=1 pi log2 pi
i=1
n
pi log2 pi – энтропия
P
q 6 ΘL, Θ =
i=1
1.9.1 RLE-кодирование
Running length encoding. abbbbaaaaabbbbbb 1a4b5a5b
1.9.2 MTF-кодирование
Move to front
abbbbaaaaabbbbbccccccccaa
a b c
0 1 2
a → 0, b → 1 но мы перемещаем b в начало
b a c
b → 0, b → 0, . . . , b → 0, a → 1, a → 0 . . . , b → 1, b → 0 . . . , c → 2, c → 0
0100010000100002000000020 – резкий переход по частотам в сторону 0
→ bzip2 – BWT Barrows Wheeler Transform :
abacaba$ $
$avacaba
a$abacab
aba$abac
acaba$ab
abacaba$
ba$abaca
bacaba$a
caba$aba
последний столбец – результат abcb$aaa
Text → BWT → MTF → AE/Haff
ГЛАВА 1. 1 КУРС 27
1.9.3 LZ77-78
abacaba
abac(4, 3) – отступи на 4 назад и повтори 3.
ababababc ab(2, 2)(4, 4)c ab(2, 6)c
a 0
b 1
c 2
ab 3
ba 4
ac 5
ca 6
aba 7
a$ 8
010230
28 ГЛАВА 1. 1 КУРС
Если вхоидит в d(x, z), то входит в d(x, y) + d(y, z)
Всё выполняется, и правда расстояние
→ Bn
P
Пример. ex :
^ minP H(c(x), c(y)) – эта величина характеризует насколько далеко нахо-
x,y∈
дятся кодовые слова, т.е. насколько много нужно повредить, чтобы полу-
чить другой символ
Пример. c : B8 → B9
d(c) = 2 Хотя бы два бита будут различаться. А значит такой код обнару-
живает одну ошибку, согласно определения
ГЛАВА 1. 1 КУРС 29
Определение 30. Bn , x ∈ Bn , r ∈ Z+
Шаром S(x, r) = {y|H(x, y) 6 r}
S(0000, 1) = {0000, 0001, 0010, 0100, 1000}
30 ГЛАВА 1. 1 КУРС
x2 ∈ Bn \ S(x1 , 2k) x2 = c(2)
2
x3 ∈ B n \
S
S(xi , 2k)
i=1
n(n−1)
V (n, r) = 1 + n + 2 + . . . + Cnr
r = 1 V (n, 1) = 1 + n
m(n + 2) 6 2n
2n
m6 n+1
ГЛАВА 1. 1 КУРС 31
log(m) + log(n + 1) 6 n
32 ГЛАВА 1. 1 КУРС
Глава 2
Комбинаторика
33
A ⊆ X∗
Перенесём порядок с X на A. Этот перенос называется лексикографическим
порядком на A
a = x1 x2 . . . xl
b = y1 y2 . . . yt
xi , yi ∈ X
Будем говорить a 6lex b, если ∃i 6 min(l, t), что:
1. i 6 j =⇒ xi = yj
(
i=l
2.
i < t, xi+1 < yi+1
000 - 0
001 - 1
010 - 2
011 - 3
Для n = 3
100 - 4
101 - 5
110 - 6
111 - 7
aa
ab
ac
ba
Σ = {a, b, c} n = 2 bb
bc
ca
cb
cc
000 - 0
001 - 1
Пример. Двоичные вектора без двух единиц подряд. 010 - 2
100 - 4
101 - 5
Посчитаем их.
n fn
0 ε 1
1 0,1 2
>1 0.. или 10... Fn = 0Fn−1 + 10Fn−2 – Фибоначчи
34 ГЛАВА 2. КОМБИНАТОРИКА
2.3 Перестановки
(permutations)
ai ∈ {1, 2, ..., n} i 6= j =⇒ ai 6= aj
123
132
213
231
312
321
Σ = {4, ◦, ?}
4◦?
4?◦
◦4?
◦?4
?4◦
?◦4
Подсчёт: на первую позицию можно поставить n элементов, на вторую n−1
и так далее получается n(n − 1)(n − 2) . . . 2 · 1 = n!
Пусть те же условия, но позиций не n, а k
n < k
∅
n=k перестановки
n>k ...
12
13
14
n = 4, k = 2 21
23
24
...
n! = nn
2.4 Сочетания
{1, 2, . . . , n}
ГЛАВА 2. КОМБИНАТОРИКА 35
Выбираем из этих элементов k и составляем из них множество {a1 , a2 , . . . , ak } ai 6=
aj
n = 3, k = 2 {1, 2} {1, 3} {2, 3}
12 И 21 это разные размещения, но одно сочетание {1, 2}
Чтобы подсчитать воспользуемся канонизацией:
из 7 по 4 {2, 3, 5, 6} {3, 6, 2, 5} . . . 24 способа записать одно и то же сочета-
ние
Один из этих способов будем использовать как канонический. Путь это
будет ествественное возрастающее представление {2, 3, 5, 6}
123
124
125
134
135
n=5, k=3
145
234
235
245
345
Перечислили. Теперь займёмся подсчётом
An,k – множество. a ∼ b, если они задают одно и то же сочетания (sort(a) =
sort(b) set(a) = set(b))
Cn,k = An,k |∼
У каждого класса эквивалентности получается одинаковый размер
|An,k | n
|Cn,k | = k! n!
= k!(n−k)! = Cnk = = биномиальный коэффициент =
k
= n choose k
n n−1 n−1
Cn,k = Cn−1,k−1 ∪ Cn−1,k = + – треугольник Пас-
k k−1 k
каля
1
1 1
1 2 1
1 4 41
1 4 641
1 5 10 10 5 1
36 ГЛАВА 2. КОМБИНАТОРИКА
Определение 32. Код Грея на двоичных веторах:
перечисление g1 g2 . . . gn H(hi , gi+1 ) = 1
000
001
011
010
Пример. n = 3
110
111
101
100
концы тоже на расстоянии 1. Такой код называется циклическим
C = C3 + C5 − C15
ГЛАВА 2. КОМБИНАТОРИКА 37
n
S n−1
S n−1
S n−1
S
Доказательство. Ai = Ai ∪ An = Ai +|An |− (Ai ∩ An ) =
i=1 i=1 i=1 i=1
(−1)|I|+1 (−1)|I|+1
P T P T
Ai + |An | + Ai ∩ An =
I⊆{1,2,...,n−1} i∈I J⊆{1,2,...,n−1} i∈J
(∗)
2.7 Алгоритмы ..
Двоичные вектора фиксированной длины B n
Как нам сгенерировать все эти вектора?
gen:
gen all, starting with 0
gen all, starting with 1
Это рекурсия, мы каждый раз делим на два.
Другой взгляд: обход в глубину двоичного дерева.
gen(p) # p - prefix
if len(p) == n:
print(p)
return
gen(p+[0])
gen(p+[1])
main:
gen([])
Отметим, что эта программа печатает (перечисляет) вектора в лексигогра-
фическом порядке.
Перестановкаи
n = 3123, 132, 213, 231, 312, 321
Когда мы выбираем первый элемент, остаётся выбор только из двух, а на
следующей итерации нет выбора – один возможный вариант.
gen(p):
if len(p) = n:
print(p)
return
for i = 1 .. n:
if i not in p:
gen(p+[i])
Строчки из 0 и 1 длинны 6 n
38 ГЛАВА 2. КОМБИНАТОРИКА
n
Bn
S
k=0
ε
0
00
000
001
01
010
011
Печатаем теперь не только в листе, а везде
gen(p) # p - prefix
print(p)
if len(p) = n:
return
gen(p+[0])
gen(p+[1])
main:
gen([])
В общем случает. Мы хотим сгенерировать объект
gen(p) # p - префикс комбинаторного обекта
if (p - к.о.):
print(p)
for (c in Sigma) # перебор в возрастающем порядке
if (p+[c] -- префикс к.о.)
gen(p+[c])
Сочетания Σ = {1, 2, . . . , n}. Характеризуются двумя числами: n, k
if len(p) = n:
print(p)
return
for (c = 1 или (p[-1]+1) .. n-k+len(p)+1)
if p != [] and c <= p[-1]
continue
if n-c < k-len(p)-1
continue # break
gen(p+[c])
Правильные скобочные последовательности.
Есть последовательность открывающихся и закрывающихся скобочек. И
выполнены условия:
1. На любом префиксе #(−#) > 0
ГЛАВА 2. КОМБИНАТОРИКА 39
2. В конце баланс – 0
() (())
((())) (()()) (()) () ()(()) () () ()
Σ = {(, )} (<)
gen(p, bal):
if len(p) = 2n:
print(p)
return
if bal+1<= 2n-len(p)-1:
gen(p+[(], bal+1)
if bal>0:
gen(p+[)], bal-1)
main:
gen([], 0)
Оптимизация: храним префикс в общем массиве a и будет брать его срезы
нужной длины. Кроме того создадим массив used – маска какие мы элемен-
ты взяли. а какие ещё нет
gen(p) # p -- длина префикса
if len(p) == n:
print(a)
return
for i = 1 .. n:
if !used[i]:
used[i] = true
a[p]=i
gen(p+1)
used(p[i]) = false
gen(p)
if p == n
if k = 0
print(a)
k--
return
for i = 1 .. n:
if !used[i]
if k >= (n-p-1)!:
k-=(n-p-1)!
40 ГЛАВА 2. КОМБИНАТОРИКА
else:
used[i] = true
a[p] = i
gen(p+1)
used[i]=false
return
gen(p) # p - префикс комбинаторного обекта
if (p - к.о.):
if (k=0):
print(p)
return
k--
for (c in Sigma) # перебор в возрастающем порядке
if (p+[c] -- префикс к.о.)
t = количество к.о. с префиксом p+[c]
if k >= t:
k-=t
else:
gen(p+[c])
return
gen(p+[c])
j k
В перестановках мы можем оптимизировать ещё дальше и делать c = k
(n−p−1)! +
1 k = k%(n − p − 1)!
Из n берём m
k
gen(p):
if p == m:
print(a)
return
for c = 1(a[p-1] ... n-m+p+1:
t = Из n-c выбираем m-p-1
if k >= t:
k-=t
else:
gen(p+1)
Теперь будем выполнять обратную задачу: искать номер по объекту.
gen(p):
if p -- к.о.:
if p == z:
res = k
else:
k++
ГЛАВА 2. КОМБИНАТОРИКА 41
for (c in Sigma):
if (p+[c] -- префикс к.о):
gen(p+[c])
Применим “изоморфный” алгоритм предыдущему:
gen(p) # p - префикс комбинаторного обекта
if (p - к.о.):
if p = z:
res = k
return
k++
for (c in Sigma)
if (p+[c] -- префикс к.о.)
t = количество к.о. с префиксом p+[c]
if (p+[c] -- префикс z):
gen(p+[c])
return
else:
k += t
Следующий к.о.
к.о. лежит в упорядоченном множестве к.о. Следующий имеет с этим какой-
то общий префикс
1. максимальный общий префикс, который можно сохранить, увеличив
след. p
2. Увеличить следующий элемент минимальным образом, заменив a на
b
3. Дальше к этому элементу p + b нужно приписать минимальную воз-
растающую последовательность
3576421
2.8 Лекция
Перестановки n(n − 1)(n − 2) . . .
n(n−1)...(n−k+1)
Сочетания k! = n!
k!(n−k)!
Скобочные последовательности
((())) (()()) (())() ()(()) ()()()
42 ГЛАВА 2. КОМБИНАТОРИКА
n n−1 n−1
= + – Делим на две группы
k k−1 k
Перестановки Pn = Pn−1 · n
2. В конце баланс 0
A0,0 = 1
ГЛАВА 2. КОМБИНАТОРИКА 43
Сочетания тоже можно представить сеткой (рисунок выше)
Ak,b = Ak−1,b+1 + Ak−1,b+1
| {z }
b>0
A0,0 = 1
Если убрать внешние скобки, то у оставшейся последовательности пони-
зиться график Дика по балансу. Найдём индекс (первый), в котором баланс
стал −1 – i. Тогда можно представить последовательность в виде (псп)псп,
где псп – правильная скобочная последовательность. Эти две последова-
тельности никак не связаны друг другом, значит их можно отдельно по-
считать и перемножить Ci−1 Cn−i
n
P n−1
P
Cn = Ci−1 Cn−1 = Ci Cn−i−1
i=1 i=0
44 ГЛАВА 2. КОМБИНАТОРИКА
5=2+1+1+1
ГЛАВА 2. КОМБИНАТОРИКА 45
Определение 34. Полугруппа – группоид с ассоциативностью. (a · b) ·
c = a · (b · c)
Пример. (Z, +)
(R, +)
(R, ·) – НЕ группа
(R \ {0}) – группа
(Z, ·) – НЕ группа
({1, −1}, ·) – группа
46 ГЛАВА 2. КОМБИНАТОРИКА
Пример. X = R2 G = [0, 2π), +mod2π – действие группы поворотов на
множество точек
Пример. X = T n
G = {0, . . . , n − 1}, +mod n }
[1, 2, 3, 4] свинутая 3 раза [2, 3, 4, 1
X G – группа, которая действует на X
∼G – эквивалентны с точностью до G
x ∼G y ∃g ∈ G y = gx
1. x ∼G x x = ex
2. x ∼G y y = gx x = g −1 y y ∼G x
3. x ∼G y y ∼G z y = gx z = hy = hgx
ГЛАВА 2. КОМБИНАТОРИКА 47
X/G – классы эквивалентности, орбиты
P
|Ig |
Теорема 19 (Лемма Бернсайда). |X/G| =
g∈G
|G|
48 ГЛАВА 2. КОМБИНАТОРИКА
Пример. n = 3 B 3
123 8
132 4
213 4
231 2
312 2
321 4
8+4+4+2+2+4
6 =4 000 001 011 111
kc(g)
P P
|Ig |
Теорема 20 (Теорема Пойя). |X/G| =
g g
|G| = |G| =∗
n
si ki
P
∗= i=1
si – число перестановок с i циклами в G
|G|
n
Если G = Sn si =
i
P n i
k
i i
|X/G| = n!
ГЛАВА 2. КОМБИНАТОРИКА 49
Пример (Дизъюнктное объединение). A, B – два множества комбинатор-
ных объектов, без общих объектов. A ∩ B = ∅
f (A, B) = A ∪ B = C – функция конструирования an , bn |C| = cn = an + bn
t A = {1, 2, 3, . . .} B = {1, 2, 3, . . .} A ∪ B = A = B
A t B – объединение с учётом возможного повторения элементов. Вообще,
получается мультимножество.
Рассмотрим множество пометок M = {a, b}
A t B = A × {a} ∪ B × {b}
Пример (Последовательность). A a0 = 0
∞ ∞ ∞
Ai = A0 ∪ A × Ai−1 = A0 ∪ A × Ai = A0 ∪ A × C
S S S
C = SeqA =
i=0 i=1 i=1
Пример. U = { } u0 = 0 u1 = 1 u2 = u3 = . . . = 0
V = U × U = {( , )} v0 = 0, v1 = 0, v2 = 1, v3 = v4 = . . . = 0
Z = Seq U = {[], [ ], [ , ], [ , , ], . . .}
z0 = 1, z1 = 1, z2 = 1, . . .
n
ui zn−i = 1 · zn−1 = zn−1 . По индукции zn = 1
P
z0 = 1 zn =
i=1
50 ГЛАВА 2. КОМБИНАТОРИКА
Z + = Sqe+ U Seq Z + 2
{[], [[ ]] , [[ ] , [ ]] , [[ , ]] , . . .}
{[], [1], [1, 1], [2], [1, 1, 1], [1, 2], [2, 1], [3], }
bP
kc
n
ГЛАВА 2. КОМБИНАТОРИКА 51
2. С порядком на детях: Есть понятие первого, второго, .. сына
F = SeqT (Forest)
n
P
tn = uk fn−k = fn−1
k=0
u1 = 1 u0 = u2 = u3 = . . . = 0
n
P
fn = tk fn−k
k=1
n−1
P
tn = tk tn−k
k=1
kc
bP
n
tk +s−1
fn,k = s fn−ks,k−1
k=0
C = CycB C4 = 6
Длина цикла l
gcd(l,k)
A Ak = A × Ak−1
S n·gcd(l,k) ,g
l
52 ГЛАВА 2. КОМБИНАТОРИКА
n l−1
Итого: Cn = 1
P P
l · S ng
l ,g
l=1 k=0
.
g=gcd(l,k)
ng ..l
SeqU – перестановки
3. Set = MSet (не может быть двух одинаковых.
Последовательности длины k Ak
sn,k – количество последовательностей длины k веса n
n
n
P
sn,k = i ai sn−i,k−1 sn,1=an
i=1
C = Set A
n
P sn,k
cn = k!
k=1
k
Set U U s
0
6 n
k=
n,k=
n!
k=n
sn,k = n · sn−1,k−1
n!
Cn = n! =1
n
sn,k
Циклы для помеченных объектов: CycA = C
P
cn = k
k=1
(k)
Размещения по k: An = U k × Set U
Akn = k! nk × 1 = nk k! = (n−k)!
n!
ГЛАВА 2. КОМБИНАТОРИКА 53
(k) sn,k
Cn = Set=k U × Set U Set=k Cn,k = k! – множества равно k
Разбиения на множества:
n
Set =k
Set U – разбиения на k множеств
+
k
Разбиение на циклы:
n
Set =k
Cyc U – разбиение на k циклов
+
k
Set Set+ U – число Белла Bn
Set Cyc+ U – перестановки n!
54 ГЛАВА 2. КОМБИНАТОРИКА