Классы NP, coNP, Σ₁, Π₁ — различия между версиями
| Строка 16: | Строка 16: | ||
Пусть <tex>L \in \mathrm{\Sigma_1}</tex>. Тогда существуют <tex>R(x,y)</tex> и полином <tex>p</tex> из определения <tex>\mathrm{\Sigma_1}</tex>. Построим недетерминированную программу <tex>q(x)</tex>, разрешающую <tex>L</tex>. | Пусть <tex>L \in \mathrm{\Sigma_1}</tex>. Тогда существуют <tex>R(x,y)</tex> и полином <tex>p</tex> из определения <tex>\mathrm{\Sigma_1}</tex>. Построим недетерминированную программу <tex>q(x)</tex>, разрешающую <tex>L</tex>. | ||
q(x): | q(x): | ||
| − | y <tex> | + | y ← <tex>\{0,1\}^{p(|x|)}</tex> |
| − | return | + | return R(x,y) |
Если <tex>x\in L</tex>, то программа сможет «угадать» подходящий сертификат. Если <tex>x\notin L</tex>, то подходящего сертификата не существует по определению. Таким образом, <tex>q</tex> разрешает <tex>L</tex>, следовательно <tex>L\in \mathrm{NP}</tex>. | Если <tex>x\in L</tex>, то программа сможет «угадать» подходящий сертификат. Если <tex>x\notin L</tex>, то подходящего сертификата не существует по определению. Таким образом, <tex>q</tex> разрешает <tex>L</tex>, следовательно <tex>L\in \mathrm{NP}</tex>. | ||
*<tex>\mathrm{NP} \subset \mathrm{\Sigma_1}</tex>. | *<tex>\mathrm{NP} \subset \mathrm{\Sigma_1}</tex>. | ||
| Строка 37: | Строка 37: | ||
1. Построим программу <tex>r</tex>, разрешающую <tex>L_1\cap L_2</tex>: | 1. Построим программу <tex>r</tex>, разрешающую <tex>L_1\cap L_2</tex>: | ||
r(x): | r(x): | ||
| − | return p(x) | + | return p(x) && q(x) |
2. Построим программу <tex>r</tex>, разрешающую <tex>L_1\cup L_2</tex>: | 2. Построим программу <tex>r</tex>, разрешающую <tex>L_1\cup L_2</tex>: | ||
r(x): | r(x): | ||
| Строка 43: | Строка 43: | ||
3. Построим программу <tex>r</tex>, разрешающую <tex>L_1L_2</tex>: | 3. Построим программу <tex>r</tex>, разрешающую <tex>L_1L_2</tex>: | ||
r(x): | r(x): | ||
| − | n <tex> | + | n ← <tex>|</tex>x<tex>|</tex> |
| − | + | mid ←? {1..n} | |
| − | return p(x[1..mid]) | + | return p(x[1..mid]) && q(x[mid+1..n]) |
4. Построим программу <tex>r</tex>, разрешающую <tex>L_1^*</tex>: | 4. Построим программу <tex>r</tex>, разрешающую <tex>L_1^*</tex>: | ||
r(x): | r(x): | ||
| − | n <tex> | + | n ← <tex>|</tex>x<tex>|</tex> |
| − | + | prev ← 1 | |
do | do | ||
| − | cur | + | cur ←? {prev..n} |
if (!p(x[prev..cur])) | if (!p(x[prev..cur])) | ||
return false | return false | ||
| − | prev | + | prev ← cur+1 |
while (cur != n) | while (cur != n) | ||
return true | return true | ||
| Строка 64: | Строка 64: | ||
* Задача о клике; | * Задача о клике; | ||
* [http://arxiv.org/abs/cs.CC/0210020 Тетрис] | * [http://arxiv.org/abs/cs.CC/0210020 Тетрис] | ||
| − | Все эти языки также являются [[Примеры_NP-полных_языков._Теорема_Кука|<tex>\mathrm{NP}</tex>-полными]]. | + | Все эти языки также являются [[Примеры_NP-полных_языков._Теорема_Кука|<tex>\mathrm{NP}</tex>-полными]]. По [[Теорема Ладнера|теореме Ладнера]] существует язык из <tex>\mathrm{NP}</tex>, не являющийся <tex>\mathrm{NP}</tex>-полным. |
== Связь P и NP == | == Связь P и NP == | ||
Версия 11:54, 9 июня 2012
Определение
| Определение: |
| . |
То есть — это множество языков, разрешимых недетерминированной программой за полиномиальное время.
| Определение: |
| . |
Нестрого говоря, — это множество языков, для которых существует работающая за полиномиальное время детерминированная программа-верификатор , а для каждого слова из языка (и только для слова из языка) можно предъявить сертификат полиномиальной длины, подтверждающий принадлежность слова языку и проверяемый верификатором.
| Теорема: |
. |
| Доказательство: |
Пусть . Тогда существуют и полином из определения . Построим недетерминированную программу , разрешающую . q(x):
y ←
return R(x,y)
Если , то программа сможет «угадать» подходящий сертификат. Если , то подходящего сертификата не существует по определению. Таким образом, разрешает , следовательно .
|
Примечание: определение часто называют также «определением NP на языке сертификатов».
Свойства
| Теорема: |
Пусть . Тогда:
|
| Доказательство: |
|
Пусть разрешает , а разрешает . 1. Построим программу , разрешающую : r(x): return p(x) && q(x) 2. Построим программу , разрешающую : r(x):
return p(x) q(x)
3. Построим программу , разрешающую : r(x): n ← x mid ←? {1..n} return p(x[1..mid]) && q(x[mid+1..n]) 4. Построим программу , разрешающую : r(x): n ← x prev ← 1 do cur ←? {prev..n} if (!p(x[prev..cur])) return false prev ← cur+1 while (cur != n) return true |
Примеры NP-языков
- Язык раскрасок графа в цветов;
- Задача о клике;
- Тетрис
Все эти языки также являются -полными. По теореме Ладнера существует язык из , не являющийся -полным.
Связь P и NP
Очевидно, что , так как детерминированные программы можно рассматривать как недетерминированные, в которых не используется недетерминированный выбор. Вопрос о равенстве данных классов до сих пор остается открытым. Были осуществлены различные подходы к разрешению этой задачи: попытка найти редкий -полный язык; было доказано, что доказательство должно быть нерелятивизующимся; различные попытки найти полиномиальные решения для задач из :
Некоторые задачи из очень похожи на задачи из . В каждой из приведенных ниже пар задач первая разрешима за полиномиальное время, а вторая является -полной. При этом различие между задачами кажется совершенно незначительным.
- Поиск самых коротких и самых длинных простых путей;
- Эйлеров и гамильтонов циклы;
- 2-CNF и 3-CNF выполнимость.