Введение

Класс сложности #P-полные задачи (произносится "шарп P-полные" или "число P-полные") образует класс сложности в теории вычислительной сложности. Задачи в этом классе сложности определяются двумя свойствами: задача принадлежит классу #P, который состоит из задач, определяемых как подсчет числа допустимых путей недетерминированной машины Тьюринга, работающей за полиномиальное время. Задача является #P-трудной, что означает, что любая другая задача из #P имеет полиномиальное время сведения Тьюринга или сведения подсчетом к ней. Сведение подсчетом – это пара полиномиальных преобразований: из входных данных другой задачи в входные данные данной задачи и из выходных данных данной задачи в выходные данные другой задачи, позволяющее решить другую задачу, используя любой подпрограммный модуль для данной задачи. Сведение Тьюринга – это алгоритм для другой задачи, который делает полиномиальное число вызовов подпрограммного модуля для данной задачи и, помимо этих вызовов, использует полиномиальное время. В некоторых случаях используются экономные сведения – более специфичный тип сведения, сохраняющий точное количество решений. #P-полные задачи не проще, чем NP-полные задачи. Алгоритм, решающий #P-полную задачу за полиномиальное время (если бы он существовал), решил бы проблему P против NP, подразумевая, что P = NP. Такого алгоритма не известно, и доказательства его несуществования также не известны.

Легкие проблемы с версиями с жестким подсчетом

Некоторые #P-полные задачи соответствуют простым (вычислимым за полиномиальное время) задачам. Определение выполнимости булевой формулы в ДНФ легко: такая формула выполнима тогда и только тогда, когда она содержит выполнимую конъюнкцию (не содержащую переменную и её отрицание). В то же время, подсчёт количества выполнимых назначений является #P-полной задачей. Более того, определение 2-выполнимости проще, чем подсчёт количества выполнимых назначений. Топологическая сортировка проста, в отличие от подсчёта количества топологических сортировок. Единственное совершенное паросочетание можно найти за полиномиальное время, но подсчёт всех совершенных паросочетаний является #P-полной задачей. Задача подсчёта совершенных паросочетаний была первой задачей подсчёта, соответствующей простой задаче P, показанной как #P-полная, в статье Лесли Валианта 1979 года, в которой также впервые были определены класс #P и #P-полные задачи.

Приближение

Существуют вероятностные алгоритмы, которые с высокой вероятностью возвращают хорошие приближения для некоторых #P-полных задач. Это одна из демонстраций возможностей вероятностных алгоритмов. Для многих #P-полных задач существует полностью полиномиальная схема рандомизированного приближения во времени, или "FPRAS", которая, по сути, с высокой вероятностью выдает приближение с заданной степенью точности за время, полиномиальное как относительно размера задачи, так и относительно требуемой степени точности. Jerrum, Valiant и Vazirani показали, что каждая #P-полная задача либо имеет FPRAS, либо принципиально не поддается приближению; если существует полиномиальный алгоритм, который последовательно находит приближение #P-полной задачи, отличающееся от точного решения на величину, полиномиальную относительно размера входных данных, то этот алгоритм можно использовать для построения FPRAS.