Сложность вычислений
Circuit Complexity
Процессор - это булева схема. Каждый такт - новый слой вентилей. Вопрос: какие задачи принципиально требуют последовательных шагов, и какие можно «распараллелить до нуля»? Circuit Complexity даёт язык для этих вопросов - и первые доказанные ответы.
- **GPU-вычисления:** матричное умножение в NC^2 - именно поэтому GPU с тысячами ядер даёт 100x ускорение на нейросетях
- **Аппаратная верификация:** схемная сложность используется для доказательства нижних границ в дизайне чипов
- **Криптография:** доказательство PARITY ∉ AC^0 - метод случайных ограничений - стало основой для атак на псевдослучайные генераторы
Boolean Circuits и размер
Процессор внутри - это сеть логических вентилей. Каждый вентиль принимает 1-2 бита, применяет AND/OR/NOT, отдаёт 1 бит. **Булева схема (Boolean circuit)** - именно такая сеть: ориентированный ациклический граф, где листья - входные биты, внутренние узлы - вентили, один выход - результат вычисления.
Ключевое отличие схем от машин Тьюринга: схема **фиксированного размера** работает только на входах фиксированной длины n. Для каждого n нужна своя схема C_n. Семейство {C_n} задаёт язык: x ∈ L тогда и только тогда, когда C_{|x|}(x) = 1.
**Размер (size)** схемы - аналог времени машины Тьюринга. **Глубина (depth)** - аналог параллельного времени: шаги, которые нельзя распараллелить.
Схема глубины d работает на входе длины n. Что означает глубина d в физическом смысле?
NC: параллельные вычисления
1979 год. Ник Пиппенгер задал вопрос: какие задачи можно решить **быстро параллельно**? Не просто «есть алгоритм», а «можно залить миллионом процессоров и получить ответ почти мгновенно». Так родился класс **NC** (Nick's Class).
Задача лежит в NC^k, если для неё существует семейство схем полиномиального размера size(n) = poly(n) и глубины depth(n) = O(log^k n). Глубина logарифмическая - это значит даже при n = миллиард, цепочка зависимостей содержит лишь ~30^k последовательных шагов.
**NC vs P:** NC ⊆ P, но неизвестно, NC = P или NC ⊊ P. Если NC ≠ P, то P-complete задачи принципиально «последовательные» - никакой параллелизм им не поможет.
Умножение n×n матриц лежит в NC^2. Что это означает на практике?
AC-иерархия
NC использует вентили с двумя входами (fan-in 2). Что если разрешить вентили с **неограниченным** количеством входов? Один OR-вентиль сразу над всеми входами - это мощнее. Так появляется класс **AC**: схемы с неограниченным fan-in и полиномиальным размером.
AC^k - семейство схем полиномиального размера и глубины O(log^k n), но вентили AND/OR принимают произвольно много входов. AC^0 - глубина O(1), то есть константная! Всего несколько слоёв вентилей, как бы ни рос вход.
**Razborov-Smolensky (1987):** MAJORITY ∉ AC^0 - тоже доказано! Нельзя посчитать большинство голосов схемой константной глубины, сколько бы широких вентилей не использовалось.
Почему результат 'PARITY ∉ AC^0' считается прорывом в теории сложности?
P/poly и advice
Семейство схем {C_n} может быть **несчислимым**: нет алгоритма, строящего C_n по n. Это открывает класс **P/poly** - задачи, решаемые полиномиальными схемами без ограничений на их вычислимость. Формально: машина Тьюринга с дополнительной подсказкой (advice) длины poly(n) для каждого n.
Advice a_n - строка длины poly(n), зависящая только от длины входа n, но не от самого входа. Машина M с advice решает язык L, если для каждого n существует a_n такое, что M(x, a_n) = 1 ⟺ x ∈ L для всех |x| = n.
**Почему P/poly не 'решает' NP:** advice нужно заранее знать - это как список ответов для конкретной длины входа. В реальности advice нельзя вычислить, если задача NP-трудна.
Чем P/poly отличается от P?
Circuit Complexity
- Булева схема - DAG из вентилей AND/OR/NOT; size = число вентилей, depth = параллельное время
- NC^k = poly-size, O(log^k n) глубина с fan-in 2; NC ⊆ P, равенство неизвестно
- AC^k = то же, но неограниченный fan-in; PARITY ∉ AC^0 - первое нижнее ограничение (1984)
- P/poly = полиномиальные схемы + несчислимые семейства; содержит неразрешимые языки
- Karp-Lipton: NP ⊆ P/poly влечёт схлопывание PH
Связанные темы
Circuit Complexity соединяет параллельные вычисления, нижние оценки и вопрос P vs NP.
- Пространственная сложность — PSPACE и схемы - параллели между пространством и глубиной
- Рандомизированные алгоритмы — BPP ⊆ P/poly - рандомизация схлопывается в advice
- Communication Complexity — Нижние оценки через коммуникацию применяются и к схемам
Вопросы для размышления
- Почему глубина схемы является мерой параллельной сложности, а не размер?
- Что означает для практических вычислений тот факт, что Circuit Value Problem является P-complete?
- Если NP ⊆ P/poly, что это говорит о возможности аппаратного ускорения NP-задач?