Лекция 13

Элементы теории сложности

(Конспект: О. Нескоромная)

13.1 Элементы теории сложности

13.1.1 Классы P и NP

Пусть Σ — конечный алфавит. Напомним, что массовая задача M есть некоторое множество индивидуальных задач — пар (u, s) (где u, s ∈ Σ^{∗}, u — условие, s — решение).

Определение 13.1. M ∈ ÑP, если

1. M — полиномиально ограничена, т.е. существует многочлен p, такой, что для любого условия u, если существует хотя бы одно такое s, что (u, s) ∈ M, то существует и s′ длины не более p(|u|), такое что (u, s′) ∈ M.

2. M — полиномиально проверяема, т.е. существует многочлен p, существует алгоритм A, такие, что ∀u, s ∈ Σ^{∗}((u, s) ∈ M ⇔ A(u, s) = 1) и при этом A заканчивает свою работу за время, не превосходящее p(|u| + |s|).

Пример 13.1. {(N, m) | N⋮m, 1 < m < N}.

Пример 13.2 (S̃AT (задача о выполнимости булевой формулы)). Дана формула в конъюнктивной нормальной форме (конъюнкция конечного числа дизъюнкций, в каждую из дизъюнкций входят логические переменные либо их отрицания): например,

{(x_{1} ∨ x_{2} ∨ x_{3}) ∧ (¬x_{1} ∨ ¬x_{2}) ∧ (x_{4} ∨ ¬x_{2})}.

Требуется найти значения переменных, такие, что значение всего выражения — истина (в приведенном примере: x_{1} — истина, x_{2} — ложь). Это задача из ÑP: решение — не длиннее условия, и подставить мы его также можем быстро. Формула, для которой такие значения существуют, называется выполнимой.

Определение 13.2. Для каждой массовой задачи M определим язык L(M) = {u | ∃s (u, s) ∈ M} — множество всех условий, для которых существуют решения.

Определение 13.3. Язык L принадлежит классу NP, если ∃M ∈ ÑP : L = L(M).

Определение 13.4. M ∈ P̃, если существует многочлен p и существует алгоритм A (который может выдавать строку из Σ^{∗} или останавливаться с результатом �решения нет�), такие, что A работает не дольше, чем p(размер входа), и решает задачу M, т.е.

• A(u) = s ⟹ (u, s) ∈ M;

• ∃s (u, s) ∈ M ⟹ A(u) ≠ �решения нет� .

Определение 13.5. L ∈ P, если существует многочлен p и существует алгоритм A (выдающий 0 или 1), такие, что A работает не дольше, чем p(размер входа), и ∀u ∈ Σ^{∗}(A(u) = 1 ⇔ u ∈ L).

Открытый вопрос 13.1. P =?= NP.

(Гипотеза: P ≠ NP.)

13.1.2 Сводимости и полнота

�Упростим� этот вопрос, не изменяя его.

Определение 13.6. Язык L полиномиально сводится к языку L′ (обозначим это L → L′), если существует многочлен p и существует алгоритм A, работающий не дольше, чем p(длина входа), такие, что ∀u∈Σ^{∗} (A(u) ∈ L′ ⇔ u ∈ L).

Определение 13.7. Язык называется NP-трудным, если любой другой язык из NP к нему сводится. Язык называется NP-полным, если он NPтрудный и при этом сам принадлежит NP.

Теорема 13.1. Если L — NP-полный и L ∈ P, то P = NP.

Доказательство. Очевидно.

Теорема 13.2. SAT (язык всех выполнимых формул) — NP-полный.

Следствие 13.1. Если SAT ∈ P, то P = NP.

13.1.3 Алгоритмы, использующие случайные числа

Определение 13.8. M ∈ R̃P, если 1. M — полиномиально ограничена.

2. M — полиномиально проверяема.

3. Каждое разрешимое условие M имеет не менее половины решений,

т.е.

∀u((∃t(u, t) ∈ M) ⇒
|{s | (u, s) ∈ M, |s| ⩽ p(|u|)}| ⩾
\frac{1}{2} · кол-во всех строк длины не более p(|u|))

