Вероятностные вычисления. Вероятностная машина Тьюринга — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 1: Строка 1:
 
{{В разработке}}
 
{{В разработке}}
 
[[Категория: Теория сложности]]
 
[[Категория: Теория сложности]]
'''Вероятностные вычисления''' — один из подходов в теории вычислительной сложности, в котором программы получают доступ к случайным битам. Мы рассмотрим классы сложности, для которых разрешающие программы могут делать односторонние, двусторонние ошибки или работать за полиномиальное время лишь в среднем случае.
+
'''Вероятностные вычисления''' — один из подходов в теории вычислительной сложности, в котором программы получают доступ, говоря неформально, к генератору случайных чисел. Мы рассмотрим классы сложности, для которых программы могут работать за полиномиальное время и делать односторонние, двусторонние ошибки или работать за полиномиальное время лишь в среднем случае.
  
 
== Основные определения ==
 
== Основные определения ==
 
{{Определение
 
{{Определение
 
|definition =
 
|definition =
'''Вероятностная лента''' — бесконечная последовательность битов, распределение которых подчиняется некоторому вероятностному закону (обычно считают, что вероятность нахождения <tex>0</tex> или <tex>1</tex> в каждой позиции равна <tex>1/2</tex>).
+
'''Вероятностная лента''' — бесконечная в одну сторону последовательность битов, распределение которых подчиняется некоторому вероятностному закону (обычно считают, что биты в различных позициях независимы и вероятность нахождения <tex>0</tex> или <tex>1</tex> в каждой позиции равна <tex>1/2</tex>).
 
}}
 
}}
 
{{Определение
 
{{Определение
 
|definition =
 
|definition =
'''Вероятностная машина Тьюринга''' (ВМТ) — обобщение детерминированной машины Тьюринга. Переходы в ВМТ могут осуществляться с учетом информации, считанной с вероятностной ленты.
+
'''Вероятностная машина Тьюринга''' (ВМТ) — детерминированная машина Тьюринга, имеющая вероятностную ленту. Переходы в ВМТ могут осуществляться с учетом информации, считанной с вероятностной ленты.
 
}}
 
}}
  
Строка 17: Строка 17:
 
Введем вероятностное пространство <tex>(\Omega, \Sigma, \operatorname{P})</tex>, где пространство элементарных исходов <tex>\Omega</tex> — множество всех вероятностных лент, <tex>\Sigma</tex> — сигма-алгебра подмножеств <tex>\Omega</tex>, <tex>\operatorname{P}</tex> — вероятностная мера, заданная на <tex>\Sigma</tex>. Покажем, что любой предикат от ВМТ является событием.
 
Введем вероятностное пространство <tex>(\Omega, \Sigma, \operatorname{P})</tex>, где пространство элементарных исходов <tex>\Omega</tex> — множество всех вероятностных лент, <tex>\Sigma</tex> — сигма-алгебра подмножеств <tex>\Omega</tex>, <tex>\operatorname{P}</tex> — вероятностная мера, заданная на <tex>\Sigma</tex>. Покажем, что любой предикат от ВМТ является событием.
 
