Классы NP, coNP, Σ₁, Π₁ — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Свойства: Пофиксил оформление псевдокода)
(Добавил определение co-NP, доказал первый пример, поправил псевдокод)
Строка 1: Строка 1:
 
== Определение ==
 
== Определение ==
 
{{Определение
 
{{Определение
|definition=<tex>\mathrm{NP}=\bigcup\limits_{p(n) \in poly}\mathrm{NTIME}(p(n))</tex>.
+
|definition=<tex>\mathrm{NP}=\!\!\bigcup\limits_{p(n) \in poly}\!\!\operatorname{NTIME}(p(n))</tex>.
 
}}
 
}}
 
То есть <tex>\mathrm{NP}</tex> — это множество языков, разрешимых недетерминированной программой за полиномиальное время.
 
То есть <tex>\mathrm{NP}</tex> — это множество языков, разрешимых недетерминированной программой за полиномиальное время.
 
{{Определение
 
{{Определение
|definition=<tex>\mathrm{\Sigma_1}=\{L\bigm|\exists R(x,y)\in \tilde{\mathrm{P}}, p(n) - poly:x\in L\Leftrightarrow\exists y : |y|\le p(|x|), R(x,y)=1\}</tex>.
+
|definition=<tex>\textrm{co-NP} = \{L \bigm| \overline{L} \in \mathrm{NP}\}</tex>.
 +
}}
 +
То есть <tex>\textrm{co-NP}</tex> — это множество языков, дополнение к которым лежит в NP.
 +
{{Определение
 +
|definition=<tex>\mathrm{\Sigma_1}=\{L\bigm|\exists R(x,y)\in \tilde{\mathrm{P}}, p(n) \in poly : x\in L\Leftrightarrow\exists y : |y|\le p(|x|), R(x,y)=1\}</tex>.
 
}}
 
}}
 
Нестрого говоря, <tex>\mathrm{\Sigma_1}</tex> — это множество языков, для которых существует работающая за полиномиальное время детерминированная программа-верификатор <tex>R(x,y)</tex>, а для каждого слова из языка (и только для слова из языка) можно предъявить сертификат полиномиальной длины, подтверждающий принадлежность слова языку и проверяемый верификатором.
 
Нестрого говоря, <tex>\mathrm{\Sigma_1}</tex> — это множество языков, для которых существует работающая за полиномиальное время детерминированная программа-верификатор <tex>R(x,y)</tex>, а для каждого слова из языка (и только для слова из языка) можно предъявить сертификат полиномиальной длины, подтверждающий принадлежность слова языку и проверяемый верификатором.
Строка 15: Строка 19:
 
*<tex>\mathrm{\Sigma_1} \subset \mathrm{NP}</tex>.
 
*<tex>\mathrm{\Sigma_1} \subset \mathrm{NP}</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>.
 
Пусть <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 &larr; <tex>\{0,1\}^{p(|x|)}</tex>
+
  y = <tex>\{0,1\}^{p(|x|)}</tex>
    return R(x,y)
+
  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>.
Строка 36: Строка 40:
  
 
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) '''and''' q(x)
 
   '''return''' p(x) '''and''' 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):
 
   '''return''' p(x) '''or''' q(x)  
 
   '''return''' p(x) '''or''' q(x)  
 
3. Построим программу <tex>r</tex>, разрешающую <tex>L_1L_2</tex>:
 
3. Построим программу <tex>r</tex>, разрешающую <tex>L_1L_2</tex>:
  r(x):
+
r(x):
    n = <tex>|</tex>x<tex>|</tex>
+
  n = <tex>|</tex>x<tex>|</tex>
    mid =<sup>?</sup> {1 .. n}
+
  mid =<sup>?</sup> {1 .. n}
    '''return''' p(x[1 .. mid]) '''and''' q(x[mid+1 .. n])
+
  '''return''' p(x[1 .. mid]) '''and''' q(x[mid+1 .. n])
 
4. Построим программу <tex>r</tex>, разрешающую <tex>L_1^*</tex>:
 
4. Построим программу <tex>r</tex>, разрешающую <tex>L_1^*</tex>:
 
<code>
 
<code>
  r(x):
+
r(x):
    n = <tex>|</tex>x<tex>|</tex>
+
  n = <tex>|</tex>x<tex>|</tex>
    prev = 1
+
  prev = 1
    '''do'''
