Теорема о соотношении coNP и IP — различия между версиями
(Новая страница: «{{Определение |definition= <tex>\mathrm{\#SAT}=\{\langle \varphi, k \rangle \bigm| \varphi</tex> имеет ровно <tex>k</tex> удовлетво...») |
м |
||
Строка 16: | Строка 16: | ||
|statement=<tex>\mathrm{\#SAT} \in \mathrm{IP}</tex>. | |statement=<tex>\mathrm{\#SAT} \in \mathrm{IP}</tex>. | ||
|proof= | |proof= | ||
− | Для доказательства леммы построим программы | + | Для доказательства леммы построим программы <tex>\mathit{Verifier}</tex> и <tex>\mathit{Prover}</tex> из [[Интерактивные протоколы. Класс IP. Класс AM#Класс IP|определения]] класса <tex>\mathrm{IP}</tex>. |
Сперва арифметизуем формулу <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>. | ||
Строка 22: | Строка 22: | ||
По лемме (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>. | По лемме (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>. | ||
− | Приступим к описанию | + | Приступим к описанию <tex>\mathit{Verifier}</tex>'а. |
'''Шаг 0''' | '''Шаг 0''' | ||
− | Если <tex>d=0</tex> или <tex>m=0</tex>, то | + | Если <tex>d=0</tex> или <tex>m=0</tex>, то <tex>\mathit{Verifier}</tex> может проверить указанное выше условие сам и вернуть соответствующий результат. |
− | Иначе запросим у | + | Иначе запросим у <tex>\mathit{Prover}</tex>'а такое простое число <tex>p</tex>, что <tex>3dm \le p \le 6dm</tex> (такое <tex>p</tex> существует в силу [http://ru.wikipedia.org/wiki/Постулат_Бертрана постулата Бертрана]). |
− | Проверим <tex>p</tex> на простоту и на принадлежность заданному промежутку. Как мы [[Класс P#Примеры задач и языков из P|знаем]], <tex>\mathrm{Primes} \in \mathrm{P}</tex>, следовательно на эти операции у | + | Проверим <tex>p</tex> на простоту и на принадлежность заданному промежутку. Как мы [[Класс P#Примеры задач и языков из P|знаем]], <tex>\mathrm{Primes} \in \mathrm{P}</tex>, следовательно на эти операции у <tex>\mathit{Verifier}</tex>'а уйдёт полиномиальное от размера входа время. |
Далее будем проводить все вычисления модулю <tex>p</tex>. | Далее будем проводить все вычисления модулю <tex>p</tex>. | ||
− | Попросим | + | Попросим <tex>\mathit{Prover}</tex> 'а прислать <tex>\mathit{Verifier}</tex>'у формулу <tex>A_0(x_1)= \sum\limits_{x_2 = 0}^{1}\ldots\sum\limits_{x_m = 0}^{1} A(x_1, x_2, ..., x_m)</tex>. |
− | Заметим, что размер формулы <tex>A_0(x_1)</tex> будет полином от длины входа | + | Заметим, что размер формулы <tex>A_0(x_1)</tex> будет полином от длины входа <tex>\mathit{Verifier}</tex> 'а, так как <tex>A_0(x_1)</tex> — полином степени не выше, чем <tex>d</tex>, от одной переменной, а значит его можно представить в виде <tex>A_0(x) = \sum\limits_{i = 0}^{d} C_i \cdot x ^ i</tex>. |
− | Проверим следующее утверждение: <tex>A_0(0) + A_0(1) = k</tex> (*) (здесь и далее под словом «проверим» будем подразумевать следующее: если утверждение верно, | + | Проверим следующее утверждение: <tex>A_0(0) + A_0(1) = k</tex> (*) (здесь и далее под словом «проверим» будем подразумевать следующее: если утверждение верно, <tex>\mathit{Verifier}</tex> продолжает свою работу, иначе он прекращает свою работу и возвращет '''false'''). |
'''Шаг i''' | '''Шаг i''' | ||
− | Пусть <tex>r_i = random(0..p-1)</tex>. Отправим <tex>r_i</tex> программе | + | Пусть <tex>r_i = random(0..p-1)</tex>. Отправим <tex>r_i</tex> программе <tex>\mathit{Prover}</tex>. |
− | Попросим | + | Попросим <tex>\mathit{Prover}</tex> 'а прислать <tex>\mathit{Verifier}</tex>'у формулу <tex>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)</tex>. |
Проверим следующее утверждение: <tex>A_i(0) + A_i(1) = A_{i-1}(r_i)</tex> (*). | Проверим следующее утверждение: <tex>A_i(0) + A_i(1) = A_{i-1}(r_i)</tex> (*). | ||
Строка 47: | Строка 47: | ||
'''Шаг m''' | '''Шаг m''' | ||
− | Пусть <tex>r_m = random(0..p-1)</tex>. Отправим <tex>r_m</tex> программе | + | Пусть <tex>r_m = random(0..p-1)</tex>. Отправим <tex>r_m</tex> программе <tex>\mathit{Prover}</tex>. |
− | Попросим программу | + | Попросим программу <tex>\mathit{Prover}</tex> прислать <tex>\mathit{Verifier}</tex>'у значение <tex>A_m()= A(r_1, r_2, ..., r_m)</tex>. |
Проверим следующее утверждение: <tex>A_m() = A_{m-1}(r_m)</tex> (*). | Проверим следующее утверждение: <tex>A_m() = A_{m-1}(r_m)</tex> (*). | ||
Строка 56: | Строка 56: | ||
Возвращаем '''true'''. | Возвращаем '''true'''. | ||
− | Докажем теперь, что построенный таким образом | + | Докажем теперь, что построенный таким образом <tex>\mathit{Verifier}</tex> — корректный. Для этого нужно доказать следующие утверждения: |
− | # Построенный | + | # Построенный <tex>\mathit{Verifier}</tex> - вероятностная машина Тьюринга, совершающая не более полинома от длины входа действий. |
# <tex>\langle \varphi, k \rangle \in \mathrm{\#SAT} \Rightarrow \exists \mathit{Prover} : P(\mathit{Verifier^{Prover}}(\langle \varphi, k \rangle)=1) \ge 2/3</tex>. | # <tex>\langle \varphi, k \rangle \in \mathrm{\#SAT} \Rightarrow \exists \mathit{Prover} : P(\mathit{Verifier^{Prover}}(\langle \varphi, k \rangle)=1) \ge 2/3</tex>. | ||
# <tex>\langle \varphi, k \rangle \notin \mathrm{\#SAT} \Rightarrow \forall \mathit{Prover} : P(\mathit{Verifier^{Prover}}(\langle \varphi, k \rangle)=1) \le 1/3</tex>. | # <tex>\langle \varphi, k \rangle \notin \mathrm{\#SAT} \Rightarrow \forall \mathit{Prover} : P(\mathit{Verifier^{Prover}}(\langle \varphi, k \rangle)=1) \le 1/3</tex>. | ||
Строка 63: | Строка 63: | ||
Докажем эти утверждения. | Докажем эти утверждения. | ||
− | #Первый факт следует из построения | + | #Первый факт следует из построения <tex>\mathit{Verifier}</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>, то условия (*) выполнятются, следовательно существует такой | + | #По [[Арифметизация булевых формул с кванторами | лемме (2)]], если <tex>\sum\limits_{x_1 = 0}^1 \ldots \sum\limits_{x_m = 0}^1 A_\phi(x_1, \ldots, x_m)=k</tex>, то условия (*) выполнятются, следовательно существует такой <tex>\mathit{Prover}</tex>, что <tex>P(\mathit{Verifier^{Prover}}(\langle\phi,k\rangle)) = 1</tex>, для любой пары <tex>\langle\phi,k\rangle \in \mathrm{\#SAT}</tex>. |
− | #Пусть количество наборов, удовлетворяющих <tex>\phi</tex>, не равно <tex>k</tex>. Для того, что бы | + | #Пусть количество наборов, удовлетворяющих <tex>\phi</tex>, не равно <tex>k</tex>. Для того, что бы <tex>\mathit{Verifier}</tex> вернул '''true''', <tex>\mathit{Prover}</tex> 'у необходимо посылать такие <tex>A_i</tex>, чтобы выполнялись все проверяемые условия. Посмотрим на то, что он может послать: |
:'''Шаг 0''' | :'''Шаг 0''' | ||
− | :Так как количество наборов, удовлетворяющих <tex>\phi</tex>, не равно <tex>k</tex>, то | + | :Так как количество наборов, удовлетворяющих <tex>\phi</tex>, не равно <tex>k</tex>, то <tex>\mathit{Prover}</tex> не может послать правильное <tex>A_0</tex>, поскольку в этом случае не выполнится условие <tex>A_0(0) + A_0(1) = k</tex>. Поэтому он посылает не <tex>A_0</tex>, а некое <tex>\tilde{A}_0</tex>. |
:<tex>\ldots</tex> | :<tex>\ldots</tex> | ||
:'''Шаг i''' | :'''Шаг i''' | ||
− | :Заметим, что если на каком-то шаге <tex>A_{i-1}(r_i) = \tilde{A}_{i-1}(r_i)</tex>, то начиная со следующего шага | + | :Заметим, что если на каком-то шаге <tex>A_{i-1}(r_i) = \tilde{A}_{i-1}(r_i)</tex>, то начиная со следующего шага <tex>\mathit{Prover}</tex> может посылать правильные <tex>A_j</tex> и в итоге <tex>\mathit{Verifier}</tex> вернёт '''true'''. |
:Для некоторого случайно выбранного <tex>r_i</tex> вероятность того, что <tex>A_{i-1}(r_i) = \tilde{A}_{i-1}(r_i)</tex>, то есть <tex>r_i</tex> — корень полинома <tex>(A_{i-1} - \tilde{A}_{i-1})(r_i)</tex>, имеющего степень не больше <tex>d</tex>, не превосходит <tex>\frac{d}{p}</tex>. | :Для некоторого случайно выбранного <tex>r_i</tex> вероятность того, что <tex>A_{i-1}(r_i) = \tilde{A}_{i-1}(r_i)</tex>, то есть <tex>r_i</tex> — корень полинома <tex>(A_{i-1} - \tilde{A}_{i-1})(r_i)</tex>, имеющего степень не больше <tex>d</tex>, не превосходит <tex>\frac{d}{p}</tex>. | ||
:<tex>\ldots</tex> | :<tex>\ldots</tex> | ||
:'''Шаг m''' | :'''Шаг m''' | ||
− | :Так как на последнем шаге | + | :Так как на последнем шаге <tex>\mathit{Verifier}</tex> полученным от <tex>\mathit{Prover}</tex> значение с непосредственно вычисленным, слово будет допущено только в том случае, когда <tex>\mathit{Prover}</tex> смог прислать верное значение, что в свою очередь возможно лишь если на одном из предыдущих шагов был верно угадан корень полинома. |
: | : | ||
:Вычислим вероятность того, что хотя бы раз корень был угадан. | :Вычислим вероятность того, что хотя бы раз корень был угадан. | ||
Строка 80: | Строка 80: | ||
:В последнем переходе мы воспользовались [http://ru.wikipedia.org/wiki/Ряд_Тейлора формулой Тейлора] для логарифма и экспоненты, а также тем, что <tex>m>0</tex>. | :В последнем переходе мы воспользовались [http://ru.wikipedia.org/wiki/Ряд_Тейлора формулой Тейлора] для логарифма и экспоненты, а также тем, что <tex>m>0</tex>. | ||
− | Таким образом, построенный нами | + | Таким образом, построенный нами <tex>\mathit{Verifier}</tex> корректен, а значит лемма доказана. |
}} | }} | ||
Версия 00:48, 5 июня 2012
Определение: |
имеет ровно удовлетворяющих наборов . |
Лемма (1): |
. |
Доказательство: |
Следует из леммы (1). |
Лемма (2): |
. |
Доказательство: |
Для доказательства леммы построим программы определения класса . и изСперва арифметизуем формулу . Пусть полученный полином имеет степень .По лемме (1) вместо условия , можно проверять условие .Приступим к описанию 'а.Шаг 0 Если постулата Бертрана). Проверим на простоту и на принадлежность заданному промежутку. Как мы знаем, , следовательно на эти операции у 'а уйдёт полиномиальное от размера входа время. или , то может проверить указанное выше условие сам и вернуть соответствующий результат. Иначе запросим у 'а такое простое число , что (такое существует в силуДалее будем проводить все вычисления модулю .Попросим 'а прислать 'у формулу . Заметим, что размер формулы будет полином от длины входа 'а, так как — полином степени не выше, чем , от одной переменной, а значит его можно представить в виде .Проверим следующее утверждение: (*) (здесь и далее под словом «проверим» будем подразумевать следующее: если утверждение верно, продолжает свою работу, иначе он прекращает свою работу и возвращет false).Шаг i Пусть . Отправим программе .Попросим 'а прислать 'у формулу .Проверим следующее утверждение: (*).Шаг m Пусть . Отправим программе .Попросим программу прислать 'у значение .Проверим следующее утверждение: (*). А также сами подставим в и проверим правильность присланного значения .Возвращаем true. Докажем теперь, что построенный таким образом — корректный. Для этого нужно доказать следующие утверждения:
Докажем эти утверждения.
|
Теорема: |
. |
Доказательство: |
Сведём язык к языку следующим образом: , где — количество различных переменных в формуле .Очевидно, что По лемме (2) . . Тогда . Так как , то . |