{{Теорема
 
{{Теорема
|statement= <tex>\forall A</tex> — предикат от ВМТ: <tex>R = \{r | A(m(x, r))\} \in \Sigma</tex>.
+
|statement= Пусть <tex>m</tex> — ВМТ. Тогда <tex>\forall x, \forall A</tex> — предикат от <tex>m</tex>: <tex>R = \{r | A(m(x, r))\} \in \Sigma</tex>, т.е. <tex>R</tex> измеримо.
 
|proof=
 
|proof=
Считаем, что <tex>x</tex> фиксирован.
 
 
 
<tex>R = \bigcup\limits_{i = 0}^\infty R_i</tex>, <tex>R_i = \{r | A(m(x, r)), m</tex> прочитала ровно <tex>i</tex> первых символов с вероятностной ленты<tex>\}</tex>.
 
<tex>R = \bigcup\limits_{i = 0}^\infty R_i</tex>, <tex>R_i = \{r | A(m(x, r)), m</tex> прочитала ровно <tex>i</tex> первых символов с вероятностной ленты<tex>\}</tex>.
  
<tex>R_i \in \Sigma</tex>, <tex>\operatorname{P}(R_i) = \frac{1}{2^i} \cdot |\{s : |s| = i, s</tex> — префикс <tex>r \in R_i\}|</tex>.
+
<tex>R_i \in \Sigma</tex>, <tex>\operatorname{P}(R_i) = \frac{1}{2^i} \cdot |\{s : |s| = i, s</tex> — префикс <tex>r \in R_i\}|</tex>, <tex>R_i</tex> дизъюнктны.
  
 
<tex>R \in \Sigma</tex> как счетное объединение множеств, при этом <tex>\operatorname{P}(R) = \sum\limits_{i = 0}^{\infty} \operatorname{P}(R_i)</tex>.
 
<tex>R \in \Sigma</tex> как счетное объединение множеств, при этом <tex>\operatorname{P}(R) = \sum\limits_{i = 0}^{\infty} \operatorname{P}(R_i)</tex>.
Строка 32: Строка 30:
 
|definition =
 
|definition =
 
<tex>\mathrm{ZPP}</tex> (от ''zero-error probabilistic polynomial'') — множество языков <tex>L</tex>, для которых <tex>\exists p \forall x</tex>:
 
<tex>\mathrm{ZPP}</tex> (от ''zero-error probabilistic polynomial'') — множество языков <tex>L</tex>, для которых <tex>\exists p \forall x</tex>:
1) <tex>\operatorname{P}(p(x) \ne [x \in L]) = 0</tex>;<br>
+
# <tex>\operatorname{P}(p(x) \ne [x \in L]) = 0</tex>;<br>
2) <tex>\operatorname{E}(\operatorname{T}(p(x))) = poly(|x|)</tex>.<br>
+
# <tex>\operatorname{E}[\operatorname{T}(p(x))] = poly(|x|)</tex>.<br>
 
}}
 
}}
  
Строка 39: Строка 37:
 
|definition =
 
|definition =
 
<tex>\mathrm{RP}</tex> (от ''randomized polynomial'') — множество языков <tex>L</tex>, для которых <tex>\exists p \forall x</tex>:
 
<tex>\mathrm{RP}</tex> (от ''randomized polynomial'') — множество языков <tex>L</tex>, для которых <tex>\exists p \forall x</tex>:
1) <tex>x \notin L \Rightarrow p(x) = 0</tex>;<br>
+
# <tex>x \notin L \Rightarrow \operatorname{P}(p(x) = 0) = 1</tex>;<br>
2) <tex>x \in L \Rightarrow \operatorname{P}(p(x) = 1) \ge 1/2</tex>;<br>
+
# <tex>x \in L \Rightarrow \operatorname{P}(p(x) = 1) \ge 1/2</tex>;<br>
3) <tex>\forall r \operatorname{T}(p(x)) \le poly(|x|).</tex>
+
# <tex>\forall r \operatorname{T}(p(x)) \le poly(|x|).</tex>
 
}}
 
}}
 
Заметим, что константа <tex>1/2</tex> в пункте 2 определения <tex>\mathrm{RP}</tex> может быть заменена на любую другую из промежутка <tex>(0, 1)</tex>, поскольку требуемой вероятности можно добиться множественным запуском программы.
 
Заметим, что константа <tex>1/2</tex> в пункте 2 определения <tex>\mathrm{RP}</tex> может быть заменена на любую другую из промежутка <tex>(0, 1)</tex>, поскольку требуемой вероятности можно добиться множественным запуском программы.
  
Определим также <tex>\mathrm{coRP}</tex> как дополнение к <tex>\mathrm{RP}</tex>.
+
<tex>\mathrm{RP}</tex> можно рассматривать как вероятностный аналог класса <tex>\mathrm{NP}</tex>, предполагая, что вероятность угадать сертификат в случае его существования не менее <tex>1/2</tex>.
  
