\documentclass[spec, och, labwork]{SCWorks}
\usepackage{preamble}

\begin{document}
\include{titlepage.tex}

\begin{definition}
    NP-полная задача "--- в теории алгоритмов задача с ответом <<да>> или
    <<нет>> из класса NP, к которой можно свести любую другую задачу из этого
    класса за полиномиальное время (то есть при помощи операций, число которых
    не превышает некоторого полинома в зависимости от размера исходных данных).
    Таким образом, NP-полные задачи образуют в некотором смысле подмножество
    <<типовых>> задач в классе NP: если для какой-то из них найден
    <<полиномиально быстрый>> алгоритм решения, то и любая другая задача из
    класса NP может быть решена так же <<быстро>>.
\end{definition}

\begin{definition}
    Алфавитом называется всякое конечное множество символов (например, $\{0,
    1\}$ или $\{a, b, c\}$). Множество всех возможных слов (конечных строк,
    составленных из символов этого алфавита) над некоторым алфавитом $\Sigma$
    обозначается $\Sigma_*$. Языком $L$ над алфавитом $\Sigma$ называется всякое
    подмножество множества $\Sigma_*$, то есть $L \subset \Sigma_*$.
\end{definition}

\begin{definition}
    Пусть $L_1$ и $L_2$ "--- два языка над алфавитом $\Sigma$. Язык $L_1$
    называется сводимым (по Карпу) к языку $L_2$, если существует функция, $f :
    \Sigma_* \to \Sigma_*$, вычислимая за полиномиальное время, обладающая
    следующим свойством: $x \in L_1$ тогда и только тогда, когда $f(x) \in L_2$.
    Сводимость по Карпу обозначается как $L_1 \leq_p L_2$ или $L_1 \propto L_2$.
\end{definition}

\begin{definition}
    Язык $L_2$ называется NP-трудным, если любой язык из класса NP сводится к
    нему. Язык называют NP-полным, если он NP-труден, и при этом сам лежит в
    классе NP.
\end{definition}

Неформально говоря, то что задача A сводится к задаче B, означает, что задача A
«не сложнее» задачи B (так как, если мы можем решить B, то можем решить и A.
Таким образом, класс NP-трудных задач включает NP-полные задачи и задачи,
которые <<сложнее>> их (то есть те задачи, к которым могут быть сведены
NP-полные задачи). Класс NP включает NP-полные задачи и задачи, которые «легче»
их (то есть те задачи, которые сводятся к NP-полным задачам).

Из определения следует, что, если будет найден алгоритм, решающий некоторую
(любую) NP-полную задачу за полиномиальное время, то все NP-задачи окажутся в
классе P, то есть будут решаться за полиномиальное время.

\begin{definition}
    Тавтологией называется булева формула, принимающая значение 1 на всех
    наборах значений её переменных.
\end{definition}

Теорема Кука "--- Левина (также просто теорема Кука) утверждает, что задача о
выполнимости булевой формулы в КНФ (ВЫП) является NP-полной.

Доказательство этой теоремы, полученное Стивеном Куком в его фундаментальной
работе в 1971 году, стало одним из первых важнейших результатов теории NP-полных
задач. Независимо в то же время эта теорема была доказана советским математиком
Леонидом Левиным.

В доказательстве теоремы Кука каждая задача из класса NP в явном виде сводится к
ВЫП. С. Кук (S. Cook) определил класс NP задач распознавания свойств следующим
образом. Задача принадлежит классу NP, если:
\begin{enumerate}
    \item
        решением задачи является один из двух ответов: <<да>> или <<нет>>
        (задача распознавания свойств);
    \item
        требуемый ответ может быть получен на недетерминированном вычислительном
        устройстве за полиномиальное время.
\end{enumerate}

Этот класс, как позже показал Р. Карп (R. Karp) в свою очередь содержит в себе
другой широкий класс задач, названный Карпом NP-полные задачи, или NPC, сводимые
в пределах этого класса одна к другой.

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

\begin{theorem}
    ВЫП "--- язык булевых формул из $n$ переменных, для которых существует
    подстановка, при которой формула истинна.

    \begin{equation*}
        \text{ВЫП} = \{ \varphi ~ | ~ \exists ~ x : \varphi(x) = 1 \}
    \end{equation*}
\end{theorem}
\begin{proof}
    $\text{ВЫП} \in \text{NP}$, потому что можно написать недетерминированную
    программу $p$, которая распознает язык ВЫП. Она будет недетерминированно
    выбирать подстановку, проверять, истинна ли формула при такой подстановке, и
    выдавать ответ.
\end{proof}

Сведения задачи ВЫП к задаче NP-полноты языка, состоящего из булевых функций, не
являющихся тавтологиями можно добиться с помощью вычислимой полиномиальной
функции.

Допустим, с помощью некоторой функции $\varphi(x_1, \dots, x_n, \dots)$ можно
получить кортеж $(0, 1, 1, 1, \dots)$. Зададим функцию $\nu(x_1, \dots, x_n,
\dots)$, что для такого входа мы будем получать все кортежи вида $(1, 0, 0, 0,
\dots)$, $(0, 1, 0, 0, \dots)$ и т.д.

Для кортежей с большим количеством нулей, функция $\nu$ задаётся аналогичным
образом.

Получаем, что задача имеет сложность
\begin{equation*}
    \sum_{i = 0}^\infty C_n^i \cdot \sum_{i = 0}^\infty C_n^{n - i} =
    \sum_{i = 0}^\infty C_n^i \cdot C_n^{n - i} =
    \sum_{i = 0}^\infty (C_n^i)^2
\end{equation*}
где $C_n^k$ "--- биномиальный коэффициент.

\end{document}
