Лемма о соотношении coNP и IP — различия между версиями
м |
|||
| Строка 63: | Строка 63: | ||
Попросим программу ''Prover'' прислать ''Verifier'' 'у значение <tex>A_m()= A(r_1, r_2, ..., r_m)</tex>. | Попросим программу ''Prover'' прислать ''Verifier'' 'у значение <tex>A_m()= A(r_1, r_2, ..., r_m)</tex>. | ||
| − | Проверим следующее утверждение: <tex> | + | Проверим следующее утверждение: <tex>A_m() = A_{m-1}(r_m)</tex>. |
А также сами подставим <tex>r_1, r_2, ..., r_m</tex> в <tex>A(x_1, x_2, ..., x_m)</tex> и проверим правильность присланного значения <tex>A_m()</tex>. | А также сами подставим <tex>r_1, r_2, ..., r_m</tex> в <tex>A(x_1, x_2, ..., x_m)</tex> и проверим правильность присланного значения <tex>A_m()</tex>. | ||
Возвращаем '''true'''. | Возвращаем '''true'''. | ||
| + | |||
| + | Докажем теперь, что построенный таким образом ''Verifier'' — корректный. Таким образом, нужно доказать: | ||
| + | # Построенный ''Verifier'' - вероятностная машина Тьюринга, совершающая не более полинома от длины входа действий. | ||
| + | # <tex>\langle \varphi, k \rangle \in \#SAT \Rightarrow \exists Prover : P(Verifier^{Prover}(x)) \ge 2/3</tex>. | ||
| + | # <tex>\langle \varphi, k \rangle \notin \#SAT \Rightarrow \forall Prover : P(Verifier^{Prover}(x)) \le 1/3</tex>. | ||
| + | |||
| + | Из построения ''Verifier'' 'а видно, что он работает за <tex>O(poly(|input|))</tex>. | ||
| + | |||
}} | }} | ||
Версия 16:57, 1 июня 2012
| Определение: |
| имеет ровно удовлетворяющих наборов . |
Введём понятие арифметизации булевых формул. Пусть нам дана формула . Сделаем следующие преобразования и получим формулу :
- ;
- ;
- ;
- .
Заметим, что длина формулы при этом возрастёт не более, чем в константу раз.
| Лемма (1): |
. |
| Лемма (2): |
. |
| Доказательство: |
| Следует из леммы (1). |
| Лемма (3): |
. |
| Доказательство: |
|
Для доказательства леммы построим программы Verifier и Prover из определения класса . Сперва арифметизуем формулу . Пусть полученный полином имеет степень . По лемме (2) вместо условия , можно проверять условие . Приступим к описанию Verifier'а. Шаг 0 Запросим у Prover'а такое простое число , что . Проверим простоту и условие (константу определим позднее). Как мы знаем, , следовательно на эти операции у Verifier'а уйдёт полиномиальное от размера входа время. Далее будем проводить все вычисления модулю . Попросим Prover 'а прислать Verifier 'у формулу . Заметим, что размер формулы будет полином от длины входа Verifier 'а, так как полином от одной переменной степени не выше, чем , а значит его можно представить в виде . Проверим следующее утверждение: (здесь и далее под словом «проверим» будем подразумевать следующее: если утверждение верно, Verifier продолжает свою работу, иначе он прекращает свою работу и возвращет false). Шаг i Пусть . Отправим программе Prover. Пусть . Попросим Prover 'а прислать Verifier 'у формулу . Проверим следующее утверждение: . Шаг m Пусть . Отправим программе Prover. Попросим программу Prover прислать Verifier 'у значение . Проверим следующее утверждение: . А также сами подставим в и проверим правильность присланного значения . Возвращаем true. Докажем теперь, что построенный таким образом Verifier — корректный. Таким образом, нужно доказать:
|
| Лемма (4): |
. |
| Доказательство: |
|
Сведём язык к языку следующим образом: , где — количество различных переменных в формуле . Очевидно, что . По лемме (3) . Тогда . Так как , то . |