<tex>\mathrm{RP}</tex> можно рассматривать как вероятностный аналог класса <tex>\mathrm{NP}</tex>, предполагая, что вероятность угадать сертификат в случае его существования не менее <tex>1/2</tex>.
+
{{Определение
 +
|definition =
 +
<tex>\mathrm{coRP} = \{L | \overline L \in \mathrm{RP}\}</tex>.
 +
}}
  
 
{{Определение
 
{{Определение
 
|definition =
 
|definition =
 
<tex>\mathrm{BPP}</tex> (от ''bounded probabilistic polynomial'') — множество языков <tex>L</tex>, для которых <tex>\exists p \forall x</tex>:
 
<tex>\mathrm{BPP}</tex> (от ''bounded probabilistic polynomial'') — множество языков <tex>L</tex>, для которых <tex>\exists p \forall x</tex>:
1) <tex>\operatorname{P}(p(x) = [x \in L]) \ge 2/3</tex>;<br>
+
# <tex>\operatorname{P}(p(x) = [x \in L]) \ge 2/3</tex>;<br>
2) <tex>\forall r \operatorname{T}(p(x)) \le poly(|x|)</tex>.
+
# <tex>\forall r \operatorname{T}(p(x)) \le poly(|x|)</tex>.
 
}}
 
}}
Аналогично сделанному выше замечанию, константу <tex>2/3</tex> можно заменить на любое число из промежутка <tex>(1/2, 1)</tex>. Замена константы на <tex>1/2</tex> сделало бы данный класс равным <tex>\Sigma^*</tex>.
+
Аналогично сделанному выше замечанию, константу <tex>2/3</tex> можно заменить на любое число из промежутка <tex>(1/2, 1)</tex>. Замена константы на <tex>1/2</tex> сделало бы данный класс равным <tex>\Sigma^*</tex> (программа, возвращающая результат функции ''random''(), подошла бы для любого языка).
  
 
{{Определение
 
{{Определение
 
|definition =
 
|definition =
 
<tex>\mathrm{PP}</tex> (от ''bounded probabilistic polynomial'') — множество языков <tex>L</tex>, для которых <tex>\exists p \forall x</tex>:
 
<tex>\mathrm{PP}</tex> (от ''bounded probabilistic polynomial'') — множество языков <tex>L</tex>, для которых <tex>\exists p \forall x</tex>:
1) <tex>\operatorname{P}(p(x) = [x \in L]) > 1/2</tex>;<br>
+
# <tex>\operatorname{P}(p(x) = [x \in L]) > 1/2</tex>;<br>
2) <tex>\forall r \operatorname{T}(p(x)) \le poly(|x|)</tex>.
+
# <tex>\forall r \operatorname{T}(p(x)) \le poly(|x|)</tex>.
 
}}
 
}}
  
Строка 68: Строка 69:
 
|statement = <tex>\mathrm{P} \subset \mathrm{ZPP} = \mathrm{RP} \cap \mathrm{coRP}</tex>.
 
|statement = <tex>\mathrm{P} \subset \mathrm{ZPP} = \mathrm{RP} \cap \mathrm{coRP}</tex>.
 
|proof =
 
|proof =
Утверждение <tex>\mathrm{P} \subset \mathrm{ZPP}</tex> является очевидным, так как программы, разрешающие <tex>\mathrm{P}</tex>, удовлетворяют ограничениям класса <tex>\mathrm{ZPP}</tex>.
+
Утверждение <tex>\mathrm{P} \subset \mathrm{ZPP}</tex> является очевидным, так как программы, удовлетворяющие ограничениям <tex>\mathrm{P}</tex>, также удовлетворяют ограничениям класса <tex>\mathrm{ZPP}</tex>.
  
 
Покажем, что <tex>\mathrm{ZPP} = \mathrm{RP} \cap \mathrm{coRP}</tex>.
 
Покажем, что <tex>\mathrm{ZPP} = \mathrm{RP} \cap \mathrm{coRP}</tex>.
Строка 75: Строка 76:
 
|definition =
 
|definition =
 
<tex>\mathrm{ZPP}_1</tex> — множество языков <tex>L</tex>, для которых <tex>\exists p \forall x</tex>:
 
