Сложность вычислений
BPP, RP, ZPP: рандомизированные алгоритмы
1977 год. Михаэль Рабин публикует тест простоты. Рандомизированный алгоритм проверяет 1024-битное RSA-число за 10 миллисекунд с вероятностью ошибки меньше $2^{-128}$. Детерминированный алгоритм с той же гарантией потребовал бы времени, превышающего возраст Вселенной. Каждый раз, когда браузер устанавливает HTTPS-соединение - где-то выполняется этот тест. Рандомизация - не костыль. Это отдельный вычислительный класс с собственной теорией.
- Miller-Rabin в OpenSSL и BoringSSL: генерация RSA-ключей при каждом TLS-handshake
- Randomized quicksort в C++ STL, Python, Java - ожидаемое O(n log n) без деградации на sorted input
- Monte Carlo Tree Search в AlphaGo/AlphaZero: случайные rollouts для оценки миллионов позиций
- Randomized SVD в scikit-learn: PCA на матрицах 10^6 x 10^4 за секунды вместо часов
- Bloom filter в Redis, Cassandra, Chrome Safe Browsing: вероятностная структура в духе RP
Monte Carlo vs Las Vegas: два разных компромисса
1977 год. Гэри Миллер предлагает тест простоты числа, основанный на гипотезе Римана. Михаэль Рабин убирает гипотезу и делает тест рандомизированным. Результат: проверка 1024-битного RSA-числа за 10 миллисекунд с вероятностью ошибки менее $2^{-128}$. Детерминированный алгоритм с той же гарантией потребовал бы времени, сравнимого с возрастом Вселенной. Каждый HTTPS-handshake в интернете работает на этом компромиссе.
Рандомизированные алгоритмы бросают монету в процессе работы. Это не просто оптимизация - это другая вычислительная модель. Машина Тьюринга получает дополнительную ленту со случайными битами и может читать их в любой момент. Два принципиально разных подхода к ошибке разделяют мир рандомизированных алгоритмов.
- Monte Carlo — Всегда останавливается за полиномиальное время. Может ошибиться - с ограниченной вероятностью. Пример: тест Миллера-Рабина.
- Las Vegas — Никогда не ошибается. Время работы - случайная величина (ожидаемое полиномиальное). Пример: randomized quicksort, поиск простого числа.
Randomized quicksort - классический Las Vegas. Выбор пивота случаен, но сортировка всегда правильная. Ожидаемое время $O(n \log n)$, наихудший случай $O(n^2)$ - но он случается с вероятностью $2^{-n}$ при случайном выборе. В стандартной библиотеке C++, Python, Java - именно этот вариант.
Monte Carlo Tree Search в AlphaGo - другой архетип. Случайные rollouts оценивают позиции: алгоритм смотрит на тысячи случайных концовок партии и усредняет. Никакой гарантии оптимальности хода, но статистика сходится. Именно этим AlphaGo в 2016 году обыграл Ли Седоля - детерминированный минимакс не справился бы с разветвлённостью дерева го.
**Усиление уверенности (amplification):** порог ошибки 1/3 в BPP - произвольная константа. Запустить алгоритм $k$ раз, взять большинство голосов - вероятность ошибки падает до $2^{-\Omega(k)}$. За 100 запусков ошибка становится $\approx 2^{-100}$. Это бесплатно по порядку роста сложности.
Алгоритм A всегда даёт правильный ответ, но иногда говорит 'не знаю'. Алгоритм B всегда отвечает, но с вероятностью 0.1 ошибается. Какой из них Las Vegas?
BPP, RP, coRP, ZPP: таксономия вероятностных классов
Четыре основных вероятностных класса выстраиваются по типу допустимой ошибки. Самый жёсткий - **ZPP** (Zero-error Probabilistic Polynomial time): алгоритм всегда правильный, ожидаемое время полиномиальное. ZPP = RP $\cap$ coRP - красивый факт, доказываемый в три строки.
**RP** (Randomized Polynomial time) допускает одностороннюю ошибку: если $x \in L$ - алгоритм говорит YES с вероятностью $\geq 1/2$; если $x \notin L$ - говорит NO гарантированно. Ложного срабатывания на NO нет.
**coRP** - симметрично: YES-входы определяются точно, NO-входы - с вероятностью $\geq 1/2$. Тест Миллера-Рабина лежит в coRP: простые числа он называет простыми гарантированно, составные - с вероятностью $\geq 3/4$. **BPP** - самый мягкий: двусторонняя ошибка $\leq 1/3$ на любом входе.
**ZPP = RP ∩ coRP:** если есть RP-алгоритм для L и coRP-алгоритм для дополнения L, запускать их поочерёдно. Когда один даёт точный ответ - остановиться. Ожидаемое время полиномиальное, ошибок нет. Это и есть ZPP.
Включение RP $\subseteq$ NP - прямое: недетерминированная машина угадывает случайные биты, которые привели к YES. Обратное неизвестно. P $\subseteq$ ZPP $\subseteq$ RP $\subseteq$ BPP - цепочка включений, ни одно из которых не доказано строгим. Это центральный открытый вопрос дерандомизации.
Алгоритм для задачи L: если $x \in L$ - всегда отвечает YES. Если $x \notin L$ - отвечает NO с вероятностью $\geq 2/3$. К какому классу относится этот алгоритм?
Дерандомизация: можно ли убрать монетку?
Центральная гипотеза: **BPP = P**. Если это правда, случайность ничего не даёт - любой рандомизированный алгоритм можно симулировать детерминированным за полиномиальное время. Если неправда - существуют задачи, где монетка принципиально ускоряет вычисление. Ответа нет ни в ту, ни в другую сторону.
Теорема Адлемана (1978): BPP $\subseteq$ P/poly. Для каждой длины входа $n$ существует 'подсказка' (advice) полиномиального размера, с которой задача решается детерминированно. Проблема: advice зависит от $n$ и не вычислима эффективно. P/poly содержит неразрешимые задачи - это не полиномиальное время в обычном смысле.
**Псевдослучайные генераторы (PRG)** - главный инструмент дерандомизации. PRG растягивает короткое зерно (seed) длины $O(\log n)$ в строку длины $n$, неотличимую от истинно случайной для любого алгоритма ограниченного размера. Перебрать все $2^{O(\log n)} = \text{poly}(n)$ зёрен детерминированно - полиномиальное время.
Теорема Импальяццо-Вигдерсона (1997): если существуют функции, вычислимые за $2^{O(n)}$ времени, но требующие схем размера $2^{\Omega(n)}$ - тогда BPP = P. Иначе: если 'сложные' функции существуют, из них строится PRG и дерандомизация работает. Это переводит BPP = P в вопрос о circuit lower bounds - такой же открытый.
В ML рандомизация повсюду - и её тоже дерандомизируют. Dropout во время инференса заменяется масштабированием весов (детерминированная аппроксимация Monte Carlo оценки матожидания). Randomized SVD в scikit-learn использует PRG с фиксированным seed для воспроизводимости. Mini-batch SGD рандомизирован, но порядок батчей фиксируют через `torch.manual_seed` - частичная дерандомизация ради воспроизводимости экспериментов.
Алгоритм AKS (Агравал-Каял-Саксена, 2002) - историческая точка: PRIMES $\in$ P. Первый детерминированный полиномиальный тест простоты. Он дерандомизировал Миллера-Рабина. На практике AKS медленнее рандомизированного варианта - полиномиальность не гарантирует быстроты. Miller-Rabin с 128 итерациями остаётся стандартом в OpenSSL, BoringSSL, LibreSSL.
**Криптографический контрапункт:** если BPP = P и PRG существуют - это предполагает существование односторонних функций, на которых держится криптография с открытым ключом. Теория сложности и криптография переплетены глубже, чем кажется: открытый вопрос о BPP - это одновременно вопрос о безопасности RSA.
PRG растягивает зерно длины $O(\log n)$ в строку длины $n$. Почему это помогает дерандомизировать BPP-алгоритм?
Связанные темы
Вероятностные классы сложности стыкуются с теорией вероятностей, криптографией и автоматами
- P vs NP — BPP и RP - промежуточные классы между P и NP; дерандомизационная гипотеза BPP=P
- Теорема Байеса — Amplification вероятности ошибки - тот же итеративный байес-апдейт
- Circuit Complexity — BPP ⊆ P/poly - связь с нерандомизированными схемами полиномиального размера
- Криптография — PRG <-> односторонние функции: BPP=P эквивалентно существованию OWF
Итоги
- BPP - задачи с двусторонней ошибкой <= 1/3; amplification снижает ошибку до 2^{-k} за k запусков
- RP - односторонняя ошибка (только на YES-входах); coRP - симметрично; ZPP = RP ∩ coRP (Las Vegas)
- P ⊆ ZPP ⊆ RP ⊆ BPP; RP ⊆ NP; ни одно включение не доказано строгим
- Дерандомизационная гипотеза BPP=P - эквивалентна PRG из функций с экспоненциальной схемной сложностью
- AKS 2002: PRIMES ∈ P - дерандомизация Миллера-Рабина; на практике медленнее рандомизированного варианта
Вопросы для размышления
- Если BPP = P доказано - что это означает для криптографии с открытым ключом? Должны ли существовать односторонние функции в этом мире, и где тогда проходит граница между 'случайным' и 'псевдослучайным' с точки зрения вычислений?
Связанные уроки
- cplx-05 — L/NL как фундамент понимания вычислительных ресурсов
- cplx-01 — P и NP - базовые классы, от которых отталкиваются BPP и RP
- prob-04-bayes — Байес-апдейт - снижение неопределённости через итерации
- alg-01-big-o — Вероятностный анализ строится поверх O-нотации
- fl-05-regex — Недетерминизм в автоматах - структурный аналог рандомизации