(здесь | … | обозначает в одном случае — мощность множества, а в другом — длину строки; многочлен p — тот, что фигурирует в определении полиномиальной ограниченности).

Определение 13.9. L ∈ RP ⇔ ∃M ∈ R̃P L = L(M).

Очевидно, для задачи из R̃P достаточно выбрать случайную строку длины p(|u|), чтобы получить решение задачи u с вероятностью ⩾ \frac{1}{2}. Если повторить эту процедуру k раз, то вероятность успеха будет 1 − \frac{1}{2^{k}}, чего для практических целей вполне достаточно. Теорема 13.3. Язык, состоящий из всех составных чисел, принадлежит RP. Доказательство. Алгоритм, проверяющий простоту числа N:

• Если N⋮2 или N = 1, то сразу выдать правильный ответ.

• Случайно выбираем число M от 2 до N − 1.

• Если НОД(M, N) ≠ 1, то выдать ответ �составное�.

• (*) В противном случае, если M^{(N−1)/2} ≢ (\frac{M}{N}) (mod N), то выдать ответ �составное�.

• В противном случае, выдать ответ �возможно, простое�.

(Здесь (\frac{M}{N}) — символ Лежандра.) Проверим корректность алгоритма. Все шаги корректны, проверим корректность шага (*) и то, что если число составное, то вероятность получить ответ не позднее этого шага — не менее \frac{1}{2}. Доказательство этого разобьем на следующие леммы (во всех из них предполагается, что N — нечетно и ⩾ 3).

Лемма 13.1. N ∈ ℙ ⇒ M^{(N−1)/2} ≡ (\frac{M}{N}) (mod N).

Доказательство. Доказана в курсе алгебры.

Лемма 13.2. Если для всех M, взаимно простых с N, выполняется M^{(N−1)/2} ≡ (\frac{M}{N}) (mod N), то N ∈ ℙ.

Доказательство. Пусть N ∉ ℙ, т.е. N = p_{1} ·. . .·p_{k}. Рассмотрим 2 случая.

1. Среди p_{i} нет одинаковых. Пусть r — невычет по модулю p_{1}, т.е. (\frac{r}{p_{1}} ) ≡ −1(mod p_{1}). По китайской теореме об остатках существует M, такое, что M ≡ r(mod p_{1}), M ≡ 1(mod p_{i}) при i ≠ 1. Тогда (\frac{M}{N}) = ∏_{i}(\frac{M}{p_{i}}) = −1. С другой стороны, M^{(N−1)/2} ≡ 1(mod N). Противоречие.

2. N = p^{2}n (p ∈ ℙ). Пусть r — первообразный корень по модулю p^{2}.

Тогда r^{N−1} = (r^{(N−1)/2})^{2} ≡ (\frac{r}{N})^{2} ≡ 1(mod r). Это значит, что N−1⋮p(p−1).

Но N⋮p. Противоречие.

Лемма 13.3. N ∉ ℙ ⇒ |\{M ∈ \{2, …, N−1\} | M^{(N−1)/2} ≢ (\frac{M}{N}) (mod N)\} > \frac{N−2}{2}.

Доказательство. Пусть сравнение выполняется для остатков M_{1}, …, M_{k} по модулю N. По лемме 13.2 существует M^{∗}, для которого сравнение не выполняется.

Для остатков M^{∗} · M_{1}, …, M^{∗} · M_{k} по модулю N сравнение также не выполняется ((\frac{M_{i}M^{∗}}{N}) = (\frac{M^{∗}}{N}) · (\frac{M_{i}}{N}) ≢ M_{i}^{(N−1)/2}(M^{∗})^{(N−1)/2}(mod N)). Кроме того, они все различны: M_{i}M^{∗} ≡ M_{j}M^{∗}(mod N) ⇒ M_{i} ≡ M_{j}(mod N), поскольку НОД(M^{∗}, N) = 1. Таким образом, их не меньше, чем тех, для которых сравнение выполняется.