<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Veda</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Veda"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Veda"/>
		<updated>2026-06-11T16:46:38Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60734</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60734"/>
				<updated>2017-05-04T19:34:41Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры #P-Complete задач */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;  класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для '''недетерминированной''' МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время '''недетерминированная''' машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\mathrm{FP}&amp;lt;/tex&amp;gt; {{---}} класс задач подсчета, разрешимых на '''детерминированной''' машине Тьюринга за полиномиальное время, то есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время '''детерминированная''' машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Подсчет числа сертификатов как минимум столь же сложен, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Также можно заметить, что если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[Sharp SAT|#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:cycle_block.png|thumb|300px|Блок H]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n \cdot \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что, если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{mn} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} \cdot n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как &amp;lt;tex&amp;gt;HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt; и любая проблема из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; может быть сведена к ней за полиномиальное время.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P-&amp;lt;/tex&amp;gt;полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-Complete задач ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество удовлетворяющих назначений для заданной в ДНФ формулы. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Задача нахождения перманента &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления перманента недетерминированно выбирается перестановка из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой такой перестановки вычисляется произведение соответствующих элементов матрицы, полученные значения складываются. Время работы такого алгоритма на недетерминированной машине Тьюринга {{---}} &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;. Для этого будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1 \ldots \, x_n\}, \,  \{x_i, x_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Таким образом, нашей целью будет построение некоторого графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, матрицей смежности которого будет &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Для этого по данной 3-КНФ формуле построим ориентированный граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Назовем покрытием ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами. Далее покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;, а любое другое назначение не будет вносить вклад. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков. (Все ребра, для которых на схеме не указан вес, имеют вес &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.) &lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; данной переменной. Присвоение &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; соответствует покрытию, включающему ребра-петли и ребро &amp;lt;tex&amp;gt;``false&amp;quot;&amp;lt;/tex&amp;gt;. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует  единственное покрытие и его вес равен &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного блока - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме.  Представим, что мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; в некотором графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt;. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в 3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;, достаточно посчитать перманент матрицы смежности графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. А значит задача подсчета числа совершенных паросочетаний в двудольном графе эквивалентна задаче вычисления перманента &amp;lt;tex&amp;gt;\{0,1\}-&amp;lt;/tex&amp;gt;матрицы и также является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
