В теории вычислительной сложности класс сложности #P (произносится как «sharp P» или иногда «number P» или «hash P») — это множество задач подсчёта , связанных с задачами принятия решений в множестве NP . Более формально, #P — это класс функциональных задач вида «вычислить f ( x )», где f — это число принимающих путей недетерминированной машины Тьюринга, работающей за полиномиальное время . В отличие от большинства известных классов сложности, это не класс задач принятия решений , а класс функциональных задач . Наиболее сложными, представительными задачами этого класса являются #P-полные .
Проблема принятия решений NP часто имеет вид «Существуют ли решения, удовлетворяющие определенным ограничениям?» Например:
Соответствующие задачи функции #P спрашивают «сколько», а не «есть ли какие-нибудь». Например:
Очевидно, что задача #P должна быть по крайней мере такой же сложной, как соответствующая задача NP . Если легко подсчитать ответы, то должно быть легко сказать, есть ли вообще какие-либо ответы — просто подсчитайте их и посмотрите, больше ли их количество нуля. Некоторые из этих задач, такие как поиск корня , достаточно просты, чтобы быть в FP , в то время как другие являются #P-полными .
Одним из следствий теоремы Тоды является то, что полиномиальная машина с оракулом #P ( P #P ) может решить все проблемы в PH , всю полиномиальную иерархию . Фактически, полиномиальной машине нужно сделать только один запрос #P , чтобы решить любую проблему в PH . Это указывает на крайнюю сложность точного решения #P -полных проблем.
Удивительно, но некоторые проблемы #P , которые считаются сложными, соответствуют легким (например, линейно-временным) проблемам P. Для получения дополнительной информации об этом см. #P-complete .
Ближайший класс задач принятия решений к #P — это PP , который спрашивает, принимает ли большинство (более половины) путей вычисления. Это находит наиболее значимый бит в ответе задачи #P . Класс задач принятия решений ⊕P (произносится как «Четность-P») вместо этого спрашивает наименее значимый бит ответа #P .
#P формально определяется следующим образом:
#P также может быть эквивалентно определен в терминах верификатора. Проблема принятия решений находится в NP , если существует проверяемый за полиномиальное время сертификат для данного экземпляра проблемы — то есть NP спрашивает, существует ли доказательство членства для входных данных, которое может быть проверено на корректность за полиномиальное время. Класс #P спрашивает, сколько сертификатов существует для экземпляра проблемы, которое может быть проверено на корректность за полиномиальное время. [1] В этом контексте #P определяется следующим образом:
Класс сложности #P был впервые определен Лесли Валиантом в статье 1979 года о вычислении перманента квадратной матрицы , в которой он доказал, что перманент является #P-полным . [3]
Ларри Стокмейер доказал, что для каждой проблемы #P существует рандомизированный алгоритм , использующий оракул для SAT, который при наличии экземпляра и возвращает с высокой вероятностью число, такое что . [4] Время выполнения алгоритма является полиномиальным по и . Алгоритм основан на лемме об остаточном хэше .