+
  '''do'''
      cur =<sup>?</sup> {prev .. n}
+
    cur =<sup>?</sup> {prev .. n}
      '''if not''' p(x[prev .. cur])
+
    '''if not''' p(x[prev .. cur])
        '''return false'''
+
      '''return''' ''false''
      prev = cur + 1
+
    prev = cur + 1
    '''while''' cur != n
+
  '''while''' cur != n
    '''return true'''
+
  '''return''' ''true''
 
</code>
 
</code>
 
<br>
 
<br>
Строка 63: Строка 67:
  
 
== Примеры языков из NP ==
 
== Примеры языков из NP ==
* Язык раскрасок графа в <tex>k</tex> цветов.
+
* Проблема раскраски вершин графа в <tex>k</tex> цветов.<br><!--
 +
-->Разрешается следующей программой:
 +
r(G):
 +
  n = <tex>|V(G)|</tex>
 +
  c =<sup>?</sup> <tex>\{ 1, \dotsc, k \} ^ n</tex>
 +
  '''for''' uv '''in''' <tex>E(G)</tex>
 +
    '''if''' c[u] == c[v]
 +
      '''return''' ''false''
 +
  '''return''' ''true''
 
* Задача о клике.
 
* Задача о клике.
 
* [http://arxiv.org/abs/cs.CC/0210020 Тетрис].
 
* [http://arxiv.org/abs/cs.CC/0210020 Тетрис].
 
Все эти языки также являются [[Примеры_NP-полных_языков._Теорема_Кука|<tex>\mathrm{NP}</tex>-полными]]. По [[Теорема Ладнера|теореме Ладнера]] существует язык из <tex>\mathrm{NP}</tex>, не являющийся <tex>\mathrm{NP}</tex>-полным.
 
Все эти языки также являются [[Примеры_NP-полных_языков._Теорема_Кука|<tex>\mathrm{NP}</tex>-полными]]. По [[Теорема Ладнера|теореме Ладнера]] существует язык из <tex>\mathrm{NP}</tex>, не являющийся <tex>\mathrm{NP}</tex>-полным.
 +
 +
== Примеры языков из co-NP ==
 +
* Даны <tex>n</tex> целых чисел. Верно ли, что любое их непустое подмножество имеет ненулевую сумму?
  
 
== Связь P и NP ==
 
== Связь P и NP ==

Версия 12:59, 28 февраля 2016

Определение

Определение:
[math]\mathrm{NP}=\!\!\bigcup\limits_{p(n) \in poly}\!\!\operatorname{NTIME}(p(n))[/math].

То есть [math]\mathrm{NP}[/math] — это множество языков, разрешимых недетерминированной программой за полиномиальное время.

Определение:
[math]\textrm{co-NP} = \{L \bigm| \overline{L} \in \mathrm{NP}\}[/math].

То есть [math]\textrm{co-NP}[/math] — это множество языков, дополнение к которым лежит в NP.

Определение:
[math]\mathrm{\Sigma_1}=\{L\bigm|\exists R(x,y)\in \tilde{\mathrm{P}}, p(n) \in poly : x\in L\Leftrightarrow\exists y : |y|\le p(|x|), R(x,y)=1\}[/math].

Нестрого говоря, [math]\mathrm{\Sigma_1}[/math] — это множество языков, для которых существует работающая за полиномиальное время детерминированная программа-верификатор [math]R(x,y)[/math], а для каждого слова из языка (и только для слова из языка) можно предъявить сертификат полиномиальной длины, подтверждающий принадлежность слова языку и проверяемый верификатором.

Теорема:
[math]\mathrm{\Sigma_1}=\mathrm{NP}[/math].
Доказательство:
[math]\triangleright[/math]
  • [math]\mathrm{\Sigma_1} \subset \mathrm{NP}[/math].

Пусть [math]L \in \mathrm{\Sigma_1}[/math]. Тогда существуют [math]R(x,y)[/math] и полином [math]p[/math] из определения [math]\mathrm{\Sigma_1}[/math]. Построим недетерминированную программу [math]q(x)[/math], разрешающую [math]L[/math].

q(x):
  y = [math]\{0,1\}^{p(|x|)}[/math]
  return R(x,y)

Если [math]x\in L[/math], то программа сможет «угадать» подходящий сертификат. Если [math]x\notin L[/math], то подходящего сертификата не существует по определению. Таким образом, [math]q[/math] разрешает [math]L[/math], следовательно [math]L\in \mathrm{NP}[/math].

  • [math]\mathrm{NP} \subset \mathrm{\Sigma_1}[/math].
Пусть [math]L\in \mathrm{NP}[/math]. Тогда существует недетерминированная программа [math]q(x)[/math], разрешающая этот язык. Построим верификатор [math]R(x,y)[/math]. В качестве сертификата будем использовать последовательность выборов в программе [math]q[/math], приводящую к допуску слова (такой сертификат имеет полиномиальную длину, поскольку выборов в [math]q[/math] может быть сделано не более, чем время ее работы, то есть не более, чем полином). Верификатор будет аналогичен программе [math]q[/math], только вместо каждого недетерминированного выбора он будет присваивать значение, указанное в сертификате. Если [math]x\in L[/math], то в [math]q[/math] существует последовательность выборов таких, что [math]q(x)=1[/math], следовательно существует и верный сертификат. Если [math]x\notin L[/math], то для любой последовательности выборов [math]q(x)=0[/math], следовательно подходящего сертификата не существует. Таким образом, [math]L \in \mathrm{\Sigma_1}[/math].
[math]\triangleleft[/math]

Примечание: определение [math]\mathrm{\Sigma_1}[/math] часто называют также «определением NP на языке сертификатов».

Свойства

Теорема:
Пусть [math]L_1,L_2\in \mathrm{NP}[/math]. Тогда:
  1. [math]L_1\cap L_2\in \mathrm{NP}[/math];
  2. [math]L_1\cup L_2\in \mathrm{NP}[/math];
  3. [math]L_1L_2\in \mathrm{NP}[/math];
  4. [math]L_1^*\in \mathrm{NP}[/math].
Доказательство:
[math]\triangleright[/math]

Пусть [math]p[/math] разрешает [math]L_1[/math], а [math]q[/math] разрешает [math]L_2[/math].

1. Построим программу [math]r[/math], разрешающую [math]L_1\cap L_2[/math]:

r(x):
  return p(x) and q(x)

2. Построим программу [math]r[/math], разрешающую [math]L_1\cup L_2[/math]:

r(x):
  return p(x) or q(x) 

3. Построим программу [math]r[/math], разрешающую [math]L_1L_2[/math]:

r(x):
  n = [math]|[/math]x[math]|[/math]
  mid =? {1 .. n}
  return p(x[1 .. mid]) and q(x[mid+1 .. n])

4. Построим программу [math]r[/math], разрешающую [math]L_1^*[/math]:

r(x):
  n = [math]|[/math]x[math]|[/math]
  prev = 1
  do
    cur =? {prev .. n}
    if not p(x[prev .. cur])
      return false
    prev = cur + 1
  while cur != n
  return true


[math]\triangleleft[/math]

Примеры языков из NP

  • Проблема раскраски вершин графа в [math]k[/math] цветов.
    Разрешается следующей программой:
r(G):
  n = [math]|V(G)|[/math]
  c =? [math]\{ 1, \dotsc, k \} ^ n[/math]
  for uv in [math]E(G)[/math]
    if c[u] == c[v]
      return false
  return true

Все эти языки также являются [math]\mathrm{NP}[/math]-полными. По теореме Ладнера существует язык из [math]\mathrm{NP}[/math], не являющийся [math]\mathrm{NP}[/math]-полным.

Примеры языков из co-NP

  • Даны [math]n[/math] целых чисел. Верно ли, что любое их непустое подмножество имеет ненулевую сумму?

Связь P и NP

Очевидно, что [math]\mathrm{P} \subseteq \mathrm{NP}[/math], так как детерминированные программы можно рассматривать как недетерминированные, в которых не используется недетерминированный выбор. Вопрос о равенстве данных классов до сих пор остается открытым. Были осуществлены различные подходы к разрешению этой задачи: попытка найти редкий [math]\mathrm{NP}[/math]-полный язык; было доказано, что доказательство должно быть нерелятивизующимся; различные попытки найти полиномиальные решения для задач из [math]\mathrm{NPC}[/math]:

Некоторые задачи из [math]\mathrm{P}[/math] очень похожи на задачи из [math]\mathrm{NP}[/math]. В каждой из приведенных ниже пар задач первая разрешима за полиномиальное время, а вторая является [math]\mathrm{NP}[/math]-полной. При этом различие между задачами кажется совершенно незначительным.

См. также