<tex>\mathrm{ZPP}_1</tex> — множество языков <tex>L</tex>, для которых <tex>\exists p \forall x</tex>:
1) <tex>p(x) \in \{0, 1, ?\}</tex>;
+
# <tex>p(x) \in \{0, 1, ?\}</tex>;
 
+
# <tex>p(x) \ne \enskip? \Rightarrow p(x) = [x \in L]</tex>;
2) <tex>p(x) \ne ? \Rightarrow p(x) = [x \in L]</tex>;
+
# <tex>\operatorname{P}(p(x) = \enskip?) \le 1/2</tex>;
 
+
# <tex>\forall r \operatorname{T}(p(x)) \le poly(|x|).</tex>
3) <tex>\operatorname{P}(p(x) = ?) \le 1/2</tex>;
 
 
 
4) <tex>\forall r \operatorname{T}(p(x)) \le poly(|x|).</tex>
 
 
}}
 
}}
Сначала докажем, что <tex>\mathrm{ZPP} = \mathrm{ZPP}_1</tex>.
+
1. Сначала докажем, что <tex>\mathrm{ZPP} = \mathrm{ZPP}_1</tex>.
  
 
1) <tex>\mathrm{ZPP} \subset \mathrm{ZPP}_1</tex>.
 
1) <tex>\mathrm{ZPP} \subset \mathrm{ZPP}_1</tex>.
Строка 91: Строка 89:
 
<tex>\operatorname{P}(X > k \operatorname{E}[X]) \le 1/k</tex>.
 
<tex>\operatorname{P}(X > k \operatorname{E}[X]) \le 1/k</tex>.
  
Подставляем <tex>k = 2</tex>. Тогда, если запустить программу <tex>p</tex> для <tex>ZPP</tex> с ограничением по времени <tex>2E[X]</tex>, она не успеет завершиться с вероятностью, не превышающей <tex>1/2</tex>. В этом случае программа <tex>q</tex> для <tex>\mathrm{ZPP}_1</tex> вернет <tex>?</tex>, а иначе — результат программы <tex>p</tex>. Заметим, что <tex>q</tex> работает полиномиальное время, так как <tex>E[X]</tex> ограничено некоторым полиномом по определению класса <tex>\mathrm{ZPP}</tex>.
+
Подставим <tex>k = 2</tex>. Тогда, если запустить программу <tex>p</tex> для <tex>\mathrm{ZPP}</tex> с ограничением по времени <tex>2E[X]</tex>, она не успеет завершиться с вероятностью, не превышающей <tex>1/2</tex>. Опишем программу <tex>q</tex> для <tex>\mathrm{ZPP}_1</tex>. Она будет возвращать <tex>?</tex>, если <tex>p</tex> не успеет завершиться, а иначе — результат работы программы <tex>p</tex>. Заметим, что <tex>q</tex> работает полиномиальное время, так как <tex>E[X]</tex> ограничено некоторым полиномом по определению класса <tex>\mathrm{ZPP}</tex>.
  
2) <tex>\mathrm{ZPP_1} \subset \mathrm{ZPP}</tex>. Будем запускать программу p для <tex>\mathrm{ZPP_1}</tex>, пока не получим ответ, отличный от <tex>?</tex>. Математическое ожидание количества запусков <tex>p</tex> не превышает <tex>\sum\limits_{k = 0}^\infty \frac{k}{2^k} = 2</tex>. Значит, новая программа будет в среднем работать за полиномиальное время, что и требуется для класса <tex>\mathrm{ZPP}</tex>.
+
2) <tex>\mathrm{ZPP_1} \subset \mathrm{ZPP}</tex>.
 +
Будем запускать программу <tex>p</tex> для <tex>\mathrm{ZPP_1}</tex>, пока не получим ответ, отличный от <tex>?</tex>. Математическое ожидание количества запусков <tex>p</tex> не превышает <tex>\sum\limits_{k = 0}^\infty \frac{k}{2^k} = 2</tex>. Значит, новая программа будет в среднем работать за полиномиальное время, что и требуется для класса <tex>\mathrm{ZPP}</tex>.
  
