|
|
(не показано 12 промежуточных версий 4 участников) |
Строка 2: |
Строка 2: |
| '''Вероятностные вычисления''' — один из подходов в теории вычислительной сложности, в котором программы получают доступ, говоря неформально, к генератору случайных чисел. Мы рассмотрим классы сложности, для которых программы могут работать за полиномиальное время и делать односторонние, двусторонние ошибки или работать за полиномиальное время лишь в среднем случае. | | '''Вероятностные вычисления''' — один из подходов в теории вычислительной сложности, в котором программы получают доступ, говоря неформально, к генератору случайных чисел. Мы рассмотрим классы сложности, для которых программы могут работать за полиномиальное время и делать односторонние, двусторонние ошибки или работать за полиномиальное время лишь в среднем случае. |
| | | |
− | == Основные определения ==
| |
| {{Определение | | {{Определение |
| |definition = | | |definition = |
Строка 23: |
Строка 22: |
| | | |
| <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>. |
− | }}
| |
− |
| |
− | == Вероятностные классы сложности ==
| |
− | {{Определение
| |
− | |definition =
| |
− | <tex>\mathrm{ZPP}</tex> (от ''zero-error probabilistic polynomial'') — множество языков <tex>L</tex>, для которых <tex>\exists p \forall x</tex>:
| |
− | # <tex>\operatorname{P}(p(x) \ne [x \in L]) = 0</tex>;<br>
| |
− | # <tex>\operatorname{E}[\operatorname{T}(p(x))] = poly(|x|)</tex>.<br>
| |
− | }}
| |
− | <tex>\mathrm{ZPP}</tex> — сложностный класс, такой что программы, удовлетворяющие его ограничениям, не могут делать ошибок, но работают за полиномиальное время только в среднем случае.
| |
− |
| |
− | Напомним, что математическое ожидание является усреднением по вероятностным лентам, а не по входу <tex>x</tex>.
| |
− |
| |
− | {{Определение
| |
− | |definition =
| |
− | <tex>\mathrm{RP}</tex> (от ''randomized polynomial'') — множество языков <tex>L</tex>, для которых <tex>\exists p \forall x</tex>:
| |
− | # <tex>x \notin L \Rightarrow \operatorname{P}(p(x) = 0) = 1</tex>;<br>
| |
− | # <tex>x \in L \Rightarrow \operatorname{P}(p(x) = 1) \ge 1/2</tex>;<br>
| |
− | # <tex>\forall r \operatorname{T}(p(x)) \le poly(|x|).</tex>
| |
− | }}
| |
− | <tex>\mathrm{RP}</tex> — сложностный класс, допускающий ошибки программ на словах из <tex>L</tex>.
| |
− | Заметим, что константа <tex>1/2</tex> в пункте 2 определения <tex>\mathrm{RP}</tex> может быть заменена на любую другую из промежутка <tex>(0, 1)</tex>, поскольку требуемой вероятности можно добиться множественным запуском программы.
| |
− |
| |
− | <tex>\mathrm{RP}</tex> можно рассматривать как вероятностный аналог класса <tex>\mathrm{NP}</tex>, предполагая, что вероятность угадать сертификат в случае его существования не менее <tex>1/2</tex>.
| |
− |
| |
− | {{Определение
| |
− | |definition =
| |
− | <tex>\mathrm{coRP} = \{L \bigm| \overline L \in \mathrm{RP}\}</tex>.
| |
− | }}
| |
− | Класс <tex>\mathrm{coRP}</tex> допускает ошибки программ на словах, не принадлежащих <tex>L</tex>.
| |
− |
| |
− | {{Определение
| |
− | |definition =
| |
− | <tex>\mathrm{BPP}</tex> (от ''bounded probabilistic polynomial'') — множество языков <tex>L</tex>, для которых <tex>\exists p \forall x</tex>:
| |
− | # <tex>\operatorname{P}(p(x) = [x \in L]) \ge 2/3</tex>;
| |
− | # <tex>\forall r \operatorname{T}(p(x)) \le poly(|x|)</tex>.
| |
− | }}
| |
− | <tex>\mathrm{BPP}</tex> — сложностный класс, допускающий двусторонние ошибки.
| |
− | Аналогично сделанному выше замечанию, константу <tex>2/3</tex> можно заменить на любое число из промежутка <tex>(1/2, 1)</tex>. Замена константы на <tex>1/2</tex> сделало бы данный класс равным <tex>\Sigma^*</tex> (программа, возвращающая результат функции ''random''(), подошла бы для любого языка).
| |
− |
| |
− | {{Определение
| |
− | |definition =
| |
− | <tex>\mathrm{PP}</tex> (от ''probabilistic polynomial'') — множество языков <tex>L</tex>, для которых <tex>\exists p \forall x</tex>:
| |
− | # <tex>\operatorname{P}(p(x) = [x \in L]) > 1/2</tex>;
| |
− | # <tex>\forall r \operatorname{T}(p(x)) \le poly(|x|)</tex>.
| |
− | }}
| |
− | <tex>\mathrm{PP}</tex> также допускает двусторонние ошибки, но является более широким по сравнению с <tex>\mathrm{BPP}</tex>.
| |
− |
| |
− | == Соотношение вероятностных классов ==
| |
− | {{Теорема
| |
− | |statement = <tex>\mathrm{P} \subset \mathrm{ZPP} = \mathrm{RP} \cap \mathrm{coRP}</tex>.
| |
− | |proof =
| |
− | Утверждение <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}_1</tex>.
| |
− | {{Определение
| |
− | |definition =
| |
− | <tex>\mathrm{ZPP}_1</tex> — множество языков <tex>L</tex>, для которых <tex>\exists p \forall x</tex>:
| |
− | # <tex>p(x) \in \{0, 1, ?\}</tex>;
| |
− | # <tex>p(x) \ne \enskip? \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>
| |
− | }}
| |
− | 1. Сначала докажем, что <tex>\mathrm{ZPP} = \mathrm{ZPP}_1</tex>.
| |
− |
| |
− | 1) <tex>\mathrm{ZPP} \subset \mathrm{ZPP}_1</tex>.
| |
− |
| |
− | Пусть <tex>X</tex> — случайная величина, равная времени работы программы <tex>p</tex> для <tex>\mathrm{ZPP}</tex>, <tex>X > 0</tex>. Запишем [http://ru.wikipedia.org/wiki/Неравенство_Маркова неравенство Маркова]:
| |
− |
| |
− | <tex>\operatorname{P}(X > k \operatorname{E}[X]) \le 1/k</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>.
| |
− | Будем запускать программу <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>.
| |
− |
| |
− | 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>.
| |
− |
| |
− | 2) <tex>\mathrm{ZPP}_1 \subset\mathrm{coRP}</tex>. Достаточно вместо <tex>?</tex> возвращать <tex>1</tex>.
| |
− |
| |
− | 3) <tex>\mathrm{ZPP}_1 \supset \mathrm{RP} \cap \mathrm{coRP}</tex>.
| |
− | Пусть программа <tex>p_1</tex> удовлетворяет ограничениям <tex>\mathrm{RP}</tex> и ошибается на словах из языка <tex>L</tex> с вероятностью не более <tex>1/2</tex>, а программа <tex>p_2</tex> удовлетворяет ограничениям <tex>\mathrm{coRP}</tex> и ошибается на словах не из языка <tex>L</tex> с аналогичной вероятностью. Построим программу <tex>q</tex> для <tex>\mathrm{ZPP}_1</tex>:
| |
− | q(x)
| |
− | '''if''' <tex>p_2</tex>(x) = 0
| |
− | '''return''' 0
| |
− | '''if''' <tex>p_1</tex>(x) = 1
| |
− | '''return''' 1
| |
− | '''return''' ?
| |
− |
| |
− | Вероятность вывести <tex>?</tex> есть <tex>\operatorname{P}(p_2(x) = 1, p_1(x) = 0) \le 1/2</tex>.
| |
− | }}
| |
− |
| |
− | {{Теорема
| |
− | |statement = <tex>\mathrm{RP} \subset \mathrm{NP} \subset \mathrm{PP} \subset \mathrm{PS}</tex>.
| |
− | |proof =
| |
− | 1. <tex>\mathrm{RP} \subset \mathrm{NP}</tex>. Если в программе для <tex>L \in \mathrm{RP}</tex> заменить все вызовы ''random''() на недетерминированный выбор, то получим программу для <tex>L</tex> с ограничениями <tex>\mathrm{NP}</tex>.
| |
− |
| |
− | 2. <tex>\mathrm{NP} \subset \mathrm{PP}</tex>. Приведем программу <tex>q</tex> с ограничениями класса <tex>\mathrm{PP}</tex>, которая разрешает <tex>L \in \mathrm{NP}</tex>. Пусть функция ''infair_coin''() моделирует нечестную монету, а именно возвращает единицу с вероятностью <tex>1/2 - \varepsilon</tex>, где <tex>\varepsilon</tex> мы определим позже, и ноль с вероятностью <tex>1/2 + \varepsilon</tex>. Пусть также <tex>V</tex> — верификатор сертификатов для <tex>L</tex>. Тогда <tex>q</tex> будет выглядеть следующим образом:
| |
− | q(x)
| |
− | c <- случайный сертификат (полиномиальной длины)
| |
− | '''if''' V(x, c)
| |
− | '''return''' 1
| |
− | '''return''' infair_coin()
| |
− | Необходимо удовлетворить условию <tex>\operatorname{P}(q(x) = [x \in L]) > 1/2</tex>.
| |
− |
| |
− | Пусть <tex>x \notin L</tex>. В этом случае <tex>V(x, c)</tex> вернет <tex>0</tex> и результат работы программы будет зависеть от нечестной монеты. Она вернет <tex>0</tex> с вероятностью <tex>1/2 + \varepsilon > 1/2</tex>.
| |
− |
| |
− | Пусть <tex>x \in L</tex>. Тогда [[Формула полной вероятности|по формуле полной вероятности]] <tex>\operatorname{P}(q(x) = 1) = p_0 + (1 - p_0) (1/2 - \varepsilon)</tex>, где <tex>p_0</tex> — вероятность угадать правильный сертификат. Заметим, что поскольку длина всех сертификатов ограничена некоторым полиномом <tex>s(n), n = |x|</tex> и существует хотя бы один правильный сертификат, <tex>p_0 \ge 2^{-s(n)}</tex>. Найдем <tex>\varepsilon</tex> из неравенства <tex>\operatorname{P}(q(x) = 1) > 1/2</tex>:
| |
− |
| |
− | <tex>p_0 + 1/2 - \varepsilon - p_0 / 2 + p_0 \varepsilon > 1/2</tex>;
| |
− |
| |
− | <tex>p_0 / 2 + (p_0 - 1)\varepsilon > 0</tex>;
| |
− |
| |
− | <tex>\varepsilon < \frac{p_0}{2 (1 - p_0)}</tex>.
| |
− |
| |
− | Достаточно взять <tex>\varepsilon \le p_0 / 2</tex>. Из сделанного выше замечания следует, что работу функции ''infair_coin''() можно смоделировать с помощью не более чем <tex>s(n) + 1</tex> вызовов ''random''(). Таким образом, мы построили программу <tex>q</tex>, удовлетворяющую ограничениям класса <tex>\mathrm{PP}</tex>.
| |
− |
| |
− | 3. <tex>\mathrm{PP} \subset \mathrm{PS}</tex>. Пусть <tex>p</tex> — программа для языка <tex>L \in \mathrm{PP}</tex>. Она используют не более чем полиномиальное количество вероятностных бит, так как сама работает за полиномиальное время. Тогда программа для <tex>\mathrm{PS}</tex> будет перебирать все участки вероятностных лент нужной полиномиальной длины и запускать на них <tex>p</tex>. Ответом будет <tex>0</tex> или <tex>1</tex> в зависимости от того, каких ответов <tex>p</tex> оказалось больше.
| |
− | }}
| |
− |
| |
− | {{Теорема
| |
− | |statement =
| |
− | <tex>\mathrm{RP} \cup \mathrm{coRP} \subset \mathrm{BPP}</tex>.
| |
− | |proof =
| |
− | Пусть <tex>p</tex> — программа для <tex>L \in \mathrm{RP}</tex>. Программу <tex>q</tex> для <tex>\mathrm{BPP}</tex> определим следующим образом:
| |
− | q(x)
| |
− | u <- p(x)
| |
− | v <- p(x)
| |
− | '''return''' u '''or''' v
| |
− | Пусть <tex>x \in L</tex>. В этом случае вероятность ошибки равна <tex>\operatorname{P}(u = 0, v = 0) = \operatorname{P}(u = 0) \cdot \operatorname{P}(v = 0) \le 1/4</tex>.
| |
− |
| |
− | Пусть <tex>x \notin L</tex>. Тогда с вероятностью <tex>1</tex> будет верно <tex>u = 0, v = 0</tex> и <tex>q</tex> вернет правильный ответ.
| |
− |
| |
− | Аналогично доказывается, что <tex>\mathrm{coRP} \subset \mathrm{BPP}</tex>.
| |
| }} | | }} |
| | | |
| == См. также == | | == См. также == |
− | * [[Теоремы о BPP, BPPweak и BPPstrong]] | + | * [[Классы RP и coRP]] |
− | * [[Уменьшение ошибки в классе RP]] | + | * [[Класс ZPP]] |
− | * [[Теорема Лаутемана]] | + | * [[Класс BPP]] |
| | | |
| == Литература == | | == Литература == |
| * [http://www.cs.princeton.edu/theory/complexity/ Sanjeev Arora, Boaz Barak. Computational Complexity: A Modern Approach] | | * [http://www.cs.princeton.edu/theory/complexity/ Sanjeev Arora, Boaz Barak. Computational Complexity: A Modern Approach] |