Лемма о соотношении coNP и IP — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м
м
Строка 3: Строка 3:
 
{{Определение
 
{{Определение
 
|definition=
 
|definition=
<tex>\#SAT=\{\langle \varphi, k \rangle \bigm| \varphi</tex> имеет ровно <tex>k</tex> удовлетворяющих наборов <tex>\}</tex>.
+
<tex>\mathrm{\#SAT}=\{\langle \varphi, k \rangle \bigm| \varphi</tex> имеет ровно <tex>k</tex> удовлетворяющих наборов <tex>\}</tex>.
 
}}
 
}}
  
Строка 9: Строка 9:
 
{{Лемма
 
{{Лемма
 
|about=1
 
|about=1
|statement=<tex>\sum\limits_{x_1 = 0}^1 \ldots \sum\limits_{x_m = 0}^1  A_\phi(x_1, \ldots, x_m)=k \Leftrightarrow \langle\phi,k\rangle \in \#SAT</tex>.
+
|statement=<tex>\sum\limits_{x_1 = 0}^1 \ldots \sum\limits_{x_m = 0}^1  A_\phi(x_1, \ldots, x_m)=k \Leftrightarrow \langle\phi,k\rangle \in \mathrm{\#SAT}</tex>.
 
|proof=Следует из [[Арифметизация булевых формул с кванторами | леммы (1)]].
 
|proof=Следует из [[Арифметизация булевых формул с кванторами | леммы (1)]].
 
}}
 
}}
Строка 16: Строка 16:
 
{{Лемма
 
{{Лемма
 
|about=2
 
|about=2
|statement=<tex>\#SAT \in \mathrm{IP}</tex>.
+
|statement=<tex>\mathrm{\#SAT} \in \mathrm{IP}</tex>.
 
|proof=
 
|proof=
 
Для доказательства леммы построим программы ''Verifier'' и ''Prover'' из [[Интерактивные протоколы. Класс IP. Класс AM#Класс IP|определения]] класса <tex>\mathrm{IP}</tex>.
 
Для доказательства леммы построим программы ''Verifier'' и ''Prover'' из [[Интерактивные протоколы. Класс IP. Класс AM#Класс IP|определения]] класса <tex>\mathrm{IP}</tex>.
Строка 22: Строка 22:
 
Сперва арифметизуем формулу <tex>\phi</tex>. Пусть полученный полином <tex>A(x_1, x_2, ..., x_m)</tex> имеет степень <tex>d</tex>.
 
Сперва арифметизуем формулу <tex>\phi</tex>. Пусть полученный полином <tex>A(x_1, x_2, ..., x_m)</tex> имеет степень <tex>d</tex>.
  
По лемме (1) вместо условия <tex>\langle \phi, k \rangle \in \#SAT</tex>, можно проверять условие <tex>\sum\limits_{x_1 = 0}^1 \ldots \sum\limits_{x_m = 0}^1  A_\phi(x_1, \ldots, x_m)=k</tex>.
+
По лемме (1) вместо условия <tex>\langle \phi, k \rangle \in \mathrm{\#SAT}</tex>, можно проверять условие <tex>\sum\limits_{x_1 = 0}^1 \ldots \sum\limits_{x_m = 0}^1  A_\phi(x_1, \ldots, x_m)=k</tex>.
  
 
Приступим к описанию ''Verifier'''а.
 
Приступим к описанию ''Verifier'''а.
Строка 64: Строка 64:
  
 
#Первый факт следует из построения ''Verifier'' 'а.
 
#Первый факт следует из построения ''Verifier'' 'а.
#По [[Арифметизация булевых формул с кванторами | лемме (2)]], если <tex>\sum\limits_{x_1 = 0}^1 \ldots \sum\limits_{x_m = 0}^1  A_\phi(x_1, \ldots, x_m)=k</tex>, то условия (*) выполнятются, следовательно существует такой ''Prover'', что <tex>P(Verifier^{Prover}(\langle\phi,k\rangle)) = 1</tex>, для любой пары <tex>\langle\phi,k\rangle \in \#SAT</tex>.
+
#По [[Арифметизация булевых формул с кванторами | лемме (2)]], если <tex>\sum\limits_{x_1 = 0}^1 \ldots \sum\limits_{x_m = 0}^1  A_\phi(x_1, \ldots, x_m)=k</tex>, то условия (*) выполнятются, следовательно существует такой ''Prover'', что <tex>P(Verifier^{Prover}(\langle\phi,k\rangle)) = 1</tex>, для любой пары <tex>\langle\phi,k\rangle \in \mathrm{\#SAT}</tex>.
 
#Пусть количество наборов, удовлетворяющих <tex>\phi</tex>, не равно <tex>k</tex>. Для того, что бы ''Verifier'' вернул '''true''', ''Prover'' 'у необходимо посылать такие <tex>A_i</tex>, чтобы выполнялись все проверяемые условия. Посмотрим на то, что он может послать:
 
#Пусть количество наборов, удовлетворяющих <tex>\phi</tex>, не равно <tex>k</tex>. Для того, что бы ''Verifier'' вернул '''true''', ''Prover'' 'у необходимо посылать такие <tex>A_i</tex>, чтобы выполнялись все проверяемые условия. Посмотрим на то, что он может послать:
 
:'''Шаг 0'''
 
:'''Шаг 0'''
Строка 87: Строка 87:
 
|statement=<tex>\mathrm{coNP} \subset \mathrm{IP}</tex>.
 
|statement=<tex>\mathrm{coNP} \subset \mathrm{IP}</tex>.
 
|proof=
 
|proof=
Сведём язык <tex>TAUT</tex> к языку <tex>\#SAT</tex> следующим образом: <tex>\phi \mapsto \langle \phi, 2^k \rangle </tex>, где <tex>k</tex> — количество различных переменных в формуле <tex>\phi</tex>.
+
Сведём язык <tex>\mathrm{TAUT}</tex> к языку <tex>\mathrm{\#SAT}</tex> следующим образом: <tex>\phi \mapsto \langle \phi, 2^k \rangle </tex>, где <tex>k</tex> — количество различных переменных в формуле <tex>\phi</tex>.
  
Очевидно, что <tex>\phi \in TAUT \Leftrightarrow \langle \phi, 2^k \rangle \in \#SAT</tex>.
+
Очевидно, что <tex>\phi \in \mathrm{TAUT} \Leftrightarrow \langle \phi, 2^k \rangle \in \mathrm{\#SAT}</tex>.
  
По лемме (2) <tex>\#SAT \in \mathrm{IP}</tex>. Тогда <tex>TAUT \in \mathrm{IP}</tex>. Так как <tex>TAUT \in \mathrm{coNPC}</tex>, то <tex>\mathrm{coNP} \subset \mathrm{IP}</tex>.
+
По лемме (2) <tex>\mathrm{\#SAT} \in \mathrm{IP}</tex>. Тогда <tex>\mathrm{TAUT} \in \mathrm{IP}</tex>. Так как <tex>\mathrm{TAUT} \in \mathrm{coNPC}</tex>, то <tex>\mathrm{coNP} \subset \mathrm{IP}</tex>.
 
}}
 
}}
  
 
[[Категория: Теория сложности]]
 
[[Категория: Теория сложности]]

Версия 01:14, 4 июня 2012

Эта статья находится в разработке!


Определение:
[math]\mathrm{\#SAT}=\{\langle \varphi, k \rangle \bigm| \varphi[/math] имеет ровно [math]k[/math] удовлетворяющих наборов [math]\}[/math].


Лемма (1):
[math]\sum\limits_{x_1 = 0}^1 \ldots \sum\limits_{x_m = 0}^1 A_\phi(x_1, \ldots, x_m)=k \Leftrightarrow \langle\phi,k\rangle \in \mathrm{\#SAT}[/math].
Доказательство:
[math]\triangleright[/math]
Следует из леммы (1).
[math]\triangleleft[/math]


Лемма (2):
[math]\mathrm{\#SAT} \in \mathrm{IP}[/math].
Доказательство:
[math]\triangleright[/math]

Для доказательства леммы построим программы Verifier и Prover из определения класса [math]\mathrm{IP}[/math].

Сперва арифметизуем формулу [math]\phi[/math]. Пусть полученный полином [math]A(x_1, x_2, ..., x_m)[/math] имеет степень [math]d[/math].

По лемме (1) вместо условия [math]\langle \phi, k \rangle \in \mathrm{\#SAT}[/math], можно проверять условие [math]\sum\limits_{x_1 = 0}^1 \ldots \sum\limits_{x_m = 0}^1 A_\phi(x_1, \ldots, x_m)=k[/math].

Приступим к описанию Verifier'а.

Шаг 0

Если [math]d=0[/math] или [math]m=0[/math], то Verifier может проверить указанное выше условие сам и вернуть соответствующий результат. Иначе запросим у Prover'а такое простое число [math]p[/math], что [math]3dm \le p \le 6dm[/math] (такое [math]p[/math] существует в силу постулата Бертрана). Проверим [math]p[/math] на простоту и на принадлежность заданному промежутку. Как мы знаем, [math]Primes \in \mathrm{P}[/math], следовательно на эти операции у Verifier'а уйдёт полиномиальное от размера входа время.

Далее будем проводить все вычисления модулю [math]p[/math].

Попросим Prover 'а прислать Verifier 'у формулу [math]A_0(x_1)= \sum\limits_{x_2 = 0}^{1}\ldots\sum\limits_{x_m = 0}^{1} A(x_1, x_2, ..., x_m)[/math]. Заметим, что размер формулы [math]A_0(x_1)[/math] будет полином от длины входа Verifier 'а, так как [math]A_0(x_1)[/math] полином от одной переменной степени не выше, чем [math]d[/math], а значит его можно представить в виде [math]A_0(x) = \sum\limits_{i = 0}^{d} C_i \cdot x ^ i[/math].

Проверим следующее утверждение: [math]A_0(0) + A_0(1) = k[/math] (*) (здесь и далее под словом «проверим» будем подразумевать следующее: если утверждение верно, Verifier продолжает свою работу, иначе он прекращает свою работу и возвращет false).

Шаг i

Пусть [math]r_i = random(p)[/math]. Отправим [math]r_i[/math] программе Prover.

Попросим Prover 'а прислать Verifier 'у формулу [math]A_i(x_{i+1}) = \sum\limits_{x_{i+2} = 0}^{1}\ldots\sum\limits_{x_m = 0}^{1} A(r_1,\ldots, r_i, x_{i+1}, ..., x_m)[/math].

Проверим следующее утверждение: [math]A_i(0) + A_i(1) = A_{i-1}(r_i)[/math] (*).

Шаг m

Пусть [math]r_m = random(p)[/math]. Отправим [math]r_m[/math] программе Prover.

Попросим программу Prover прислать Verifier 'у значение [math]A_m()= A(r_1, r_2, ..., r_m)[/math].

Проверим следующее утверждение: [math]A_m() = A_{m-1}(r_m)[/math] (*). А также сами подставим [math]r_1, r_2, ..., r_m[/math] в [math]A(x_1, x_2, ..., x_m)[/math] и проверим правильность присланного значения [math]A_m()[/math].

Возвращаем true.

Докажем теперь, что построенный таким образом Verifier — корректный. Для этого нужно доказать следующие утверждения:

  1. Построенный Verifier - вероятностная машина Тьюринга, совершающая не более полинома от длины входа действий.
  2. [math]\langle \varphi, k \rangle \in \#SAT \Rightarrow \exists Prover : P(Verifier^{Prover}(\langle \varphi, k \rangle)) \ge 2/3[/math].
  3. [math]\langle \varphi, k \rangle \notin \#SAT \Rightarrow \forall Prover : P(Verifier^{Prover}(\langle \varphi, k \rangle)) \le 1/3[/math].
  1. Первый факт следует из построения Verifier 'а.
  2. По лемме (2), если [math]\sum\limits_{x_1 = 0}^1 \ldots \sum\limits_{x_m = 0}^1 A_\phi(x_1, \ldots, x_m)=k[/math], то условия (*) выполнятются, следовательно существует такой Prover, что [math]P(Verifier^{Prover}(\langle\phi,k\rangle)) = 1[/math], для любой пары [math]\langle\phi,k\rangle \in \mathrm{\#SAT}[/math].
  3. Пусть количество наборов, удовлетворяющих [math]\phi[/math], не равно [math]k[/math]. Для того, что бы Verifier вернул true, Prover 'у необходимо посылать такие [math]A_i[/math], чтобы выполнялись все проверяемые условия. Посмотрим на то, что он может послать:
Шаг 0
Так как количество наборов, удовлетворяющих [math]\phi[/math], не равно [math]k[/math], то Prover не может послать правильное [math]A_0[/math] – не выполнится условие [math]A_0(0) + A_0(1) = k[/math]. Поэтому он посылает не [math]A_0[/math], а некое [math]\tilde{A}_0[/math].
Шаг 1
По лемме Шварца-Зиппеля [math]P(A_0(r_1) = \tilde{A}_0(r_1)) \le \frac d p[/math] для некоторого случайно выбранного [math]r_1[/math]. Тогда [math]P(A_0(r_1) \ne \tilde{A}_0(r_1)) \ge 1 - \frac d p[/math], при этом должно выполняться равенство [math]A_1(0) + A_1(1) = A_0(r_1)[/math]. Значит с вероятностью не меньше, чем [math]1 - \frac d p[/math], Prover отправит Verifier[math]\tilde{A}_1[/math] вместо [math]A_1[/math].
[math]\ldots[/math]
Шаг m
[math]P(A_{m-1}(r_m) \ne \tilde{A}_{m-1}(r_m)) \ge 1 - \frac d p[/math]. Значит с такой вероятностью Verifier получит [math]\tilde{A}_m[/math] вместо [math]A_m[/math]. Но так как на шаге [math]m[/math] Verifier вычисляет [math]A_m[/math] и сравнивает его с полученным от Prover 'а, то в этом случае Verifier вернет false.
Заметим, что если на каком-то шаге [math]A_{i-1}(r_i) = \tilde{A}_{i-1}(r_i)[/math], то начиная со следующего шага Prover может посылать истинные значения [math]A_i[/math] и в итоге Verifier вернёт true.
Из описанного процесса видно, что с вероятностью большей либо равной [math](1 - \frac d p) ^ m[/math] мы дойдем до последнего шага и будем имееть [math]\tilde{A}_n[/math] вместо [math]A_n[/math]. Так как на шаге [math]m[/math] Verifier вычисляет [math]A_n[/math] и проверяет значение, то Verifier вернет false.
Оценим вероятность возврата Verifier 'ом ответа false.
[math]P(!Verifier^{Prover}(\langle \varphi, k \rangle)) \ge (1 - \frac d p) ^ m \ge (1 - \frac d {3dm})^m = (1 - \frac 1 {3m})^m = 1 - \frac 1 3 + \frac{m(m - 1)}{2 (3m)^2} - \frac{m(m-1)(m-2)}{6 (3m)^3} + \ldots \ge \frac 2 3[/math].
Таким образом, построенный нами Verifier корректен, а значит лемма доказана.
[math]\triangleleft[/math]


Лемма (3):
[math]\mathrm{coNP} \subset \mathrm{IP}[/math].
Доказательство:
[math]\triangleright[/math]

Сведём язык [math]\mathrm{TAUT}[/math] к языку [math]\mathrm{\#SAT}[/math] следующим образом: [math]\phi \mapsto \langle \phi, 2^k \rangle [/math], где [math]k[/math] — количество различных переменных в формуле [math]\phi[/math].

Очевидно, что [math]\phi \in \mathrm{TAUT} \Leftrightarrow \langle \phi, 2^k \rangle \in \mathrm{\#SAT}[/math].

По лемме (2) [math]\mathrm{\#SAT} \in \mathrm{IP}[/math]. Тогда [math]\mathrm{TAUT} \in \mathrm{IP}[/math]. Так как [math]\mathrm{TAUT} \in \mathrm{coNPC}[/math], то [math]\mathrm{coNP} \subset \mathrm{IP}[/math].
[math]\triangleleft[/math]