Теперь покажем, что <tex>\mathrm{ZPP}_1 = \mathrm{RP} \cap \mathrm{coRP}</tex>.
+
2. Теперь покажем, что <tex>\mathrm{ZPP}_1 = \mathrm{RP} \cap \mathrm{coRP}</tex>.
  
 
1) <tex>\mathrm{ZPP}_1 \subset \mathrm{RP}</tex>. Достаточно вместо <tex>?</tex> возвращать <tex>0</tex>.
 
1) <tex>\mathrm{ZPP}_1 \subset \mathrm{RP}</tex>. Достаточно вместо <tex>?</tex> возвращать <tex>0</tex>.
Строка 102: Строка 101:
  
 
3) <tex>\mathrm{ZPP}_1 \supset \mathrm{RP} \cap \mathrm{coRP}</tex>.
 
3) <tex>\mathrm{ZPP}_1 \supset \mathrm{RP} \cap \mathrm{coRP}</tex>.
Пусть программа <tex>p</tex> ошибается на словах из языка с вероятностью не более <tex>1/2</tex>, <tex>q</tex> ошибается на словах не из языка с аналогичной вероятностью. Вычислим значения <tex>p(x)</tex> и <tex>q(x)</tex>. Вернем <tex>0</tex>, если <tex>p(x) = 0</tex>. Вернем <tex>1</tex>, если <tex>q(x) = 1</tex>. В противном случае вернем <tex>?</tex>. Вероятность вывести <tex>?</tex> есть <tex>\operatorname{P}(p(x) = 1, q(x) = 0) \le 1/2</tex>.
+
Пусть программа <tex>p_1</tex> удовлетворяет ограничениям <tex>RP</tex> и ошибается на словах из языка <tex>L</tex> с вероятностью не более <tex>1/2</tex>, а программа <tex>p_2</tex> удовлетворяет ограничениям <tex>coRP</tex> и ошибается на словах не из языка <tex>L</tex> с аналогичной вероятностью. Построим программу <tex>q</tex> для <tex>\mathrm{ZPP}_1</tex>:
 +
  q(x):
 +
    '''if''' p(x) = 0:
 +
      '''return''' 0
 +
    '''if'' q(x) = 1:
 +
      '''return''' 1
 +
    '''return''' ?
  
 +
Вероятность вывести <tex>?</tex> есть <tex>\operatorname{P}(p(x) = 1, q(x) = 0) \le 1/2</tex>.
 
}}
 
}}
  

Версия 12:52, 31 мая 2012

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

Вероятностные вычисления — один из подходов в теории вычислительной сложности, в котором программы получают доступ, говоря неформально, к генератору случайных чисел. Мы рассмотрим классы сложности, для которых программы могут работать за полиномиальное время и делать односторонние, двусторонние ошибки или работать за полиномиальное время лишь в среднем случае.

Основные определения

Определение:
Вероятностная лента — бесконечная в одну сторону последовательность битов, распределение которых подчиняется некоторому вероятностному закону (обычно считают, что биты в различных позициях независимы и вероятность нахождения [math]0[/math] или [math]1[/math] в каждой позиции равна [math]1/2[/math]).


Определение:
Вероятностная машина Тьюринга (ВМТ) — детерминированная машина Тьюринга, имеющая вероятностную ленту. Переходы в ВМТ могут осуществляться с учетом информации, считанной с вероятностной ленты.


Используя тезис Черча-Тьюринга, ВМТ можно сопоставить программы, имеющие доступ к случайным битам. Обращение к очередному биту можно трактовать как вызов специальной функции random(). При этом также будем предполагать, что вероятностная лента является неявным аргументом программы или ВМТ, т.е. [math]p(x) = p(x, r)[/math], где [math]r[/math] — вероятностная лента.

Введем вероятностное пространство [math](\Omega, \Sigma, \operatorname{P})[/math], где пространство элементарных исходов [math]\Omega[/math] — множество всех вероятностных лент, [math]\Sigma[/math] — сигма-алгебра подмножеств [math]\Omega[/math], [math]\operatorname{P}[/math] — вероятностная мера, заданная на [math]\Sigma[/math]. Покажем, что любой предикат от ВМТ является событием.

Теорема:
Пусть [math]m[/math] — ВМТ. Тогда [math]\forall x, \forall A[/math] — предикат от [math]m[/math]: [math]R = \{r | A(m(x, r))\} \in \Sigma[/math], т.е. [math]R[/math] измеримо.
Доказательство:
[math]\triangleright[/math]

[math]R = \bigcup\limits_{i = 0}^\infty R_i[/math], [math]R_i = \{r | A(m(x, r)), m[/math] прочитала ровно [math]i[/math] первых символов с вероятностной ленты[math]\}[/math].

[math]R_i \in \Sigma[/math], [math]\operatorname{P}(R_i) = \frac{1}{2^i} \cdot |\{s : |s| = i, s[/math] — префикс [math]r \in R_i\}|[/math], [math]R_i[/math] дизъюнктны.

[math]R \in \Sigma[/math] как счетное объединение множеств, при этом [math]\operatorname{P}(R) = \sum\limits_{i = 0}^{\infty} \operatorname{P}(R_i)[/math].
[math]\triangleleft[/math]

Вероятностные сложностные классы

Определение:
[math]\mathrm{ZPP}[/math] (от zero-error probabilistic polynomial) — множество языков [math]L[/math], для которых [math]\exists p \forall x[/math]:
  1. [math]\operatorname{P}(p(x) \ne [x \in L]) = 0[/math];
  2. [math]\operatorname{E}[\operatorname{T}(p(x))] = poly(|x|)[/math].


Определение:
[math]\mathrm{RP}[/math] (от randomized polynomial) — множество языков [math]L[/math], для которых [math]\exists p \forall x[/math]:
  1. [math]x \notin L \Rightarrow \operatorname{P}(p(x) = 0) = 1[/math];
  2. [math]x \in L \Rightarrow \operatorname{P}(p(x) = 1) \ge 1/2[/math];
  3. [math]\forall r \operatorname{T}(p(x)) \le poly(|x|).[/math]

Заметим, что константа [math]1/2[/math] в пункте 2 определения [math]\mathrm{RP}[/math] может быть заменена на любую другую из промежутка [math](0, 1)[/math], поскольку требуемой вероятности можно добиться множественным запуском программы.

[math]\mathrm{RP}[/math] можно рассматривать как вероятностный аналог класса [math]\mathrm{NP}[/math], предполагая, что вероятность угадать сертификат в случае его существования не менее [math]1/2[/math].


Определение:
[math]\mathrm{coRP} = \{L | \overline L \in \mathrm{RP}\}[/math].


Определение:
[math]\mathrm{BPP}[/math] (от bounded probabilistic polynomial) — множество языков [math]L[/math], для которых [math]\exists p \forall x[/math]:
  1. [math]\operatorname{P}(p(x) = [x \in L]) \ge 2/3[/math];
  2. [math]\forall r \operatorname{T}(p(x)) \le poly(|x|)[/math].

Аналогично сделанному выше замечанию, константу [math]2/3[/math] можно заменить на любое число из промежутка [math](1/2, 1)[/math]. Замена константы на [math]1/2[/math] сделало бы данный класс равным [math]\Sigma^*[/math] (программа, возвращающая результат функции random(), подошла бы для любого языка).


Определение:
[math]\mathrm{PP}[/math] (от bounded probabilistic polynomial) — множество языков [math]L[/math], для которых [math]\exists p \forall x[/math]:
  1. [math]\operatorname{P}(p(x) = [x \in L]) \gt 1/2[/math];
  2. [math]\forall r \operatorname{T}(p(x)) \le poly(|x|)[/math].


Соотношение вероятностных классов

Теорема:
[math]\mathrm{P} \subset \mathrm{ZPP} = \mathrm{RP} \cap \mathrm{coRP}[/math].
Доказательство:
[math]\triangleright[/math]

Утверждение [math]\mathrm{P} \subset \mathrm{ZPP}[/math] является очевидным, так как программы, удовлетворяющие ограничениям [math]\mathrm{P}[/math], также удовлетворяют ограничениям класса [math]\mathrm{ZPP}[/math].

Покажем, что [math]\mathrm{ZPP} = \mathrm{RP} \cap \mathrm{coRP}[/math]. Для этого определим вспомогательный класс [math]\mathrm{ZPP}_1[/math].

Определение:
[math]\mathrm{ZPP}_1[/math] — множество языков [math]L[/math], для которых [math]\exists p \forall x[/math]:
  1. [math]p(x) \in \{0, 1, ?\}[/math];
  2. [math]p(x) \ne \enskip? \Rightarrow p(x) = [x \in L][/math];
  3. [math]\operatorname{P}(p(x) = \enskip?) \le 1/2[/math];
  4. [math]\forall r \operatorname{T}(p(x)) \le poly(|x|).[/math]

1. Сначала докажем, что [math]\mathrm{ZPP} = \mathrm{ZPP}_1[/math].

1) [math]\mathrm{ZPP} \subset \mathrm{ZPP}_1[/math].

Пусть [math]X[/math] — случайная величина, равная времени работы программы [math]p[/math] для [math]\mathrm{ZPP}[/math], [math]X \gt 0[/math]. Запишем неравенство Маркова:

[math]\operatorname{P}(X \gt k \operatorname{E}[X]) \le 1/k[/math].

Подставим [math]k = 2[/math]. Тогда, если запустить программу [math]p[/math] для [math]\mathrm{ZPP}[/math] с ограничением по времени [math]2E[X][/math], она не успеет завершиться с вероятностью, не превышающей [math]1/2[/math]. Опишем программу [math]q[/math] для [math]\mathrm{ZPP}_1[/math]. Она будет возвращать [math]?[/math], если [math]p[/math] не успеет завершиться, а иначе — результат работы программы [math]p[/math]. Заметим, что [math]q[/math] работает полиномиальное время, так как [math]E[X][/math] ограничено некоторым полиномом по определению класса [math]\mathrm{ZPP}[/math].

2) [math]\mathrm{ZPP_1} \subset \mathrm{ZPP}[/math]. Будем запускать программу [math]p[/math] для [math]\mathrm{ZPP_1}[/math], пока не получим ответ, отличный от [math]?[/math]. Математическое ожидание количества запусков [math]p[/math] не превышает [math]\sum\limits_{k = 0}^\infty \frac{k}{2^k} = 2[/math]. Значит, новая программа будет в среднем работать за полиномиальное время, что и требуется для класса [math]\mathrm{ZPP}[/math].

2. Теперь покажем, что [math]\mathrm{ZPP}_1 = \mathrm{RP} \cap \mathrm{coRP}[/math].

1) [math]\mathrm{ZPP}_1 \subset \mathrm{RP}[/math]. Достаточно вместо [math]?[/math] возвращать [math]0[/math].

2) [math]\mathrm{ZPP}_1 \subset\mathrm{coRP}[/math]. Достаточно вместо [math]?[/math] возвращать [math]1[/math].

3) [math]\mathrm{ZPP}_1 \supset \mathrm{RP} \cap \mathrm{coRP}[/math]. Пусть программа [math]p_1[/math] удовлетворяет ограничениям [math]RP[/math] и ошибается на словах из языка [math]L[/math] с вероятностью не более [math]1/2[/math], а программа [math]p_2[/math] удовлетворяет ограничениям [math]coRP[/math] и ошибается на словах не из языка [math]L[/math] с аналогичной вероятностью. Построим программу [math]q[/math] для [math]\mathrm{ZPP}_1[/math]:

 q(x):
   if p(x) = 0:
     return 0
   'if q(x) = 1:
     return 1
   return ?
Вероятность вывести [math]?[/math] есть [math]\operatorname{P}(p(x) = 1, q(x) = 0) \le 1/2[/math].
[math]\triangleleft[/math]
Теорема:
[math]\mathrm{RP} \subset \mathrm{NP} \subset \mathrm{PP} \subset \mathrm{PS}[/math].
Доказательство:
[math]\triangleright[/math]

Покажем, что [math]\mathrm{RP} \subset \mathrm{NP}[/math]. Если в разрешающей программе для [math]L \in \mathrm{RP}[/math] заменить все вызовы random() на недетерминированный выбор, то получим программу с ограничениями [math]\mathrm{NP}[/math], разрешающую [math]L[/math].

Покажем, что [math]\mathrm{PP} \subset \mathrm{PS}[/math]. Пусть [math]p[/math] — разрешающая программа для языка [math]L \in \mathrm{PP}[/math]. Она используют не более чем полиномиальное количество вероятностных бит, так как сама работает за полиномиальное время. Тогда программа для [math]\mathrm{PS}[/math] будет перебирать все участки вероятностных лент нужной полиномиальной длины и запускать на них [math]p[/math]. Ответом будет [math]0[/math] или [math]1[/math] в зависимости от того, каких ответов [math]p[/math] оказалось больше.

Теперь докажем, что [math]\mathrm{NP} \subset \mathrm{PP}[/math]. Приведем программу [math]q[/math] с ограничениями класса [math]\mathrm{PP}[/math], которая разрешает [math]L \in \mathrm{NP}[/math]. Пусть функция infair_coin() моделирует нечестную монету, а именно возвращает единицу с вероятностью [math]1/2 - \varepsilon[/math], где [math]\varepsilon[/math] мы определим позже, и ноль с вероятностью [math]1/2 + \varepsilon[/math]. Пусть также [math]V[/math] — верификатор сертификатов для [math]L[/math]. Тогда [math]q[/math] будет выглядеть следующим образом:

 q(x):
   c <- случайный сертификат (полиномиальной длины)
   return V(x, c) ? 1 : infair_coin()

Необходимо удовлетворить условию [math]\operatorname{P}(p(x) = [x \in L]) \gt 1/2[/math].

Пусть [math]x \notin L[/math]. В этом случае [math]V(x, c)[/math] вернет [math]0[/math] и результат работы программы будет зависеть от нечестной монеты. Она вернет [math]0[/math] с вероятностью [math]1/2 + \varepsilon \gt 1/2[/math].

Пусть [math]x \in L[/math]. Тогда по формуле полной вероятности [math]\operatorname{P}(p(x) = 1) = p_0 + (1 - p_0) (1/2 - \varepsilon)[/math], где [math]p_0[/math] — вероятность угадать правильный сертификат. Заметим, что поскольку все сертификаты имеют полиномиальную длину и существует хотя бы один правильный сертификат, [math]p_0[/math] не более чем экспоненциально мала. Найдем [math]\varepsilon[/math] из неравенства [math]\operatorname{P}(p(x) = 1) \gt 1/2[/math]:

[math]p_0 + 1/2 - \varepsilon - p_0 / 2 + p_0 \varepsilon \gt 1/2[/math];

[math]p_0 / 2 + (p_0 - 1)\varepsilon \gt 0[/math];

[math]\varepsilon \lt p_0 (1 - p_0) / 2[/math].

Достаточно взять [math]\varepsilon \lt p_0 / 4[/math]. Из сделанного выше замечания следует, что работу функции infair_coin() можно смоделировать с помощью полиномиального количества вызовов random(). Таким образом, мы построили программу [math]q[/math], удовлетворяющую ограничениям класса [math]\mathrm{PP}[/math].
[math]\triangleleft[/math]
Теорема:
1. [math]\mathrm{RP} \subset \mathrm{BPP}[/math];
2. [math]\mathrm{coRP} \subset \mathrm{BPP}[/math].
Доказательство:
[math]\triangleright[/math]

Пусть [math]p[/math] — программа для [math]L \in RP[/math]. Программу [math]q[/math] для [math]\mathrm{BPP}[/math] определим следующим образом:

 q(x):
   u <- p(x)
   v <- p(x)
   return u or v

Пусть [math]x \in L[/math]. В этом случае вероятность ошибки равна [math]\operatorname{P}(u = 0, v = 0) = \operatorname{P}(u = 0) \cdot \operatorname{P}(v = 0) \le 1/4[/math].

Пусть [math]x \notin L[/math]. Тогда [math]u = 0, v = 0[/math] и [math]q[/math] вернет правильный ответ.

Аналогично доказывается, что [math]\mathrm{coRP} \subset \mathrm{BPP}[/math].
[math]\triangleleft[/math]

См. также

Литература