*[http://theory.cs.princeton.edu/complexity/book.pdf Christos H. Papadimitriou. Computational Complexity. c. 172-179]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Counting_problem_(complexity) Counting problem]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P Sharp-P ]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-complete Sharp-P-complete]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-completeness_of_01-permanent Sharp-P-completeness of 01-permanent]&lt;br /&gt;
*[https://shaih.github.io/pubs/01perm.pdf Zero One Permanent is  #P-Complete,  A Simpler Proof]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Класс P]]&lt;br /&gt;
*[[Классы NP, coNP, Σ₁, Π₁]]&lt;br /&gt;
*[[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60733</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60733"/>
				<updated>2017-05-04T19:33:25Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры #P-Complete задач */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;  класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для '''недетерминированной''' МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время '''недетерминированная''' машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\mathrm{FP}&amp;lt;/tex&amp;gt; {{---}} класс задач подсчета, разрешимых на '''детерминированной''' машине Тьюринга за полиномиальное время, то есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время '''детерминированная''' машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Подсчет числа сертификатов как минимум столь же сложен, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Также можно заметить, что если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[Sharp SAT|#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:cycle_block.png|thumb|300px|Блок H]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n \cdot \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что, если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{mn} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} \cdot n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как &amp;lt;tex&amp;gt;HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt; и любая проблема из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; может быть сведена к ней за полиномиальное время.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P-&amp;lt;/tex&amp;gt;полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-Complete задач ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество удовлетворяющих назначений для заданной в ДНФ формулы. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Задача нахождения перманента &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления перманента недетерминированно выбирается перестановка из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой такой перестановки вычисляется произведение соответствующих элементов матрицы, полученные значения складываются. Время работы такого алгоритма на недетерминированной машине Тьюринга {{---}} &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;. Для этого будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1 \ldots \, x_n\}, \,  \{x_i, x_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Таким образом, нашей целью будет построение некоторого графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, матрицей смежности которого будет &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Для этого по данной 3-КНФ формуле построим ориентированный граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Назовем покрытием ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами. Далее покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;, а любое другое назначение не будет вносить вклад. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков. (Все ребра, для которых на схеме не указан вес, имеют вес &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.) &lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; данной переменной. Присвоение &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; соответствует покрытию, включающему ребра-петли и ребро &amp;lt;tex&amp;gt;``false&amp;quot;&amp;lt;/tex&amp;gt;. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует  единственное покрытие и его вес равен &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного блока - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме.  Представим, что мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; в некотором графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt;. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в 3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;, достаточно посчитать перманент матрицы смежности графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. А значит задача подсчета числа совершенных паросочетаний в двудольном графе эквивалентна задаче вычисления перманента &amp;lt;tex&amp;gt;\{0,1\}-&amp;lt;/tex&amp;gt;матрицы и также является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
*[http://theory.cs.princeton.edu/complexity/book.pdf Christos H. Papadimitriou. Computational Complexity. c. 172-179]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Counting_problem_(complexity) Counting problem]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P Sharp-P ]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-complete Sharp-P-complete]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-completeness_of_01-permanent Sharp-P-completeness of 01-permanent]&lt;br /&gt;
*[https://shaih.github.io/pubs/01perm.pdf Zero One Permanent is  #P-Complete,  A Simpler Proof]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Класс P]]&lt;br /&gt;
*[[Классы NP, coNP, Σ₁, Π₁]]&lt;br /&gt;
*[[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60732</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60732"/>
				<updated>2017-05-04T19:31:27Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры #P-Complete задач */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;  класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для '''недетерминированной''' МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время '''недетерминированная''' машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\mathrm{FP}&amp;lt;/tex&amp;gt; {{---}} класс задач подсчета, разрешимых на '''детерминированной''' машине Тьюринга за полиномиальное время, то есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время '''детерминированная''' машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Подсчет числа сертификатов как минимум столь же сложен, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Также можно заметить, что если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[Sharp SAT|#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:cycle_block.png|thumb|300px|Блок H]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n \cdot \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что, если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{mn} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} \cdot n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как &amp;lt;tex&amp;gt;HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt; и любая проблема из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; может быть сведена к ней за полиномиальное время.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P-&amp;lt;/tex&amp;gt;полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-Complete задач ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество удовлетворяющих назначений для заданной в ДНФ формулы. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Задача нахождения перманента &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления перманента недетерминированно выбирается перестановка из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой такой перестановки вычисляется произведение соответствующих элементов матрицы, полученные значения складываются. Время работы такого алгоритма на недетерминированной машине Тьюринга {{---}} &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;. Для этого будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1 \ldots \, x_n\}, \,  \{x_i, x_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Таким образом, нашей целью будет построение некоторого графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, матрицей смежности которого будет &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Для этого по данной 3-КНФ формуле построим ориентированный граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Назовем покрытием ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами. Далее покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;, а остальные не будут вносить вклад. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков. (Все ребра, для которых на схеме не указан вес, имеют вес &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.) &lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; данной переменной. Присвоение &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; соответствует покрытию, включающему ребра-петли и ребро &amp;lt;tex&amp;gt;``false&amp;quot;&amp;lt;/tex&amp;gt;. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует  единственное покрытие и его вес равен &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного блока - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме.  Представим, что мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; в некотором графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt;. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в 3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;, достаточно посчитать перманент матрицы смежности графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. А значит задача подсчета числа совершенных паросочетаний в двудольном графе эквивалентна задаче вычисления перманента &amp;lt;tex&amp;gt;\{0,1\}-&amp;lt;/tex&amp;gt;матрицы и также является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
*[http://theory.cs.princeton.edu/complexity/book.pdf Christos H. Papadimitriou. Computational Complexity. c. 172-179]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Counting_problem_(complexity) Counting problem]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P Sharp-P ]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-complete Sharp-P-complete]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-completeness_of_01-permanent Sharp-P-completeness of 01-permanent]&lt;br /&gt;
*[https://shaih.github.io/pubs/01perm.pdf Zero One Permanent is  #P-Complete,  A Simpler Proof]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Класс P]]&lt;br /&gt;
*[[Классы NP, coNP, Σ₁, Π₁]]&lt;br /&gt;
*[[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60731</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60731"/>
				<updated>2017-05-04T19:26:32Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры задач из #P */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;  класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для '''недетерминированной''' МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время '''недетерминированная''' машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\mathrm{FP}&amp;lt;/tex&amp;gt; {{---}} класс задач подсчета, разрешимых на '''детерминированной''' машине Тьюринга за полиномиальное время, то есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время '''детерминированная''' машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Подсчет числа сертификатов как минимум столь же сложен, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Также можно заметить, что если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[Sharp SAT|#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:cycle_block.png|thumb|300px|Блок H]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n \cdot \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что, если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{mn} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} \cdot n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как &amp;lt;tex&amp;gt;HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt; и любая проблема из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; может быть сведена к ней за полиномиальное время.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P-&amp;lt;/tex&amp;gt;полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-Complete задач ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество удовлетворяющих назначений для заданной в ДНФ формулы. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Задача нахождения перманента &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления перманента недетерминированно выбирается перестановка из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой такой перестановки вычисляется произведение соответствующих элементов матрицы, полученные значения складываются. Время работы такого алгоритма на недетерминированной машине Тьюринга {{---}} &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;. Для этого будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1 \ldots \, x_n\}, \,  \{x_i, x_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Таким образом, нашей целью будет построение некоторого графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, матрицей смежности которого будет &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Для этого по данной 3-КНФ формуле построим ориентированный граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Назовем покрытием ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами. Далее покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;, а остальные не будут вносить вклад. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков. (Все ребра, для которых на схеме не указан вес, имеют вес &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.) &lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; данной переменной. Присвоение &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; соответствует покрытию, включающему ребра-петли и ребро &amp;lt;tex&amp;gt;``false&amp;quot;&amp;lt;/tex&amp;gt;. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует  единственное покрытие и его вес равен &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного блока - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме.  Представим, что мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; в некотором графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt;. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в 3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. А значит задача подсчета числа совершенных паросочетаний в двудольном графе эквивалентна задаче вычисления перманента &amp;lt;tex&amp;gt;\{0,1\}-&amp;lt;/tex&amp;gt;матрицы и также является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
*[http://theory.cs.princeton.edu/complexity/book.pdf Christos H. Papadimitriou. Computational Complexity. c. 172-179]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Counting_problem_(complexity) Counting problem]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P Sharp-P ]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-complete Sharp-P-complete]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-completeness_of_01-permanent Sharp-P-completeness of 01-permanent]&lt;br /&gt;
*[https://shaih.github.io/pubs/01perm.pdf Zero One Permanent is  #P-Complete,  A Simpler Proof]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Класс P]]&lt;br /&gt;
*[[Классы NP, coNP, Σ₁, Π₁]]&lt;br /&gt;
*[[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60730</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60730"/>
				<updated>2017-05-02T09:25:06Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры #P-Complete задач */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;  класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для '''недетерминированной''' МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время '''недетерминированная''' машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\mathrm{FP}&amp;lt;/tex&amp;gt; {{---}} класс задач подсчета, разрешимых на '''детерминированной''' машине Тьюринга за полиномиальное время, то есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время '''детерминированная''' машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Подсчет числа сертификатов как минимум столь же сложен, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Также можно заметить, что если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[Sharp SAT|#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:cycle_block.png|thumb|300px|Блок XOR]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n \cdot \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что, если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{mn} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} \cdot n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как &amp;lt;tex&amp;gt;HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt; и любая проблема из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; может быть сведена к ней за полиномиальное время.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P-&amp;lt;/tex&amp;gt;полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-Complete задач ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество удовлетворяющих назначений для заданной в ДНФ формулы. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Задача нахождения перманента &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления перманента недетерминированно выбирается перестановка из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой такой перестановки вычисляется произведение соответствующих элементов матрицы, полученные значения складываются. Время работы такого алгоритма на недетерминированной машине Тьюринга {{---}} &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;. Для этого будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1 \ldots \, x_n\}, \,  \{x_i, x_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Таким образом, нашей целью будет построение некоторого графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, матрицей смежности которого будет &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Для этого по данной 3-КНФ формуле построим ориентированный граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Назовем покрытием ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами. Далее покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;, а остальные не будут вносить вклад. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков. (Все ребра, для которых на схеме не указан вес, имеют вес &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.) &lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; данной переменной. Присвоение &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; соответствует покрытию, включающему ребра-петли и ребро &amp;lt;tex&amp;gt;``false&amp;quot;&amp;lt;/tex&amp;gt;. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует  единственное покрытие и его вес равен &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного блока - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме.  Представим, что мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; в некотором графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt;. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в 3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. А значит задача подсчета числа совершенных паросочетаний в двудольном графе эквивалентна задаче вычисления перманента &amp;lt;tex&amp;gt;\{0,1\}-&amp;lt;/tex&amp;gt;матрицы и также является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
*[http://theory.cs.princeton.edu/complexity/book.pdf Christos H. Papadimitriou. Computational Complexity. c. 172-179]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Counting_problem_(complexity) Counting problem]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P Sharp-P ]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-complete Sharp-P-complete]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-completeness_of_01-permanent Sharp-P-completeness of 01-permanent]&lt;br /&gt;
*[https://shaih.github.io/pubs/01perm.pdf Zero One Permanent is  #P-Complete,  A Simpler Proof]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Класс P]]&lt;br /&gt;
*[[Классы NP, coNP, Σ₁, Π₁]]&lt;br /&gt;
*[[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60729</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60729"/>
				<updated>2017-05-02T09:16:01Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Класс #P */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;  класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для '''недетерминированной''' МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время '''недетерминированная''' машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\mathrm{FP}&amp;lt;/tex&amp;gt; {{---}} класс задач подсчета, разрешимых на '''детерминированной''' машине Тьюринга за полиномиальное время, то есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время '''детерминированная''' машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Подсчет числа сертификатов как минимум столь же сложен, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Также можно заметить, что если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[Sharp SAT|#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:cycle_block.png|thumb|300px|Блок XOR]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n \cdot \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что, если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{mn} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} \cdot n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как &amp;lt;tex&amp;gt;HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt; и любая проблема из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; может быть сведена к ней за полиномиальное время.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P-&amp;lt;/tex&amp;gt;полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-Complete задач ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Задача нахождения перманента &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления перманента недетерминированно выбирается перестановка из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой такой перестановки вычисляется произведение соответствующих элементов матрицы, полученные значения складываются. Время работы такого алгоритма на недетерминированной машине Тьюринга {{---}} &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;. Для этого будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1 \ldots \, x_n\}, \,  \{x_i, x_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Таким образом, нашей целью будет построение некоторого графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, матрицей смежности которого будет &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Для этого по данной 3-КНФ формуле построим ориентированный граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Назовем покрытием ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами. Далее покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;, а остальные не будут вносить вклад. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков. (Все ребра, для которых на схеме не указан вес, имеют вес &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.) &lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; данной переменной. Присвоение &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; соответствует покрытию, включающему ребра-петли и ребро &amp;lt;tex&amp;gt;``false&amp;quot;&amp;lt;/tex&amp;gt;. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует  единственное покрытие и его вес равен &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного блока - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме.  Представим, что мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; в некотором графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt;. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в 3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. А значит задача подсчета числа совершенных паросочетаний в двудольном графе эквивалентна задаче вычисления перманента &amp;lt;tex&amp;gt;\{0,1\}-&amp;lt;/tex&amp;gt;матрицы и также является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
*[http://theory.cs.princeton.edu/complexity/book.pdf Christos H. Papadimitriou. Computational Complexity. c. 172-179]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Counting_problem_(complexity) Counting problem]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P Sharp-P ]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-complete Sharp-P-complete]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-completeness_of_01-permanent Sharp-P-completeness of 01-permanent]&lt;br /&gt;
*[https://shaih.github.io/pubs/01perm.pdf Zero One Permanent is  #P-Complete,  A Simpler Proof]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Класс P]]&lt;br /&gt;
*[[Классы NP, coNP, Σ₁, Π₁]]&lt;br /&gt;
*[[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60728</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60728"/>
				<updated>2017-05-02T07:17:10Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры #P-Complete задач */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;  класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время недетерминированная машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\mathrm{FP}&amp;lt;/tex&amp;gt; {{---}} класс задач подсчета, разрешимых на детерминированной машине Тьюринга за полиномиальное время, то есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время детерминированная машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Подсчет числа сертификатов как минимум столь же сложен, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Также можно заметить, что если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[Sharp SAT|#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:cycle_block.png|thumb|300px|Блок XOR]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n \cdot \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что, если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{mn} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} \cdot n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как &amp;lt;tex&amp;gt;HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt; и любая проблема из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; может быть сведена к ней за полиномиальное время.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P-&amp;lt;/tex&amp;gt;полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-Complete задач ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Задача нахождения перманента &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления перманента недетерминированно выбирается перестановка из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой такой перестановки вычисляется произведение соответствующих элементов матрицы, полученные значения складываются. Время работы такого алгоритма на недетерминированной машине Тьюринга {{---}} &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;. Для этого будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1 \ldots \, x_n\}, \,  \{x_i, x_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Таким образом, нашей целью будет построение некоторого графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, матрицей смежности которого будет &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Для этого по данной 3-КНФ формуле построим ориентированный граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Назовем покрытием ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами. Далее покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;, а остальные не будут вносить вклад. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков. (Все ребра, для которых на схеме не указан вес, имеют вес &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.) &lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; данной переменной. Присвоение &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; соответствует покрытию, включающему ребра-петли и ребро &amp;lt;tex&amp;gt;``false&amp;quot;&amp;lt;/tex&amp;gt;. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует  единственное покрытие и его вес равен &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного блока - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме.  Представим, что мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; в некотором графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt;. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в 3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. А значит задача подсчета числа совершенных паросочетаний в двудольном графе эквивалентна задаче вычисления перманента &amp;lt;tex&amp;gt;\{0,1\}-&amp;lt;/tex&amp;gt;матрицы и также является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
*[http://theory.cs.princeton.edu/complexity/book.pdf Christos H. Papadimitriou. Computational Complexity. c. 172-179]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Counting_problem_(complexity) Counting problem]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P Sharp-P ]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-complete Sharp-P-complete]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-completeness_of_01-permanent Sharp-P-completeness of 01-permanent]&lt;br /&gt;
*[https://shaih.github.io/pubs/01perm.pdf Zero One Permanent is  #P-Complete,  A Simpler Proof]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Класс P]]&lt;br /&gt;
*[[Классы NP, coNP, Σ₁, Π₁]]&lt;br /&gt;
*[[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60727</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60727"/>
				<updated>2017-05-02T07:14:52Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры #P-Complete задач */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;  класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время недетерминированная машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\mathrm{FP}&amp;lt;/tex&amp;gt; {{---}} класс задач подсчета, разрешимых на детерминированной машине Тьюринга за полиномиальное время, то есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время детерминированная машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Подсчет числа сертификатов как минимум столь же сложен, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Также можно заметить, что если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[Sharp SAT|#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:cycle_block.png|thumb|300px|Блок XOR]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n \cdot \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что, если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{mn} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} \cdot n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как &amp;lt;tex&amp;gt;HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt; и любая проблема из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; может быть сведена к ней за полиномиальное время.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P-&amp;lt;/tex&amp;gt;полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-Complete задач ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Задача нахождения перманента &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления перманента недетерминированно выбирается перестановка из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой такой перестановки вычисляется произведение соответствующих элементов матрицы, полученные значения складываются. Время работы такого алгоритма на недетерминированной машине Тьюринга {{---}} &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;. Для этого будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1 \ldots \, x_n\}, \,  \{x_i, x_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Таким образом, нашей целью будет построение некоторого графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, матрицей смежности которого будет &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Для этого по данной 3-КНФ формуле построим ориентированный граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Назовем покрытием ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами. Далее покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;, а остальные не будут вносить вклад. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков. (Все ребра, для которых на схеме не указан вес, имеют вес &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.) &lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; данной переменной. Присвоение &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; соответствует покрытию, включающему ребра-петли и ребро &amp;lt;tex&amp;gt;&amp;quot;false&amp;quot;&amp;lt;/tex&amp;gt;. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует  единственное покрытие и его вес равен &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного блока - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме.  Представим, что мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; в некотором графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt;. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в 3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. А значит задача подсчета числа совершенных паросочетаний в двудольном графе эквивалентна задаче вычисления перманента &amp;lt;tex&amp;gt;\{0,1\}-&amp;lt;/tex&amp;gt;матрицы и также является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
*[http://theory.cs.princeton.edu/complexity/book.pdf Christos H. Papadimitriou. Computational Complexity. c. 172-179]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Counting_problem_(complexity) Counting problem]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P Sharp-P ]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-complete Sharp-P-complete]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-completeness_of_01-permanent Sharp-P-completeness of 01-permanent]&lt;br /&gt;
*[https://shaih.github.io/pubs/01perm.pdf Zero One Permanent is  #P-Complete,  A Simpler Proof]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Класс P]]&lt;br /&gt;
*[[Классы NP, coNP, Σ₁, Π₁]]&lt;br /&gt;
*[[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60719</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60719"/>
				<updated>2017-05-01T18:36:36Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры #P-Complete задач */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;  класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время недетерминированная машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\mathrm{FP}&amp;lt;/tex&amp;gt; {{---}} класс задач подсчета, разрешимых на детерминированной машине Тьюринга за полиномиальное время, то есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время детерминированная машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Подсчет числа сертификатов как минимум столь же сложен, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Также можно заметить, что если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[Sharp SAT|#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:cycle_block.png|thumb|300px|Блок XOR]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n \cdot \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что, если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{mn} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} \cdot n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как &amp;lt;tex&amp;gt;HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt; и любая проблема из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; может быть сведена к ней за полиномиальное время.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P-&amp;lt;/tex&amp;gt;полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-Complete задач ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Задача нахождения перманента &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления перманента будем недетерминированно выбирать перестановку из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой из них вычислять произведение соответствующих элементов матрицы, а затем.   //todo&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;. Для этого будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1 \ldots \, x_n\}, \,  \{x_i, x_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Таким образом, нашей целью будет построение некоторого графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, матрицей смежности которого будет &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Для этого по данной 3-КНФ формуле построим ориентированный граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Назовем покрытием ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами. Далее покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;, а остальные не будут вносить вклад. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков. (Все ребра, для которых на схеме не указан вес, имеют вес &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.) &lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; данной переменной. Присвоение &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; соответствует покрытию, включающему ребра-петли и ребро &amp;lt;tex&amp;gt;&amp;quot;false&amp;quot;&amp;lt;/tex&amp;gt;. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует  единственное покрытие и его вес равен &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного блока - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме.  Представим, что мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; в некотором графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt;. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в 3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. А значит задача подсчета числа совершенных паросочетаний в двудольном графе эквивалентна задаче вычисления перманента &amp;lt;tex&amp;gt;\{0,1\}-&amp;lt;/tex&amp;gt;матрицы и также является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
*[http://theory.cs.princeton.edu/complexity/book.pdf Christos H. Papadimitriou. Computational Complexity. c. 172-179]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Counting_problem_(complexity) Counting problem]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P Sharp-P ]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-complete Sharp-P-complete]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-completeness_of_01-permanent Sharp-P-completeness of 01-permanent]&lt;br /&gt;
*[https://shaih.github.io/pubs/01perm.pdf Zero One Permanent is  #P-Complete,  A Simpler Proof]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Класс P]]&lt;br /&gt;
*[[Классы NP, coNP, Σ₁, Π₁]]&lt;br /&gt;
*[[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60709</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60709"/>
				<updated>2017-04-29T13:07:43Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Замечание */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;  класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время недетерминированная машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\mathrm{FP}&amp;lt;/tex&amp;gt; {{---}} класс задач подсчета, разрешимых на детерминированной машине Тьюринга за полиномиальное время, то есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время детерминированная машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Подсчет числа сертификатов как минимум столь же сложен, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Также можно заметить, что если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[Sharp SAT|#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:cycle_block.png|thumb|300px|Блок XOR]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n \cdot \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что, если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{mn} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} \cdot n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как &amp;lt;tex&amp;gt;HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt; и любая проблема из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; может быть сведена к ней за полиномиальное время.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P-&amp;lt;/tex&amp;gt;полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-Complete задач ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Очевидно, задача нахождения перманента 0,1-матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления будем недетерминированно выбирать перестановку из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой из них вычислять нужное значение за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для этого вначале по данной 3-КНФ формуле построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков.&lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; данной переменной. Присвоение &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного блока - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt;. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в  3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. А значит задача подсчета числа совершенных паросочетаний в двудольном графе эквивалентна задаче вычисления перманента &amp;lt;tex&amp;gt;\{0,1\}-&amp;lt;/tex&amp;gt;матрицы и также является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
*[http://theory.cs.princeton.edu/complexity/book.pdf Christos H. Papadimitriou. Computational Complexity. c. 172-179]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Counting_problem_(complexity) Counting problem]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P Sharp-P ]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-complete Sharp-P-complete]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-completeness_of_01-permanent Sharp-P-completeness of 01-permanent]&lt;br /&gt;
*[https://shaih.github.io/pubs/01perm.pdf Zero One Permanent is  #P-Complete,  A Simpler Proof]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Класс P]]&lt;br /&gt;
*[[Классы NP, coNP, Σ₁, Π₁]]&lt;br /&gt;
*[[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60708</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60708"/>
				<updated>2017-04-29T13:03:13Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры #P-Complete задач */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;  класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время недетерминированная машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\mathrm{FP}&amp;lt;/tex&amp;gt; {{---}} класс задач подсчета, разрешимых на детерминированной машине Тьюринга за полиномиальное время, то есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время детерминированная машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Подсчет числа сертификатов как минимум столь же сложен, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Также можно заметить, что если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[Sharp SAT|#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:cycle_block.png|thumb|300px|Блок XOR]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n \cdot \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что, если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{mn} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} \cdot n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как &amp;lt;tex&amp;gt;HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt; и любая проблема из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; может быть сведена к ней за полиномиальное время.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P-&amp;lt;/tex&amp;gt;полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-Complete задач ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Очевидно, задача нахождения перманента 0,1-матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления будем недетерминированно выбирать перестановку из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой из них вычислять нужное значение за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для этого вначале по данной 3-КНФ формуле построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков.&lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; данной переменной. Присвоение &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного блока - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt;. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в  3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
*[http://theory.cs.princeton.edu/complexity/book.pdf Christos H. Papadimitriou. Computational Complexity. c. 172-179]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Counting_problem_(complexity) Counting problem]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P Sharp-P ]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-complete Sharp-P-complete]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-completeness_of_01-permanent Sharp-P-completeness of 01-permanent]&lt;br /&gt;
*[https://shaih.github.io/pubs/01perm.pdf Zero One Permanent is  #P-Complete,  A Simpler Proof]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Класс P]]&lt;br /&gt;
*[[Классы NP, coNP, Σ₁, Π₁]]&lt;br /&gt;
*[[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60707</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60707"/>
				<updated>2017-04-29T12:59:10Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Класс #P-Complete */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;  класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время недетерминированная машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\mathrm{FP}&amp;lt;/tex&amp;gt; {{---}} класс задач подсчета, разрешимых на детерминированной машине Тьюринга за полиномиальное время, то есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время детерминированная машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Подсчет числа сертификатов как минимум столь же сложен, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Также можно заметить, что если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[Sharp SAT|#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:cycle_block.png|thumb|300px|Блок XOR]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n \cdot \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что, если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{mn} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} \cdot n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как &amp;lt;tex&amp;gt;HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt; и любая проблема из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; может быть сведена к ней за полиномиальное время.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P-&amp;lt;/tex&amp;gt;полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-Complete задач ==&lt;br /&gt;
Многие задачи из класса &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полных получаются из задач разрешимости из класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;  за счет требования подсчета всевозможных удовлетворяющих наборов входных значений.&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Очевидно, задача нахождения перманента 0,1-матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления будем недетерминированно выбирать перестановку из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой из них вычислять нужное значение за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для этого вначале по данной 3-КНФ формуле построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков.&lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; данной переменной. Присвоение &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного блока - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt;. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в  3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
*[http://theory.cs.princeton.edu/complexity/book.pdf Christos H. Papadimitriou. Computational Complexity. c. 172-179]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Counting_problem_(complexity) Counting problem]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P Sharp-P ]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-complete Sharp-P-complete]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-completeness_of_01-permanent Sharp-P-completeness of 01-permanent]&lt;br /&gt;
*[https://shaih.github.io/pubs/01perm.pdf Zero One Permanent is  #P-Complete,  A Simpler Proof]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Класс P]]&lt;br /&gt;
*[[Классы NP, coNP, Σ₁, Π₁]]&lt;br /&gt;
*[[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60706</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60706"/>
				<updated>2017-04-29T12:15:06Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры задач из #P */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;  класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время недетерминированная машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\mathrm{FP}&amp;lt;/tex&amp;gt; {{---}} класс задач подсчета, разрешимых на детерминированной машине Тьюринга за полиномиальное время, то есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время детерминированная машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Подсчет числа сертификатов как минимум столь же сложен, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Также можно заметить, что если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[Sharp SAT|#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:cycle_block.png|thumb|300px|Блок XOR]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n \cdot \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что, если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{mn} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} \cdot n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как &amp;lt;tex&amp;gt;HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt;  и получение для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; алгоритма работающего за полиномиальное время влечет равенство &amp;lt;tex&amp;gt; \#P=FP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для более формального определения будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P&amp;lt;/tex&amp;gt;-полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-Complete задач ==&lt;br /&gt;
Многие задачи из класса &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полных получаются из задач разрешимости из класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;  за счет требования подсчета всевозможных удовлетворяющих наборов входных значений.&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Очевидно, задача нахождения перманента 0,1-матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления будем недетерминированно выбирать перестановку из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой из них вычислять нужное значение за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для этого вначале по данной 3-КНФ формуле построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков.&lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; данной переменной. Присвоение &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного блока - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt;. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в  3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
*[http://theory.cs.princeton.edu/complexity/book.pdf Christos H. Papadimitriou. Computational Complexity. c. 172-179]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Counting_problem_(complexity) Counting problem]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P Sharp-P ]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-complete Sharp-P-complete]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-completeness_of_01-permanent Sharp-P-completeness of 01-permanent]&lt;br /&gt;
*[https://shaih.github.io/pubs/01perm.pdf Zero One Permanent is  #P-Complete,  A Simpler Proof]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Класс P]]&lt;br /&gt;
*[[Классы NP, coNP, Σ₁, Π₁]]&lt;br /&gt;
*[[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60705</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60705"/>
				<updated>2017-04-29T12:11:05Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Класс #P */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;  класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время недетерминированная машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition ='''Класс''' &amp;lt;tex&amp;gt;\mathrm{FP}&amp;lt;/tex&amp;gt; {{---}} класс задач подсчета, разрешимых на детерминированной машине Тьюринга за полиномиальное время, то есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и работающая за полиномиальное время детерминированная машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Подсчет числа сертификатов как минимум столь же сложен, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Также можно заметить, что если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[Sharp SAT|#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:cycle_block.png|thumb|300px|Блок XOR]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n * \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что, если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{mn} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} * n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как&amp;lt;tex&amp;gt; HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt;  и получение для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; алгоритма работающего за полиномиальное время влечет равенство &amp;lt;tex&amp;gt; \#P=FP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для более формального определения будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P&amp;lt;/tex&amp;gt;-полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-Complete задач ==&lt;br /&gt;
Многие задачи из класса &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полных получаются из задач разрешимости из класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;  за счет требования подсчета всевозможных удовлетворяющих наборов входных значений.&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Очевидно, задача нахождения перманента 0,1-матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления будем недетерминированно выбирать перестановку из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой из них вычислять нужное значение за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для этого вначале по данной 3-КНФ формуле построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков.&lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; данной переменной. Присвоение &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного блока - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt;. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в  3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
*[http://theory.cs.princeton.edu/complexity/book.pdf Christos H. Papadimitriou. Computational Complexity. c. 172-179]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Counting_problem_(complexity) Counting problem]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P Sharp-P ]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-complete Sharp-P-complete]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-completeness_of_01-permanent Sharp-P-completeness of 01-permanent]&lt;br /&gt;
*[https://shaih.github.io/pubs/01perm.pdf Zero One Permanent is  #P-Complete,  A Simpler Proof]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Класс P]]&lt;br /&gt;
*[[Классы NP, coNP, Σ₁, Π₁]]&lt;br /&gt;
*[[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60704</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60704"/>
				<updated>2017-04-29T09:50:52Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры задач из #P */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =&amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; представляет класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и  машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Класс &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt; - аналог класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; для задач, ответ на которые представляется не битовым значением, а натуральным числом. Подсчет числа сертификатов как минимум столь же сложен, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Также можно заметить, что если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[Sharp SAT|#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:cycle_block.png|thumb|300px|Блок XOR]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n * \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что, если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{mn} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} * n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как&amp;lt;tex&amp;gt; HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt;  и получение для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; алгоритма работающего за полиномиальное время влечет равенство &amp;lt;tex&amp;gt; \#P=FP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для более формального определения будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P&amp;lt;/tex&amp;gt;-полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-Complete задач ==&lt;br /&gt;
Многие задачи из класса &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полных получаются из задач разрешимости из класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;  за счет требования подсчета всевозможных удовлетворяющих наборов входных значений.&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Очевидно, задача нахождения перманента 0,1-матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления будем недетерминированно выбирать перестановку из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой из них вычислять нужное значение за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для этого вначале по данной 3-КНФ формуле построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков.&lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; данной переменной. Присвоение &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного блока - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt;. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в  3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
*[http://theory.cs.princeton.edu/complexity/book.pdf Christos H. Papadimitriou. Computational Complexity. c. 172-179]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Counting_problem_(complexity) Counting problem]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P Sharp-P ]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-complete Sharp-P-complete]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-completeness_of_01-permanent Sharp-P-completeness of 01-permanent]&lt;br /&gt;
*[https://shaih.github.io/pubs/01perm.pdf Zero One Permanent is  #P-Complete,  A Simpler Proof]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Класс P]]&lt;br /&gt;
*[[Классы NP, coNP, Σ₁, Π₁]]&lt;br /&gt;
*[[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=60703</id>
		<title>Теория сложности</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=60703"/>
				<updated>2017-04-29T09:50:03Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Дополнительные классы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Категория: Теория сложности]]&lt;br /&gt;
&lt;br /&gt;
== Детерминированные и недетерминированные вычисления, сложность по времени и по памяти ==&lt;br /&gt;
=== Базовые определения ===&lt;br /&gt;
*[[Сложностные классы]]&lt;br /&gt;
*[[Вычисления с оракулом]]&lt;br /&gt;
&lt;br /&gt;
=== Классы P и NP, NP-полнота ===&lt;br /&gt;
*[[Класс P]]&lt;br /&gt;
*[[Недетерминированные вычисления]]&lt;br /&gt;
*[[Классы NP, coNP, Σ₁, Π₁]]&lt;br /&gt;
*[[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи]]&lt;br /&gt;
*[[Сведение по Куку задачи факторизации к языку из NP]]&lt;br /&gt;
*[[NP-полнота BH1N]]&lt;br /&gt;
*[[Теорема Кука]]&lt;br /&gt;
*[[Теоремы о временной и емкостной иерархиях]]&lt;br /&gt;
*[[Теорема Бейкера — Гилла — Соловэя]]&lt;br /&gt;
*[[Теорема Ладнера]]&lt;br /&gt;
*[[Теорема Левина]]&lt;br /&gt;
*[[Теорема Бермана — Форчуна]]&lt;br /&gt;
*[[Теорема Махэни]]&lt;br /&gt;
&lt;br /&gt;
=== [[Примеры NP-полных языков]] ===&lt;br /&gt;
* [[NP-полнота языка CNFSAT]]&lt;br /&gt;
* [[NP-полнота языка 3SAT]]&lt;br /&gt;
* [[NP-полнота языка IND (максимальное независимое множество)]]&lt;br /&gt;
* [[NP-полнота языка VCOVER (минимальное вершинное покрытие)]]&lt;br /&gt;
* [[NP-полнота языка CLIQUE]]&lt;br /&gt;
* [[NP-полнота задач о гамильтоновом цикле и пути в графах]]&lt;br /&gt;
* [[NP-полнота задачи о сумме подмножества]]&lt;br /&gt;
* [[NP-полнота задачи о рюкзаке]]&lt;br /&gt;
* [[NP-полнота задачи о раскраске графа]]&lt;br /&gt;
* [[NP-полнота игры Тетрис]]&lt;br /&gt;
&lt;br /&gt;
=== Сложность по памяти, классы PS, L, NL, coNL, EXP, NEXP ===&lt;br /&gt;
*[[Класс PS. Связь класса PS с другими классами теории сложности]]&lt;br /&gt;
*[[Теорема Сэвича. Совпадение классов NPS и PS]]&lt;br /&gt;
*[[PS-полнота языка верных булевых формул с кванторами (TQBF)]]&lt;br /&gt;
*[[PS-полнота задачи Generalized geography]]&lt;br /&gt;
*[[Классы L, NL, coNL]]&lt;br /&gt;
*[[Полнота относительно L-сведения. NL-полнота. P-полнота]]&lt;br /&gt;
*[[Теорема Иммермана]]&lt;br /&gt;
*[[Классы EXP и NEXP]]&lt;br /&gt;
&lt;br /&gt;
=== Полиномиальная иерархия ===&lt;br /&gt;
*[[Классы PH, Σ и Π]]&lt;br /&gt;
*[[Теоремы о коллапсе полиномиальной иерархии]]&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные классы ===&lt;br /&gt;
*[[Классы Sharp P, Sharp P-Complete|Классы #P, #P-Complete]]&lt;br /&gt;
&lt;br /&gt;
== Схемная сложность ==&lt;br /&gt;
*[[Схемная сложность и класс P/poly]]&lt;br /&gt;
*[[Теорема Карпа — Липтона]]&lt;br /&gt;
*[[Классы NC и AC]]&lt;br /&gt;
*[[Теорема о непринадлежности XOR классу AC⁰]]&lt;br /&gt;
&lt;br /&gt;
== Вероятностные сложностные классы ==&lt;br /&gt;
=== Основные классы ===&lt;br /&gt;
*[[Вероятностные вычисления. Вероятностная машина Тьюринга]]&lt;br /&gt;
*[[Классы RP и coRP]]&lt;br /&gt;
*[[Класс ZPP]]&lt;br /&gt;
*[[Классы BPP и PP]]&lt;br /&gt;
*[[Соотношение вероятностных классов]]&lt;br /&gt;
*[[Лемма Шварца-Зиппеля]]&lt;br /&gt;
*[[Теорема Лаутемана]]&lt;br /&gt;
*[[Теорема Валианта-Вазирани]]&lt;br /&gt;
&lt;br /&gt;
=== Интерактивные протоколы ===&lt;br /&gt;
*[[Интерактивные протоколы. Класс IP. Класс AM]]&lt;br /&gt;
*[[Арифметизация булевых формул с кванторами]]&lt;br /&gt;
*[[Теорема о соотношении coNP и IP]]&lt;br /&gt;
*[[Теорема Шамира]]&lt;br /&gt;
*[[Семейство универсальных попарно независимых хеш-функций]]&lt;br /&gt;
*[[Протокол Голдвассер-Сипсера для оценки размера множества]]&lt;br /&gt;
&lt;br /&gt;
=== Probabilistically checkable proofs ===&lt;br /&gt;
*[[PCP-система]]&lt;br /&gt;
*[[Эквивалентность PCP-теоремы и теоремы о трудности аппроксимации]]&lt;br /&gt;
*[[PCP-теорема]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Теория сложности (старая трешовая версия)|Вот сюда]] можно подсматривать, но злоупотреблять не рекомендуется.&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60701</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60701"/>
				<updated>2017-04-29T09:49:42Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: переименовал Классы в Классы Sharp P, Sharp P-Complete&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =&amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; представляет класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и  машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Класс &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt; - аналог класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; для задач, ответ на которые представляется не битовым значением, а натуральным числом. Подсчет числа сертификатов как минимум столь же сложен, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Также можно заметить, что если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:cycle_block.png|thumb|300px|Блок XOR]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n * \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что, если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{mn} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} * n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как&amp;lt;tex&amp;gt; HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt;  и получение для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; алгоритма работающего за полиномиальное время влечет равенство &amp;lt;tex&amp;gt; \#P=FP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для более формального определения будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P&amp;lt;/tex&amp;gt;-полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-Complete задач ==&lt;br /&gt;
Многие задачи из класса &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полных получаются из задач разрешимости из класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;  за счет требования подсчета всевозможных удовлетворяющих наборов входных значений.&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Очевидно, задача нахождения перманента 0,1-матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления будем недетерминированно выбирать перестановку из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой из них вычислять нужное значение за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для этого вначале по данной 3-КНФ формуле построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков.&lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; данной переменной. Присвоение &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного блока - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt;. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в  3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
*[http://theory.cs.princeton.edu/complexity/book.pdf Christos H. Papadimitriou. Computational Complexity. c. 172-179]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Counting_problem_(complexity) Counting problem]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P Sharp-P ]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-complete Sharp-P-complete]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-completeness_of_01-permanent Sharp-P-completeness of 01-permanent]&lt;br /&gt;
*[https://shaih.github.io/pubs/01perm.pdf Zero One Permanent is  #P-Complete,  A Simpler Proof]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Класс P]]&lt;br /&gt;
*[[Классы NP, coNP, Σ₁, Π₁]]&lt;br /&gt;
*[[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B&amp;diff=60702</id>
		<title>Классы</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B&amp;diff=60702"/>
				<updated>2017-04-29T09:49:42Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: переименовал Классы в Классы Sharp P, Sharp P-Complete&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#перенаправление [[Классы Sharp P, Sharp P-Complete]]&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60700</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60700"/>
				<updated>2017-04-29T09:25:13Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры #P-Complete задач */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =&amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; представляет класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и  машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Класс &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt; - аналог класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; для задач, ответ на которые представляется не битовым значением, а натуральным числом. Подсчет числа сертификатов как минимум столь же сложен, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Также можно заметить, что если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:cycle_block.png|thumb|300px|Блок XOR]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n * \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что, если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{mn} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} * n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как&amp;lt;tex&amp;gt; HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt;  и получение для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; алгоритма работающего за полиномиальное время влечет равенство &amp;lt;tex&amp;gt; \#P=FP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для более формального определения будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P&amp;lt;/tex&amp;gt;-полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-Complete задач ==&lt;br /&gt;
Многие задачи из класса &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полных получаются из задач разрешимости из класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;  за счет требования подсчета всевозможных удовлетворяющих наборов входных значений.&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Очевидно, задача нахождения перманента 0,1-матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления будем недетерминированно выбирать перестановку из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой из них вычислять нужное значение за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для этого вначале по данной 3-КНФ формуле построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков.&lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; данной переменной. Присвоение &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного блока - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt;. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в  3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
*[http://theory.cs.princeton.edu/complexity/book.pdf Christos H. Papadimitriou. Computational Complexity. c. 172-179]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Counting_problem_(complexity) Counting problem]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P Sharp-P ]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-complete Sharp-P-complete]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sharp-P-completeness_of_01-permanent Sharp-P-completeness of 01-permanent]&lt;br /&gt;
*[https://shaih.github.io/pubs/01perm.pdf Zero One Permanent is  #P-Complete,  A Simpler Proof]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Класс P]]&lt;br /&gt;
*[[Классы NP, coNP, Σ₁, Π₁]]&lt;br /&gt;
*[[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60699</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60699"/>
				<updated>2017-04-29T09:10:30Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры #P-полных задач */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =&amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; представляет класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и  машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Класс &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt; - аналог класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; для задач, ответ на которые представляется не битовым значением, а натуральным числом. Подсчет числа сертификатов как минимум столь же сложен, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Также можно заметить, что если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:cycle_block.png|thumb|300px|Блок XOR]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n * \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что, если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{mn} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} * n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как&amp;lt;tex&amp;gt; HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt;  и получение для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; алгоритма работающего за полиномиальное время влечет равенство &amp;lt;tex&amp;gt; \#P=FP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для более формального определения будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P&amp;lt;/tex&amp;gt;-полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-Complete задач ==&lt;br /&gt;
Многие задачи из класса &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полных получаются из задач разрешимости из класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;  за счет требования подсчета всевозможных удовлетворяющих наборов входных значений.&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Очевидно, задача нахождения перманента 0,1-матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления будем недетерминированно выбирать перестановку из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой из них вычислять нужное значение за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для этого вначале по данной 3-КНФ формуле построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков.&lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; данной переменной. Присвоение &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного блока - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt;. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в  3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60698</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60698"/>
				<updated>2017-04-29T09:00:42Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры #P-полных задач */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =&amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; представляет класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и  машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Класс &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt; - аналог класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; для задач, ответ на которые представляется не битовым значением, а натуральным числом. Подсчет числа сертификатов как минимум столь же сложен, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Также можно заметить, что если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:cycle_block.png|thumb|300px|Блок XOR]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n * \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что, если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{mn} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} * n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как&amp;lt;tex&amp;gt; HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt;  и получение для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; алгоритма работающего за полиномиальное время влечет равенство &amp;lt;tex&amp;gt; \#P=FP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для более формального определения будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P&amp;lt;/tex&amp;gt;-полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-полных задач ==&lt;br /&gt;
Многие задачи из класса &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полных получаются из задач разрешимости из класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;  за счет требования подсчета всевозможных удовлетворяющих наборов входных значений.&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Очевидно, задача нахождения перманента 0,1-матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления будем недетерминированно выбирать перестановку из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой из них вычислять нужное значение за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для этого вначале по данной 3-КНФ формуле построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков.&lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; данной переменной. Присвоение &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt; соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного блока - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt;. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в  3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к &amp;lt;tex&amp;gt;0,1-&amp;lt;/tex&amp;gt;матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60697</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60697"/>
				<updated>2017-04-29T08:51:19Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Класс #P-Complete */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =&amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; представляет класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и  машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Класс &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt; - аналог класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; для задач, ответ на которые представляется не битовым значением, а натуральным числом. Подсчет числа сертификатов как минимум столь же сложен, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Также можно заметить, что если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:cycle_block.png|thumb|300px|Блок XOR]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n * \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что, если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{mn} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} * n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как&amp;lt;tex&amp;gt; HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt;  и получение для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; алгоритма работающего за полиномиальное время влечет равенство &amp;lt;tex&amp;gt; \#P=FP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для более формального определения будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P&amp;lt;/tex&amp;gt;-полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-полных задач ==&lt;br /&gt;
Многие задачи из класса &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полных получаются из задач разрешимости из класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;  за счет требования подсчета всевозможных удовлетворяющих наборов входных значений.&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Очевидно, задача нахождения перманента 0,1-матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления будем недетерминированно выбирать перестановку из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой из них вычислять нужное значение за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для этого вначале по данной 3-КНФ формуле построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков.&lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению true или false данной переменной. Присвоение true соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение false соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса 1. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного клоза - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения true. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в  3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к 0,1-матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60696</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60696"/>
				<updated>2017-04-29T08:49:36Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры задач из #P */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =&amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; представляет класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и  машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Класс &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt; - аналог класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; для задач, ответ на которые представляется не битовым значением, а натуральным числом. Подсчет числа сертификатов как минимум столь же сложен, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Также можно заметить, что если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:cycle_block.png|thumb|300px|Блок XOR]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n * \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что, если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{mn} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} * n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как&amp;lt;tex&amp;gt; HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt;  и получение для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; алгоритма работающего за полиномиальное время влечет равенство &amp;lt;tex&amp;gt; \#P=FP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для более формального определения будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P&amp;lt;/tex&amp;gt;-полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для множества языков из &amp;lt;tex&amp;gt;NP&amp;lt;/tex&amp;gt; (таких как &amp;lt;tex&amp;gt;3SAT, CLIQUE, Ham &amp;lt;/tex&amp;gt;) существуют их версии из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. См. &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-полных задач ==&lt;br /&gt;
Многие задачи из класса &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полных получаются из задач разрешимости из класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;  за счет требования подсчета всевозможных удовлетворяющих наборов входных значений.&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Очевидно, задача нахождения перманента 0,1-матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления будем недетерминированно выбирать перестановку из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой из них вычислять нужное значение за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для этого вначале по данной 3-КНФ формуле построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков.&lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению true или false данной переменной. Присвоение true соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение false соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса 1. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного клоза - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения true. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в  3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к 0,1-матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Cycle_block.png&amp;diff=60695</id>
		<title>Файл:Cycle block.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Cycle_block.png&amp;diff=60695"/>
				<updated>2017-04-29T08:49:16Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60694</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60694"/>
				<updated>2017-04-29T08:45:01Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Класс #P */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =&amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; представляет класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и  машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Класс &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt; - аналог класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; для задач, ответ на которые представляется не битовым значением, а натуральным числом. Подсчет числа сертификатов как минимум столь же сложен, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Также можно заметить, что если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Line.jpg|thumb|300px|Блок XOR]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n * \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что, если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{mn} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} * n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как&amp;lt;tex&amp;gt; HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt;  и получение для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; алгоритма работающего за полиномиальное время влечет равенство &amp;lt;tex&amp;gt; \#P=FP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для более формального определения будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P&amp;lt;/tex&amp;gt;-полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для множества языков из &amp;lt;tex&amp;gt;NP&amp;lt;/tex&amp;gt; (таких как &amp;lt;tex&amp;gt;3SAT, CLIQUE, Ham &amp;lt;/tex&amp;gt;) существуют их версии из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. См. &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-полных задач ==&lt;br /&gt;
Многие задачи из класса &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полных получаются из задач разрешимости из класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;  за счет требования подсчета всевозможных удовлетворяющих наборов входных значений.&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Очевидно, задача нахождения перманента 0,1-матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления будем недетерминированно выбирать перестановку из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой из них вычислять нужное значение за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для этого вначале по данной 3-КНФ формуле построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков.&lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению true или false данной переменной. Присвоение true соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение false соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса 1. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного клоза - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения true. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в  3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к 0,1-матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60693</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60693"/>
				<updated>2017-04-29T08:41:21Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры задач из #P */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =&amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; представляет класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и  машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Класс &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt; - аналог класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; для задач, ответ на которые представляется не битовым значением, а натуральным числом. Подсчет числа сертификатов как минимум столь же сложен, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Line.jpg|thumb|300px|Блок XOR]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n * \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что, если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{mn} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} * n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как&amp;lt;tex&amp;gt; HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt;  и получение для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; алгоритма работающего за полиномиальное время влечет равенство &amp;lt;tex&amp;gt; \#P=FP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для более формального определения будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P&amp;lt;/tex&amp;gt;-полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для множества языков из &amp;lt;tex&amp;gt;NP&amp;lt;/tex&amp;gt; (таких как &amp;lt;tex&amp;gt;3SAT, CLIQUE, Ham &amp;lt;/tex&amp;gt;) существуют их версии из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. См. &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-полных задач ==&lt;br /&gt;
Многие задачи из класса &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полных получаются из задач разрешимости из класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;  за счет требования подсчета всевозможных удовлетворяющих наборов входных значений.&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Очевидно, задача нахождения перманента 0,1-матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления будем недетерминированно выбирать перестановку из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой из них вычислять нужное значение за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для этого вначале по данной 3-КНФ формуле построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков.&lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению true или false данной переменной. Присвоение true соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение false соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса 1. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного клоза - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения true. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в  3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к 0,1-матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60688</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60688"/>
				<updated>2017-04-25T10:29:31Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Класс #P */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =&amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; представляет класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и  машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Класс &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt; - аналог класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; для задач, ответ на которые представляется не битовым значением, а натуральным числом. Подсчет числа сертификатов как минимум столь же сложен, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Line.jpg|thumb|300px|Блок XOR]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с n вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n * \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{m(n-1)} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} * n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.му входящих и на единицу сумму исходящих степеней. Таким образом, сумма входящих и исходящих степеней всех вершин ориентированного графа чётна и равна удвоенному числу рёбер.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как&amp;lt;tex&amp;gt; HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt;  и получение для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; алгоритма работающего за полиномиальное время влечет равенство &amp;lt;tex&amp;gt; \#P=FP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для более формального определения будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P&amp;lt;/tex&amp;gt;-полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для множества языков из &amp;lt;tex&amp;gt;NP&amp;lt;/tex&amp;gt; (таких как &amp;lt;tex&amp;gt;3SAT, CLIQUE, Ham &amp;lt;/tex&amp;gt;) существуют их версии из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. См. &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-полных задач ==&lt;br /&gt;
Многие задачи из класса &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полных получаются из задач разрешимости из класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;  за счет требования подсчета всевозможных удовлетворяющих наборов входных значений.&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Очевидно, задача нахождения перманента 0,1-матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления будем недетерминированно выбирать перестановку из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой из них вычислять нужное значение за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для этого вначале по данной 3-КНФ формуле построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков.&lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению true или false данной переменной. Присвоение true соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение false соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса 1. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного клоза - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения true. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в  3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к 0,1-матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60687</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60687"/>
				<updated>2017-04-25T10:27:55Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Класс #P */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =&amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; представляет класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и  машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; эффективно разрешимыми, остается открытым. Класс &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt; - аналог класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; для задач, ответ на которые представляется не битовым значением, а натуральным числом. Подсчет числа сертификатов как минимум столь же сложно, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Line.jpg|thumb|300px|Блок XOR]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с n вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n * \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{m(n-1)} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} * n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.му входящих и на единицу сумму исходящих степеней. Таким образом, сумма входящих и исходящих степеней всех вершин ориентированного графа чётна и равна удвоенному числу рёбер.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как&amp;lt;tex&amp;gt; HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt;  и получение для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; алгоритма работающего за полиномиальное время влечет равенство &amp;lt;tex&amp;gt; \#P=FP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для более формального определения будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P&amp;lt;/tex&amp;gt;-полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для множества языков из &amp;lt;tex&amp;gt;NP&amp;lt;/tex&amp;gt; (таких как &amp;lt;tex&amp;gt;3SAT, CLIQUE, Ham &amp;lt;/tex&amp;gt;) существуют их версии из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. См. &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-полных задач ==&lt;br /&gt;
Многие задачи из класса &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полных получаются из задач разрешимости из класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;  за счет требования подсчета всевозможных удовлетворяющих наборов входных значений.&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Очевидно, задача нахождения перманента 0,1-матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления будем недетерминированно выбирать перестановку из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой из них вычислять нужное значение за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для этого вначале по данной 3-КНФ формуле построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков.&lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению true или false данной переменной. Присвоение true соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение false соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса 1. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного клоза - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения true. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в  3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к 0,1-матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60686</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60686"/>
				<updated>2017-04-25T10:20:29Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры #P-полных задач */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =&amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; представляет класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и  машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;  //эффективно разрешимыми// остается открытым. Класс &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt; - аналог класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; для задач, ответ на которые представляется не битовым значением, а натуральным числом. Подсчет числа сертификатов как минимум столь же сложно, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Line.jpg|thumb|300px|Блок XOR]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с n вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n * \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{m(n-1)} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} * n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.му входящих и на единицу сумму исходящих степеней. Таким образом, сумма входящих и исходящих степеней всех вершин ориентированного графа чётна и равна удвоенному числу рёбер.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как&amp;lt;tex&amp;gt; HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt;  и получение для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; алгоритма работающего за полиномиальное время влечет равенство &amp;lt;tex&amp;gt; \#P=FP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для более формального определения будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P&amp;lt;/tex&amp;gt;-полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для множества языков из &amp;lt;tex&amp;gt;NP&amp;lt;/tex&amp;gt; (таких как &amp;lt;tex&amp;gt;3SAT, CLIQUE, Ham &amp;lt;/tex&amp;gt;) существуют их версии из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. См. &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-полных задач ==&lt;br /&gt;
Многие задачи из класса &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полных получаются из задач разрешимости из класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;  за счет требования подсчета всевозможных удовлетворяющих наборов входных значений.&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Очевидно, задача нахождения перманента 0,1-матрицы принадлежит классу &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. Для вычисления будем недетерминированно выбирать перестановку из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов и для каждой из них вычислять нужное значение за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
Докажем, что задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Теперь сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для этого вначале по данной 3-КНФ формуле построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построение графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; выполним за полиномиальное время. Для этого будем использовать три вида блоков.&lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению true или false данной переменной. Присвоение true соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение false соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса 1. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного клоза - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения true. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в  3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\cdot\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к 0,1-матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
&lt;br /&gt;
Таким образом для данной нам формулы мы за полиномиальное время построили соответствующий граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;perm(A') = 4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; - матрица смежности графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и свели задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;. Значит задача &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60678</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60678"/>
				<updated>2017-04-23T21:24:28Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры задач из #P */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =&amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; представляет класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и  машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;  //эффективно разрешимыми// остается открытым. Класс &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt; - аналог класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; для задач, ответ на которые представляется не битовым значением, а натуральным числом. Подсчет числа сертификатов как минимум столь же сложно, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Line.jpg|thumb|300px|Блок XOR]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с n вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n * \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{m(n-1)} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} * n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.му входящих и на единицу сумму исходящих степеней. Таким образом, сумма входящих и исходящих степеней всех вершин ориентированного графа чётна и равна удвоенному числу рёбер.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как&amp;lt;tex&amp;gt; HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt;  и получение для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; алгоритма работающего за полиномиальное время влечет равенство &amp;lt;tex&amp;gt; \#P=FP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для более формального определения будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P&amp;lt;/tex&amp;gt;-полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для множества языков из &amp;lt;tex&amp;gt;NP&amp;lt;/tex&amp;gt; (таких как &amp;lt;tex&amp;gt;3SAT, CLIQUE, Ham &amp;lt;/tex&amp;gt;) существуют их версии из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. См. &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-полных задач ==&lt;br /&gt;
Многие задачи из класса &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полных получаются из задач разрешимости из класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;  за счет требования подсчета всевозможных удовлетворяющих наборов входных значений.&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из n элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построим граф  &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;  таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Для построения графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будем использовать три вида блоков.&lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению true или false данной переменной. Присвоение true соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение false соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса 1. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного клоза - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения true. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в  3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к 0,1-матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Line.jpg&amp;diff=60677</id>
		<title>Файл:Line.jpg</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Line.jpg&amp;diff=60677"/>
				<updated>2017-04-23T21:21:45Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60676</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60676"/>
				<updated>2017-04-23T21:16:17Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры #P-полных задач */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =&amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; представляет класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и  машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;  //эффективно разрешимыми// остается открытым. Класс &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt; - аналог класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; для задач, ответ на которые представляется не битовым значением, а натуральным числом. Подсчет числа сертификатов как минимум столь же сложно, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:dir_grap.png|thumb|300px| &amp;lt;tex&amp;gt;deg^{-}+deg^{+}=10=2\cdot |E|&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с n вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n * \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{m(n-1)} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} * n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.му входящих и на единицу сумму исходящих степеней. Таким образом, сумма входящих и исходящих степеней всех вершин ориентированного графа чётна и равна удвоенному числу рёбер.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как&amp;lt;tex&amp;gt; HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt;  и получение для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; алгоритма работающего за полиномиальное время влечет равенство &amp;lt;tex&amp;gt; \#P=FP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для более формального определения будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P&amp;lt;/tex&amp;gt;-полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для множества языков из &amp;lt;tex&amp;gt;NP&amp;lt;/tex&amp;gt; (таких как &amp;lt;tex&amp;gt;3SAT, CLIQUE, Ham &amp;lt;/tex&amp;gt;) существуют их версии из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. См. &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-полных задач ==&lt;br /&gt;
Многие задачи из класса &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полных получаются из задач разрешимости из класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;  за счет требования подсчета всевозможных удовлетворяющих наборов входных значений.&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из n элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Variable_block.png|thumb|200px|Блок переменной]]&lt;br /&gt;
[[Файл:clause_block.png|thumb|150px|Блок клоза]]&lt;br /&gt;
[[Файл:xor_block.png|thumb|200px|Блок XOR]]&lt;br /&gt;
[[Файл:blocks_connection.png|thumb|200px|Блок XOR]]&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построим граф  &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;  таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Для построения графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будем использовать три вида блоков.&lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению true или false данной переменной. Присвоение true соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение false соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса 1. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного клоза - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения true. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в  3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к 0,1-матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Blocks_connection.png&amp;diff=60675</id>
		<title>Файл:Blocks connection.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Blocks_connection.png&amp;diff=60675"/>
				<updated>2017-04-23T21:14:43Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Xor_block.png&amp;diff=60674</id>
		<title>Файл:Xor block.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Xor_block.png&amp;diff=60674"/>
				<updated>2017-04-23T20:58:10Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: загружена новая версия «Файл:Xor block.png»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Xor_block.png&amp;diff=60673</id>
		<title>Файл:Xor block.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Xor_block.png&amp;diff=60673"/>
				<updated>2017-04-23T20:56:48Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Clause_block.png&amp;diff=60672</id>
		<title>Файл:Clause block.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Clause_block.png&amp;diff=60672"/>
				<updated>2017-04-23T20:53:06Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: загружена новая версия «Файл:Clause block.png»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Clause_block.png&amp;diff=60671</id>
		<title>Файл:Clause block.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Clause_block.png&amp;diff=60671"/>
				<updated>2017-04-23T20:49:31Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60670</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60670"/>
				<updated>2017-04-23T20:44:38Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры #P-полных задач */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =&amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; представляет класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и  машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;  //эффективно разрешимыми// остается открытым. Класс &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt; - аналог класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; для задач, ответ на которые представляется не битовым значением, а натуральным числом. Подсчет числа сертификатов как минимум столь же сложно, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:dir_grap.png|thumb|300px| &amp;lt;tex&amp;gt;deg^{-}+deg^{+}=10=2\cdot |E|&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с n вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n * \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{m(n-1)} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} * n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.му входящих и на единицу сумму исходящих степеней. Таким образом, сумма входящих и исходящих степеней всех вершин ориентированного графа чётна и равна удвоенному числу рёбер.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как&amp;lt;tex&amp;gt; HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt;  и получение для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; алгоритма работающего за полиномиальное время влечет равенство &amp;lt;tex&amp;gt; \#P=FP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для более формального определения будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P&amp;lt;/tex&amp;gt;-полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для множества языков из &amp;lt;tex&amp;gt;NP&amp;lt;/tex&amp;gt; (таких как &amp;lt;tex&amp;gt;3SAT, CLIQUE, Ham &amp;lt;/tex&amp;gt;) существуют их версии из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. См. &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-полных задач ==&lt;br /&gt;
Многие задачи из класса &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полных получаются из задач разрешимости из класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;  за счет требования подсчета всевозможных удовлетворяющих наборов входных значений.&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из n элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построим граф  &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;  таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Для построения графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будем использовать три вида блоков.&lt;br /&gt;
[[Файл:Variable_block.png|thumb|250px|Блок переменной]]&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению true или false данной переменной. Присвоение true соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение false соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса 1. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного клоза - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения true. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в  3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к 0,1-матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Variable_block.png&amp;diff=60669</id>
		<title>Файл:Variable block.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Variable_block.png&amp;diff=60669"/>
				<updated>2017-04-23T20:43:50Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: загружена новая версия «Файл:Variable block.png»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;блок переменной&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Variable_block.png&amp;diff=60668</id>
		<title>Файл:Variable block.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Variable_block.png&amp;diff=60668"/>
				<updated>2017-04-23T20:34:01Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: загружена новая версия «Файл:Variable block.png»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;блок переменной&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60667</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60667"/>
				<updated>2017-04-23T20:28:38Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры #P-полных задач */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =&amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; представляет класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и  машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;  //эффективно разрешимыми// остается открытым. Класс &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt; - аналог класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; для задач, ответ на которые представляется не битовым значением, а натуральным числом. Подсчет числа сертификатов как минимум столь же сложно, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:dir_grap.png|thumb|300px| &amp;lt;tex&amp;gt;deg^{-}+deg^{+}=10=2\cdot |E|&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с n вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n * \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{m(n-1)} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} * n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.му входящих и на единицу сумму исходящих степеней. Таким образом, сумма входящих и исходящих степеней всех вершин ориентированного графа чётна и равна удвоенному числу рёбер.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как&amp;lt;tex&amp;gt; HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt;  и получение для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; алгоритма работающего за полиномиальное время влечет равенство &amp;lt;tex&amp;gt; \#P=FP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для более формального определения будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P&amp;lt;/tex&amp;gt;-полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для множества языков из &amp;lt;tex&amp;gt;NP&amp;lt;/tex&amp;gt; (таких как &amp;lt;tex&amp;gt;3SAT, CLIQUE, Ham &amp;lt;/tex&amp;gt;) существуют их версии из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. См. &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-полных задач ==&lt;br /&gt;
Многие задачи из класса &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полных получаются из задач разрешимости из класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;  за счет требования подсчета всевозможных удовлетворяющих наборов входных значений.&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из n элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построим граф  &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;  таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Для построения графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будем использовать три вида блоков.&lt;br /&gt;
[[Файл:Variable_block.png|thumb|300px|Блок переменной]]&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению true или false данной переменной. Присвоение true соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение false соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса 1. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного клоза - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения true. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в  3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к 0,1-матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Variable_block.png&amp;diff=60666</id>
		<title>Файл:Variable block.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Variable_block.png&amp;diff=60666"/>
				<updated>2017-04-23T20:26:42Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: загружена новая версия «Файл:Variable block.png»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;блок переменной&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Variable_block.png&amp;diff=60665</id>
		<title>Файл:Variable block.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Variable_block.png&amp;diff=60665"/>
				<updated>2017-04-23T20:25:41Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: загружена новая версия «Файл:Variable block.png»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;блок переменной&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Variable_block.png&amp;diff=60664</id>
		<title>Файл:Variable block.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Variable_block.png&amp;diff=60664"/>
				<updated>2017-04-23T20:24:50Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: загружена новая версия «Файл:Variable block.png»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;блок переменной&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60663</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60663"/>
				<updated>2017-04-23T19:21:52Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры #P-полных задач */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =&amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; представляет класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и  машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;  //эффективно разрешимыми// остается открытым. Класс &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt; - аналог класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; для задач, ответ на которые представляется не битовым значением, а натуральным числом. Подсчет числа сертификатов как минимум столь же сложно, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:dir_grap.png|thumb|300px| &amp;lt;tex&amp;gt;deg^{-}+deg^{+}=10=2\cdot |E|&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с n вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n * \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{m(n-1)} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} * n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.му входящих и на единицу сумму исходящих степеней. Таким образом, сумма входящих и исходящих степеней всех вершин ориентированного графа чётна и равна удвоенному числу рёбер.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как&amp;lt;tex&amp;gt; HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt;  и получение для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; алгоритма работающего за полиномиальное время влечет равенство &amp;lt;tex&amp;gt; \#P=FP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для более формального определения будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P&amp;lt;/tex&amp;gt;-полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для множества языков из &amp;lt;tex&amp;gt;NP&amp;lt;/tex&amp;gt; (таких как &amp;lt;tex&amp;gt;3SAT, CLIQUE, Ham &amp;lt;/tex&amp;gt;) существуют их версии из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. См. &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-полных задач ==&lt;br /&gt;
Многие задачи из класса &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полных получаются из задач разрешимости из класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;  за счет требования подсчета всевозможных удовлетворяющих наборов входных значений.&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из n элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построим граф  &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;  таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Для построения графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будем использовать три вида блоков.&lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению true или false данной переменной. Присвоение true соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение false соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса 1. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок XOR'''. Цель данного клоза - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок XOR'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи XOR-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения true. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению формулы в  3-КНФ. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки XOR ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к 0,1-матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60662</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60662"/>
				<updated>2017-04-23T18:09:10Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры #P-полных задач */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =&amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; представляет класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и  машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;  //эффективно разрешимыми// остается открытым. Класс &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt; - аналог класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; для задач, ответ на которые представляется не битовым значением, а натуральным числом. Подсчет числа сертификатов как минимум столь же сложно, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:dir_grap.png|thumb|300px| &amp;lt;tex&amp;gt;deg^{-}+deg^{+}=10=2\cdot |E|&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с n вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n * \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{m(n-1)} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} * n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.му входящих и на единицу сумму исходящих степеней. Таким образом, сумма входящих и исходящих степеней всех вершин ориентированного графа чётна и равна удвоенному числу рёбер.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как&amp;lt;tex&amp;gt; HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt;  и получение для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; алгоритма работающего за полиномиальное время влечет равенство &amp;lt;tex&amp;gt; \#P=FP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для более формального определения будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P&amp;lt;/tex&amp;gt;-полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для множества языков из &amp;lt;tex&amp;gt;NP&amp;lt;/tex&amp;gt; (таких как &amp;lt;tex&amp;gt;3SAT, CLIQUE, Ham &amp;lt;/tex&amp;gt;) существуют их версии из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. См. &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-полных задач ==&lt;br /&gt;
Многие задачи из класса &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полных получаются из задач разрешимости из класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;  за счет требования подсчета всевозможных удовлетворяющих наборов входных значений.&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется&amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из n элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построим граф  &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;  таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Для построения графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будем использовать три вида блоков.&lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению true или false данной переменной. Присвоение true соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение false соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса 1. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок &amp;lt;tex&amp;gt;XOR&amp;lt;/tex&amp;gt;'''. Цель данного клоза - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающемся в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt;: вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок &amp;lt;tex&amp;gt;XOR&amp;lt;/tex&amp;gt;'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям нашей формулы. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи &amp;lt;tex&amp;gt;XOR&amp;lt;/tex&amp;gt;-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения true. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки &amp;lt;tex&amp;gt;XOR&amp;lt;/tex&amp;gt; ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к 0,1-матрице. Для начала изменим веса ребер так, чтобы они были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60661</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60661"/>
				<updated>2017-04-23T17:56:58Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Замечание */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =&amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; представляет класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и  машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;  //эффективно разрешимыми// остается открытым. Класс &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt; - аналог класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; для задач, ответ на которые представляется не битовым значением, а натуральным числом. Подсчет числа сертификатов как минимум столь же сложно, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:dir_grap.png|thumb|300px| &amp;lt;tex&amp;gt;deg^{-}+deg^{+}=10=2\cdot |E|&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с n вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n * \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{m(n-1)} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} * n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.му входящих и на единицу сумму исходящих степеней. Таким образом, сумма входящих и исходящих степеней всех вершин ориентированного графа чётна и равна удвоенному числу рёбер.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как&amp;lt;tex&amp;gt; HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt;  и получение для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; алгоритма работающего за полиномиальное время влечет равенство &amp;lt;tex&amp;gt; \#P=FP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для более формального определения будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P&amp;lt;/tex&amp;gt;-полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для множества языков из &amp;lt;tex&amp;gt;NP&amp;lt;/tex&amp;gt; (таких как &amp;lt;tex&amp;gt;3SAT, CLIQUE, Ham &amp;lt;/tex&amp;gt;) существуют их версии из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. См. &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-полных задач ==&lt;br /&gt;
Многие задачи из класса &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полных получаются из задач разрешимости из класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;  за счет требования подсчета всевозможных удовлетворяющих наборов входных значений.&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется&amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из n элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построим граф  &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;  таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Для построения графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будем использовать три вида блоков.&lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению true или false данной переменной. Присвоение true соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение false соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса 1. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок &amp;lt;tex&amp;gt;XOR&amp;lt;/tex&amp;gt;'''. Цель данного клоза - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающие в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt; : вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок &amp;lt;tex&amp;gt;XOR&amp;lt;/tex&amp;gt;'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи &amp;lt;tex&amp;gt;XOR&amp;lt;/tex&amp;gt;-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения true. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки &amp;lt;tex&amp;gt;XOR&amp;lt;/tex&amp;gt; ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к 0,1-матрице. Для начала изменим веса ребер так, чтобы были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы смежности. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60660</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60660"/>
				<updated>2017-04-23T17:56:37Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры #P-полных задач */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =&amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; представляет класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и  машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;  //эффективно разрешимыми// остается открытым. Класс &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt; - аналог класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; для задач, ответ на которые представляется не битовым значением, а натуральным числом. Подсчет числа сертификатов как минимум столь же сложно, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:dir_grap.png|thumb|300px| &amp;lt;tex&amp;gt;deg^{-}+deg^{+}=10=2\cdot |E|&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с n вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n * \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{m(n-1)} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} * n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.му входящих и на единицу сумму исходящих степеней. Таким образом, сумма входящих и исходящих степеней всех вершин ориентированного графа чётна и равна удвоенному числу рёбер.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как&amp;lt;tex&amp;gt; HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt;  и получение для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; алгоритма работающего за полиномиальное время влечет равенство &amp;lt;tex&amp;gt; \#P=FP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для более формального определения будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P&amp;lt;/tex&amp;gt;-полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для множества языков из &amp;lt;tex&amp;gt;NP&amp;lt;/tex&amp;gt; (таких как &amp;lt;tex&amp;gt;3SAT, CLIQUE, Ham &amp;lt;/tex&amp;gt;) существуют их версии из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. См. &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-полных задач ==&lt;br /&gt;
Многие задачи из класса &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полных получаются из задач разрешимости из класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;  за счет требования подсчета всевозможных удовлетворяющих наборов входных значений.&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
*Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется&amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из n элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
|proof=&lt;br /&gt;
Далее будем рассматривать матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; как матрицу смежности двудольного графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. Назовем покрытие ориентированного графа циклами такой подграф, что для любой вершины есть  ровно одно входящее и исходящее ребро. Такой подграф должен состоять из циклов. Определим вес покрытия как произведение весов ребер, входящих в него. Тогда &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен сумме весов всех возможных покрытий циклами.&lt;br /&gt;
&lt;br /&gt;
Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Сведем задачу &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; клозами построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих подстановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построим граф  &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;  таким образом, чтобы в нем существовали покрытия циклами двух видов: те, которые соответствуют удовлетворяющим назначениям, и те, которые не соответствуют. Покажем, что любое удовлетворяющее назначение для формулы &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; будет добавлять &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Для построения графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будем использовать три вида блоков.&lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два покрытия циклами, соответствующие присвоению true или false данной переменной. Присвоение true соответствует покрытию, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение false соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любое покрытие циклами для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер) существует покрытие веса 1. Каждое внешнее ребро рассматриваемого клоза ассоциировано с одной переменной, присутствующей в нем.&lt;br /&gt;
&lt;br /&gt;
'''Блок &amp;lt;tex&amp;gt;XOR&amp;lt;/tex&amp;gt;'''. Цель данного клоза - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно из них присутствует в любом из покрытий циклами, учитывающие в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt; : вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок &amp;lt;tex&amp;gt;XOR&amp;lt;/tex&amp;gt;'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи &amp;lt;tex&amp;gt;XOR&amp;lt;/tex&amp;gt;-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения true. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки &amp;lt;tex&amp;gt;XOR&amp;lt;/tex&amp;gt; ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к 0,1-матрице. Для начала изменим веса ребер так, чтобы были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы смежности. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Замечание===&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60659</id>
		<title>Классы Sharp P, Sharp P-Complete</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_Sharp_P,_Sharp_P-Complete&amp;diff=60659"/>
				<updated>2017-04-23T16:02:46Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: /* Примеры #P-полных задач */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Класс #P ==&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =&amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt; представляет класс задач, решением которых является количество успешных (завершающихся в допускающих состояниях) путей вычислений для недетерминированной МТ, работающей за полиномиальное время. Отличается от большинства рассмотренных классов тем, что задачи требуют в качестве ответа не  &amp;lt;tex&amp;gt;``0&amp;quot;&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;``1&amp;quot;&amp;lt;/tex&amp;gt;, а натуральное число.&lt;br /&gt;
&amp;lt;br&amp;gt; Более формально: &amp;lt;tex&amp;gt;f : \{0,1\}^*  \rightarrow \mathbb{N}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;, если существует &amp;lt;tex&amp;gt;p \in Poly&amp;lt;/tex&amp;gt; и  машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x \in \{0,1\}^* : f(x) = | \{y \in \{0,1\}^{p(|x|)} : M(x,y) = 1 \} |&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Вопрос, являются ли задачи из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;  //эффективно разрешимыми// остается открытым. Класс &amp;lt;tex&amp;gt;FP&amp;lt;/tex&amp;gt; - аналог класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; для задач, ответ на которые представляется не битовым значением, а натуральным числом. Подсчет числа сертификатов как минимум столь же сложно, как и проверка наличия сертификата, а значит, если доказать равенство &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, то автоматически будет доказано &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt;. Однако из  &amp;lt;tex&amp;gt;NP=P&amp;lt;/tex&amp;gt; вовсе не следует  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;. Если  &amp;lt;tex&amp;gt;PSPACE  = P&amp;lt;/tex&amp;gt;, то  &amp;lt;tex&amp;gt;\#P=FP&amp;lt;/tex&amp;gt;, так как подсчет числа сертификатов может быть выполнен за полиномиальную память.&lt;br /&gt;
&lt;br /&gt;
== Примеры задач из #P ==&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
* &amp;lt;tex&amp;gt;\#CYCLE&amp;lt;/tex&amp;gt; - имея ориентированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, посчитать число простых циклов. Аналогичная задача, отвечающая на вопрос, существует ли в заданном ориентированном графе простой цикл, может быть решена за линейное время при помощи поиска в ширину. Проблема подсчета всех простых циклов значительно сложнее.&lt;br /&gt;
*Для данного массива целых чисел посчитать количество подмножеств его элементов, таких, что сумма по всем элементам подмножества равняется 0.&lt;br /&gt;
*Для данного взвешенного неориентированного графа посчитать количество Гамильтоновых циклов веса меньше k.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;P=NP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:dir_grap.png|thumb|300px| &amp;lt;tex&amp;gt;deg^{-}+deg^{+}=10=2\cdot |E|&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с n вершинами построим граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть Гамильтонов цикл тогда и только тогда, когда в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;n^{n^2}&amp;lt;/tex&amp;gt; циклов. Чтобы получить &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, заменим каждое ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на блок &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.  Блок состоит из &amp;lt;tex&amp;gt;m = n * \log{n} + 1&amp;lt;/tex&amp;gt; уровней. &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; представляет из себя ацикличный граф, а значит циклы в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; соответствуют циклам в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Кроме того, существует &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt; различных путей между &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; внутри блока, следовательно простому циклу длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соответствует цикл длины &amp;lt;tex&amp;gt;2^{(ml)}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Заметим, что если граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит гамильтонов цикл, то в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует минимум &amp;lt;tex&amp;gt;2^{m(n-1)} &amp;gt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Проверим в обратную сторону. Если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не существует Гамильтонова цикла, то самый длинный цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет длину не больше &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; и число циклов не может превысить &amp;lt;tex&amp;gt;n^{n-1}&amp;lt;/tex&amp;gt;. Таким образом, в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будет не более чем &amp;lt;tex&amp;gt;(2^m)^{n-1} * n^{n-1} &amp;lt; n^{n^2}&amp;lt;/tex&amp;gt; циклов.му входящих и на единицу сумму исходящих степеней. Таким образом, сумма входящих и исходящих степеней всех вершин ориентированного графа чётна и равна удвоенному числу рёбер.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Преобразование графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; можно выполнить за полином от количества вершин. Таким образом, если &amp;lt;tex&amp;gt;\#CYCLE \in FP&amp;lt;/tex&amp;gt;, тогда сразу же &amp;lt;tex&amp;gt;HAM \in P&amp;lt;/tex&amp;gt;. А так как&amp;lt;tex&amp;gt; HAM \in NP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;NP = P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Класс #P-Complete==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;f : \{0, 1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной, если &amp;lt;tex&amp;gt; f  \in \#P&amp;lt;/tex&amp;gt;  и получение для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; алгоритма работающего за полиномиальное время влечет равенство &amp;lt;tex&amp;gt; \#P=FP&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для более формального определения будем использовать МТ с оракулом &amp;lt;tex&amp;gt; O = \{\big \langle x, i \big \rangle: f(x)_i = 1\}&amp;lt;/tex&amp;gt; для нашей функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Для нашего типа задач оракул будет отвечать на вопросы вида &amp;quot;Принадлежит ли слово &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; языку &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt;?&amp;quot; за один шаг МТ. Для функции &amp;lt;tex&amp;gt;f = \{0,1\}^* \rightarrow  \{0, 1\}^*&amp;lt;/tex&amp;gt; будем называть &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt; множество функций, вычислимых за полиномиальное время на МТ с оракулом для функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;f - \#P&amp;lt;/tex&amp;gt;-полная, если &amp;lt;tex&amp;gt;f \in \#P&amp;lt;/tex&amp;gt; и  любая &amp;lt;tex&amp;gt;g \in \#P&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;FP^f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f \in FP &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;FP=FP^f&amp;lt;/tex&amp;gt;. Получаем, что, если &amp;lt;tex&amp;gt;f -  \#P&amp;lt;/tex&amp;gt;-полная и  &amp;lt;tex&amp;gt;f \in FP&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;FP=\#P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для множества языков из &amp;lt;tex&amp;gt;NP&amp;lt;/tex&amp;gt; (таких как &amp;lt;tex&amp;gt;3SAT, CLIQUE, Ham &amp;lt;/tex&amp;gt;) существуют их версии из &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;. См. &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры #P-полных задач ==&lt;br /&gt;
Многие задачи из класса &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полных получаются из задач разрешимости из класса &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;  за счет требования подсчета всевозможных удовлетворяющих наборов входных значений.&lt;br /&gt;
*[[#SAT]]&lt;br /&gt;
*Посчитать количество возможных подстановок, для которых заданная в ДНФ формула будет удовлетворена. &lt;br /&gt;
*Посчитать количество полных паросочетаний в данном двудольном графе. &lt;br /&gt;
*&amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;Вычислить значение перманента матрицы, заполненной нулями и единицами.&lt;br /&gt;
*Посчитать количество способов раскрасить заданный граф в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Задача вычисления перманента матрицы, заполненной нулями и единицами является &amp;lt;tex&amp;gt;\#P-&amp;lt;/tex&amp;gt;полной.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
{{Определение&lt;br /&gt;
 |definition =Перманентом матрицы А размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt; называется&amp;lt;tex&amp;gt;perm(A) = \sum\limits_{\sigma \in S_n} \prod\limits^n_{i =1}A_{i\sigma(i)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n -&amp;lt;/tex&amp;gt; множество всех перестановок из n элементов. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Задача вычисления перманента матрицы, элементы которой принадлежат множеству &amp;lt;tex&amp;gt;\{0,1\}&amp;lt;/tex&amp;gt; может быть сведена к задаче подсчета числа совершенных паросочетаний в двудольном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;X = \{x_1, …, x_n\}, \, Y = \{y_1, …, y_n\}, \,  \{x_i, y_j\} \in V(G) \iff A_{i, j} = 1&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;\prod\limits^n_{i =1}A_{i\sigma(i)} = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; является совершенным паросочетанием. В таком случае, &amp;lt;tex&amp;gt;perm(A)&amp;lt;/tex&amp;gt; равен числу совершенных паросочетаний в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Нам известно, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной. Аналогично задачам &amp;lt;tex&amp;gt;SAT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; мы можем сказать, что задача &amp;lt;tex&amp;gt;\#SAT&amp;lt;/tex&amp;gt;может быть сведена к задаче &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt;, которая также будет &amp;lt;tex&amp;gt;\#P&amp;lt;/tex&amp;gt;-полной.&lt;br /&gt;
&lt;br /&gt;
Сведем задачу  &amp;lt;tex&amp;gt;\#3SAT&amp;lt;/tex&amp;gt; к задаче &amp;lt;tex&amp;gt;perm&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По данной формуле &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменными и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; &amp;quot;клозами&amp;quot; построим целочисленную матрицу &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\#\phi -&amp;lt;/tex&amp;gt; количество удовлетворяющих постановок для &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
Основная идея заключается в том, что наше построение будет приводить к существованию в соответствующем двудольном графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; циклов двух видов: тех, которые соответствуют удовлетворяющим назначениям, и тех, которые не соответствуют. Покажем, что любое удовлетворяющее назначение добавляет &amp;lt;tex&amp;gt;4^m&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;perm(A')&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;perm(A')=4^m\cdot(\#\phi)&amp;lt;/tex&amp;gt;.  Для построения графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; будем использовать три вида блоков.&lt;br /&gt;
&lt;br /&gt;
'''Блок переменной'''. Блок каждой переменной имеет два цикла положительного веса, соответствующие присвоению 0 и 1 данной переменной. Присвоение 1 соответствует циклу, содержащему все &amp;quot;внешние&amp;quot; ребра, присвоение 0 соответствует циклу, включающему ребра-петли. Каждое внешнее ребро ассоциировано с одним клозом, в котором присутствует данная переменная.&lt;br /&gt;
&lt;br /&gt;
'''Блок клоза'''. Любой цикл для данного блока не содержит в себе как минимум одно внешнее ребро. И для любого подмножества внешних ребер (за исключением набора из всех ребер)  существует цикл веса 1. Каждое внешнее ребро ассоциировано с одной переменной, присутствующей в рассматриваемом клозе.&lt;br /&gt;
&lt;br /&gt;
'''Блок &amp;lt;tex&amp;gt;XOR&amp;lt;/tex&amp;gt;'''. Цель данного клоза - убедиться, что для произвольной пары ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; ровно одно присутствует в любом из покрытий циклами, учитывающие в итоговой сумме. Допустим, мы заменяем пару ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt; на блок XOR. Каждый цикл в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, проходящий через ровно одно из ребер &amp;lt;tex&amp;gt;uu'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;vv'&amp;lt;/tex&amp;gt;, превращается в набор циклов в графе &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; общим весом &amp;lt;tex&amp;gt;4w&amp;lt;/tex&amp;gt; : вклад дает набор циклов, которые заходят в блок через &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;u'&amp;lt;/tex&amp;gt; или заходят через &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и выходят через &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, вес остальных циклов в сумме равняется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и при дальнейшем подсчете мы можем их не учитывать. Блок &amp;lt;tex&amp;gt;XOR&amp;lt;/tex&amp;gt;'a соединяет блоки переменных с соответствующими блоками клозов так, чтобы вклад в общую сумму вносили только те циклы, которые соответствуют удовлетворяющим назначениям. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим клоз и переменную внутри него. Рассмотрим внешние ребра соответствующих блоков и соединим их при помощи &amp;lt;tex&amp;gt;XOR&amp;lt;/tex&amp;gt;-блока. Теперь если при построении цикла мы не проходим через внешнее ребро клоза, то мы гарантированно проходим по внешнему ребру переменной, что аналогично присвоению переменной значения true. Так как хотя бы одно ребро в каждом блоке клоза будет пропущено, то каждый цикл, который мы учитываем соответствует удовлетворяющему назначению. А для каждого удовлетворяющего назначения существует множество циклов суммарным весом &amp;lt;tex&amp;gt;4^{3m}&amp;lt;/tex&amp;gt;, так как они проходят через блоки &amp;lt;tex&amp;gt;XOR&amp;lt;/tex&amp;gt; ровно &amp;lt;tex&amp;gt;3m&amp;lt;/tex&amp;gt; раз. Таким образом &amp;lt;tex&amp;gt;perm(G') = 4^{3m}\#\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь сведем полученную матрицу к 0,1-матрице. Для начала изменим веса ребер так, чтобы были равны &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt;. Заметим, что замена ребра веса &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; параллельных ребер веса &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; не меняет перманента матрицы смежности. В графе не допускаются параллельные ребра, но мы можем сделать их допустимыми, если разобьем каждое из них на два, добавив новые вершины. Чтобы избавиться от ребер с отрицательным весом, заметим, что перманент графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с весами ребер равными &amp;lt;tex&amp;gt;\pm1&amp;lt;/tex&amp;gt; равен числу из отрезка &amp;lt;tex&amp;gt;[-n!, \, n!]&amp;lt;/tex&amp;gt; и может быть вычислен как &amp;lt;tex&amp;gt;y = x \,  ( mod \, 2^{m+1})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; достаточно большое (например, &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;. Для того, чтобы вычислить &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; достаточно посчитать перманент графа, где все ребра веса &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt; заменены на ребра веса &amp;lt;tex&amp;gt;2^m&amp;lt;/tex&amp;gt;. Эти ребра могут быть заменены на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ребер весом &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, которые можно разбить на двойки параллельных ребер весом &amp;lt;tex&amp;gt;+1&amp;lt;/tex&amp;gt;, как на предыдущем шаге.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Variable_block.png&amp;diff=60656</id>
		<title>Файл:Variable block.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Variable_block.png&amp;diff=60656"/>
				<updated>2017-04-20T13:14:02Z</updated>
		
		<summary type="html">&lt;p&gt;Veda: загружена новая версия «Файл:Variable block.png»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;блок переменной&lt;/div&gt;</summary>
		<author><name>Veda</name></author>	</entry>

	</feed>