<?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=Kirelagin</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=Kirelagin"/>
		<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/Kirelagin"/>
		<updated>2026-05-19T18:04:42Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=69871</id>
		<title>Формальные грамматики</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=69871"/>
				<updated>2019-02-15T23:48:52Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: /* Определения */ В правилах слева могут быть и терминалы&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Определения ==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = &lt;br /&gt;
'''Формальная грамматика'''  (англ. ''Formal grammar'') — способ описания формального языка, представляющий собой четверку&lt;br /&gt;
&amp;lt;tex&amp;gt;\Gamma =\langle \Sigma, N, S \in N, P \subset ((\Sigma \cup N)^* N (\Sigma \cup N)^*) \times (\Sigma\cup N)^{*}\rangle&amp;lt;/tex&amp;gt;, где:&lt;br /&gt;
* &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt; — [[Основные_определения: алфавит, слово, язык, конкатенация, свободный моноид слов|алфавит]], элементы которого называют '''терминалами''' (англ. ''terminals'');&lt;br /&gt;
* &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; — множество, элементы которого называют '''нетерминалами''' (англ. ''nonterminals'');&lt;br /&gt;
* &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; — начальный символ грамматики (англ. ''start symbol'');&lt;br /&gt;
* &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; — набор правил вывода (англ. ''production rules'' или ''productions'')       &amp;lt;tex&amp;gt;\alpha\rightarrow \beta&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''&amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt; выводится из &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; за один шаг''' &amp;lt;tex&amp;gt;(\alpha \Rightarrow \beta)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
# &amp;lt;tex&amp;gt;\alpha=\alpha_1\alpha_2\alpha_3&amp;lt;/tex&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt;\beta=\beta_1\beta_2\beta_3&amp;lt;/tex&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt;\alpha_1=\beta_1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\alpha_3=\beta_3&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\alpha_2\rightarrow\beta_2 \in P&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''&amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt; выводится из &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; за ноль или более шагов''' &amp;lt;tex&amp;gt;(\alpha \Rightarrow^* \beta)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&amp;lt;tex&amp;gt;\exists \gamma_1, \gamma_2, \ldots,\gamma_n : \alpha \Rightarrow \gamma_1 \Rightarrow \gamma_2 \Rightarrow  \ldots \Rightarrow \gamma_n \Rightarrow \beta&amp;lt;/tex&amp;gt; ([[Транзитивное замыкание | Рефлексивно-транзитивное замыкание]] отношения &amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt;).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
  '''Языком грамматики''' (англ. ''Language of grammar'')        называется &amp;lt;tex&amp;gt;L(\Gamma) = \{\omega \in \Sigma^{*} \mid S \Rightarrow^{*}\omega\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=sform&lt;br /&gt;
|definition = &lt;br /&gt;
'''Сентенциальная форма''' (англ. ''Sentential form'')  — последовательность терминалов и нетерминалов, выводимых из начального символа. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Обозначения ==&lt;br /&gt;
* Нетерминалы обозначаются заглавными буквами латинского алфавита (например: &amp;lt;tex&amp;gt;A, B, C&amp;lt;/tex&amp;gt;).&lt;br /&gt;
* Терминалы обозначаются строчными буквами из начала латинского алфавита (например: &amp;lt;tex&amp;gt;a, b, c&amp;lt;/tex&amp;gt;).&lt;br /&gt;
* Последовательности из терминалов (слова) обозначают строчными буквами из конца латинского или греческого алфавита (например: &amp;lt;tex&amp;gt;\omega&amp;lt;/tex&amp;gt;).&amp;lt;br/&amp;gt;&lt;br /&gt;
* Последовательности из терминалов и нетерминалов обозначаются строчными буквами из начала греческого алфавита (например: &amp;lt;tex&amp;gt;\beta, \alpha&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==Примеры грамматик==&lt;br /&gt;
===Правильные скобочные последовательности===&lt;br /&gt;
&amp;lt;tex&amp;gt;\Sigma = \{(, )\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\begin{array}{lcr}&lt;br /&gt;
S \to (S) \\&lt;br /&gt;
S \to SS \\&lt;br /&gt;
S \to \varepsilon&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вывод строки &amp;lt;tex&amp;gt;(()())&amp;lt;/tex&amp;gt;:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;S\Rightarrow(\boldsymbol{S})\Rightarrow(\boldsymbol{S}S)\Rightarrow((S)\boldsymbol{S})\Rightarrow((\boldsymbol{S})(S))\Rightarrow(()(\boldsymbol{S}))\Rightarrow(()())&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вывод строки &amp;lt;tex&amp;gt;((()())(()))&amp;lt;/tex&amp;gt;:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;S\Rightarrow(\boldsymbol{S})\Rightarrow(\boldsymbol{S}S)\rightarrow((S)\boldsymbol{S})\rightarrow((\boldsymbol{S})(S))\rightarrow&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;\rightarrow((\boldsymbol{S}S)((S)))\rightarrow (((\boldsymbol{S})S)((S))) \rightarrow ((()\boldsymbol{S})((S)))\rightarrow&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;\rightarrow((()(\boldsymbol{S}))((S)))\rightarrow ((()())((\boldsymbol{S})))\rightarrow ((()())(()))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Арифметические выражения===&lt;br /&gt;
&amp;lt;tex&amp;gt;\Sigma = \{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, *, /, -, (, )\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\begin{array}{lcr}&lt;br /&gt;
S \rightarrow S O S\\&lt;br /&gt;
S \rightarrow (S)\\&lt;br /&gt;
S \rightarrow 0\\&lt;br /&gt;
S \rightarrow DN\\&lt;br /&gt;
O \rightarrow +  \mid -  \mid *  \mid /\\&lt;br /&gt;
D \rightarrow 1  \mid 2  \mid 3  \mid 4  \mid 5  \mid 6  \mid 7  \mid 8  \mid 9\\&lt;br /&gt;
N \rightarrow NN  \mid \varepsilon\\&lt;br /&gt;
N \rightarrow 0  \mid 1  \mid 2  \mid 3  \mid 4  \mid 5  \mid 6  \mid 7  \mid 8  \mid 9.&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вывод строки &amp;lt;tex&amp;gt;2+2*2&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;S \Rightarrow SO\boldsymbol{S} \Rightarrow \boldsymbol{S} OSOS \Rightarrow 2O \boldsymbol{S} OS \Rightarrow 2O2O \boldsymbol{S} \Rightarrow 2 \boldsymbol{O} 2O2 \Rightarrow 2+2\boldsymbol{O}2 \Rightarrow 2+2*2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|Левосторонний вывод]] этой же строки: &amp;lt;tex&amp;gt;S \Rightarrow \boldsymbol{S}OS \Rightarrow 2\boldsymbol{O}S \Rightarrow 2+\boldsymbol{S} \Rightarrow 2+\boldsymbol{S}OS \Rightarrow 2+2\boldsymbol{O}S \Rightarrow  2+2*\boldsymbol{S} \Rightarrow  2+2*2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Язык &amp;lt;tex&amp;gt;0^n1^n2^n&amp;lt;/tex&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Данный язык является [[Иерархия Хомского формальных грамматик#Класс 1 |контекстно-зависимым]]. КЗ-грамматика для языка приведена ниже, а через [[Лемма о разрастании для КС-грамматик#Пример доказательства неконтекстно-свободности языка с использованием леммы | лемму о разрастании]] доказывается его неконтекстно-свободность. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Sigma = \{0, 1, 2\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S \rightarrow 012 \\&lt;br /&gt;
S \rightarrow 0TS2 \\&lt;br /&gt;
T0 \rightarrow 0T \\ &lt;br /&gt;
T1 \rightarrow 11 &lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вывод строки &amp;lt;tex&amp;gt;000111222&amp;lt;/tex&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;S \Rightarrow 0T\boldsymbol{S} 2 \Rightarrow 0T0T\boldsymbol{S}22 \Rightarrow 0T\boldsymbol{0T}01222 \Rightarrow  0\boldsymbol{T0}0T1222 \Rightarrow 00\boldsymbol{T0}T1222 \Rightarrow 000T\boldsymbol{T1}222 \Rightarrow 000\boldsymbol{T1}1222 \Rightarrow 000111222&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Данная грамматика описывает этот язык, так как мы можем вывести любую строку одним методом. &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; раз выполняем правило вывода &amp;lt;tex&amp;gt;S \rightarrow 0TS2 &amp;lt;/tex&amp;gt;. Потом выполняем правило &amp;lt;tex&amp;gt;S \rightarrow 012 &amp;lt;/tex&amp;gt;,  &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; раз выполняем &amp;lt;tex&amp;gt;T0 \rightarrow 0T &amp;lt;/tex&amp;gt;. После этого у нас получается строка &amp;lt;tex&amp;gt;0^nT^{n-1}2^n&amp;lt;/tex&amp;gt;. Выполняем &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;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;
== Источники информации==&lt;br /&gt;
* [[wikipedia:Formal_grammar | Wikipedia {{---}} Formal grammar]]&lt;br /&gt;
* [[wikipedia:Formal_language_theory | Wikipedia {{---}} Formal language]]&lt;br /&gt;
* ''Хопкрофт Д., Мотвани Р., Ульман Д.'' — Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Контекстно-свободные грамматики]]&lt;br /&gt;
[[Категория: Базовые понятия о грамматиках]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9B%D1%8F%D0%BC%D0%B1%D0%B4%D0%B0-%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=55384</id>
		<title>Лямбда-исчисление</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9B%D1%8F%D0%BC%D0%B1%D0%B4%D0%B0-%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=55384"/>
				<updated>2016-09-12T13:18:22Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{nohate}}&lt;br /&gt;
'''Лямбда-исчисление''' (''англ. lambda calculus'') {{---}} формальная система, придуманная в 1930-х годах &lt;br /&gt;
Алонзо Чёрчем. Лямбда-функция является, по сути, анонимной функцией.&lt;br /&gt;
Эта концепция показала себя удобной и сейчас активно используется во многих&lt;br /&gt;
языках программирования.&lt;br /&gt;
&lt;br /&gt;
== Лямбда-исчисление==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Лямбда-выражением''' (англ. &amp;lt;tex&amp;gt;\lambda&amp;lt;/tex&amp;gt;''-term'') называется выражение, удовлетворяющее следующей грамматике:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
\Lambda \to V\\&lt;br /&gt;
\Lambda \to \Lambda \ \Lambda\\&lt;br /&gt;
\Lambda \to \lambda V . \Lambda&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; {{---}} множество всех строк над фиксированным алфавитом &amp;lt;tex&amp;gt; \Sigma \setminus \{ &amp;quot;\lambda&amp;quot;, &amp;quot;\ &amp;quot;,\ &amp;quot;.&amp;quot;\} &amp;lt;/tex&amp;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;
создание функции одного аргумента с заданными именем аргумента и телом функции.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим, например, &amp;lt;tex&amp;gt;\lambda&amp;lt;/tex&amp;gt;-терм &amp;lt;tex&amp;gt;\operatorname{id} = \lambda x\ .\ x&amp;lt;/tex&amp;gt;. Эта функция принимает аргумент и &lt;br /&gt;
возвращает его неизменённым. Например, &lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{id}\ 2 \equiv 2&amp;lt;/tex&amp;gt;. Аналогично, &amp;lt;tex&amp;gt;\operatorname{id}\ y \equiv y&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Еще примеры:&lt;br /&gt;
:&amp;lt;tex&amp;gt;&lt;br /&gt;
x\\&lt;br /&gt;
(x\ z)\\&lt;br /&gt;
(\lambda x.(x\ z))\\&lt;br /&gt;
(\lambda z.(\lambda w.((\lambda y.((\lambda x.(x\ z))\ y))\ w)))\\&lt;br /&gt;
 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Иногда &amp;lt;tex&amp;gt;\lambda&amp;lt;/tex&amp;gt; -термы пишут по другому. Для краткости подряд идущие лямбды заменяют на одну. Например:&lt;br /&gt;
:&amp;lt;tex&amp;gt;\lambda x\ .\ \lambda y\ .P\ \to\ \lambda xy.P&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===Приоритет операций===&lt;br /&gt;
* Аппликация: &amp;lt;tex&amp;gt;x\ y\ z\ w \equiv ((x\ y)\ z)\ w&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Абстракция забирает себе всё, до чего дотянется: &amp;lt;tex&amp;gt;\lambda x\ .\ \lambda y\ .\ \lambda z\ .\ z\ y\ x \equiv \lambda x\ .\ (\lambda y\ .\ (\lambda z\ .\ ((z\ y)\ x)))&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Скобки играют привычную роль группировки действий&lt;br /&gt;
&lt;br /&gt;
===Свободные и связанные переменные===&lt;br /&gt;
''Связанными'' переменными называются все переменные, по которым выше в &lt;br /&gt;
дереве разбора были абстракции. Все остальные переменные называются свободными.&lt;br /&gt;
&lt;br /&gt;
Например, в &amp;lt;tex&amp;gt;\lambda x\ .\ \lambda y\ .\ x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; связана, а &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;{{---}} свободна. А в &amp;lt;tex&amp;gt;\lambda y\ .\ x\ (\lambda x\ .\ x)&amp;lt;/tex&amp;gt;&lt;br /&gt;
в своём первом вхождении переменная &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; свободна, а во втором {{---}} связана.&lt;br /&gt;
&lt;br /&gt;
Связанные переменные {{---}} это аргументы функции. То есть для функции они являются локальными.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим функции &amp;lt;tex&amp;gt;\lambda y\ .\ y&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\lambda x\ .\ y&amp;lt;/tex&amp;gt;. В первой из них при взгляде на &amp;lt;tex&amp;gt;y&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;\lambda x\ .\ \lambda x\ .\ \lambda y\ .\ \lambda x\ .\ x&amp;lt;/tex&amp;gt;, переменная &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; связана с самой правой абстракцией &lt;br /&gt;
по &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===α-эквивалетность===&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''&amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt;-эквивалетностью''' (англ. ''&amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; -equivalence'') {{---}} называется наименьшее соотношение эквивалентности на &amp;lt;tex&amp;gt;\Lambda&amp;lt;/tex&amp;gt; такое что:&lt;br /&gt;
:&amp;lt;tex&amp;gt;P=_\alpha P&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;&lt;br /&gt;
:&amp;lt;tex&amp;gt;\lambda x.P=_\alpha \lambda y.P[x:=y]&amp;lt;/tex&amp;gt; если &amp;lt;tex&amp;gt;y \not\in FV(P)&amp;lt;/tex&amp;gt;&lt;br /&gt;
и замкнуто относительно следующих правил:&lt;br /&gt;
:&amp;lt;tex&amp;gt; P=_\alpha P' \Rightarrow \forall x \in V: \lambda x.P=_\alpha \lambda x.P'\\&lt;br /&gt;
P=_\alpha P' \Rightarrow \forall Z \in \Lambda : P Z =_\alpha P'Z\\&lt;br /&gt;
P=_\alpha P' \Rightarrow \forall Z \in \Lambda : Z P =_\alpha Z P'\\&lt;br /&gt;
P=_\alpha P' \Rightarrow P'=_\alpha P\\&lt;br /&gt;
P=_\alpha P' \ \&amp;amp; \ P'=_\alpha P'' \Rightarrow P=_\alpha P''\\&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Функции &amp;lt;tex&amp;gt;\lambda x\ .\ \lambda y\ .\ x\ y\ z&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\lambda a\ .\ \lambda x\ .\ a\ x\ z&amp;lt;/tex&amp;gt; являются &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt;-эквивалентными,&lt;br /&gt;
а &amp;lt;tex&amp;gt;\lambda x\ .\ \lambda y\ .\ y\ z&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\lambda y\ .\ \lambda x\ .\ y\ z&amp;lt;/tex&amp;gt; {{---}} нет.&lt;br /&gt;
&lt;br /&gt;
===β-редукция===&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''&amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;-редукция''' (англ. ''&amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt; -reduction'') это наименьшее соотношение на &amp;lt;tex&amp;gt;\Lambda&amp;lt;/tex&amp;gt; такое что&lt;br /&gt;
:&amp;lt;tex&amp;gt;(\lambda x.P)Q\to _\beta P[x:=Q]&amp;lt;/tex&amp;gt;&lt;br /&gt;
и замкнуто относительно следующих правил&lt;br /&gt;
:&amp;lt;tex&amp;gt;P\to _\beta P' \Rightarrow \forall x\in V:\lambda x.P\to _\beta \lambda x.P'\\&lt;br /&gt;
P\to _\beta P' \Rightarrow \forall Z\in \Lambda : P\ Z\to _\beta P'\ Z\\&lt;br /&gt;
P\to _\beta P' \Rightarrow \forall Z\in \Lambda : Z\ P\to _\beta Z\ P'&amp;lt;/tex&amp;gt; &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Через &amp;lt;tex&amp;gt;f \to_\beta g&amp;lt;/tex&amp;gt; обозначают сведение &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;g&amp;lt;/tex&amp;gt; с помощью одной &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;-редукции.&lt;br /&gt;
А через &amp;lt;tex&amp;gt;f \to_\beta^* g&amp;lt;/tex&amp;gt; {{---}} за ноль или более.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
В &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;-редукции вполне возможна функция вида &amp;lt;tex&amp;gt;\lambda x. \lambda x.x&amp;lt;/tex&amp;gt;. Во время подстановки вместо &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; внутренняя переменная не заменяется - действует принцип локальной переменной. Но принято считать, что таких ситуаций не возникает и все переменные называются разными именами. &lt;br /&gt;
&lt;br /&gt;
===Каррирование===&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Каррирование''' (англ. ''carrying'') {{---}} преобразование функции от многих переменных в функцию, берущую свои аргументы по одному. Для функции &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; типа &amp;lt;tex&amp;gt;h\ :\ (A\ *\ B)\ \to\ C&amp;lt;/tex&amp;gt; оператор каррирования &amp;lt;tex&amp;gt;\Lambda &amp;lt;/tex&amp;gt; выполняет преобразование &amp;lt;tex&amp;gt;\Lambda (h)\ :\ A\to (B\to C)&amp;lt;/tex&amp;gt;. Таким образом &amp;lt;tex&amp;gt;\Lambda (h)&amp;lt;/tex&amp;gt; берет аргумент типа &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и возвращает функцию типа &amp;lt;tex&amp;gt;B\ \to\ C&amp;lt;/tex&amp;gt;. С интуитивной точки зрения, каррирование функции позволяет фиксировать ее некоторый аргумент, возвращая функцию от остальных аргументов. Таким образом, &amp;lt;tex&amp;gt;\Lambda&amp;lt;/tex&amp;gt; представляет собой функцию типа &amp;lt;tex&amp;gt;\Lambda :\ (A\ *\ B\to C)\to (A\to (B\to C))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Нотация Де Брауна==&lt;br /&gt;
Существует также альтернативное эквивалентное определение &amp;lt;tex&amp;gt;\lambda&amp;lt;/tex&amp;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;
связана. В данной нотации получаются несколько более простые определения &lt;br /&gt;
свободных переменных и &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;-редукции. &lt;br /&gt;
&lt;br /&gt;
Грамматику нотации можно задать как:&lt;br /&gt;
:&amp;lt;tex&amp;gt;e\ ::= n\ |\ \lambda .e\ |\ e\ e&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примеры выражений в этой нотации:&lt;br /&gt;
:&amp;lt;tex&amp;gt;&lt;br /&gt;
\begin{tabular}{cc}&lt;br /&gt;
Standart &amp;amp; de Bruijn \\&lt;br /&gt;
$\lambda x.x$ &amp;amp; $\lambda .0$ \\&lt;br /&gt;
$\lambda z.z$ &amp;amp; $\lambda .0$ \\&lt;br /&gt;
$\lambda x. \lambda y.x$ &amp;amp; $\lambda . \lambda .1$\\&lt;br /&gt;
$\lambda x. \lambda y. \lambda s. \lambda z.x\ s\ (y\ s\ z)$ &amp;amp; $\lambda . \lambda . \lambda . \lambda .3\ 1(2\ 1\ 0)$\\&lt;br /&gt;
$(\lambda x.x\ x)(\lambda x.x\ x)$ &amp;amp; $(\lambda .0\ 0)(\lambda .0\ 0)$\\&lt;br /&gt;
$(\lambda x. \lambda x.x)(\lambda y.y)$ &amp;amp; $(\lambda .\lambda .0)(\lambda .0)$\\&lt;br /&gt;
\end{tabular}&lt;br /&gt;
&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;\beta&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;\lambda&amp;lt;/tex&amp;gt;-исчислении==&lt;br /&gt;
&lt;br /&gt;
===Определение===&lt;br /&gt;
Введём на основе лямбда-исчисления аналог натуральных чисел, основанный на идее, &lt;br /&gt;
что натуральное число {{---}} это или ноль, или увеличенное на единицу натуральное &lt;br /&gt;
число.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\bar 0 = \lambda s\ .\ \lambda z\ .\ z&amp;lt;/tex&amp;gt;&lt;br /&gt;
:&amp;lt;tex&amp;gt;\bar 1 = \lambda s\ .\ \lambda z\ .\ s\ z&amp;lt;/tex&amp;gt;&lt;br /&gt;
:&amp;lt;tex&amp;gt;\bar 2 = \lambda s\ .\ \lambda z\ .\ s\ (s\ z)&amp;lt;/tex&amp;gt;&lt;br /&gt;
:&amp;lt;tex&amp;gt;\bar 3 = \lambda s\ .\ \lambda z\ .\ s\ (s\ (s\ z))&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждое число будет функцией двух аргументов: какой-то функции и начального значения.&lt;br /&gt;
Число &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; будет &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; раз применять функцию к начальному значению и возвращать &lt;br /&gt;
результат. Если такому &amp;quot;числу&amp;quot; дать на вход функцию &amp;lt;tex&amp;gt;(+1)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; в качестве &lt;br /&gt;
начального значения, то на выходе как раз будет ожидаемое от функции число:&lt;br /&gt;
&amp;lt;tex&amp;gt;\bar 3\ (+1)\ 0 \equiv 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===+1===&lt;br /&gt;
Функция, прибавляющая 1 к числу, должна принимать первым аргументом число.&lt;br /&gt;
Но число {{---}} функция двух аргументов. Значит, эта функция должна принимать три&lt;br /&gt;
аргумента: &amp;quot;число&amp;quot; &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, которое хочется увеличить, функция, которую надо будет&lt;br /&gt;
&amp;lt;tex&amp;gt;n+1&amp;lt;/tex&amp;gt; раз применить, и начальное значение.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{succ} = \lambda n\ .\ \lambda s\ .\ \lambda z\ .\ s\ (n\ s\ z)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;tex&amp;gt;n\ s\ z&amp;lt;/tex&amp;gt; {{---}} &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; раз применённая к &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt; функция &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Но нужно применить &amp;lt;tex&amp;gt;n+1&amp;lt;/tex&amp;gt; &lt;br /&gt;
раз. Отсюда &amp;lt;tex&amp;gt;s\ (n\ s\ z)&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;\operatorname{plus} = \lambda n\ .\ \lambda m\ .\ \lambda s\ .\ \lambda z\ .\ n\ s\ (m\ s\ z)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; раз применить &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; к применённому &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; раз &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(\operatorname{plus}\ \bar 3\ \bar 3)\ (+1)\ 0 \equiv 6&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(\operatorname{plus}\ ((\operatorname{plus}\ 2\ 5)(+1)\ 0)\ 4)(+1)0 \equiv 11&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;s&amp;lt;/tex&amp;gt;, а функция, применяющая &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; раз &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{mult} = \lambda n\ .\ \lambda m\ .\ \lambda s\ .\ \lambda z\ .\ n\ (m\ s)\ z&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;tex&amp;gt;m\ s&amp;lt;/tex&amp;gt; {{---}} функция, которая &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; раз применит &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; к тому, что дадут ей на &lt;br /&gt;
вход. С помощью &amp;lt;tex&amp;gt;\eta&amp;lt;/tex&amp;gt;-редукции можно немного сократить эту формулу&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{mult} = \lambda n\ .\ \lambda m\ .\ \lambda s\ .\ n\ (m\ s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(\operatorname{mult} \bar 3\ \bar 3)\ (+1)\ 0 \equiv 9&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Возведение в степень===&lt;br /&gt;
It's a kind of magic&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{power} = \lambda n\ .\ \lambda m\ .\ \lambda s\ .\ \lambda z\ .\ m\ n\ s\ z&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(\operatorname{power}\ \bar 3\ (\operatorname{succ}\ \bar 3))\ (+1)\ 0 \equiv 81&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Логические значения===&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{true} = \lambda a\ .\ \lambda b\ .\ a&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{false} = \lambda a\ .\ \lambda b\ .\ b&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функции двух аргументов, возвращающие первый и второй, соответственное, аргументы.&lt;br /&gt;
Забавный факт: &amp;lt;tex&amp;gt;\operatorname{false} \equiv_\alpha \operatorname{zero}&amp;lt;/tex&amp;gt;. Эти функции сделаны такими для того, &lt;br /&gt;
чтобы красиво написать функцию &amp;lt;tex&amp;gt;\operatorname{if}&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{if} = \lambda p\ .\ \lambda t\ .\ \lambda e\ .\ p\ t\ e&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если ей в качестве первого аргумента дадут &amp;lt;tex&amp;gt;\operatorname{true}&amp;lt;/tex&amp;gt;, то вернётся &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, иначе {{---}} &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Стандартные функции булевой логики:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{and} = \lambda n\ .\ \lambda m\ .\ \operatorname{if}\ n\ m\ \operatorname{false}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{or} = \lambda n\ .\ \lambda m\ .\ \operatorname{if}\ n\ \operatorname{true} \  m&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{not} = \lambda b\ .\ \operatorname{if}\ b\ \operatorname{false} \ \operatorname{true}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ещё одной важной функцией является функция проверки, является ли число нулём:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{isZero} = \lambda n\ .\ n\ (\lambda c\ .\ \operatorname{false})\ \operatorname{true}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функция выглядит несколько странно. &amp;lt;tex&amp;gt;\lambda c \to \operatorname{false}&amp;lt;/tex&amp;gt; - функция, которая независимо&lt;br /&gt;
от того, что ей дали на вход, возвращает &amp;lt;tex&amp;gt;\operatorname{false}&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;\operatorname{true}&amp;lt;/tex&amp;gt;. Иначе же функция будет запущено, и &lt;br /&gt;
вернётся &amp;lt;tex&amp;gt;\operatorname{false}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Пара===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{pair} = \lambda a\ .\ \lambda b\ .\ \lambda t\ .\ t\ a\ b&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{fst} = \lambda p\ .\ p\ \operatorname{true}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{snd} = \lambda p\ .\ p\ \operatorname{false}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функция &amp;lt;tex&amp;gt;\operatorname{pair}&amp;lt;/tex&amp;gt; принимает два значения и запаковывает их в пару так, чтобы к ним можно было обращаться по &amp;lt;tex&amp;gt;\operatorname{fst}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\operatorname{snd}&amp;lt;/tex&amp;gt;. В &amp;lt;tex&amp;gt;\operatorname{fst}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\operatorname{snd}&amp;lt;/tex&amp;gt; вместо &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\operatorname{pair}&amp;lt;/tex&amp;gt; будет подставлено &amp;lt;tex&amp;gt;\operatorname{true}&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;\operatorname{false}&amp;lt;/tex&amp;gt;, возвращающие, соответственно, первый и второй аргументы, то есть &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;b&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;\operatorname{minus} = \lambda n\ .\ \lambda m\ .\ m\ \operatorname{pred} n&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это то же самое, что &amp;lt;tex&amp;gt;m&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;n&amp;lt;/tex&amp;gt; раз выполним следующее: имея пару &amp;lt;tex&amp;gt;\langle n-1, n-2\rangle&amp;lt;/tex&amp;gt; построим пару &amp;lt;tex&amp;gt;\langle n, n-1\rangle&amp;lt;/tex&amp;gt;. Тогда после &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов во втором элементе пары будет записано число &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt;, которое и хочется получить. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{pred} = \lambda n\ .\ \lambda s\ .\ \lambda z.\ \operatorname{snd}\ (&lt;br /&gt;
   n\ (&lt;br /&gt;
          \lambda p\ .\ \operatorname{pair}\ (s\ (\operatorname{fst} p))\ (\operatorname{fst} p)&lt;br /&gt;
     )\ (\operatorname{pair}\ z\ z))&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;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; считаются, если &amp;lt;tex&amp;gt;a - b = 0 \wedge b - a = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{le} = \lambda n\ .\ \lambda m\ .\ \operatorname{isZero}\ (\operatorname{minus}\ n\ m)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{less} = \lambda n\ .\ \lambda m\ .\ \operatorname{le}\ n\ (\operatorname{pred} m)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{eq} = \lambda n\ .\ \lambda m\ .\ \operatorname{and}\ (\operatorname{isZero}\ (\operatorname{minus}\ n\ m))\ &lt;br /&gt;
(\operatorname{isZero}\ (\operatorname{minus}\ m\ n))&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;\operatorname{fact} = \lambda x\ .\ \operatorname{if}\ (\operatorname{isZero}\ x)\ \bar 1\ (\operatorname{fact}\ (\operatorname{pred}\ x))&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы столкнулись с проблемой. В определении функции &amp;lt;tex&amp;gt;\operatorname{fact}&amp;lt;/tex&amp;gt; используется функция &amp;lt;tex&amp;gt;\operatorname{fact}&amp;lt;/tex&amp;gt;. При формальной замене, получим бесконечную функцию. Можно попытаться решить эту проблему следующим образом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{fact} = (\lambda f\ .\ \lambda x\ .\ \operatorname{if}\ (\operatorname{isZero}\ x)\ \bar 1\ (f\ (\operatorname{pred}\ x)))\ \operatorname{fact}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=''Неподвижной точкой'' лямбда-функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; назовём такую функцию &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, что&lt;br /&gt;
&amp;lt;tex&amp;gt;f\ x \to_\beta^* x&amp;lt;/tex&amp;gt;. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Лямбда исчисление обладаем замечательным свойством: у каждой функции есть неподвижная точка!&lt;br /&gt;
&lt;br /&gt;
Рассмотрим следующую функцию. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{fix} = \lambda f\ .\ (\lambda x\ .\ f\ (x\ x))\ (\lambda x\ .\ f\ (x\ x))&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;tex&amp;gt;\operatorname{fix} \to_\beta^* \lambda f\ .\ f\ ((\lambda x\ .\ f\ (x\ x))\ (\lambda x\ .\ f\ (x\ x)))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Или, что то же самое, &lt;br /&gt;
&amp;lt;tex&amp;gt;\lambda f\ .\ (\lambda x\ .\ f\ (x\ x))\ (\lambda x\ .\ f\ (x\ x)) \to_\beta^*&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\lambda f\ .\ f\ ((\lambda x\ .\ f\ (x\ x))\ (\lambda x\ .\ f\ (x\ x)))&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рассмотрим функцию&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{fact'} = \lambda f\ .\ \lambda x\ .\ \operatorname{if}\ (\operatorname{isZero}\ x)\ \bar 1\ (\operatorname{mult}\ x\ (f\ (\operatorname{pred}\ x)))&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как было показано выше, &amp;lt;tex&amp;gt;\operatorname{fix} f \to_\beta^* f\ (\operatorname{fix} f)&amp;lt;/tex&amp;gt;, то есть, &amp;lt;tex&amp;gt;\operatorname{fix}\ \operatorname{fact'} \to_\beta^* \operatorname{fact}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\operatorname{fact}&amp;lt;/tex&amp;gt; {{---}} искомая функция, считающая факториал.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{fact} = \operatorname{fix}\ \operatorname{fact'}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это даст функцию, которая посчитает факториал числа. Но делать она это будет мееедленно-меееедленно. Для того, чтобы посчитать &amp;lt;tex&amp;gt;5!&amp;lt;/tex&amp;gt; потребовалось сделать 66066 &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;-редукций.&lt;br /&gt;
&lt;br /&gt;
Наиболее известным комбинатором неподвижной точки является &amp;lt;tex&amp;gt;Y&amp;lt;/tex&amp;gt;-комбинатор, введенный известным американским ученым Хаскеллом Карри как&lt;br /&gt;
:&amp;lt;tex&amp;gt;Y\ = \ \lambda f.(\lambda x.f(x\ x))\ (\lambda x.f(x\ x))&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;\operatorname{div'} = \lambda div\ .\ \lambda n\ .\ \lambda m\ .\ \operatorname{if}\ (\operatorname{less}\ n\ m)\ \bar 0\ (\operatorname{succ}\ (div\ (\operatorname{minus}\ n\ m)\ m))&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{div} = \operatorname{fix}\ \operatorname{div'}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И остатка от деления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{mod'} = \lambda mod\ .\ \lambda n\ .\ \lambda m\ .\ \operatorname{if}\ (\operatorname{less}\ n\ m)\ n\ (mod\ (\operatorname{minus}\ n\ m)\ m)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{mod} = \operatorname{fix}\ \operatorname{mod'}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Проверка на простоту===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{isPrimeHelp}&amp;lt;/tex&amp;gt; {{---}} принимает число, которое требуется проверить на простоту и то, на что его надо опытаться поделить, перебирая это от 2 до &amp;lt;tex&amp;gt;p-1&amp;lt;/tex&amp;gt;. Если на что-нибудь разделилось, то число {{---}} составное, иначе {{---}} простое.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{isPrimeHelp'} =&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;\lambda f\ .\ \lambda p\ .\ \lambda i\ .\ \operatorname{if}\ (\operatorname{le}\ p\ i)\ \operatorname{true}\ (\operatorname{if}\ (\operatorname{isZero}\ (\operatorname{mod}\ p\ i))\ \operatorname{false}\ (f\ p\ (\operatorname{succ}\ i)))&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{isPrimeHelp} = \operatorname{fix}\ \operatorname{isPrimeHelp'}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{isPrime} = \lambda p\ .\ \operatorname{isPrimeHelp}\ p\ \bar 2&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующее простое число. &amp;lt;tex&amp;gt;\operatorname{nextPrime'}&amp;lt;/tex&amp;gt; {{---}} следующее, больше либо равное заданного, &amp;lt;tex&amp;gt;\operatorname{nextPrime}&amp;lt;/tex&amp;gt; {{---}} следующее, большее заданного.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{nextPrime''} = \lambda f\ .\ \lambda p\ .\ \operatorname{if}\ (\operatorname{isPrime}\ p)\ p\ (f\ (\operatorname{succ}\ p)) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{nextPrime'} = \operatorname{fix}\ \operatorname{nextPrime'}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{nextPrime} = \lambda p\ .\ \operatorname{nextPrime'}\ (\operatorname{succ}\ p)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{ithPrimeStep}&amp;lt;/tex&amp;gt; пропрыгает &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; простых чисел вперёд. &amp;lt;tex&amp;gt;\operatorname{ithPrime}&amp;lt;/tex&amp;gt; принимает число &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; и пропрыгивает столько простых чисел вперёд, начиная с двойки.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{ithPrimeStep'} = \lambda f\ .\ \lambda p\ .\ \lambda i\ .\ \operatorname{if}\ (\operatorname{isZero}\ i)\ p\ (f\  (\operatorname{nextPrime}\ p)\ (\operatorname{pred}\ i))&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{ithPrimeStep} = \operatorname{fix}\ \operatorname{ithPrimeStep'}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{ithPrime} = \lambda i\ .\ \operatorname{ithPrimeStep}\ \bar 2\ i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...и всего через 314007 &amp;lt;tex&amp;gt;\beta&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;\operatorname{empty}&amp;lt;/tex&amp;gt; {{---}} возвращает пустой список&lt;br /&gt;
* &amp;lt;tex&amp;gt;\operatorname{cons}&amp;lt;/tex&amp;gt; {{---}} принимает первый элемент и оставшийся список, склеивает их&lt;br /&gt;
* &amp;lt;tex&amp;gt;\operatorname{head}&amp;lt;/tex&amp;gt; {{---}} вернуть голову списка&lt;br /&gt;
* &amp;lt;tex&amp;gt;\operatorname{tail}&amp;lt;/tex&amp;gt; {{---}} вернуть хвост списка&lt;br /&gt;
&lt;br /&gt;
Список будем хранить в следующем виде: &amp;lt;tex&amp;gt;\langle len, p_1^{a_1}p_2^{a_2}\ldots p_{len}^{a_{len}} \rangle&amp;lt;/tex&amp;gt;. При этом, голова списка будет храниться как показатель степени при &amp;lt;tex&amp;gt;p_{len}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{empty} = \operatorname{pair}\ \operatorname{zero}\ \bar 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{cons} = \lambda h\ .\ \lambda t\ .\ \operatorname{pair}\ (\operatorname{succ}\ (\operatorname{fst}\ t))\ (\operatorname{mult}\ (\operatorname{snd}\ t)\ (\operatorname{power}\ (\operatorname{ithPrime}\ (\operatorname{fst}\ t))\ h))&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{head} = \lambda list\ .\ \operatorname{getExponent}\ (\operatorname{snd}\ list)\ (\operatorname{ithPrime}\ (\operatorname{pred}\ (\operatorname{fst}\ list)))&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{tail} = \lambda list\ .\ \operatorname{pair}\ (\operatorname{pred}\ (\operatorname{fst}\ list))&lt;br /&gt;
 (\operatorname{eliminateMultiplier}\ (\operatorname{snd}\ list)\ (\operatorname{ithPrime}\ (\operatorname{pred}\ (\operatorname{fst}\ list))))&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{eliminateMultiplier'} =&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; \lambda f\ .\ \lambda n\ .\ \lambda m\ .\ \operatorname{if}\ (\operatorname{isZero}\ (\operatorname{mod}\ n\ m))\ (f\ (\operatorname{div}\ n\ m)\ m)\ n&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{eliminateMultiplier} = \operatorname{fix}\ \operatorname{eliminateMultiplier'}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{getExponent'} =&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; \lambda f\ .\ \lambda n\ .\ \lambda m\ .\ \operatorname{if}\ (\operatorname{isZero}\ (\operatorname{mod}\ n\ m))\ (\operatorname{succ}\ (f\ (\operatorname{div}\ n\ m)\ m))\ \bar 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\operatorname{getExponent} = \operatorname{fix}\ \operatorname{getExponent'}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Выводы==&lt;br /&gt;
&lt;br /&gt;
На основе этого всего уже можно реализовать эмулятор машины тьюринга: с помощью пар, списков чисел можно хранить состояния. С помощью рекурсии можно обрабатывать переходы. Входная строка будет даваться, например, закодированной аналогично списку: пара из длины и числа, характеризующего список степенями простых. Я бы продолжил это писать, но уже на операции &amp;lt;tex&amp;gt;\operatorname{head} [1, 2]&amp;lt;/tex&amp;gt; я не дождался окончания выполнения. Скорость лямбда-исчисления как вычислителя печальна.&lt;br /&gt;
&lt;br /&gt;
==Примеры (слабонервным не смотреть)==&lt;br /&gt;
&lt;br /&gt;
====fact====&lt;br /&gt;
&amp;lt;tex&amp;gt;(\lambda f.(\lambda x.f (x x))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda x.f (x x)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda f.\lambda x.(\lambda p.\lambda t.\lambda e.p t e)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.n (\lambda c.\lambda a.\lambda b.b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (x))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda s.\lambda z.s z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda m.\lambda s.n (m s))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (x)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (f ((\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;(z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) (x)))))&amp;lt;/tex&amp;gt;&lt;br /&gt;
====head====&lt;br /&gt;
&amp;lt;tex&amp;gt;\lambda list.(\lambda f.(\lambda x.f (x x))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda x.f (x x)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda f.\lambda n.\lambda m.(\lambda p.\lambda t.\lambda e.p t e)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.n (\lambda c.\lambda a.\lambda b.b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda f.(\lambda x.f (x x))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda x.f (x x)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda mod.\lambda n.\lambda m.(\lambda p.\lambda t.\lambda e.p t e)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda m.(\lambda n.\lambda m.(\lambda n.n(\lambda c.\lambda a.\lambda b.b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda m.m (\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) n) (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; m)) (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) (m)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; m) n (mod ((\lambda n.\lambda m.m (\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) n) (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; m) m)) n m)) ((\lambda n.\lambda s.\lambda z.s (n s z))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (f ((\lambda f.(\lambda x.f (x x))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda x.f (x x)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda div.\lambda n.\lambda m.(\lambda p.\lambda t.\lambda e.p t e)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda m.(\lambda n.\lambda m.(\lambda n.n (\lambda c.\lambda a.\lambda b.b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda m.m (\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) n) (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; m)) (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) (m)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; m) (\lambda s.\lambda z.z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda s.\lambda z.s (n s z))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (div ((\lambda n.\lambda m.m (\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) n) (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; m) m))) n m) m)) (\lambda s.\lambda z.z))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (list))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda i.(\lambda f.(\lambda x.f (x x))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda x.f (x x)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda f.\lambda p.\lambda i.(\lambda p.\lambda t.\lambda e.p t e)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.n (\lambda c.\lambda a.\lambda b.b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (i))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; p (f ((\lambda p.(\lambda f.(\lambda x.f (x x))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda x.f (x x)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda f.\lambda p.(\lambda p.\lambda t.\lambda e.p t e)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.(\lambda f.(\lambda x.f (x x))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda x.f (x x)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda f.\lambda p.\lambda i.(\lambda p.\lambda t.\lambda e.p t e)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda m.(\lambda n.n (\lambda c.\lambda a.\lambda b.b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda m.m (\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) n) (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; m)) (p)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; i) (\lambda a.\lambda b.a)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.\lambda t.\lambda e.p t e)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.n (\lambda c.\lambda a.\lambda b.b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda f.(\lambda x.f (x x))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda x.f (x x)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda mod.\lambda n.\lambda m.(\lambda p.\lambda t.\lambda e.p t e)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda m.(\lambda n.\lambda m.(\lambda n.n (\lambda c.\lambda a.\lambda b.b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda m.m (\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) n) (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; m)) (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) (m)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; m) n (mod ((\lambda n.\lambda m.m (\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) n) (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; m) m)) p i)) (\lambda a.\lambda b.b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (f p ((\lambda n.\lambda s.\lambda z.s (n s z))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (i)))))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; p (\lambda s.\lambda z.s (s z)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; p (f ((\lambda n.\lambda s.\lambda z.s (n s z))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p))))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda s.\lambda z.s (n s z))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) (i))))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda s.\lambda z.s (s z))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; i) ((\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (list))))&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====tail====&lt;br /&gt;
&amp;lt;tex&amp;gt;\lambda list.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (list)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda f.(\lambda x.f (x x))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda x.f (x x)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda f.\lambda n.\lambda m.(\lambda p.\lambda t.\lambda e.p t e)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.n (\lambda c.\lambda a.\lambda b.b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda f.(\lambda x.f (x x))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda x.f (x x)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda mod.\lambda n.\lambda m.(\lambda p.\lambda t.\lambda e.p t e)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda m.(\lambda n.\lambda m.(\lambda n.n (\lambda c.\lambda a.\lambda b.b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda m.m (\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) n) (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; m)) (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) (m)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; m) n (mod ((\lambda n.\lambda m.m (\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) n) (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; m) m)) n m)) (f ((\lambda f.(\lambda x.f (x x))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda x.f (x x)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda div.\lambda n.\lambda m.(\lambda p.\lambda t.\lambda e.p t e)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda m.(\lambda n.\lambda m.(\lambda n.n (\lambda c.\lambda a.\lambda b.b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda m.m (\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) n) (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; m)) (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) (m)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; m) (\lambda s.\lambda z.z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda s.\lambda z.s (n s z))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (div ((\lambda n.\lambda m.m (\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) n) (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; m) m))) n m) m) n) ((\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (list))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda i.(\lambda f.(\lambda x.f (x x))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda x.f (x x)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda f.\lambda p.\lambda i.(\lambda p.\lambda t.\lambda e.p t e)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.n (\lambda c.\lambda a.\lambda b.b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (i))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; p (f ((\lambda p.(\lambda f.(\lambda x.f (x x))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda x.f (x x)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda f.\lambda p.(\lambda p.\lambda t.\lambda e.p t e)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.(\lambda f.(\lambda x.f (x x))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda x.f (x x)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda f.\lambda p.\lambda i.(\lambda p.\lambda t.\lambda e.p t e)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda m.(\lambda n.n (\lambda c.\lambda a.\lambda b.b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda m.m (\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) n) (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; m)) (p)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; i) (\lambda a.\lambda b.a)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.\lambda t.\lambda e.p t e)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.n (\lambda c.\lambda a.\lambda b.b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda f.(\lambda x.f (x x))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda x.f (x x)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda mod.\lambda n.\lambda m.(\lambda p.\lambda t.\lambda e.p t e)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda m.(\lambda n.\lambda m.(\lambda n.n (\lambda c.\lambda a.\lambda b.b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda m.m (\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) n) (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; m)) (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) (m)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; m) n (mod ((\lambda n.\lambda m.m (\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) n) (n)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; m) m)) p i)) (\lambda a.\lambda b.b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (f p ((\lambda n.\lambda s.\lambda z.s (n s z))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (i)))))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; p (\lambda s.\lambda z.s (s z)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; p (f ((\lambda n.\lambda s.\lambda z.s (n s z))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p))))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda s.\lambda z.s (n s z))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) (i))))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (\lambda s.\lambda z.s (s z))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; i) ((\lambda n.\lambda s.\lambda z.(\lambda p.p (\lambda a.\lambda b.b))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (n (\lambda p.(\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (s ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (p)))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; ((\lambda a.\lambda b.\lambda t.t a b)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (z)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; z))) ((\lambda p.p (\lambda a.\lambda b.a))&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (list)))))&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* Lectures on the Curry Howard - Isomorphism&lt;br /&gt;
*[https://github.com/shd/tt2014 Д. Штукенберг. Лекции]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Lambda-calculus Английская Википедия]&lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%9B%D1%8F%D0%BC%D0%B1%D0%B4%D0%B0-%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5 Русская Википедия]&lt;br /&gt;
*[http://worrydream.com/AlligatorEggs Игра про крокодилов]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Теория вычислимости]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%83%D1%87%D0%B0_%D0%91%D1%80%D0%BE%D0%B4%D0%B0%D0%BB%D0%B0-%D0%9E%D0%BA%D0%B0%D1%81%D0%B0%D0%BA%D0%B8&amp;diff=44765</id>
		<title>Куча Бродала-Окасаки</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%83%D1%87%D0%B0_%D0%91%D1%80%D0%BE%D0%B4%D0%B0%D0%BB%D0%B0-%D0%9E%D0%BA%D0%B0%D1%81%D0%B0%D0%BA%D0%B8&amp;diff=44765"/>
				<updated>2015-01-22T15:26:32Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: /* Insert */ Упс, баг&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Куча Бродала-Окасаки''' (англ. ''Brodal's and Okasaki's Priority Queue'') {{---}} основана на использовании [[Биномиальная куча|биномиальной кучи]] без каскадных ссылок, добавлении минимального элемента и  на идеи Data-structural bootstrapping. Первое позволяет делать &amp;lt;math&amp;gt;\mathrm{insert}&amp;lt;/math&amp;gt; за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, второе позволяет получать минимальный элемент за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, а  третье {{---}} позволяющей выполнить &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt;  за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;. Удаление минимума работает за &amp;lt;tex&amp;gt;O(\log N)&amp;lt;/tex&amp;gt; в худшем случае. Эти оценки являются асимптотически оптимальными среди всех основанных на сравнении приоритетных очередей.&lt;br /&gt;
&lt;br /&gt;
== Структура ==&lt;br /&gt;
Используем идею, которую Тарьян и Буксбаум называют Data-structural bootstrapping. &lt;br /&gt;
{{Определение&lt;br /&gt;
|neat = 0&lt;br /&gt;
|definition= '''Data-structural bootstrapping''' {{---}} это идея, позволяющая снизить время &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; до &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; путем разрешения хранить в очереди другую очередь.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Создадим структуру Bootstrapping Priority Queues, которая будет хранить пару из минимального элемента &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt; и приоритетную очередь. Элементами приоритетной очереди будут Bootstrapping Priority Queues упорядоченные по &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''BPQ''' = '''&amp;lt;int, PQ'''('''BPQ''')'''&amp;gt;''' &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Куча из одного элемента создается так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''BPQ''' singleton'(x:'''int'''):&lt;br /&gt;
     '''return''' &amp;lt;x, null&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная структура не будет бесконечной, так как каждый раз в приоритетной очереди будет храниться на один элемент меньше, таким образом образуя иерархическую структуру. Каждое значение храниться в одном из значений &amp;lt;tex&amp;gt;T_{min}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Операции ==&lt;br /&gt;
=== Merge ===&lt;br /&gt;
Слияние выполняется выбором минимума из двух значений &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt; и добавлением в приоритетную очередь второго &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''BPQ''' merge'('''&amp;lt;'''x:'''int''', q:'''PQ&amp;gt;''', '''&amp;lt;'''y:'''int''', r:'''PQ&amp;gt;'''):&lt;br /&gt;
     '''if''' x &amp;lt; y&lt;br /&gt;
         '''return''' &amp;lt;x, insert(q, &amp;lt;y, r&amp;gt;)&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
         '''return''' &amp;lt;y, insert(r, &amp;lt;x, q&amp;gt;)&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\mathrm{insert}&amp;lt;/math&amp;gt; это добавление в приоритетную очередь. Если оно работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, то &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Insert ===&lt;br /&gt;
Это создание нового &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; его с основным деревом.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''BPQ''' insert'('''&amp;lt;'''x:'''int''', q:'''PQ&amp;gt;''', y:'''int'''):&lt;br /&gt;
     '''return''' merge'(&amp;lt;x, q&amp;gt;, singleton'(y))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Создание и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; выполняются за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, тогда &amp;lt;math&amp;gt;\mathrm{insert}&amp;lt;/math&amp;gt; работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== getMin ===&lt;br /&gt;
Выполняется просто, так как &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; хранит минимум.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''int''' getMin'('''&amp;lt;'''x:'''int''', q:'''PQ&amp;gt;'''):&lt;br /&gt;
     '''return''' x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Очевидно, работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== extractMin ===&lt;br /&gt;
Минимальный элемент хранится в верхнем &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt;, поэтому его поиск не нужен. Требуется извлечение минимума из приоритетной очереди, состоящей из &amp;lt;tex&amp;gt; BPQ&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''&amp;lt;int, BPQ&amp;gt;''' extractMin'('''&amp;lt;'''x:'''int''', q:'''PQ&amp;gt;'''):&lt;br /&gt;
     &amp;lt;&amp;lt;y, r&amp;gt;, t&amp;gt; = extractMin(q)&lt;br /&gt;
     '''return''' &amp;lt;x, &amp;lt;y, merge(r, t)&amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\mathrm{extractMin}&amp;lt;/math&amp;gt; {{---}} это функция, извлекающая минимальный элемент типа &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; из приоритетной очереди, она возвращает &amp;lt;tex&amp;gt;\langle y,r \rangle&amp;lt;/tex&amp;gt; {{---}} минимальный элемент типа &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; и остаток от приоритетной очереди после извлечение минимума {{---}} &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. Соответственно, &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; {{---}} функция, выполняющая слияние двух приоритетных очередей.&lt;br /&gt;
&lt;br /&gt;
Возвращаем минимум и &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; {{---}} новый минимальный элемент, и &amp;lt;math&amp;gt;\mathrm{merge}(r,t)&amp;lt;/math&amp;gt; {{---}} приоритетная очередь без элементов &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;math&amp;gt;\mathrm{extractMin}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; выполняются за &amp;lt;tex&amp;gt;O(\log N)&amp;lt;/tex&amp;gt;, то &amp;lt;math&amp;gt;\mathrm{extractMin}&amp;lt;/math&amp;gt; выполняется за &amp;lt;tex&amp;gt;O(\log N)&amp;lt;/tex&amp;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;
== Источники информации ==&lt;br /&gt;
* [http://www.lektorium.tv/lecture/?id=14234 Лекция А.С. Станкевича по приоритетным очередям]&lt;br /&gt;
&lt;br /&gt;
* [http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.973 Optimal Purely Functional Priority Queues]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Приоритетные очереди]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%83%D1%87%D0%B0_%D0%91%D1%80%D0%BE%D0%B4%D0%B0%D0%BB%D0%B0-%D0%9E%D0%BA%D0%B0%D1%81%D0%B0%D0%BA%D0%B8&amp;diff=44764</id>
		<title>Куча Бродала-Окасаки</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%83%D1%87%D0%B0_%D0%91%D1%80%D0%BE%D0%B4%D0%B0%D0%BB%D0%B0-%D0%9E%D0%BA%D0%B0%D1%81%D0%B0%D0%BA%D0%B8&amp;diff=44764"/>
				<updated>2015-01-22T15:25:58Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: /* extractMin */  Нормальные обозначения и правильный код&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Куча Бродала-Окасаки''' (англ. ''Brodal's and Okasaki's Priority Queue'') {{---}} основана на использовании [[Биномиальная куча|биномиальной кучи]] без каскадных ссылок, добавлении минимального элемента и  на идеи Data-structural bootstrapping. Первое позволяет делать &amp;lt;math&amp;gt;\mathrm{insert}&amp;lt;/math&amp;gt; за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, второе позволяет получать минимальный элемент за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, а  третье {{---}} позволяющей выполнить &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt;  за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;. Удаление минимума работает за &amp;lt;tex&amp;gt;O(\log N)&amp;lt;/tex&amp;gt; в худшем случае. Эти оценки являются асимптотически оптимальными среди всех основанных на сравнении приоритетных очередей.&lt;br /&gt;
&lt;br /&gt;
== Структура ==&lt;br /&gt;
Используем идею, которую Тарьян и Буксбаум называют Data-structural bootstrapping. &lt;br /&gt;
{{Определение&lt;br /&gt;
|neat = 0&lt;br /&gt;
|definition= '''Data-structural bootstrapping''' {{---}} это идея, позволяющая снизить время &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; до &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; путем разрешения хранить в очереди другую очередь.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Создадим структуру Bootstrapping Priority Queues, которая будет хранить пару из минимального элемента &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt; и приоритетную очередь. Элементами приоритетной очереди будут Bootstrapping Priority Queues упорядоченные по &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''BPQ''' = '''&amp;lt;int, PQ'''('''BPQ''')'''&amp;gt;''' &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Куча из одного элемента создается так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''BPQ''' singleton'(x:'''int'''):&lt;br /&gt;
     '''return''' &amp;lt;x, null&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная структура не будет бесконечной, так как каждый раз в приоритетной очереди будет храниться на один элемент меньше, таким образом образуя иерархическую структуру. Каждое значение храниться в одном из значений &amp;lt;tex&amp;gt;T_{min}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Операции ==&lt;br /&gt;
=== Merge ===&lt;br /&gt;
Слияние выполняется выбором минимума из двух значений &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt; и добавлением в приоритетную очередь второго &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''BPQ''' merge'('''&amp;lt;'''x:'''int''', q:'''PQ&amp;gt;''', '''&amp;lt;'''y:'''int''', r:'''PQ&amp;gt;'''):&lt;br /&gt;
     '''if''' x &amp;lt; y&lt;br /&gt;
         '''return''' &amp;lt;x, insert(q, &amp;lt;y, r&amp;gt;)&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
         '''return''' &amp;lt;y, insert(r, &amp;lt;x, q&amp;gt;)&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\mathrm{insert}&amp;lt;/math&amp;gt; это добавление в приоритетную очередь. Если оно работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, то &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Insert ===&lt;br /&gt;
Это создание нового &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; его с основным деревом.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''BPQ''' insert'('''&amp;lt;'''x:'''int''', q:'''PQ&amp;gt;''', y:'''int'''):&lt;br /&gt;
     '''return''' merge'(&amp;lt;x, q&amp;gt;, singleton(y))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Создание и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; выполняются за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, тогда &amp;lt;math&amp;gt;\mathrm{insert}&amp;lt;/math&amp;gt; работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== getMin ===&lt;br /&gt;
Выполняется просто, так как &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; хранит минимум.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''int''' getMin'('''&amp;lt;'''x:'''int''', q:'''PQ&amp;gt;'''):&lt;br /&gt;
     '''return''' x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Очевидно, работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== extractMin ===&lt;br /&gt;
Минимальный элемент хранится в верхнем &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt;, поэтому его поиск не нужен. Требуется извлечение минимума из приоритетной очереди, состоящей из &amp;lt;tex&amp;gt; BPQ&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''&amp;lt;int, BPQ&amp;gt;''' extractMin'('''&amp;lt;'''x:'''int''', q:'''PQ&amp;gt;'''):&lt;br /&gt;
     &amp;lt;&amp;lt;y, r&amp;gt;, t&amp;gt; = extractMin(q)&lt;br /&gt;
     '''return''' &amp;lt;x, &amp;lt;y, merge(r, t)&amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\mathrm{extractMin}&amp;lt;/math&amp;gt; {{---}} это функция, извлекающая минимальный элемент типа &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; из приоритетной очереди, она возвращает &amp;lt;tex&amp;gt;\langle y,r \rangle&amp;lt;/tex&amp;gt; {{---}} минимальный элемент типа &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; и остаток от приоритетной очереди после извлечение минимума {{---}} &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. Соответственно, &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; {{---}} функция, выполняющая слияние двух приоритетных очередей.&lt;br /&gt;
&lt;br /&gt;
Возвращаем минимум и &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; {{---}} новый минимальный элемент, и &amp;lt;math&amp;gt;\mathrm{merge}(r,t)&amp;lt;/math&amp;gt; {{---}} приоритетная очередь без элементов &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;math&amp;gt;\mathrm{extractMin}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; выполняются за &amp;lt;tex&amp;gt;O(\log N)&amp;lt;/tex&amp;gt;, то &amp;lt;math&amp;gt;\mathrm{extractMin}&amp;lt;/math&amp;gt; выполняется за &amp;lt;tex&amp;gt;O(\log N)&amp;lt;/tex&amp;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;
== Источники информации ==&lt;br /&gt;
* [http://www.lektorium.tv/lecture/?id=14234 Лекция А.С. Станкевича по приоритетным очередям]&lt;br /&gt;
&lt;br /&gt;
* [http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.973 Optimal Purely Functional Priority Queues]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Приоритетные очереди]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%83%D1%87%D0%B0_%D0%91%D1%80%D0%BE%D0%B4%D0%B0%D0%BB%D0%B0-%D0%9E%D0%BA%D0%B0%D1%81%D0%B0%D0%BA%D0%B8&amp;diff=44763</id>
		<title>Куча Бродала-Окасаки</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%83%D1%87%D0%B0_%D0%91%D1%80%D0%BE%D0%B4%D0%B0%D0%BB%D0%B0-%D0%9E%D0%BA%D0%B0%D1%81%D0%B0%D0%BA%D0%B8&amp;diff=44763"/>
				<updated>2015-01-22T15:11:52Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: /* getMin */  Нормальные обозначения&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Куча Бродала-Окасаки''' (англ. ''Brodal's and Okasaki's Priority Queue'') {{---}} основана на использовании [[Биномиальная куча|биномиальной кучи]] без каскадных ссылок, добавлении минимального элемента и  на идеи Data-structural bootstrapping. Первое позволяет делать &amp;lt;math&amp;gt;\mathrm{insert}&amp;lt;/math&amp;gt; за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, второе позволяет получать минимальный элемент за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, а  третье {{---}} позволяющей выполнить &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt;  за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;. Удаление минимума работает за &amp;lt;tex&amp;gt;O(\log N)&amp;lt;/tex&amp;gt; в худшем случае. Эти оценки являются асимптотически оптимальными среди всех основанных на сравнении приоритетных очередей.&lt;br /&gt;
&lt;br /&gt;
== Структура ==&lt;br /&gt;
Используем идею, которую Тарьян и Буксбаум называют Data-structural bootstrapping. &lt;br /&gt;
{{Определение&lt;br /&gt;
|neat = 0&lt;br /&gt;
|definition= '''Data-structural bootstrapping''' {{---}} это идея, позволяющая снизить время &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; до &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; путем разрешения хранить в очереди другую очередь.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Создадим структуру Bootstrapping Priority Queues, которая будет хранить пару из минимального элемента &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt; и приоритетную очередь. Элементами приоритетной очереди будут Bootstrapping Priority Queues упорядоченные по &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''BPQ''' = '''&amp;lt;int, PQ'''('''BPQ''')'''&amp;gt;''' &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Куча из одного элемента создается так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''BPQ''' singleton'(x:'''int'''):&lt;br /&gt;
     '''return''' &amp;lt;x, null&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная структура не будет бесконечной, так как каждый раз в приоритетной очереди будет храниться на один элемент меньше, таким образом образуя иерархическую структуру. Каждое значение храниться в одном из значений &amp;lt;tex&amp;gt;T_{min}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Операции ==&lt;br /&gt;
=== Merge ===&lt;br /&gt;
Слияние выполняется выбором минимума из двух значений &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt; и добавлением в приоритетную очередь второго &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''BPQ''' merge'('''&amp;lt;'''x:'''int''', q:'''PQ&amp;gt;''', '''&amp;lt;'''y:'''int''', r:'''PQ&amp;gt;'''):&lt;br /&gt;
     '''if''' x &amp;lt; y&lt;br /&gt;
         '''return''' &amp;lt;x, insert(q, &amp;lt;y, r&amp;gt;)&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
         '''return''' &amp;lt;y, insert(r, &amp;lt;x, q&amp;gt;)&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\mathrm{insert}&amp;lt;/math&amp;gt; это добавление в приоритетную очередь. Если оно работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, то &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Insert ===&lt;br /&gt;
Это создание нового &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; его с основным деревом.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''BPQ''' insert'('''&amp;lt;'''x:'''int''', q:'''PQ&amp;gt;''', y:'''int'''):&lt;br /&gt;
     '''return''' merge'(&amp;lt;x, q&amp;gt;, singleton(y))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Создание и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; выполняются за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, тогда &amp;lt;math&amp;gt;\mathrm{insert}&amp;lt;/math&amp;gt; работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== getMin ===&lt;br /&gt;
Выполняется просто, так как &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; хранит минимум.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''int''' getMin'('''&amp;lt;'''x:'''int''', q:'''PQ&amp;gt;'''):&lt;br /&gt;
     '''return''' x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Очевидно, работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== extractMin ===&lt;br /&gt;
Минимальный элемент хранится в верхнем &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt;, по этому его поиск не нужен. Требуется извлечение минимума из приоритетной очереди, состоящей из &amp;lt;tex&amp;gt; BPQ&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;int, BPQ&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;''' extractMin(&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;x:'''int''', q:'''BPQ'''&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;):&lt;br /&gt;
     &amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;y, r&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;, t&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt; = extractMin(q)&lt;br /&gt;
     '''return''' &amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;y, merge(r, t)&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\mathrm{extractMin}&amp;lt;/math&amp;gt;{{---}} это функция, извлекающая минимальный элемент типа &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; из приоритетной очереди, она возвращает &amp;lt;tex&amp;gt;(y,r)&amp;lt;/tex&amp;gt; {{---}} минимальный элемент типа &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; и остаток от приоритетной очереди после извлечение минимума {{---}} &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; функция, выполняющая слияние двух приоритетных очередей.&lt;br /&gt;
&lt;br /&gt;
Возвращаем &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} новый минимальный элемент, и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; приоритетная очередь без элемента &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;math&amp;gt;\mathrm{extractMin}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; выполняются за &amp;lt;tex&amp;gt;O(\log N)&amp;lt;/tex&amp;gt;, тогда &amp;lt;math&amp;gt;\mathrm{extractMin}&amp;lt;/math&amp;gt; выполняется за &amp;lt;tex&amp;gt;O(\log N)&amp;lt;/tex&amp;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;
== Источники информации ==&lt;br /&gt;
* [http://www.lektorium.tv/lecture/?id=14234 Лекция А.С. Станкевича по приоритетным очередям]&lt;br /&gt;
&lt;br /&gt;
* [http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.973 Optimal Purely Functional Priority Queues]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Приоритетные очереди]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%83%D1%87%D0%B0_%D0%91%D1%80%D0%BE%D0%B4%D0%B0%D0%BB%D0%B0-%D0%9E%D0%BA%D0%B0%D1%81%D0%B0%D0%BA%D0%B8&amp;diff=44762</id>
		<title>Куча Бродала-Окасаки</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%83%D1%87%D0%B0_%D0%91%D1%80%D0%BE%D0%B4%D0%B0%D0%BB%D0%B0-%D0%9E%D0%BA%D0%B0%D1%81%D0%B0%D0%BA%D0%B8&amp;diff=44762"/>
				<updated>2015-01-22T15:10:52Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: /* Insert */ Нормальные обозначения&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Куча Бродала-Окасаки''' (англ. ''Brodal's and Okasaki's Priority Queue'') {{---}} основана на использовании [[Биномиальная куча|биномиальной кучи]] без каскадных ссылок, добавлении минимального элемента и  на идеи Data-structural bootstrapping. Первое позволяет делать &amp;lt;math&amp;gt;\mathrm{insert}&amp;lt;/math&amp;gt; за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, второе позволяет получать минимальный элемент за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, а  третье {{---}} позволяющей выполнить &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt;  за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;. Удаление минимума работает за &amp;lt;tex&amp;gt;O(\log N)&amp;lt;/tex&amp;gt; в худшем случае. Эти оценки являются асимптотически оптимальными среди всех основанных на сравнении приоритетных очередей.&lt;br /&gt;
&lt;br /&gt;
== Структура ==&lt;br /&gt;
Используем идею, которую Тарьян и Буксбаум называют Data-structural bootstrapping. &lt;br /&gt;
{{Определение&lt;br /&gt;
|neat = 0&lt;br /&gt;
|definition= '''Data-structural bootstrapping''' {{---}} это идея, позволяющая снизить время &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; до &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; путем разрешения хранить в очереди другую очередь.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Создадим структуру Bootstrapping Priority Queues, которая будет хранить пару из минимального элемента &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt; и приоритетную очередь. Элементами приоритетной очереди будут Bootstrapping Priority Queues упорядоченные по &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''BPQ''' = '''&amp;lt;int, PQ'''('''BPQ''')'''&amp;gt;''' &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Куча из одного элемента создается так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''BPQ''' singleton'(x:'''int'''):&lt;br /&gt;
     '''return''' &amp;lt;x, null&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная структура не будет бесконечной, так как каждый раз в приоритетной очереди будет храниться на один элемент меньше, таким образом образуя иерархическую структуру. Каждое значение храниться в одном из значений &amp;lt;tex&amp;gt;T_{min}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Операции ==&lt;br /&gt;
=== Merge ===&lt;br /&gt;
Слияние выполняется выбором минимума из двух значений &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt; и добавлением в приоритетную очередь второго &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''BPQ''' merge'('''&amp;lt;'''x:'''int''', q:'''PQ&amp;gt;''', '''&amp;lt;'''y:'''int''', r:'''PQ&amp;gt;'''):&lt;br /&gt;
     '''if''' x &amp;lt; y&lt;br /&gt;
         '''return''' &amp;lt;x, insert(q, &amp;lt;y, r&amp;gt;)&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
         '''return''' &amp;lt;y, insert(r, &amp;lt;x, q&amp;gt;)&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\mathrm{insert}&amp;lt;/math&amp;gt; это добавление в приоритетную очередь. Если оно работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, то &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Insert ===&lt;br /&gt;
Это создание нового &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; его с основным деревом.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''BPQ''' insert'('''&amp;lt;'''x:'''int''', q:'''PQ&amp;gt;''', y:'''int'''):&lt;br /&gt;
     '''return''' merge'(&amp;lt;x, q&amp;gt;, singleton(y))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Создание и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; выполняются за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, тогда &amp;lt;math&amp;gt;\mathrm{insert}&amp;lt;/math&amp;gt; работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== getMin ===&lt;br /&gt;
Выполняется просто, так как &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; хранит минимум.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''int''' getMin(&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;x:'''int''', q:'''BPQ'''&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;):&lt;br /&gt;
     '''return''' x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Очевидно, работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== extractMin ===&lt;br /&gt;
Минимальный элемент хранится в верхнем &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt;, по этому его поиск не нужен. Требуется извлечение минимума из приоритетной очереди, состоящей из &amp;lt;tex&amp;gt; BPQ&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;int, BPQ&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;''' extractMin(&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;x:'''int''', q:'''BPQ'''&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;):&lt;br /&gt;
     &amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;y, r&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;, t&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt; = extractMin(q)&lt;br /&gt;
     '''return''' &amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;y, merge(r, t)&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\mathrm{extractMin}&amp;lt;/math&amp;gt;{{---}} это функция, извлекающая минимальный элемент типа &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; из приоритетной очереди, она возвращает &amp;lt;tex&amp;gt;(y,r)&amp;lt;/tex&amp;gt; {{---}} минимальный элемент типа &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; и остаток от приоритетной очереди после извлечение минимума {{---}} &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; функция, выполняющая слияние двух приоритетных очередей.&lt;br /&gt;
&lt;br /&gt;
Возвращаем &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} новый минимальный элемент, и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; приоритетная очередь без элемента &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;math&amp;gt;\mathrm{extractMin}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; выполняются за &amp;lt;tex&amp;gt;O(\log N)&amp;lt;/tex&amp;gt;, тогда &amp;lt;math&amp;gt;\mathrm{extractMin}&amp;lt;/math&amp;gt; выполняется за &amp;lt;tex&amp;gt;O(\log N)&amp;lt;/tex&amp;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;
== Источники информации ==&lt;br /&gt;
* [http://www.lektorium.tv/lecture/?id=14234 Лекция А.С. Станкевича по приоритетным очередям]&lt;br /&gt;
&lt;br /&gt;
* [http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.973 Optimal Purely Functional Priority Queues]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Приоритетные очереди]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%83%D1%87%D0%B0_%D0%91%D1%80%D0%BE%D0%B4%D0%B0%D0%BB%D0%B0-%D0%9E%D0%BA%D0%B0%D1%81%D0%B0%D0%BA%D0%B8&amp;diff=44761</id>
		<title>Куча Бродала-Окасаки</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%83%D1%87%D0%B0_%D0%91%D1%80%D0%BE%D0%B4%D0%B0%D0%BB%D0%B0-%D0%9E%D0%BA%D0%B0%D1%81%D0%B0%D0%BA%D0%B8&amp;diff=44761"/>
				<updated>2015-01-22T15:08:57Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: /* Merge */ Нормальные обозначения&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Куча Бродала-Окасаки''' (англ. ''Brodal's and Okasaki's Priority Queue'') {{---}} основана на использовании [[Биномиальная куча|биномиальной кучи]] без каскадных ссылок, добавлении минимального элемента и  на идеи Data-structural bootstrapping. Первое позволяет делать &amp;lt;math&amp;gt;\mathrm{insert}&amp;lt;/math&amp;gt; за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, второе позволяет получать минимальный элемент за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, а  третье {{---}} позволяющей выполнить &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt;  за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;. Удаление минимума работает за &amp;lt;tex&amp;gt;O(\log N)&amp;lt;/tex&amp;gt; в худшем случае. Эти оценки являются асимптотически оптимальными среди всех основанных на сравнении приоритетных очередей.&lt;br /&gt;
&lt;br /&gt;
== Структура ==&lt;br /&gt;
Используем идею, которую Тарьян и Буксбаум называют Data-structural bootstrapping. &lt;br /&gt;
{{Определение&lt;br /&gt;
|neat = 0&lt;br /&gt;
|definition= '''Data-structural bootstrapping''' {{---}} это идея, позволяющая снизить время &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; до &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; путем разрешения хранить в очереди другую очередь.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Создадим структуру Bootstrapping Priority Queues, которая будет хранить пару из минимального элемента &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt; и приоритетную очередь. Элементами приоритетной очереди будут Bootstrapping Priority Queues упорядоченные по &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''BPQ''' = '''&amp;lt;int, PQ'''('''BPQ''')'''&amp;gt;''' &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Куча из одного элемента создается так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''BPQ''' singleton'(x:'''int'''):&lt;br /&gt;
     '''return''' &amp;lt;x, null&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная структура не будет бесконечной, так как каждый раз в приоритетной очереди будет храниться на один элемент меньше, таким образом образуя иерархическую структуру. Каждое значение храниться в одном из значений &amp;lt;tex&amp;gt;T_{min}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Операции ==&lt;br /&gt;
=== Merge ===&lt;br /&gt;
Слияние выполняется выбором минимума из двух значений &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt; и добавлением в приоритетную очередь второго &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''BPQ''' merge'('''&amp;lt;'''x:'''int''', q:'''PQ&amp;gt;''', '''&amp;lt;'''y:'''int''', r:'''PQ&amp;gt;'''):&lt;br /&gt;
     '''if''' x &amp;lt; y&lt;br /&gt;
         '''return''' &amp;lt;x, insert(q, &amp;lt;y, r&amp;gt;)&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
         '''return''' &amp;lt;y, insert(r, &amp;lt;x, q&amp;gt;)&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\mathrm{insert}&amp;lt;/math&amp;gt; это добавление в приоритетную очередь. Если оно работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, то &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Insert ===&lt;br /&gt;
Это создание нового &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; его с основным деревом.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;int, BPQ&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;''' insert(&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;x:'''int''', q:'''BPQ'''&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;, y:'''int'''):&lt;br /&gt;
     '''return''' merge(&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;x, q&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;, create(y))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Создание и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; выполняются за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, тогда &amp;lt;math&amp;gt;\mathrm{insert}&amp;lt;/math&amp;gt; работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== getMin ===&lt;br /&gt;
Выполняется просто, так как &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; хранит минимум.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''int''' getMin(&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;x:'''int''', q:'''BPQ'''&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;):&lt;br /&gt;
     '''return''' x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Очевидно, работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== extractMin ===&lt;br /&gt;
Минимальный элемент хранится в верхнем &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt;, по этому его поиск не нужен. Требуется извлечение минимума из приоритетной очереди, состоящей из &amp;lt;tex&amp;gt; BPQ&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;int, BPQ&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;''' extractMin(&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;x:'''int''', q:'''BPQ'''&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;):&lt;br /&gt;
     &amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;y, r&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;, t&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt; = extractMin(q)&lt;br /&gt;
     '''return''' &amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;y, merge(r, t)&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\mathrm{extractMin}&amp;lt;/math&amp;gt;{{---}} это функция, извлекающая минимальный элемент типа &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; из приоритетной очереди, она возвращает &amp;lt;tex&amp;gt;(y,r)&amp;lt;/tex&amp;gt; {{---}} минимальный элемент типа &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; и остаток от приоритетной очереди после извлечение минимума {{---}} &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; функция, выполняющая слияние двух приоритетных очередей.&lt;br /&gt;
&lt;br /&gt;
Возвращаем &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} новый минимальный элемент, и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; приоритетная очередь без элемента &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;math&amp;gt;\mathrm{extractMin}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; выполняются за &amp;lt;tex&amp;gt;O(\log N)&amp;lt;/tex&amp;gt;, тогда &amp;lt;math&amp;gt;\mathrm{extractMin}&amp;lt;/math&amp;gt; выполняется за &amp;lt;tex&amp;gt;O(\log N)&amp;lt;/tex&amp;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;
== Источники информации ==&lt;br /&gt;
* [http://www.lektorium.tv/lecture/?id=14234 Лекция А.С. Станкевича по приоритетным очередям]&lt;br /&gt;
&lt;br /&gt;
* [http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.973 Optimal Purely Functional Priority Queues]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Приоритетные очереди]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%83%D1%87%D0%B0_%D0%91%D1%80%D0%BE%D0%B4%D0%B0%D0%BB%D0%B0-%D0%9E%D0%BA%D0%B0%D1%81%D0%B0%D0%BA%D0%B8&amp;diff=44760</id>
		<title>Куча Бродала-Окасаки</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%83%D1%87%D0%B0_%D0%91%D1%80%D0%BE%D0%B4%D0%B0%D0%BB%D0%B0-%D0%9E%D0%BA%D0%B0%D1%81%D0%B0%D0%BA%D0%B8&amp;diff=44760"/>
				<updated>2015-01-22T15:04:48Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: /* Структура */ Нормальные обозначения&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Куча Бродала-Окасаки''' (англ. ''Brodal's and Okasaki's Priority Queue'') {{---}} основана на использовании [[Биномиальная куча|биномиальной кучи]] без каскадных ссылок, добавлении минимального элемента и  на идеи Data-structural bootstrapping. Первое позволяет делать &amp;lt;math&amp;gt;\mathrm{insert}&amp;lt;/math&amp;gt; за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, второе позволяет получать минимальный элемент за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, а  третье {{---}} позволяющей выполнить &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt;  за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;. Удаление минимума работает за &amp;lt;tex&amp;gt;O(\log N)&amp;lt;/tex&amp;gt; в худшем случае. Эти оценки являются асимптотически оптимальными среди всех основанных на сравнении приоритетных очередей.&lt;br /&gt;
&lt;br /&gt;
== Структура ==&lt;br /&gt;
Используем идею, которую Тарьян и Буксбаум называют Data-structural bootstrapping. &lt;br /&gt;
{{Определение&lt;br /&gt;
|neat = 0&lt;br /&gt;
|definition= '''Data-structural bootstrapping''' {{---}} это идея, позволяющая снизить время &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; до &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; путем разрешения хранить в очереди другую очередь.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Создадим структуру Bootstrapping Priority Queues, которая будет хранить пару из минимального элемента &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt; и приоритетную очередь. Элементами приоритетной очереди будут Bootstrapping Priority Queues упорядоченные по &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''BPQ''' = '''&amp;lt;int, PQ'''('''BPQ''')'''&amp;gt;''' &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Куча из одного элемента создается так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''BPQ''' singleton'(x:'''int'''):&lt;br /&gt;
     '''return''' &amp;lt;x, null&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная структура не будет бесконечной, так как каждый раз в приоритетной очереди будет храниться на один элемент меньше, таким образом образуя иерархическую структуру. Каждое значение храниться в одном из значений &amp;lt;tex&amp;gt;T_{min}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Операции ==&lt;br /&gt;
=== Merge ===&lt;br /&gt;
Слияние выполняется выбором минимума из двух значений &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt; и добавлением в приоритетную очередь второго &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''BPQ''' merge(&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;x:'''int''', q:'''BPQ'''&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;y:'''int''', r:'''BPQ'''&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;):&lt;br /&gt;
     '''if''' x &amp;lt; y&lt;br /&gt;
         '''return''' (x, insert(q, &amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;y, r&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;))&lt;br /&gt;
     '''else'''&lt;br /&gt;
         '''return''' (y, insert(r, &amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;x, q&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\mathrm{insert}&amp;lt;/math&amp;gt; это добавление в приоритетную очередь работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, тогда &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Insert ===&lt;br /&gt;
Это создание нового &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; его с основным деревом.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;int, BPQ&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;''' insert(&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;x:'''int''', q:'''BPQ'''&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;, y:'''int'''):&lt;br /&gt;
     '''return''' merge(&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;x, q&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;, create(y))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Создание и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; выполняются за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, тогда &amp;lt;math&amp;gt;\mathrm{insert}&amp;lt;/math&amp;gt; работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== getMin ===&lt;br /&gt;
Выполняется просто, так как &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; хранит минимум.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''int''' getMin(&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;x:'''int''', q:'''BPQ'''&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;):&lt;br /&gt;
     '''return''' x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Очевидно, работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== extractMin ===&lt;br /&gt;
Минимальный элемент хранится в верхнем &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt;, по этому его поиск не нужен. Требуется извлечение минимума из приоритетной очереди, состоящей из &amp;lt;tex&amp;gt; BPQ&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;int, BPQ&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;''' extractMin(&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;x:'''int''', q:'''BPQ'''&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;):&lt;br /&gt;
     &amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;y, r&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;, t&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt; = extractMin(q)&lt;br /&gt;
     '''return''' &amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;y, merge(r, t)&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\mathrm{extractMin}&amp;lt;/math&amp;gt;{{---}} это функция, извлекающая минимальный элемент типа &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; из приоритетной очереди, она возвращает &amp;lt;tex&amp;gt;(y,r)&amp;lt;/tex&amp;gt; {{---}} минимальный элемент типа &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; и остаток от приоритетной очереди после извлечение минимума {{---}} &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; функция, выполняющая слияние двух приоритетных очередей.&lt;br /&gt;
&lt;br /&gt;
Возвращаем &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} новый минимальный элемент, и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; приоритетная очередь без элемента &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;math&amp;gt;\mathrm{extractMin}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; выполняются за &amp;lt;tex&amp;gt;O(\log N)&amp;lt;/tex&amp;gt;, тогда &amp;lt;math&amp;gt;\mathrm{extractMin}&amp;lt;/math&amp;gt; выполняется за &amp;lt;tex&amp;gt;O(\log N)&amp;lt;/tex&amp;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;
== Источники информации ==&lt;br /&gt;
* [http://www.lektorium.tv/lecture/?id=14234 Лекция А.С. Станкевича по приоритетным очередям]&lt;br /&gt;
&lt;br /&gt;
* [http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.973 Optimal Purely Functional Priority Queues]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Приоритетные очереди]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%83%D1%87%D0%B0_%D0%91%D1%80%D0%BE%D0%B4%D0%B0%D0%BB%D0%B0-%D0%9E%D0%BA%D0%B0%D1%81%D0%B0%D0%BA%D0%B8&amp;diff=44755</id>
		<title>Куча Бродала-Окасаки</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%83%D1%87%D0%B0_%D0%91%D1%80%D0%BE%D0%B4%D0%B0%D0%BB%D0%B0-%D0%9E%D0%BA%D0%B0%D1%81%D0%B0%D0%BA%D0%B8&amp;diff=44755"/>
				<updated>2015-01-22T13:56:12Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: Не тайпчекалось же, ну&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Куча Бродала-Окасаки''' (англ. ''Brodal's and Okasaki's Priority Queue'') {{---}} основана на использовании [[Биномиальная куча|биномиальной кучи]] без каскадных ссылок, добавлении минимального элемента и  на идеи Data-structural bootstrapping. Первое позволяет делать &amp;lt;math&amp;gt;\mathrm{insert}&amp;lt;/math&amp;gt; за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, второе позволяет получать минимальный элемент за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, а  третье {{---}} позволяющей выполнить &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt;  за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;. Удаление минимума работает за &amp;lt;tex&amp;gt;O(\log N)&amp;lt;/tex&amp;gt; в худшем случае. Эти оценки являются асимптотически оптимальными среди всех основанных на сравнении приоритетных очередей.&lt;br /&gt;
&lt;br /&gt;
== Структура ==&lt;br /&gt;
Используем идею, которую Тарьян и Буксбаум называют Data-structural bootstrapping. &lt;br /&gt;
{{Определение&lt;br /&gt;
|neat = 0&lt;br /&gt;
|definition= '''Data-structural bootstrapping''' {{---}} это идея, позволяющая снизить время &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; до &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; путем разрешения хранить в очереди другую очередь.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Создадим структуру Bootstrapping Priority Queues, которая будет хранить пару из минимального элемента &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt; и приоритетную очередь. Элементами приоритетной очереди будут Bootstrapping Priority Queues упорядоченные по &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt;. Это можно записать так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; BPQ \left ( T_{min}, PQ \right) = \langle T_{min}, PQ \left (BPQ \left \langle T_{min}, PQ\right \rangle \right)\rangle&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Куча из одного элемента будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathrm{create} &amp;lt;/math&amp;gt;&amp;lt;tex&amp;gt;(x) = BPQ \left \langle x, null\right \rangle&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная структура не будет бесконечной, так как каждый раз в приоритетной очереди будет храниться на один элемент меньше, таким образом образуя иерархическую структуру. Каждое значение храниться в одном из значений &amp;lt;tex&amp;gt;T_{min}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Операции ==&lt;br /&gt;
=== Merge ===&lt;br /&gt;
Слияние выполняется выбором минимума из двух значений &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt; и добавлением в приоритетную очередь второго &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''BPQ''' merge(&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;x:'''int''', q:'''BPQ'''&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;y:'''int''', r:'''BPQ'''&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;):&lt;br /&gt;
     '''if''' x &amp;lt; y&lt;br /&gt;
         '''return''' (x, insert(q, &amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;y, r&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;))&lt;br /&gt;
     '''else'''&lt;br /&gt;
         '''return''' (y, insert(r, &amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;x, q&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\mathrm{insert}&amp;lt;/math&amp;gt; это добавление в приоритетную очередь работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, тогда &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Insert ===&lt;br /&gt;
Это создание нового &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; его с основным деревом.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;int, BPQ&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;''' insert(&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;x:'''int''', q:'''BPQ'''&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;, y:'''int'''):&lt;br /&gt;
     '''return''' merge(&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;x, q&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;, create(y))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Создание и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; выполняются за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, тогда &amp;lt;math&amp;gt;\mathrm{insert}&amp;lt;/math&amp;gt; работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== getMin ===&lt;br /&gt;
Выполняется просто, так как &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; хранит минимум.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''int''' getMin(&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;x:'''int''', q:'''BPQ'''&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;):&lt;br /&gt;
     '''return''' x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Очевидно, работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== extractMin ===&lt;br /&gt;
Минимальный элемент хранится в верхнем &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt;, по этому его поиск не нужен. Требуется извлечение минимума из приоритетной очереди, состоящей из &amp;lt;tex&amp;gt; BPQ&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;int, BPQ&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;''' extractMin(&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;x:'''int''', q:'''BPQ'''&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;):&lt;br /&gt;
     &amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;y, r&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;, t&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt; = extractMin(q)&lt;br /&gt;
     '''return''' &amp;lt;tex&amp;gt; \langle &amp;lt;/tex&amp;gt;y, merge(r, t)&amp;lt;tex&amp;gt; \rangle &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\mathrm{extractMin}&amp;lt;/math&amp;gt;{{---}} это функция, извлекающая минимальный элемент типа &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; из приоритетной очереди, она возвращает &amp;lt;tex&amp;gt;(y,r)&amp;lt;/tex&amp;gt; {{---}} минимальный элемент типа &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt; и остаток от приоритетной очереди после извлечение минимума {{---}} &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; функция, выполняющая слияние двух приоритетных очередей.&lt;br /&gt;
&lt;br /&gt;
Возвращаем &amp;lt;tex&amp;gt; BPQ &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} новый минимальный элемент, и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; приоритетная очередь без элемента &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;math&amp;gt;\mathrm{extractMin}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathrm{merge}&amp;lt;/math&amp;gt; выполняются за &amp;lt;tex&amp;gt;O(\log N)&amp;lt;/tex&amp;gt;, тогда &amp;lt;math&amp;gt;\mathrm{extractMin}&amp;lt;/math&amp;gt; выполняется за &amp;lt;tex&amp;gt;O(\log N)&amp;lt;/tex&amp;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;
== Источники информации ==&lt;br /&gt;
* [http://www.lektorium.tv/lecture/?id=14234 Лекция А.С. Станкевича по приоритетным очередям]&lt;br /&gt;
&lt;br /&gt;
* [http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.973 Optimal Purely Functional Priority Queues]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Приоритетные очереди]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%94%D0%B5%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B2%D0%BE_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE&amp;diff=36042</id>
		<title>Обсуждение:Декартово дерево</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%94%D0%B5%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B2%D0%BE_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE&amp;diff=36042"/>
				<updated>2014-01-28T17:05:28Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: /* Приоритет */ Новая тема&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: {{tick | ticked=1}} зачем-то tree + heap написано в техе.&lt;br /&gt;
:: По-моему, так лучше выглядит (мимокрокодил) [[Участник:SkudarnovYaroslav|SkudarnovYaroslav]] 19:52, 6 февраля 2012 (MSK)&lt;br /&gt;
: {{tick | ticked=1}} Убрать «описание», запихать его в шапку статьи. --[[Участник:Dgerasimov|Дмитрий Герасимов]] 14:04, 14 апреля 2012 (GST)&lt;br /&gt;
:: либо везде используй &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt;, либо везде &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;. Лучше маленькие буквы, имхо. Тут же написать, что x — ключ, а y — приоритет.&lt;br /&gt;
&lt;br /&gt;
: {{tick | ticked=1}} Добавить интервики. Тут и бинарное дерево поиска, и куча, и на неявный ключ, и на случайную величину, и на линейность матожидания можно сослаться.&lt;br /&gt;
&lt;br /&gt;
: {{tick | ticked=1}} написать, как строить декартово дерево за O(n), если заранее есть ключи в возрастающем порядке.&lt;br /&gt;
:: {{tick | ticked=1}} Хорошо, что есть рекурсивный алгоритм, но про его асимптотику тожно можно что-нибудь написать. Хотя в нем вроде особого смысла нет,  так как он, кажется, может работать за столько же, как если бы мы тупо добавляли по одному элементу в дерево.&lt;br /&gt;
::: Ну а h у нас может быть O(n). Напиши сразу, что O(n^2) и все.&lt;br /&gt;
:: {{tick | ticked=1}} «делаем шаг по склону вверх» — ээ, какая-то упоротая фраза.&lt;br /&gt;
&lt;br /&gt;
: {{tick | ticked=1}} вообще ничего нет про кприоритет, как он выбирается и все такое.&lt;br /&gt;
: {{tick | ticked=1}} запилить доказательство логарифмической оценки высоты дерева.&lt;br /&gt;
: {{tick | ticked=1}} операции лучше объединить в один раздел, а виды опреаций сделать подразделами&lt;br /&gt;
: {{tick | ticked=1}} к split и merge неплохо бы небольшой псевдокод.&lt;br /&gt;
:: Почитай правила оформления псевдокода.--[[Участник:Dgerasimov|Дмитрий Герасимов]] 16:50, 21 апреля 2012 (GST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: {{tick | ticked=1}} &amp;quot;Реализация №1:&amp;quot; -- зачем двоеточие в названии раздела?&lt;br /&gt;
: {{tick | ticked=1}} Написать, чем отличаются реализации 1 и 2 друг от друга. &lt;br /&gt;
:: '''Наверное, они отличаются не тем, что не используется merge или split, а в том, что просто их меньше во второй реализации?'''--[[Участник:Dgerasimov|Дмитрий Герасимов]] 16:40, 28 апреля 2012 (GST)&lt;br /&gt;
::: Если написать что в реализации 2 используется меньше split или merge, будет выглядеть не очень, когда их там в принципе нет(Редактор)&lt;br /&gt;
:::: Гм, ладно, сойдет. Кстати, можно подписываться с помощью &amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
:: И писать «этот вариант отличается» надо либо после объявления реализации № 2, либо вообще после неет.&lt;br /&gt;
: {{tick | ticked=1}} А вообще почему-то реализация 1 расписана по пунктом, а во второй все сплошным текстом.&lt;br /&gt;
: {{tick | ticked=1}} добавить категории --[[Участник:Dgerasimov|Дмитрий Герасимов]] 19:11, 6 февраля 2012 (MSK)&lt;br /&gt;
: {{tick | ticked=1}} нет источников --[[Участник:Rybak|Андрей Рыбак]] 12:36, 25 марта 2012 (GST)&lt;br /&gt;
&lt;br /&gt;
: {{tick | ticked=1}} доказательство:&lt;br /&gt;
:: {{tick | ticked=1}}«являются незавимыми непрерывными случайными величинами с одинаковым вероятностным распределением» — непрерывные случайные величины? Гм, вроде этого не было в курсе дискретки, ну это еще интуитивно более-менее ясно. А вот что такое «одинаковое распределение»?&lt;br /&gt;
::: «с одного и того же распределения» — бред. возьмем для приортиетов нечестную монету (или что-то подобное), она может давать независимые случайные величины, но для приоритетов не подходит. &lt;br /&gt;
:::: Все еще не исправлено --[[Участник:Dgerasimov|Дмитрий Герасимов]] 11:44, 26 апреля 2012 (GST)&amp;lt;nowiki&amp;gt;Вставьте сюда текст, который не нужно форматировать&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
::::: '''НЕ ИСПРАВЛЕНО!!!!!1111''' --[[Участник:Dgerasimov|Дмитрий Герасимов]] 16:40, 28 апреля 2012 (GST)&lt;br /&gt;
:::::: ох. Суть формулировки ты не изменил, а только сделал более мутной. «приоритеты  которого выбраны случайно и независимо». Возьмем _нечестную_ игральную кость с 1000000000 граней, к примеру, будем выбирать ею приоритеты. Случайно? Случайно. Независимо? Независимо. Подходит для выбора приоритетов? Нет. В чем же проблема?--[[Участник:Dgerasimov|Дмитрий Герасимов]] 13:48, 1 мая 2012 (GST)&lt;br /&gt;
::::::: Мне кажется, что все предыдущие формулировки были мутными, ведь нам нужно чтобы высота была логарифм, поэтому выбираем приоритеты случайно, единственное что надо выделить это независимость, она используется в утверждении что среди X_{i,k} любая вершина может оказаться с минимальным приоритетом. Иначе говоря я не вижу мест, где моей формулировки недостаточно. Насчет проблемы, если она заключается в том что приоритеты должны быть разными, то да формулировка не до конца корректна. Но если к примеру написать как написано где то глубоко в кормене &amp;quot;Декартово дерево из n ключей, приоритеты 'y' у которого выбраны так, что n! перестановок входных ключей равновероятны, имеет высоту O(log n)&amp;quot; станет несколько ... в общем я написал в шапке доказательства -- [[Участник:Орынбаев Хусаин|Орынбаев Хусаин]] 15:58, 1 мая 2012 (GST)&lt;br /&gt;
:::::::: Должны быть разными, в том числе. В общем, то, что тебе нужно называется равномерным распределением. --[[Участник:Dgerasimov|Дмитрий Герасимов]] 23:06, 3 мая 2012 (GST)&lt;br /&gt;
::::::::: Ну и где что-то про равномерное распределение? --[[Участник:Dgerasimov|Дмитрий Герасимов]] 16:19, 15 мая 2012 (GST)&lt;br /&gt;
:: вот эта запись x_i — ancestor x_j — не очень. Во-первых, ancestor of, а во-вторых, «—» как-то неуместно. Лучше x_i is ancestor of x_j, в общем.&lt;br /&gt;
:: «использовали линейность математического ожидания E» — эм, просто линейность математического ожидания, зачем значок E тут?&lt;br /&gt;
:: В X_k,i у индексов тех поехал.&lt;br /&gt;
:: «минимальный приоритет в treap’е» — в treap'е -&amp;gt; в декартовом дереве&lt;br /&gt;
:: Как-то доказательство пошло сначала с индукционного перехода, а потом к базе. Надо бы наоборот.&lt;br /&gt;
:: как-то ты сразу суммы свернул, надо чуть поподробнее расписать замены диапазонов суммирования, ну или что там используется.&lt;br /&gt;
::: {{tick | ticked=1}} Только пояснение о том, какое неравенство использвуется, лучше в скобках после написать, а не с новой строки.&lt;br /&gt;
:::: {{tick | ticked=1}} И обозначай в тех логарифм не как ln, а как \ln.&lt;br /&gt;
::::: Ааа, хрень полная написана. Во-первых, log n и ln n при маленьких n отличаются так же, как при больших — а именно в константу раз. Во-вторых, значок ~ означает, что функции эквивалентны, то есть их частное при больших n стремится к 1. &lt;br /&gt;
: {{tick | ticked=1}} Кстати, там где ты говоришь про высоту декартового дерева, говори не O(\ln n), а O(\log n) (просто один раз упомяни, что они в константу раз различаются и все).&lt;br /&gt;
: {{tick | ticked=1}} У тебя merge в техе в разных местах по-разному написан, то &amp;lt;tex&amp;gt; Merge &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\operatorname{Merge}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
: {{tick | ticked=1}} «Построение декартово дерева»&lt;br /&gt;
:: все еще не исправлено...--[[Участник:Dgerasimov|Дмитрий Герасимов]] 16:40, 28 апреля 2012 (GST)&lt;br /&gt;
::: аргх. правильно говорить «декартова дерева». --[[Участник:Dgerasimov|Дмитрий Герасимов]] 13:48, 1 мая 2012 (GST)&lt;br /&gt;
&lt;br /&gt;
== Приоритет ==&lt;br /&gt;
&lt;br /&gt;
Ребятушки, у вас полстатьи в корне максимальный проритет, полстатьи — минимальный. Давайте уж сойдемся на том, что приоритет, он на то и приоритет, чтобы первым шел тот, у кого он больше. [[Участник:Kirelagin|Кирилл Елагин]] 21:05, 28 января 2014 (GST)&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B5%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B2%D0%BE_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE&amp;diff=36041</id>
		<title>Декартово дерево</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B5%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B2%D0%BE_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE&amp;diff=36041"/>
				<updated>2014-01-28T17:04:18Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: /* Merge */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Эта статья про Курево''&lt;br /&gt;
&lt;br /&gt;
'''Декартово дерево''' {{---}} это структура данных, объединяющая в себе бинарное дерево поиска и бинарную кучу (отсюда и второе её название: treap (tree + heap) и дерамида (дерево + пирамида), также существует название курево (куча + дерево).&lt;br /&gt;
&lt;br /&gt;
Более строго, это бинарное дерево, в узлах которого хранится пары &amp;lt;tex&amp;gt; (x,y) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; - это ключ, а &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; - это приоритет. Также оно является [[Дерево поиска, наивная реализация|двоичным деревом поиска]] по &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и [[Двоичная куча|пирамидой]] по &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;. Предполагая, что все &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и все &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; являются различными, получаем, что если некоторый элемент дерева содержит &amp;lt;tex&amp;gt;(x_0,y_0)&amp;lt;/tex&amp;gt;, то у всех элементов в левом поддереве &amp;lt;tex&amp;gt;x &amp;lt; x_0&amp;lt;/tex&amp;gt;, у всех элементов в правом поддереве &amp;lt;tex&amp;gt; x &amp;gt; x_0&amp;lt;/tex&amp;gt;, а также и в левом, и в правом поддереве имеем: &amp;lt;tex&amp;gt; y &amp;lt; y_0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Дерамиды были предложены Сиделем (Siedel) и Арагоном (Aragon) в 1996 г.&lt;br /&gt;
&lt;br /&gt;
== Операции в декартовом дереве ==&lt;br /&gt;
=== Split ===&lt;br /&gt;
[[file:split.png|thumb|400px|Операция split]]&lt;br /&gt;
&lt;br /&gt;
Операция &amp;lt;tex&amp;gt;\mathrm{Split}&amp;lt;/tex&amp;gt; (''разрезать'') позволяет сделать следующее: разрезать декартово дерево &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; по ключу &lt;br /&gt;
&amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; и получить два других декартовых дерева: &amp;lt;tex&amp;gt;T_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T_2&amp;lt;/tex&amp;gt;, причем в &amp;lt;tex&amp;gt;T_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
находятся все ключи дерева &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;, не большие &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, а в &amp;lt;tex&amp;gt;T_2&amp;lt;/tex&amp;gt; {{---}} большие &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{Split}(T, k) \to \{T_1, T_2\}&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;T_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T_2&amp;lt;/tex&amp;gt;:&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_1&amp;lt;/tex&amp;gt;: левое поддерево &amp;lt;tex&amp;gt;T_1&amp;lt;/tex&amp;gt; совпадёт с левым поддеревом &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;. Для нахождения правого поддерева &amp;lt;tex&amp;gt;T_1&amp;lt;/tex&amp;gt;, нужно разрезать правое поддерево &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;T^R_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T^R_2&amp;lt;/tex&amp;gt; по ключу &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; и взять &amp;lt;tex&amp;gt;T^R_1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_2&amp;lt;/tex&amp;gt; совпадёт с &amp;lt;tex&amp;gt;T^R_2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Случай, в котором требуется разрезать дерево по ключу, меньше либо равному ключа в корне, рассматривается симметрично.&lt;br /&gt;
&lt;br /&gt;
Псевдокод:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Split(Treap t, int k, Treap &amp;amp;t1, Treap &amp;amp;t2)&lt;br /&gt;
  if t == NULL &lt;br /&gt;
    t1 = t2 = NULL;&lt;br /&gt;
  else if k &amp;gt; t.x &lt;br /&gt;
    Split(t.right, k, t.right, t2);&lt;br /&gt;
    t1 = t;&lt;br /&gt;
  else &lt;br /&gt;
    Split(t.left, k, t1, t.left);&lt;br /&gt;
    t2 = t;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Оценим время работы операции &amp;lt;tex&amp;gt;\mathrm{Split}&amp;lt;/tex&amp;gt;. Во время выполнения вызывается одна операция &amp;lt;tex&amp;gt;\mathrm{Split}&amp;lt;/tex&amp;gt; для&lt;br /&gt;
дерева хотя бы на один меньшей высоты и делается ещё &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; операций. Тогда итоговая трудоёмкость этой операции&lt;br /&gt;
равна &amp;lt;tex&amp;gt;O(h)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; {{---}} высота дерева.&lt;br /&gt;
&lt;br /&gt;
=== Merge ===&lt;br /&gt;
[[file:merge.png|thumb|400px|Операция merge]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим вторую операцию с декартовыми деревьями {{---}} &amp;lt;tex&amp;gt;\mathrm{Merge}&amp;lt;/tex&amp;gt; (''слить''). &lt;br /&gt;
&lt;br /&gt;
С помощью этой операции можно слить два декартовых дерева в одно.&lt;br /&gt;
Причем, все ключи в первом(''левом'') дереве должны быть меньше, чем&lt;br /&gt;
ключи во втором(''правом''). В результате получается дерево, в котором есть все ключи из первого и второго деревьев.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{Merge}(T_1, T_2) \to \{T\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рассмотрим принцип работы этой операции. Пусть нужно слить деревья &amp;lt;tex&amp;gt;T_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T_2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда, очевидно, у результирующего дерева &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; есть корень. &lt;br /&gt;
Корнем станет вершина из &amp;lt;tex&amp;gt;T_1&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;T_2&amp;lt;/tex&amp;gt; с наибольшим приоритетом &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;. Но вершина с самым большим &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; из всех вершин деревьев &lt;br /&gt;
&amp;lt;tex&amp;gt;T_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T_2&amp;lt;/tex&amp;gt; может быть только либо корнем &amp;lt;tex&amp;gt;T_1&amp;lt;/tex&amp;gt;, либо корнем &amp;lt;tex&amp;gt;T_2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Рассмотрим случай, в котором корень &amp;lt;tex&amp;gt;T_1&amp;lt;/tex&amp;gt; имеет больший &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;, чем корень &amp;lt;tex&amp;gt;T_2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Случай, в котором корень &amp;lt;tex&amp;gt;T_2&amp;lt;/tex&amp;gt; имеет больший &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;, чем корень &amp;lt;tex&amp;gt;T_1&amp;lt;/tex&amp;gt;, симметричен этому.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; корня &amp;lt;tex&amp;gt;T_1&amp;lt;/tex&amp;gt; больше &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; корня &amp;lt;tex&amp;gt;T_2&amp;lt;/tex&amp;gt;, то он и будет являться корнем. Тогда левое поддерево &lt;br /&gt;
&amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; совпадёт с левым поддеревом &amp;lt;tex&amp;gt;T_1&amp;lt;/tex&amp;gt;. Справа же нужно подвесить объединение правого поддерева&lt;br /&gt;
&amp;lt;tex&amp;gt;T_1&amp;lt;/tex&amp;gt; и дерева &amp;lt;tex&amp;gt;T_2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Псевдокод:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Merge(Treap &amp;amp;t, Treap t1, Treap t2)&lt;br /&gt;
  if t1 == NULL or t2 == NULL &lt;br /&gt;
    if t1 != NULL&lt;br /&gt;
      t = t1;&lt;br /&gt;
    else&lt;br /&gt;
      t = t2;&lt;br /&gt;
  else if t1.y &amp;gt; t2.y&lt;br /&gt;
    Merge(t1.right, t1.right, t2);&lt;br /&gt;
    t = t1;&lt;br /&gt;
  else &lt;br /&gt;
    Merge(t2.left, t1, t2.left);&lt;br /&gt;
    t = t2;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рассуждая аналогично операции &amp;lt;tex&amp;gt;\mathrm{Split}&amp;lt;/tex&amp;gt; приходим к выводу, что трудоёмкость операции &amp;lt;tex&amp;gt;\mathrm{Merge}&amp;lt;/tex&amp;gt; &lt;br /&gt;
равна &amp;lt;tex&amp;gt;O(h)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; {{---}} высота дерева.&lt;br /&gt;
&lt;br /&gt;
=== Insert ===&lt;br /&gt;
Операция &amp;lt;tex&amp;gt;\mathrm{Insert}(T, k)&amp;lt;/tex&amp;gt; добавляет в дерево &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; элемент &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k.x&amp;lt;/tex&amp;gt; {{---}} ключ, а &amp;lt;tex&amp;gt;k.y&amp;lt;/tex&amp;gt;{{---}} приоритет.&lt;br /&gt;
&lt;br /&gt;
Представим что элемент &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, это декартово дерево из одного элемента, и для того чтобы его добавить в наше декартово дерево &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;, очевидно, нам нужно их слить. Но &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; может содержать ключи как меньше, так и больше ключа &amp;lt;tex&amp;gt;k.x&amp;lt;/tex&amp;gt;, поэтому сначала нужно разрезать &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; по ключу &amp;lt;tex&amp;gt;k.x&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Реализация №1 &lt;br /&gt;
# Разобьём наше дерево по ключу, который мы хотим добавить, то есть &amp;lt;tex&amp;gt;\mathrm{Split}(T, k.x) \to \{T_1, T_2\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Сливаем первое дерево с новым элементом, то есть &amp;lt;tex&amp;gt;\mathrm{Merge}(T_1, k) \to T_1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Сливаем получившиеся дерево со вторым, то есть &amp;lt;tex&amp;gt;\mathrm{Merge}(T_1, T_2) \to T&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Реализация №2  &lt;br /&gt;
# Сначала спускаемся по дереву (как в обычном бинарном дереве поиска по &amp;lt;tex&amp;gt;k.x&amp;lt;/tex&amp;gt;), но останавливаемся на первом элементе, в котором значение приоритета оказалось меньше &amp;lt;tex&amp;gt;k.y&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Теперь вызываем &amp;lt;tex&amp;gt;\mathrm{Split}(T, k.x) \to \{T_1, T_2\}&amp;lt;/tex&amp;gt; от найденного элемента (от элемента вместе со всем его поддеревом) &lt;br /&gt;
# Полученные &amp;lt;tex&amp;gt;T_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T_2&amp;lt;/tex&amp;gt; записываем в качестве левого и правого сына добавляемого элемента.&lt;br /&gt;
# Полученное дерево ставим на место элемента, найденного в первом пункте.&lt;br /&gt;
&lt;br /&gt;
В первой реализации два раза используется &amp;lt;tex&amp;gt;\mathrm{Merge}&amp;lt;/tex&amp;gt;, а во второй реализации слияние вообще не используется.&lt;br /&gt;
&lt;br /&gt;
=== Remove ===&lt;br /&gt;
Операция &amp;lt;tex&amp;gt;\mathrm{Remove}(T, x)&amp;lt;/tex&amp;gt; удаляет из дерева &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; элемент с ключом &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Реализация №1&lt;br /&gt;
&lt;br /&gt;
# Разобьём наше дерево по ключу, который мы хотим удалить, то есть &amp;lt;tex&amp;gt;\mathrm{Split }(T, k.x) \to \{T_1, T_2\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Теперь отделяем от первого дерева элемент &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, опять таки разбивая по ключу &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;\mathrm{Split }(T_1, k.x - \varepsilon) \to \{T_1, T_3\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Сливаем первое дерево со вторым, то есть &amp;lt;tex&amp;gt;\mathrm{Merge }(T_1, T_2) \to T&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
* Реализация №2&lt;br /&gt;
# Спускаемся по дереву (как в обычном бинарном дереве поиска по &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;), ища удаляемый элемент. &lt;br /&gt;
# Найдя элемент, вызываем &amp;lt;tex&amp;gt;\mathrm{Merge}&amp;lt;/tex&amp;gt; его левого и правого сыновей&lt;br /&gt;
# Результат процедуры &amp;lt;tex&amp;gt;\mathrm{Merge}&amp;lt;/tex&amp;gt; ставим на место удаляемого элемента.&lt;br /&gt;
&lt;br /&gt;
В первой реализации два раза используется &amp;lt;tex&amp;gt;\mathrm{Split}&amp;lt;/tex&amp;gt;, а во второй реализации разрезание вообще не используется.&lt;br /&gt;
&lt;br /&gt;
== Построение декартова дерева ==&lt;br /&gt;
Пусть нам известно из каких пар &amp;lt;tex&amp;gt;(x_i, y_i)&amp;lt;/tex&amp;gt; требуется построить декартово дерево, причем также известно, что &amp;lt;tex&amp;gt;x_1 &amp;lt; x_2 &amp;lt; \ldots &amp;lt; x_n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
=== Рекурсивный алгоритм ===&lt;br /&gt;
Рассмотрим приоритеты &amp;lt;tex&amp;gt;y_1 , y_2 , \ldots , y_n&amp;lt;/tex&amp;gt; и выберем максимум среди них, пусть это будет &amp;lt;tex&amp;gt;y_k&amp;lt;/tex&amp;gt;, и сделаем &amp;lt;tex&amp;gt;(x_k, y_k)&amp;lt;/tex&amp;gt; корнем дерева (по свойству [[Двоичная куча|пирамиды]] в корне должен быть элемент с максимальным приоритетом). Проделав то же самое с &amp;lt;tex&amp;gt;y_1 , y_2 , \ldots , y_{k-1}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y_{k+1} , y_{k+2} , \ldots , y_n&amp;lt;/tex&amp;gt;, получим соответственно левого и правого сына &amp;lt;tex&amp;gt;(x_k, y_k)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такой алгоритм работает за &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм за O(n) ===&lt;br /&gt;
Будем строить дерево слева направо, то есть начиная с &amp;lt;tex&amp;gt;(x_1, y_1)&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;(x_n, y_n)&amp;lt;/tex&amp;gt;, при этом помнить последний добавленный элемент &amp;lt;tex&amp;gt;(x_k, y_k)&amp;lt;/tex&amp;gt;. Он будет самым правым, так как у него будет максимальный ключ, а по ключам декартово дерево представляет собой [[Дерево поиска, наивная реализация|двоичное дерево поиска]]. При добавлении &amp;lt;tex&amp;gt;(x_{k+1}, y_{k+1})&amp;lt;/tex&amp;gt;, пытаемся сделать его правым сыном &amp;lt;tex&amp;gt;(x_k, y_k)&amp;lt;/tex&amp;gt;, это следует сделать если &amp;lt;tex&amp;gt;y_k &amp;gt; y_{k+1}&amp;lt;/tex&amp;gt;, иначе делаем шаг к предку последнего элемента и смотрим его значение &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;. Поднимаемся до тех пор, пока приоритет в рассматриваемом элементе меньше приоритета в добавляемом, после чего делаем &amp;lt;tex&amp;gt;(x_{k+1}, y_{k+1})&amp;lt;/tex&amp;gt; его правым сыном, а предыдущего правого сына делаем левым сыном &amp;lt;tex&amp;gt;(x_{k+1}, y_{k+1})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что каждую вершину мы посетим максимум дважды: при непосредственном добавлении и, поднимаясь вверх (ведь после этого вершина будет лежать в чьем-то левом поддереве, а мы поднимаемся только по правому). Из этого следует, что построение происходит за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Случайные приоритеты ==&lt;br /&gt;
Мы уже выяснили, что сложность операций с декартовым деревом линейно зависит от его высоты. В действительности высота декартова дерева может быть линейной относительно его размеров. Например, высота декартова дерева, построенного по набору ключей &amp;lt;tex&amp;gt;(1, 1), \ldots, (n, 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 = В декартовом дереве из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; узлов, приоритеты &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; которого являются [[Дискретная случайная величина|случайными величинами]] c равномерным распределением, средняя глубина вершины &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
Будем считать, что все выбранные приоритеты &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; попарно различны.&lt;br /&gt;
&lt;br /&gt;
Для начала введем несколько обозначений:&lt;br /&gt;
* &amp;lt;tex&amp;gt;x_k&amp;lt;/tex&amp;gt; {{---}} вершина с &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-ым по величине ключом;&lt;br /&gt;
* индикаторная величина &amp;lt;tex&amp;gt;A_{i, j} = \left\{\begin{array}{lllc} 1 &amp;amp;&amp;amp;, x_i\  \text{is ancestor of} \ x_j\\ &lt;br /&gt;
0 &amp;amp;&amp;amp;, \text{otherwise}\\&lt;br /&gt;
\end{array}\right.&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d(v)&amp;lt;/tex&amp;gt; - глубина вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
В силу обозначений глубину вершины можно записать как количество предков:&lt;br /&gt;
:&amp;lt;tex&amp;gt;d(x_k) = \sum\limits_{i = 1}^{n} A_{i,k} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь можно выразить [[Математическое ожидание случайной величины|математическое ожидание]] глубины конкретной вершины:&lt;br /&gt;
:&amp;lt;tex&amp;gt;E(d(x_k)) = \sum\limits_{i = 1}^{n} Pr[A_{i,k} = 1] &amp;lt;/tex&amp;gt; {{---}} здесь мы использовали линейность математического ожидания, и то что &amp;lt;tex&amp;gt;E(X) = Pr[X = 1]&amp;lt;/tex&amp;gt; для индикаторной величины &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;Pr[A]&amp;lt;/tex&amp;gt; {{---}} вероятность события &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;).&lt;br /&gt;
Для подсчёта средней глубины вершин нам нужно сосчитать вероятность того,  что вершина &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; является предком вершины &amp;lt;tex&amp;gt;x_k&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;Pr[A_{i,k} = 1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Введем новое обозначение:&lt;br /&gt;
* &amp;lt;tex&amp;gt;X_{i, k}&amp;lt;/tex&amp;gt; {{---}}  множество ключей &amp;lt;tex&amp;gt;\{x_i, \ldots, x_k\}&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;\{x_k, \ldots, x_i\}&amp;lt;/tex&amp;gt;,  в зависимости от &amp;lt;tex&amp;gt;i &amp;lt; k&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;i &amp;gt; k&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;X_{i, k}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;X_{k, i}&amp;lt;/tex&amp;gt; обозначают одно и тоже, их мощность равна &amp;lt;tex&amp;gt;|k - i| + 1&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Для любых &amp;lt;tex&amp;gt;i \ne k&amp;lt;/tex&amp;gt; , &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; является предком &amp;lt;tex&amp;gt;x_k&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; имеет наименьший приоритет среди &amp;lt;tex&amp;gt;X_{i, k}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=Если &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; является корнем, то оно является предком &amp;lt;tex&amp;gt;x_k&amp;lt;/tex&amp;gt; и по определению имеет минимальный приоритет среди всех вершин, следовательно, и среди &amp;lt;tex&amp;gt;X_{i, k}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
С другой стороны,  если &amp;lt;tex&amp;gt;x_k&amp;lt;/tex&amp;gt; {{---}}  корень,  то &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; {{---}}  не предок &amp;lt;tex&amp;gt;x_k&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;x_k&amp;lt;/tex&amp;gt; имеет минимальный приоритет в декартовом дереве; следовательно, &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; не имеет наименьший приоритет среди &amp;lt;tex&amp;gt;X_{i, k}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь предположим, что какая-то другая   вершина &amp;lt;tex&amp;gt;x_m&amp;lt;/tex&amp;gt; – корень. Тогда, если &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x_k&amp;lt;/tex&amp;gt; лежат в разных поддеревьях, то &amp;lt;tex&amp;gt;i &amp;lt; m &amp;lt; k&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;i &amp;gt; m &amp;gt; k&amp;lt;/tex&amp;gt;, следовательно, &amp;lt;tex&amp;gt;x_m&amp;lt;/tex&amp;gt; содержится в &amp;lt;tex&amp;gt;X_{i , k}&amp;lt;/tex&amp;gt;. В этом случае &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; – не предок &amp;lt;tex&amp;gt;x_k&amp;lt;/tex&amp;gt;, и наименьший приоритет среди &amp;lt;tex&amp;gt;X_{i, k}&amp;lt;/tex&amp;gt; имеет вершина с номером &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наконец,  если &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x_k&amp;lt;/tex&amp;gt; лежат в одном поддереве,  то доказательство применяется по индукции: пустое декартово дерево есть тривиальная база,  а рассматриваемое поддерево является меньшим декартовым деревом. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Так как распределение приоритетов равномерное, каждая вершина среди &amp;lt;tex&amp;gt;X_{i, k}&amp;lt;/tex&amp;gt; может иметь минимальный приоритет,  мы немедленно приходим к следующему равенству: &lt;br /&gt;
: &amp;lt;tex&amp;gt;Pr[A_{i, j} = 1] = \left\{\begin{array}{lllc} \frac{1}{k - i + 1} &amp;amp;&amp;amp;, k \ &amp;gt; \ i\\ &lt;br /&gt;
0 &amp;amp;&amp;amp;, k\ =\ i\\&lt;br /&gt;
\frac{1}{i - k + 1} &amp;amp;&amp;amp;, k \ &amp;lt; \ i\\&lt;br /&gt;
\end{array}\right.&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подставив последнее в нашу формулу с математическим ожиданием получим:&lt;br /&gt;
: &amp;lt;tex&amp;gt;E(d(x_k)) = \sum\limits_{i = 1}^{n} Pr[A_{i,k} = 1] = \sum\limits_{i = 1}^{k - 1}  \frac{1}{k - i + 1} + \sum\limits_{i = k + 1}^{n} \frac{1}{i - k + 1} \le \ln(k) + \ln(n-k) + 2&amp;lt;/tex&amp;gt; (здесь мы использовали неравенство &amp;lt;tex&amp;gt;\sum\limits_{i = 1}^{n}  \frac{1}{i} \le \ln(n) + 1&amp;lt;/tex&amp;gt;)&lt;br /&gt;
: &amp;lt;tex&amp;gt;\log(n)&amp;lt;/tex&amp;gt; отличается от &amp;lt;tex&amp;gt;\ln(n)&amp;lt;/tex&amp;gt; в константу раз, поэтому &amp;lt;tex&amp;gt;\log(n) = O(\ln(n))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В итоге мы получили что &amp;lt;tex&amp;gt;E(d(x_k)) = O(\log(n))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Таким образом, среднее время работы операций &amp;lt;tex&amp;gt;\mathrm{Split}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{Merge}&amp;lt;/tex&amp;gt; будет &amp;lt;tex&amp;gt;O(\log(n))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Декартово дерево по неявному ключу]]&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
*[http://ru.wikipedia.org/wiki/Декартово_дерево Декартово дерево — Википедия]&lt;br /&gt;
*[http://rain.ifmo.ru/cat/data/theory/trees/treaps-2006/article.pdf Treaps и T-Treaps]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Деревья поиска]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kirelagin&amp;diff=35112</id>
		<title>Участник:Kirelagin</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kirelagin&amp;diff=35112"/>
				<updated>2014-01-04T22:54:17Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Кирилл Елагин&lt;br /&gt;
&lt;br /&gt;
* [http://kir.elagin.me/ kir.elagin.me]&lt;br /&gt;
* [[Участник:Kirelagin/Оформление|Как сделать нормальный конспект]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0&amp;diff=32798</id>
		<title>Нормальная подгруппа</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0&amp;diff=32798"/>
				<updated>2013-06-24T16:37:48Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: /* Нормальные подгруппы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Нормальные подгруппы ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&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;\forall x\in G,\,\forall h\in H : x\cdot h\cdot x^{-1}\in H&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Свойства ===&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Подгруппа &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;x \in G&amp;lt;/tex&amp;gt; выполнено &amp;lt;tex&amp;gt;xHx^{-1}=H&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&amp;lt;tex&amp;gt;xHx^{-1} \subset H&amp;lt;/tex&amp;gt; по определению &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;. Подставив в предыдущее выражение &amp;lt;tex&amp;gt;x^{-1}&amp;lt;/tex&amp;gt; вместо &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, видим, что &amp;lt;tex&amp;gt;x^{-1}Hx \subset H&amp;lt;/tex&amp;gt;. Следовательно, &amp;lt;tex&amp;gt;H = x(x^{-1}Hx)x^{-1} \subset xHx^{-1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Итого, &amp;lt;tex&amp;gt;xHx^{-1}=H&amp;lt;/tex&amp;gt;. В другую сторону — прямо из определения.&lt;br /&gt;
}}&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Любая подгруппа [[Абелева группа|абелевой группы]] {{---}} нормальна.&lt;br /&gt;
|proof=&amp;lt;tex&amp;gt;x n x^{-1} = x x^{-1} n = en = n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
* Подгруппа &amp;lt;tex&amp;gt;H =\{(1)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(2&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;3)\}&amp;lt;/tex&amp;gt; группы &amp;lt;tex&amp;gt;S_3&amp;lt;/tex&amp;gt; [[Симметрическая группа|группы перестановок]] множества из трех элементов не является абелевой.&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория групп]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0&amp;diff=32797</id>
		<title>Подгруппа</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0&amp;diff=32797"/>
				<updated>2013-06-24T16:21:29Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: /* Нормальные подгруппы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&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;H&amp;lt;/tex&amp;gt; образует группу и называется '''подгруппой''' группы &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;:&lt;br /&gt;
:&amp;lt;tex&amp;gt;\forall a,b\in H\subseteq G : a\cdot b\in H&amp;lt;/tex&amp;gt;&lt;br /&gt;
:&amp;lt;tex&amp;gt;\forall a\in H : a^{-1}\in H&amp;lt;/tex&amp;gt;&lt;br /&gt;
:&amp;lt;tex&amp;gt;\exists a\in H \Rightarrow e=a\cdot a^{-1} \in H&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
* Подмножество &amp;lt;tex&amp;gt;n\mathbb{Z}=\{nm\vert m\in\mathbb{Z}\}&amp;lt;/tex&amp;gt; является подгруппой в &amp;lt;tex&amp;gt;\mathbb{Z}&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;n\in\mathbb{N}&amp;lt;/tex&amp;gt; относительно операции сложения.&lt;br /&gt;
* Группа &amp;lt;tex&amp;gt;G=\{m\vert m\in\mathbb{Z}\&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;mod&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;5=0\}&amp;lt;/tex&amp;gt; является подгруппой  в &amp;lt;tex&amp;gt;\mathbb{Z}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства ===&lt;br /&gt;
* [[Теорема о подгруппах циклической группы|Все подгруппы циклической группы являются циклическими]].&lt;br /&gt;
&lt;br /&gt;
== Нормальные подгруппы ==&lt;br /&gt;
{{Main|нормальная подгруппа}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&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;\forall x\in G,\,\forall h\in H : x\cdot h\cdot x^{-1}\in H&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория групп]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D0%B0%D1%8F_%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0&amp;diff=32796</id>
		<title>Конечная группа</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D0%B0%D1%8F_%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0&amp;diff=32796"/>
				<updated>2013-06-24T16:17:22Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: /* Свойства */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
[[группа|Группа]] называется '''конечной''', если множество ее элементов конечно. Мощность множества элементов группы &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называют порядком группы и обозначают &amp;lt;tex&amp;gt;\vert G\vert&amp;lt;/tex&amp;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;
Пусть &amp;lt;tex&amp;gt;\mathbb{A}_n = \{a_1,a_2,\dots,a_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;
{| border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;8&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| *&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;...&amp;lt;/big&amp;gt;&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;...&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;&amp;lt;/big&amp;gt;  &lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; &lt;br /&gt;
| &amp;lt;big&amp;gt;a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;...&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;&amp;lt;/big&amp;gt;  &lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;...&lt;br /&gt;
| &amp;lt;big&amp;gt;...&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;...&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;...&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;...&amp;lt;/big&amp;gt;  &lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;...&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;&amp;lt;/big&amp;gt;  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Свойства ===&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Каждая строка или столбец являются перестановкой элементов группы.&lt;br /&gt;
|proof=Пусть &amp;lt;tex&amp;gt;a,b,c,d \in G&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;ab=d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;ac=d \Rightarrow b=c&amp;lt;/tex&amp;gt;. Так как количество клеток в строке равно количеству элементов, то, по принципу Дирихле, каждый элемент группы встречается в строке один раз. &lt;br /&gt;
}}&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Если таблица симметрична относительно главной диагонали, то операция умножения коммутативна.&lt;br /&gt;
|proof=Таблица симметрична &amp;lt;tex&amp;gt;\Rightarrow ab = ba&amp;lt;/tex&amp;gt; для любых &amp;lt;tex&amp;gt;a,b \in G&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=В конечной группе порядок каждого элемента является делителем порядка группы.&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим элемент &amp;lt;tex&amp;gt;x\in G&amp;lt;/tex&amp;gt; c порядком &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; и подмножество &amp;lt;tex&amp;gt;\langle x\rangle=\lbrace e,\,x,\,x^2,\,...,x^{n-1}\rbrace&amp;lt;/tex&amp;gt; (все &amp;lt;tex&amp;gt;x^k&amp;lt;/tex&amp;gt; различны при &amp;lt;tex&amp;gt;k&amp;lt;n&amp;lt;/tex&amp;gt; — в противном случае при &amp;lt;tex&amp;gt;x^k=x^m (m&amp;lt;k&amp;lt;n)\Rightarrow x^{k—m}=e&amp;lt;/tex&amp;gt;, т.е. &amp;lt;tex&amp;gt;n&amp;gt;k—m&amp;lt;/tex&amp;gt; не является порядком элемента &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;). Легко проверить, что &amp;lt;tex&amp;gt;\langle x\rangle&amp;lt;/tex&amp;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;.&lt;br /&gt;
}}&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Все группы простого порядка &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; изоморфны &amp;lt;tex&amp;gt;\mathbb{Z}/p\mathbb{Z}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим элемент &amp;lt;tex&amp;gt;x\in G,\,x\neq e&amp;lt;/tex&amp;gt; c порядком &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; и подмножество &amp;lt;tex&amp;gt;\langle x\rangle=\lbrace e,\,x,\,x^2,\,...,x^{n-1}\rbrace&amp;lt;/tex&amp;gt; (все &amp;lt;tex&amp;gt;x^k&amp;lt;/tex&amp;gt; различны при &amp;lt;tex&amp;gt;k&amp;lt;n&amp;lt;/tex&amp;gt; — см. выше). Очевидно, &amp;lt;tex&amp;gt;\langle x\rangle&amp;lt;/tex&amp;gt; — подгруппа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, изоморфная &amp;lt;tex&amp;gt;\mathbb{Z}/n\mathbb{Z}&amp;lt;/tex&amp;gt;. Но тогда &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; делит &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;(как порядок подгруппы) и не равняется единице(&amp;lt;tex&amp;gt;x^1\neq e&amp;lt;/tex&amp;gt;), значит &amp;lt;tex&amp;gt;n=p&amp;lt;/tex&amp;gt;. Раз порядок конечной подгруппы &amp;lt;tex&amp;gt;\mathbb{Z}/p\mathbb{Z}\subseteq G&amp;lt;/tex&amp;gt; совпадает с порядком группы, то группа и подгруппа просто совпадают: &amp;lt;tex&amp;gt;\mathbb{Z}/p\mathbb{Z}\eqsim G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Примеры таблиц умножения для конечных групп ===&lt;br /&gt;
Ниже перечислены все группы до шестого порядка включительно:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;|G| = 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
Тривиальная группа&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| *&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;e&amp;lt;/big&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;e&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;e&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;|G| = 2&amp;lt;/tex&amp;gt;&lt;br /&gt;
Группа вычетов по модулю два относительно сложения: &amp;lt;tex&amp;gt;\mathbb{Z}/2\mathbb{Z}&amp;lt;/tex&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| +&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt; &lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;|G| = 3&amp;lt;/tex&amp;gt;&lt;br /&gt;
Группа вычетов по модулю три относительно сложения: &amp;lt;tex&amp;gt;\mathbb{Z}/3\mathbb{Z}&amp;lt;/tex&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| +&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt; &lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt; &lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;|G| = 4&amp;lt;/tex&amp;gt;&lt;br /&gt;
Группа вычетов по модулю четыре относительно сложения: &amp;lt;tex&amp;gt;\mathbb{Z}/4\mathbb{Z}&amp;lt;/tex&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| +&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt; &lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt; &lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt; &lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;3&amp;lt;/big&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;3&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;3&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;3&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;3&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;3&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Группа &amp;lt;tex&amp;gt;\mathbb{Z}/2\mathbb{Z}\times\mathbb{Z}/2\mathbb{Z}&amp;lt;/tex&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| +&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;(0,0)&amp;lt;/big&amp;gt; &lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;(0,1)&amp;lt;/big&amp;gt; &lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;(1,0)&amp;lt;/big&amp;gt; &lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;(1,1)&amp;lt;/big&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;(0,0)&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;(0,0)&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;(0,1)&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;(1,0)&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;(1,1)&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;(0,1)&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;(0,1)&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;(0,0)&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;(1,1)&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;(1,0)&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;(1,0)&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;(1,0)&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;(1,1)&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;(0,0)&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;(0,1)&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;(1,1)&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;(1,1)&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;(1,0)&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;(0,1)&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;(0,0)&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;|G| = 5&amp;lt;/tex&amp;gt;&lt;br /&gt;
Группа вычетов по модулю пять относительно сложения: &amp;lt;tex&amp;gt;\mathbb{Z}/5\mathbb{Z}&amp;lt;/tex&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| +&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt; &lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt; &lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt; &lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;3&amp;lt;/big&amp;gt; &lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;4&amp;lt;/big&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;3&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;4&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;3&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;4&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;3&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;4&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;3&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;3&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;4&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;4&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;4&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;3&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;|G| = 6&amp;lt;/tex&amp;gt;&lt;br /&gt;
Группа вычетов по модулю шесть относительно сложения: &amp;lt;tex&amp;gt;\mathbb{Z}/6\mathbb{Z}&amp;lt;/tex&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| +&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt;&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt;&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt;&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;3&amp;lt;/big&amp;gt;&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;4&amp;lt;/big&amp;gt;&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;5&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;3&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;4&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;5&amp;lt;/big&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;3&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;4&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;5&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;3&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;4&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;5&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;3&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;3&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;4&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;5&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;4&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;4&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;5&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;3&amp;lt;/big&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;5&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;5&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;0&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;1&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;2&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;3&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;4&amp;lt;/big&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Группа перестановок множества из трех элементов: &amp;lt;tex&amp;gt;\mathbb{S}_3&amp;lt;/tex&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| *&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;e&amp;lt;/big&amp;gt;&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;a&amp;lt;/big&amp;gt;&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;aa&amp;lt;/big&amp;gt;&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;b&amp;lt;/big&amp;gt;&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;c&amp;lt;/big&amp;gt;&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;d&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;e&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;e&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;a&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;aa&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;b&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;c&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;d&amp;lt;/big&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;a&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;a&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;aa&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;e&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;c&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;d&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;b&amp;lt;/big&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;aa&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;aa&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;e&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;a&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;d&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;b&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;c&amp;lt;/big&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;b&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;b&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;d&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;c&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;e&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;aa&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;a&amp;lt;/big&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;c&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;c&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;b&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;d&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;a&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;e&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;aa&amp;lt;/big&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#efefef;&amp;quot;| &amp;lt;big&amp;gt;d&amp;lt;/big&amp;gt;&lt;br /&gt;
| &amp;lt;big&amp;gt;d&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;c&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;b&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;aa&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;a&amp;lt;/big&amp;gt; || &amp;lt;big&amp;gt;e&amp;lt;/big&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Для группы &amp;lt;tex&amp;gt;\mathbb{S}_3&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; — это циклическая перестановка &amp;lt;tex&amp;gt;(123)\rightarrow(231)&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;b,\,c,\,d&amp;lt;/tex&amp;gt; — транспозиции &amp;lt;tex&amp;gt;(123)\rightarrow(213),\,(123)\rightarrow(132),\,(123)\rightarrow(321)&amp;lt;/tex&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория групп]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D0%BB_%D0%A4%D0%B5%D0%B9%D0%B5%D1%80%D0%B0&amp;diff=25849</id>
		<title>Интеграл Фейера</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D0%BB_%D0%A4%D0%B5%D0%B9%D0%B5%D1%80%D0%B0&amp;diff=25849"/>
				<updated>2012-06-19T15:58:21Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: Правки Dgerasimov (обсуждение) откачены к версии Sementry&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = Определим так называемые '''суммы Фейера''', как среднее арифметическое сумм Фурье:&lt;br /&gt;
&amp;lt;tex&amp;gt;\sigma_n(f,x) = \frac{1}{n+1}\sum\limits_{k=0}^{n}S_n(f,x)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Подставим в эту формулу интеграл Дирихле: &amp;lt;tex&amp;gt;\sigma_n=\frac{1}{n+1}\int\limits_{Q}f(x+t)D_n(t)dt = \int\limits_{Q}f(x)\frac{1}{n+1}\sum\limits_{k=0}^{n}D_k(t)dt&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = '''Ядро Фейера''' - &amp;lt;tex&amp;gt;\Phi_n(t)=\frac{1}{n+1}\sum\limits_{k=0}^{n}D_k(t)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Пользуясь определением, запишем &amp;lt;tex&amp;gt;\sigma_k(f,x)=\int\limits_{Q}f(x+t)\Phi_n(t)dt&amp;lt;/tex&amp;gt;. Так как ядро Дирихле четное, то по формуле, ядро Фейера тоже четное. Заинтегрируем по &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; ядро Фейера: &amp;lt;tex&amp;gt;\int\limits_{Q}\Phi_n(t)dt=\frac{1}{n+1}\sum\limits_{k=0}^{n}\int\limits_{Q}D_k(t)dt = 1&amp;lt;/tex&amp;gt;, то есть ядро Фейера нормированно &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Поступая аналогично ядру Дирихле, можно придти к выводу &amp;lt;tex&amp;gt;\sigma_n(f,x)-S = \int\limits_{Q}(f(x+t)-f(x-t)-2S)\Phi_n(t)dt&amp;lt;/tex&amp;gt; {{---}} основная формула для исследования сумм Фейера в индивидуальной точке. Найдем замкнутое выражение для ядра Фейера.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex dpi=&amp;quot;150&amp;quot;&amp;gt;\Phi_n=\frac{1}{2\pi(n+1)}(\frac{\sin{(\frac{n+1}{2})t}}{\sin{\frac{t}{2}}})^2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex dpi=&amp;quot;150&amp;quot;&amp;gt;\Phi_n(t)=\frac{1}{n+1}\sum\limits_{k=0}^{n}\frac{1}{2\pi}\frac{\sin{(k+\frac{1}{2})t}}{\sin{\frac{t}{2}}}=\frac{1}{2\pi(n+1)}\frac{1}{\sin{\frac{t}{2}}}\sum\limits_{k=0}^{n}(\sin{k+\frac{1}{2}}t\sin{\frac{t}{2}})=&amp;lt;/tex&amp;gt; &lt;br /&gt;
&amp;lt;tex dpi=&amp;quot;150&amp;quot;&amp;gt; \frac{1}{2\pi(n+1)}\frac{1}{\sin{\frac{t}{2}}}\sum\limits_{k=0}^{n}\frac{1}{2}(\cos{kt}-\cos{(k+1)t})=\frac{1}{2\pi(n+1)}\frac{1-\cos{(n+1)t}}{2\sin^2{\frac{t}{2}}}=\frac{1}{2\pi(n+1)}\frac{\sin^2{\frac{n+1}{2}t}}{\sin^2{\frac{t}{2}}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Из этой формулы видно, что ядро Фейера всегда неотрицательно, в отличии от ядра Дирихле.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = &amp;lt;tex&amp;gt;\int\limits_{Q}|D_n(t)|dt&amp;lt;/tex&amp;gt; называется '''константой Лебега'''.&lt;br /&gt;
}}&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement= &amp;lt;tex&amp;gt;\int\limits_{Q}|D_n(t)|dt \sim \ln{n}&amp;lt;/tex&amp;gt; при больших &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof= &lt;br /&gt;
&amp;lt;tex&amp;gt;\int\limits_{Q}|D_n(t)|dt \sim \int\limits_{0}^{\pi} \frac {|\sin (n+ \frac12)t|}{\sin \frac{t}{2}} dt = \int\limits_{0}^{\frac{\pi}{2}} \frac {|\sin (2n+ 1)t|}{\sin t} dt&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как на &amp;lt;tex&amp;gt; [0; \frac{\pi}{2}] &amp;lt;/tex&amp;gt; выполняется двойное неравенство &amp;lt;tex&amp;gt; \frac{2}{\pi} t \le \sin t \le t &amp;lt;/tex&amp;gt;, то можно рассматривать &amp;lt;tex&amp;gt; \int\limits_{0}^{\frac{\pi}{2}} \frac {|\sin (2n+ 1)t|}{t} dt &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разобьем интеграл на две части, &amp;lt;tex&amp;gt; \int\limits_{0}^{\frac{\pi}{2}} = \int\limits_{0}^{\frac{\pi}{2n+1}} + \int\limits_{\frac{\pi}{2n+1}}^{\frac{\pi}{2}} &amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \int\limits_{0}^{\frac{\pi}{2n+1}} \frac {|\sin (2n+ 1)t|}{t} dt \le  \int\limits_{0}^{\frac{\pi}{2n+1}} \frac {(2n + 1) |\sin t|}{t} dt \le const &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Оценка сверху: &amp;lt;tex&amp;gt; \int\limits_{\frac{\pi}{2n+1}}^{\frac{\pi}{2}} \frac {|\sin (2n+ 1)t|}{t} dt \le \int\limits_{\frac{\pi}{2n+1}}^{\frac{\pi}{2}} \frac {1}{t} dt = \ln t \bigg|_{\frac{\pi}{2n+1}}^{\frac{\pi}{2}} \sim \ln n &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Оценка снизу: &amp;lt;tex&amp;gt; \int\limits_{\frac{\pi}{2n+1}}^{\frac{\pi}{2}} \frac {|\sin (2n+ 1)t|}{t} dt \ge \int\limits_{\frac{\pi}{2n+1}}^{\frac{\pi}{2}} \frac {\sin^2 (2n+ 1)t}{t} dt = \frac12 \int\limits_{\frac{\pi}{2n+1}}^{\frac{\pi}{2}} \frac{dt}{t} - \frac12 _{\frac{\pi}{2n+1}}^{\frac{\pi}{2}} \frac {\cos (4n+ 2)t}{t} dt \sim \ln n &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Отсюда получаем требуемое.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Именно с этим фактом связана трудность исследования рядов Фурье в индивидуальной точке, в отличии от сумм Фейера, где ядро положительно и условия сходимости выписываются проще.&lt;br /&gt;
&lt;br /&gt;
Поясним смысл сумм Фейера: в свое время, рассматривая числовые ряды, мы говорили, что &amp;lt;tex&amp;gt;\sum\limits_{k=1}^{\infty}a_k = \lim\limits_{n \to \infty}S_n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S_n=\sum\limits_{k=1}^{n}a_n&amp;lt;/tex&amp;gt;. Для расходящихся рядов, можно применять обобщенные методы суммирования, главное, чтобы выполнялись свойства перманентности и эффективности. К примеру, если &amp;lt;tex&amp;gt;\sigma_n=\frac{1}{n}\sum\limits_{n=1}^{\infty}S_k \to S&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\sum\limits_{n=1}^{\infty}a_n = S&amp;lt;/tex&amp;gt; по методу средних арифметических. &lt;br /&gt;
В точно таком же смысле, если взять ряд Фурье: &amp;lt;tex&amp;gt;\frac{a_0}{2}+\sum\limits_{n=1}^{\infty}(a_n\cos{nx}+b_n\sin{nx})=\lim\limits_{n \to \infty}S_n(f,x)=\lim\limits_{n \to \infty}\sigma_n(f,x)&amp;lt;/tex&amp;gt;(с.а.). В этом и состоит смысл введения сумм Фейера.&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9B%D0%B5%D0%B2%D0%B8%D0%BD%D0%B0&amp;diff=24041</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%B5%D0%BC%D0%B0_%D0%9B%D0%B5%D0%B2%D0%B8%D0%BD%D0%B0&amp;diff=24041"/>
				<updated>2012-06-05T10:07:24Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Теорема&lt;br /&gt;
|author=Левин&lt;br /&gt;
|statement=&lt;br /&gt;
Для любого языка &amp;lt;tex&amp;gt;L \in \Sigma_1&amp;lt;/tex&amp;gt; и соответствующего ему (из определения &amp;lt;tex&amp;gt;\Sigma_1&amp;lt;/tex&amp;gt;) отношения &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; существует «оптимальная» (работающая «не сильно дольше», чем любая другая) программа &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;, сопоставляющая словам из &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; их сертификаты, то есть:&lt;br /&gt;
# &amp;lt;tex&amp;gt;x \in L \Leftrightarrow R(x, p(x)) = 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# для любой другой программы &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt;, для которой верно &amp;lt;tex&amp;gt;x \in L \Leftrightarrow R(x, q(x)) = 1&amp;lt;/tex&amp;gt;, найдутся такие константа &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt; и полином &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt;, что для любого &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; выполняется: &amp;lt;tex&amp;gt;T(p, x) \le c \cdot T(q, x) + r(|x|)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Построим «оптимальную» программу &amp;lt;tex&amp;gt;p(x)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пронумеруем все программы &amp;lt;tex&amp;gt;\lbrace p_i \rbrace_{i=1}^\infty&amp;lt;/tex&amp;gt;. Подадим им на вход слово &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и будем исполнять по одной инструкции в следующем порядке: на шаге с номером &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; запустим программу &amp;lt;tex&amp;gt;p_k&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; таково, что &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; делится на &amp;lt;tex&amp;gt;2^{k-1}&amp;lt;/tex&amp;gt; и не делится на &amp;lt;tex&amp;gt;2^{k}&amp;lt;/tex&amp;gt;. Таким образом, программа &amp;lt;tex&amp;gt;p_k&amp;lt;/tex&amp;gt; будет исполняться на каждом &amp;lt;tex&amp;gt;2^k&amp;lt;/tex&amp;gt;-м шаге начиная с &amp;lt;tex&amp;gt;2^{k-1}&amp;lt;/tex&amp;gt;-го. Следовательно, если &amp;lt;tex&amp;gt;p_k&amp;lt;/tex&amp;gt; завершит работу за &amp;lt;tex&amp;gt;T(p_k, x)&amp;lt;/tex&amp;gt; инструкций, то к этому времени нами будет сделано &amp;lt;tex&amp;gt;2^{k-1} + (T(P_k, x) - 1) \cdot 2^k&amp;lt;/tex&amp;gt; шагов.&lt;br /&gt;
&lt;br /&gt;
Как только &amp;lt;tex&amp;gt;p_k&amp;lt;/tex&amp;gt;, выдав некоторое значение, завершит работу, будем на соответствующих шагах запускать проверку сертификата слова &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, используя вывод &amp;lt;tex&amp;gt;p_k&amp;lt;/tex&amp;gt; в качестве сертификата. Если результат проверки положителен, искомый сертификат найден, иначе — продолжим работу, ничего не делая на тех шагах, когда должна была исполняться &amp;lt;tex&amp;gt;p_k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, если некоторая программа &amp;lt;tex&amp;gt;q = p_m&amp;lt;/tex&amp;gt; генерирует верные сертификаты, то наша программа &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; завершит работу не более, чем за &amp;lt;tex&amp;gt;2^{m-1} + (T(p_m,x) + T(R, \langle x,p_m(x) \rangle) - 1) \cdot 2^m&amp;lt;/tex&amp;gt; шагов. &amp;lt;tex&amp;gt;R \in P&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;|y| \le poly(|x|)&amp;lt;/tex&amp;gt; из определения &amp;lt;tex&amp;gt;\Sigma_1&amp;lt;/tex&amp;gt;, значит это равно &amp;lt;tex&amp;gt;2^{m-1} + (T(p_m,x) + poly(|x|)) \cdot 2^m = 2^m \cdot T(q,x) + poly(|x|)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Класс P]]&lt;br /&gt;
*[[Классы_NP_и_Σ₁]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9B%D0%B5%D0%B2%D0%B8%D0%BD%D0%B0&amp;diff=24040</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%B5%D0%BC%D0%B0_%D0%9B%D0%B5%D0%B2%D0%B8%D0%BD%D0%B0&amp;diff=24040"/>
				<updated>2012-06-05T10:05:15Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Теорема&lt;br /&gt;
|author=Левин&lt;br /&gt;
|statement=&lt;br /&gt;
Для любого языка &amp;lt;tex&amp;gt;L \in \Sigma_1&amp;lt;/tex&amp;gt; и соответствующего ему (из определения &amp;lt;tex&amp;gt;\Sigma_1&amp;lt;/tex&amp;gt;) отношения &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; существует «оптимальная» (работающая «не сильно дольше», чем любая другая) программа &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;, сопоставляющая словам из &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; их сертификаты, то есть:&lt;br /&gt;
# &amp;lt;tex&amp;gt;x \in L \Leftrightarrow R(x, p(x)) = 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# для любой другой программы &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt;, для которой верно &amp;lt;tex&amp;gt;x \in L \Leftrightarrow R(x, q(x)) = 1&amp;lt;/tex&amp;gt;, найдутся такие константа &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt; и полином &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt;, что для любого &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; выполняется: &amp;lt;tex&amp;gt;T(p, x) \le c \cdot T(q, x) + r(|x|)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Построим «оптимальную» программу &amp;lt;tex&amp;gt;p(x)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пронумеруем все программы &amp;lt;tex&amp;gt;\lbrace p_i \rbrace_{i=1}^\infty&amp;lt;/tex&amp;gt;. Подадим им на вход слово &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и будем исполнять по одной инструкции в следующем порядке: на шаге с номером &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; запустим программу &amp;lt;tex&amp;gt;p_k&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; таково, что &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; делится на &amp;lt;tex&amp;gt;2^{k-1}&amp;lt;/tex&amp;gt; и не делится на &amp;lt;tex&amp;gt;2^{k}&amp;lt;/tex&amp;gt;. Таким образом, программа &amp;lt;tex&amp;gt;p_k&amp;lt;/tex&amp;gt; будет исполняться на каждом &amp;lt;tex&amp;gt;2^k&amp;lt;/tex&amp;gt;-м шаге начиная с &amp;lt;tex&amp;gt;2^{k-1}&amp;lt;/tex&amp;gt;-го. Следовательно, если &amp;lt;tex&amp;gt;p_k&amp;lt;/tex&amp;gt; завершит работу за &amp;lt;tex&amp;gt;T(p_k, x)&amp;lt;/tex&amp;gt; инструкций, то к этому времени нами будет сделано &amp;lt;tex&amp;gt;2^{k-1} + (T(P_k, x) - 1) \cdot 2^k&amp;lt;/tex&amp;gt; шагов.&lt;br /&gt;
&lt;br /&gt;
Как только &amp;lt;tex&amp;gt;p_k&amp;lt;/tex&amp;gt;, выдав некоторое значение, завершит работу, будем на соответствующих шагах запускать проверку сертификата слова &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, используя вывод &amp;lt;tex&amp;gt;p_k&amp;lt;/tex&amp;gt; в качестве сертификата. Если результат проверки положителен, искомый сертификат найден, иначе — продолжим работу ничего не делая на тех шагах, когда должна была исполняться &amp;lt;tex&amp;gt;p_k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, если некоторая программа &amp;lt;tex&amp;gt;q = p_m&amp;lt;/tex&amp;gt; генерирует верные сертификаты, то наша программа &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; завершит работу не более, чем за &amp;lt;tex&amp;gt;2^{m-1} + (T(p_m,x) + T(R, \langle x,p_m(x) \rangle) - 1) \cdot 2^m&amp;lt;/tex&amp;gt; шагов. &amp;lt;tex&amp;gt;R \in P&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;|y| \le poly(|x|)&amp;lt;/tex&amp;gt; из определения &amp;lt;tex&amp;gt;\Sigma_1&amp;lt;/tex&amp;gt;, значит это равно &amp;lt;tex&amp;gt;2^{m-1} + (T(p_m,x) + poly(|x|)) \cdot 2^m = 2^m \cdot T(q,x) + poly(|x|)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Класс P]]&lt;br /&gt;
*[[Классы_NP_и_Σ₁]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9B%D0%B5%D0%B2%D0%B8%D0%BD%D0%B0&amp;diff=24039</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%B5%D0%BC%D0%B0_%D0%9B%D0%B5%D0%B2%D0%B8%D0%BD%D0%B0&amp;diff=24039"/>
				<updated>2012-06-05T09:46:21Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Теорема&lt;br /&gt;
|author=Левин&lt;br /&gt;
|statement=&lt;br /&gt;
Для любого языка &amp;lt;tex&amp;gt;L \in \Sigma_1&amp;lt;/tex&amp;gt; и соответствующего ему (из определения &amp;lt;tex&amp;gt;\Sigma_1&amp;lt;/tex&amp;gt;) отношения &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; существует «оптимальная» (работающая «не сильно дольше», чем любая другая) программа &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;, сопоставляющая словам из &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; их сертификаты, то есть:&lt;br /&gt;
# &amp;lt;tex&amp;gt;x \in L \Leftrightarrow R(x, p(x)) = 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# для любой другой программы &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt;, для которой верно &amp;lt;tex&amp;gt;x \in L \Leftrightarrow R(x, q(x)) = 1&amp;lt;/tex&amp;gt;, найдутся такие константа &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt; и полином &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt;, что для любого &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; выполняется: &amp;lt;tex&amp;gt;T(p, x) \le c \cdot T(q, x) + r(|x|)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Построим «оптимальную» программу &amp;lt;tex&amp;gt;p(x)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пронумеруем все программы &amp;lt;tex&amp;gt;\lbrace p_i \rbrace_{i=1}^\infty&amp;lt;/tex&amp;gt;. Поместим их в различные потоки, подадим на вход слово &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и будем исполнять по одной инструкции в следующем порядке: на шаге с номером &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; запустим программу &amp;lt;tex&amp;gt;p_k&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; таково, что &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; делится на &amp;lt;tex&amp;gt;2^{k-1}&amp;lt;/tex&amp;gt; и не делится на &amp;lt;tex&amp;gt;2^{k}&amp;lt;/tex&amp;gt;. Таким образом, программа &amp;lt;tex&amp;gt;p_k&amp;lt;/tex&amp;gt; будет исполняться на каждом &amp;lt;tex&amp;gt;2^k&amp;lt;/tex&amp;gt;-м шаге начиная с &amp;lt;tex&amp;gt;2^{k-1}&amp;lt;/tex&amp;gt;-го. Следовательно, если &amp;lt;tex&amp;gt;p_k&amp;lt;/tex&amp;gt; завершит работу за &amp;lt;tex&amp;gt;T(p_k, x)&amp;lt;/tex&amp;gt; инструкций, то к этому времени нами будет сделано &amp;lt;tex&amp;gt;2^{k-1} + (T(P_k, x) - 1) \cdot 2^k&amp;lt;/tex&amp;gt; шагов.&lt;br /&gt;
&lt;br /&gt;
Как только &amp;lt;tex&amp;gt;p_k&amp;lt;/tex&amp;gt;, выдав некоторое значение, завершит работу, запустим в том же потоке проверку сертификата слова &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, используя вывод &amp;lt;tex&amp;gt;p_k&amp;lt;/tex&amp;gt; в качестве сертификата. Если результат проверки положителен, искомый сертификат найден, иначе — продолжим работу больше ничего не запуская в этом потоке.&lt;br /&gt;
&lt;br /&gt;
Таким образом, если некоторая программа &amp;lt;tex&amp;gt;q = p_m&amp;lt;/tex&amp;gt; генерирует верные сертификаты, то наша программа &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; завершит работу не более, чем за &amp;lt;tex&amp;gt;2^{m-1} + (T(p_m,x) + T(R, \langle x,p_m(x) \rangle) - 1) \cdot 2^m&amp;lt;/tex&amp;gt; шагов. &amp;lt;tex&amp;gt;R \in P&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;|y| \le poly(|x|)&amp;lt;/tex&amp;gt; из определения &amp;lt;tex&amp;gt;\Sigma_1&amp;lt;/tex&amp;gt;, значит это равно &amp;lt;tex&amp;gt;2^{m-1} + (T(p_m,x) + poly(|x|)) \cdot 2^m = 2^m \cdot T(q,x) + poly(|x|)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Класс P]]&lt;br /&gt;
*[[Классы_NP_и_Σ₁]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=PS-%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_%D0%B2%D0%B5%D1%80%D0%BD%D1%8B%D1%85_%D0%B1%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB_%D1%81_%D0%BA%D0%B2%D0%B0%D0%BD%D1%82%D0%BE%D1%80%D0%B0%D0%BC%D0%B8_(TQBF)&amp;diff=23791</id>
		<title>PS-полнота языка верных булевых формул с кванторами (TQBF)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=PS-%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_%D0%B2%D0%B5%D1%80%D0%BD%D1%8B%D1%85_%D0%B1%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB_%D1%81_%D0%BA%D0%B2%D0%B0%D0%BD%D1%82%D0%BE%D1%80%D0%B0%D0%BC%D0%B8_(TQBF)&amp;diff=23791"/>
				<updated>2012-06-04T15:25:32Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&amp;lt;tex&amp;gt;\mathrm{TQBF}&amp;lt;/tex&amp;gt; расшифровывается как '''True Quantified Boolean Formula'''. Это язык верных булевых формул с кванторами.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{TQBF}=\{Q_1 x_1 Q_2 x_2 \ldots Q_n x_n \phi(x_1, x_2, \dots, x_n), Q_i \in \{\forall, \exists\}\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=1&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{TQBF} \in \mathrm{PS}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=Чтобы доказать это, просто приведём программу &amp;lt;tex&amp;gt;solve&amp;lt;/tex&amp;gt;, решающую булеву формулу с кванторами на &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; дополнительной памяти и работающую за конечное время.&lt;br /&gt;
 &amp;lt;tex&amp;gt;solve(Q_1 x_1 Q_2 x_2 \ldots Q_n x_n \phi(x_1, x_2, \ldots, x_n))&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;Q_1 = \forall&amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''return''' &amp;lt;tex&amp;gt;solve(Q_2 x_2 \ldots Q_n x_n \phi(0, x_2, \ldots, x_n)) \land solve(Q_2 x_2 \ldots Q_n x_n \phi(1, x_2, \ldots, x_n))&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;Q_1 = \exists&amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''return''' &amp;lt;tex&amp;gt;solve(Q_2 x_2 \ldots Q_n x_n \phi(0, x_2, \ldots, x_n)) \lor solve(Q_2 x_2 \dots Q_n x_n \phi(1, x_2, \ldots, x_n))&amp;lt;/tex&amp;gt;&lt;br /&gt;
Эта программа требует &amp;lt;tex&amp;gt;O(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;
|about=2&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{TQBF} \in \mathrm{PSH}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=Рассмотрим язык &amp;lt;tex&amp;gt;L \in \mathrm{PS}&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Построим такую функцию &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;x \in L \Leftrightarrow f(x) \in \mathrm{TQBF}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T(f, x) \le p(|x|)&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;L \in \mathrm{PS}&amp;lt;/tex&amp;gt;, то существует детерминированная машина Тьюринга &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt;, распознающая его с использованием памяти полиномиального размера. Будем считать, что длина ленты машины &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;r(n)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;r&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;\Omega = |\Sigma \cup Q|&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;I&amp;lt;/tex&amp;gt; — конфигурация &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt;. Конфигурация однозначно задаётся позицией и содержанием рабочей ленты. Введём обозначение &amp;lt;tex&amp;gt;x_{I,i,c}&amp;lt;/tex&amp;gt; — в конфигурации &amp;lt;tex&amp;gt;I&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-том месте стоит символ &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt;. Тогда размер конфигурации равен &amp;lt;tex&amp;gt;\Omega r(n)&amp;lt;/tex&amp;gt;. Следовательно всего конфигураций &amp;lt;tex&amp;gt;2^{\Omega r(n)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Под выражением &amp;lt;tex&amp;gt;\exists I&amp;lt;/tex&amp;gt; будем понимать &amp;lt;tex&amp;gt; \exists x_{I,1,c_1} \, \exists x_{I,1,c_2} \ldots \exists x_{I,1,c_\Omega}  \, \exists x_{I,2,c_1} \ldots&amp;lt;/tex&amp;gt; Аналогично выражение &amp;lt;tex&amp;gt; \forall I&amp;lt;/tex&amp;gt; обозначает &amp;lt;tex&amp;gt; \forall x_{I,1,c_1} \, \forall x_{I,1,c_2} \ldots \forall x_{I,1,c_\Omega}  \, \forall x_{I,2,c_1} \ldots&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рассмотрим функцию &amp;lt;tex&amp;gt;\phi(A, B, t)&amp;lt;/tex&amp;gt;, проверяющую следующее условие: конфигурация &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; достижима из конфигурации &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; не более, чем за &amp;lt;tex&amp;gt;2^t&amp;lt;/tex&amp;gt; шагов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\phi(A, B, 0) = (A = B) \lor (A \vdash B)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\phi(A, B, t) = \exists R \, [\phi(A, R, t-1) \land \phi(R, B, t-1)]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что данная формула имеет экспоненциальный размер, поэтому воспользуемся квантором &amp;lt;tex&amp;gt;\forall&amp;lt;/tex&amp;gt; и перепишем её следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\phi(A, B, t) =  \exists R \,\forall U \,\forall V \, \{\phi(U, V, t-1) \lor [\neg(U = A \land V = R) \land \neg(U = R \land V = B)]\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер полученной функции &amp;lt;tex&amp;gt;\phi(A, B, t)&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;f(M, w)&amp;lt;/tex&amp;gt;, которая будет переводить ДМТ &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; и слово на ленте &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; в формулу из &amp;lt;tex&amp;gt;\mathrm{TQBF}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(M, w) = \exists S \, \exists F \, (S - start) \land (F - accept) \land \phi(S, F, log_2(2^{\Omega r(n)})))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выражения &amp;lt;tex&amp;gt;S - start&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;F - accept&amp;lt;/tex&amp;gt; можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;S - start = x_{S, 1, w[1]} \land x_{S, 2, w[2]} \land \ldots \land x_{S, |w|, w[|w|]} \land x_{S, |w| + 1, B} \ldots \land x_{S, r(n) , B}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;F - accept = x_{S, |w| + 1, \#_y} \lor \ldots \lor x_{S, r(n), \#_y}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Докажем, что сведение &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; корректно.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;w \in L&amp;lt;/tex&amp;gt;, то существует путь из стартовой конфигурации в финишную, причём длины не более, чем &amp;lt;tex&amp;gt;2^{\Omega r(n)}&amp;lt;/tex&amp;gt;, а значит формула &amp;lt;tex&amp;gt;f(M, w)&amp;lt;/tex&amp;gt; верна.&lt;br /&gt;
&lt;br /&gt;
Если формула &amp;lt;tex&amp;gt;f(M, w)&amp;lt;/tex&amp;gt; оказалась верна, то существует путь из стартовой конфигурации в финишную длины не более, чем &amp;lt;tex&amp;gt;2^{\Omega r(n)}&amp;lt;/tex&amp;gt;. Значит, ДМТ &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; допускает слово &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;w \in L&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, &amp;lt;tex&amp;gt;\mathrm{TQBF} \in \mathrm{PSH}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{TQBF} \in \mathrm{PSC}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=Доказательство непосредственно следует из лемм. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB%D1%8B._%D0%9A%D0%BB%D0%B0%D1%81%D1%81_IP._%D0%9A%D0%BB%D0%B0%D1%81%D1%81_AM&amp;diff=23790</id>
		<title>Интерактивные протоколы. Класс IP. Класс AM</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB%D1%8B._%D0%9A%D0%BB%D0%B0%D1%81%D1%81_IP._%D0%9A%D0%BB%D0%B0%D1%81%D1%81_AM&amp;diff=23790"/>
				<updated>2012-06-04T15:23:10Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Определения ==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
&amp;lt;b&amp;gt;Интерактивным протоколом&amp;lt;/b&amp;gt;, разрешающим язык &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, называется абстрактная машина (см. рисунок), моделирующая вычисления как обмен сообщениями между двумя программами (Prover и Verifier, далее &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; соответственно), такими, что&lt;br /&gt;
# &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; заинтересован в том, чтобы &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; решил, что слово &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; принадлежит языку;&lt;br /&gt;
# &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; не ограничен в вычислительной мощности;&lt;br /&gt;
# &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; заинтересован установить, действительно ли слово &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; принадлежит языку;&lt;br /&gt;
# &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; — [[Вероятностные вычисления. Вероятностная машина Тьюринга|вероятностная машина Тьюринга]];&lt;br /&gt;
# &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; ограничен полиномиальным временем работы.&lt;br /&gt;
}}&lt;br /&gt;
[[Файл:IPS.png|250px|thumb|right|Схема интерактивного протокола.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, обменивающийся сообщениями с &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;, будем обозначать &amp;lt;tex&amp;gt;V^{P}&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;V&amp;lt;/tex&amp;gt;:&lt;br /&gt;
# &amp;lt;b&amp;gt; public coins &amp;lt;/b&amp;gt; — &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; может видеть вероятностную ленту &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;b&amp;gt; private coins &amp;lt;/b&amp;gt; — &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; &amp;lt;b&amp;gt;не&amp;lt;/b&amp;gt; может видеть вероятностную ленту &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{IP}[f] = \{L\bigm|\exists \langle V, P \rangle : &amp;lt;/tex&amp;gt; &amp;lt;br/&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; не имеет доступа к вероятностной ленте &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; (private coins);&lt;br /&gt;
# &amp;lt;tex&amp;gt; \forall x \in L \Rightarrow P(V^{P}(x) = 1) \ge \frac{2}{3} &amp;lt;/tex&amp;gt;;&amp;lt;br/&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt; \forall x \notin L \Rightarrow P(V^{P}(x) = 1) \le \frac{1}{3} &amp;lt;/tex&amp;gt;;&amp;lt;br/&amp;gt;&lt;br /&gt;
# число раундов интерактивного протокола &amp;lt;tex&amp;gt; O(f(n)), n = |x|\}&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = &amp;lt;tex&amp;gt;\mathrm{IP}=\bigcup\limits_{p(n) \in poly} \mathrm{IP} [p(n)] &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Язык &amp;lt;tex&amp;gt;\mathrm{AM}&amp;lt;/tex&amp;gt; (&amp;lt;i&amp;gt;Arthur–Merlin games&amp;lt;/i&amp;gt;) отличается от &amp;lt;tex&amp;gt;\mathrm{IP}&amp;lt;/tex&amp;gt; лишь тем, что &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; может видеть вероятностную ленту &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{AM}[f] = \{L\bigm|\exists \langle V, P \rangle : &amp;lt;/tex&amp;gt; &amp;lt;br/&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; может читать вероятностную ленту &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; (public coins);&lt;br /&gt;
# &amp;lt;tex&amp;gt; \forall x \in L \Rightarrow P(V^{P}(x) = 1) \ge \frac{2}{3} &amp;lt;/tex&amp;gt;;&amp;lt;br/&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt; \forall x \notin L \Rightarrow P(V^{P}(x) = 1) \le \frac{1}{3} &amp;lt;/tex&amp;gt;;&amp;lt;br/&amp;gt;&lt;br /&gt;
# число раундов интерактивного протокола &amp;lt;tex&amp;gt; O(f(n)), n = |x|\} &amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = &amp;lt;tex&amp;gt;\mathrm{AM}=\bigcup\limits_{p(n) \in poly} \mathrm{AM} [p(n)] &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
Если для интерактивного протокола выполняется &amp;lt;tex&amp;gt; \forall x \in L \Rightarrow P(V^{P}(x) = 1) = 1 &amp;lt;/tex&amp;gt;, то говорят, что он обладает свойством &amp;lt;b&amp;gt; completeness &amp;lt;/b&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
Если для интерактивного протокола выполняется &amp;lt;tex&amp;gt; \forall x \notin L \Rightarrow P(V^{P}(x) = 1) = 0 &amp;lt;/tex&amp;gt;, то говорят, что он обладает свойством &amp;lt;b&amp;gt; soundness &amp;lt;/b&amp;gt;.&lt;br /&gt;
}} &lt;br /&gt;
Свойство completeness можно достичь, а soundness достичь нельзя.&lt;br /&gt;
&lt;br /&gt;
== Соотношения с другими классами теории сложности ==&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{BPP} \subset \mathrm{IP}[0]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; сам по себе является вероятностной машиной Тьюринга и поэтому может разрешить язык из &amp;lt;tex&amp;gt;\mathrm{BPP}&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;
|statement=&amp;lt;tex&amp;gt;\mathrm{NP} \subset \mathrm{IP}[1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Для разрешения языка из &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt; будем использовать следующий протокол:&lt;br /&gt;
&amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; будет проверять на принадлежность слова &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; используя сертификат, который он запросит у &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; не ограничен в вычислительной мощности, он может подобрать подходящий сертификат и именно его и сообщит, так как он заинтересован в том, чтобы &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; принял слово. Для этого требуется лишь один раунд интерактивного протокола.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Язык GNI ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{GNI}&amp;lt;/tex&amp;gt; расшифровывается как Graph Non Isomorphism. Это язык пар неизоморфных друг другу графов.&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{GNI}=\{ \langle G, H \rangle, &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;\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{GNI} \in \mathrm{IP}[1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Будем использовать следующий алгоритм для &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;:&lt;br /&gt;
# Возьмём случайное число &amp;lt;tex&amp;gt;i \in \{0, 1\}&amp;lt;/tex&amp;gt; и случайную перестановку &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; с вероятностной ленты; &amp;lt;br/&amp;gt;&lt;br /&gt;
# Создадим новый граф, перемешав вершины графа c номером &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; перестановкой &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;; &amp;lt;br/&amp;gt;&lt;br /&gt;
# Перешлём &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; полученный граф с просьбой определить, из какого из исходных графов он был получен; &amp;lt;br/&amp;gt;&lt;br /&gt;
# Получив ответ, сравним его с правильным ответом — числом &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;; &amp;lt;br/&amp;gt;&lt;br /&gt;
# Если полученный ответ не совпадёт с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, то вернём &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;; &amp;lt;br/&amp;gt;&lt;br /&gt;
# Иначе повторим первые пять шагов ещё раз и перейдём к последнему шагу; &amp;lt;br/&amp;gt;&lt;br /&gt;
# Если мы ещё не вернули &amp;lt;tex&amp;gt;0&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;\mathrm{IP}[1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Во-первых, очевидно, что число раундов не превосходит двух. &amp;lt;br/&amp;gt;&lt;br /&gt;
Рассмотрим теперь случаи&lt;br /&gt;
* &amp;lt;tex&amp;gt; \langle G, H \rangle \in \mathrm{GNI}&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;P&amp;lt;/tex&amp;gt; сможет определить какой граф был перемешан &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;. Таким образом, &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; сможет два раза подряд вернуть правильный ответ и в итоге &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; вернёт 1.&lt;br /&gt;
* &amp;lt;tex&amp;gt; \langle G, H \rangle \notin \mathrm{GNI}&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;P&amp;lt;/tex&amp;gt; не сможет определить какой граф был перемешан &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;P&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;V&amp;lt;/tex&amp;gt; примет слово &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, когда оно не принадлежит языку (то есть &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; два раза подряд верно угадает номер графа), равна &amp;lt;tex&amp;gt;\frac{1}{4}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Таким образом, построенный протокол удовлетворяет условию теоремы.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Вероятностные вычисления. Вероятностная машина Тьюринга]]&lt;br /&gt;
*[[Классы NP и Σ₁]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</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_NP,_coNP,_%CE%A3%E2%82%81,_%CE%A0%E2%82%81&amp;diff=23782</id>
		<title>Классы NP, coNP, Σ₁, Π₁</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_NP,_coNP,_%CE%A3%E2%82%81,_%CE%A0%E2%82%81&amp;diff=23782"/>
				<updated>2012-06-04T15:01:56Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Тут должен быть заголовок.&lt;br /&gt;
&lt;br /&gt;
== Определение ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&amp;lt;tex&amp;gt;\mathrm{NP}=\bigcup\limits_{p(n) \in poly}\mathrm{NTIME}(p(n))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
То есть &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt; — это множество языков, разрешимых недетерминированной программой за полиномиальное время.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&amp;lt;tex&amp;gt;\mathrm{\Sigma_1}=\{L\bigm|\exists R(x,y)\in \tilde{\mathrm{P}}, p(n) - poly:x\in L\Leftrightarrow\exists y : |y|\le p(|x|), R(x,y)=1\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Нестрого говоря, &amp;lt;tex&amp;gt;\mathrm{\Sigma_1}&amp;lt;/tex&amp;gt; — это множество языков, для которых существует работающая за полиномиальное время детерминированная программа-верификатор &amp;lt;tex&amp;gt;R(x,y)&amp;lt;/tex&amp;gt;, а для каждого слова из языка (и только для слова из языка) можно предъявить сертификат полиномиальной длины, подтверждающий принадлежность слова языку и проверяемый верификатором.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{\Sigma_1}=\mathrm{NP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathrm{\Sigma_1} \subset \mathrm{NP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;L \in \mathrm{\Sigma_1}&amp;lt;/tex&amp;gt;. Тогда существуют &amp;lt;tex&amp;gt;R(x,y)&amp;lt;/tex&amp;gt; и полином &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; из определения &amp;lt;tex&amp;gt;\mathrm{\Sigma_1}&amp;lt;/tex&amp;gt;. Построим недетерминированную программу &amp;lt;tex&amp;gt;q(x)&amp;lt;/tex&amp;gt;, разрешающую &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;.&lt;br /&gt;
  &amp;lt;tex&amp;gt;q(x):&amp;lt;/tex&amp;gt;&lt;br /&gt;
    &amp;lt;tex&amp;gt;y\leftarrow?\{0,1\}^{\le p(|x|)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
    &amp;lt;tex&amp;gt;return&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;R(x,y)&amp;lt;/tex&amp;gt;&lt;br /&gt;
Если &amp;lt;tex&amp;gt;x\in L&amp;lt;/tex&amp;gt;, то программа сможет «угадать» подходящий сертификат. Если &amp;lt;tex&amp;gt;x\notin L&amp;lt;/tex&amp;gt;, то подходящего сертификата не существует по определению. Таким образом, &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; разрешает &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, следовательно &amp;lt;tex&amp;gt;L\in \mathrm{NP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathrm{NP} \subset \mathrm{\Sigma_1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;L\in \mathrm{NP}&amp;lt;/tex&amp;gt;. Тогда существует недетерминированная программа &amp;lt;tex&amp;gt;q(x)&amp;lt;/tex&amp;gt;, разрешающая этот язык. Построим верификатор &amp;lt;tex&amp;gt;R(x,y)&amp;lt;/tex&amp;gt;. В качестве сертификата будем использовать последовательность выборов в программе &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt;, приводящую к допуску слова (такой сертификат имеет полиномиальную длину, поскольку выборов в &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; может быть сделано не более, чем время ее работы, то есть не более, чем полином). Верификатор будет аналогичен программе &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt;, только вместо каждого недетерминированного выбора он будет присваивать значение, указанное в сертификате. Если &amp;lt;tex&amp;gt;x\in L&amp;lt;/tex&amp;gt;, то в &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; существует последовательность выборов таких, что &amp;lt;tex&amp;gt;q(x)=1&amp;lt;/tex&amp;gt;, следовательно существует и верный сертификат. Если &amp;lt;tex&amp;gt;x\notin L&amp;lt;/tex&amp;gt;, то для любой последовательности выборов &amp;lt;tex&amp;gt;q(x)=0&amp;lt;/tex&amp;gt;, следовательно подходящего сертификата не существует. Таким образом, &amp;lt;tex&amp;gt;L \in \mathrm{\Sigma_1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
'''Примечание:'''определение &amp;lt;tex&amp;gt;\mathrm{\Sigma_1}&amp;lt;/tex&amp;gt; часто называют также «определением NP на языке сертификатов».&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;L_1,L_2\in \mathrm{NP}&amp;lt;/tex&amp;gt;. Тогда:&lt;br /&gt;
#&amp;lt;tex&amp;gt;L_1\cap L_2\in \mathrm{NP}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
#&amp;lt;tex&amp;gt;L_1\cup L_2\in \mathrm{NP}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
#&amp;lt;tex&amp;gt;L_1L_2\in \mathrm{NP}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
#&amp;lt;tex&amp;gt;L_1^*\in \mathrm{NP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; разрешает &amp;lt;tex&amp;gt;L_1&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; разрешает &amp;lt;tex&amp;gt;L_2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
1. Построим программу &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt;, разрешающую &amp;lt;tex&amp;gt;L_1\cap L_2&amp;lt;/tex&amp;gt;:&lt;br /&gt;
  &amp;lt;tex&amp;gt;r(x):&amp;lt;/tex&amp;gt;&lt;br /&gt;
    &amp;lt;tex&amp;gt;return&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;p(x)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\&amp;amp;\&amp;amp;&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;q(x)&amp;lt;/tex&amp;gt; &lt;br /&gt;
2. Построим программу &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt;, разрешающую &amp;lt;tex&amp;gt;L_1\cup L_2&amp;lt;/tex&amp;gt;:&lt;br /&gt;
  &amp;lt;tex&amp;gt;r(x):&amp;lt;/tex&amp;gt;&lt;br /&gt;
    &amp;lt;tex&amp;gt;return&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;p(x)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;||&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;q(x)&amp;lt;/tex&amp;gt; &lt;br /&gt;
3. Построим программу &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt;, разрешающую &amp;lt;tex&amp;gt;L_1L_2&amp;lt;/tex&amp;gt;:&lt;br /&gt;
  &amp;lt;tex&amp;gt;r(x):&amp;lt;/tex&amp;gt;&lt;br /&gt;
    &amp;lt;tex&amp;gt;n\leftarrow|x|&amp;lt;/tex&amp;gt;&lt;br /&gt;
    &amp;lt;tex&amp;gt;mid\leftarrow?\{1..n\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
    &amp;lt;tex&amp;gt;return&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;p(x[1..mid])&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\&amp;amp;\&amp;amp;&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;q(x[mid+1..n])&amp;lt;/tex&amp;gt;&lt;br /&gt;
4. Построим программу &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt;, разрешающую &amp;lt;tex&amp;gt;L_1^*&amp;lt;/tex&amp;gt;:&lt;br /&gt;
  &amp;lt;tex&amp;gt;r(x):&amp;lt;/tex&amp;gt;&lt;br /&gt;
    &amp;lt;tex&amp;gt;n\leftarrow|x|&amp;lt;/tex&amp;gt;&lt;br /&gt;
    &amp;lt;tex&amp;gt;prev\leftarrow 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
    &amp;lt;tex&amp;gt;do&amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;cur\leftarrow?\{prev..n\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;if&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(!p(x[prev..cur]))&amp;lt;/tex&amp;gt;&lt;br /&gt;
        &amp;lt;tex&amp;gt;return&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;false&amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;prev\leftarrow cur+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
    &amp;lt;tex&amp;gt;while&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(cur&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;!=&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
    &amp;lt;tex&amp;gt;return&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Примеры NP-языков ==&lt;br /&gt;
* Язык раскрасок графа в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов;&lt;br /&gt;
* Задача о клике;&lt;br /&gt;
* [http://arxiv.org/abs/cs.CC/0210020 Тетрис]&lt;br /&gt;
Все эти языки также являются [[Примеры_NP-полных_языков._Теорема_Кука|&amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полными]]. [[Теорема_Ладнера|О существовании не полного &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt; языка]].&lt;br /&gt;
&lt;br /&gt;
== Связь P и NP ==&lt;br /&gt;
Очевидно, что &amp;lt;tex&amp;gt;\mathrm{P} \subseteq \mathrm{NP}&amp;lt;/tex&amp;gt;, так как детерминированные программы можно рассматривать как недетерминированные, в которых не используется недетерминированный выбор. Вопрос о равенстве данных классов до сих пор остается открытым. Были осуществлены различные подходы к разрешению этой задачи: попытка найти [[Теорема_Махэни|редкий &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полный язык]]; было доказано, что [[Теорема_Бейкера_—_Гилла_—_Соловэя|доказательство должно быть нерелятивизующимся]]; различные попытки найти полиномиальные решения для задач из &amp;lt;tex&amp;gt;\mathrm{NPC}&amp;lt;/tex&amp;gt;:&lt;br /&gt;
*[http://arxiv.org/abs/1011.3944 «решение» 3SAT за полиномиальное время];&lt;br /&gt;
*[http://www.cse.yorku.ca/~aaw/Zambito/TSP_Survey.pdf задача о коммивояжере].&lt;br /&gt;
&lt;br /&gt;
Некоторые задачи из &amp;lt;tex&amp;gt;\mathrm{P}&amp;lt;/tex&amp;gt; очень похожи на задачи из &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;. В каждой из приведенных ниже задач пар задач одна разрешима за полиномиальное время, а другая является &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полной. При этом различие между задачами кажется совершенно незначительным.&lt;br /&gt;
*Поиск [[Обход_в_ширину|самых коротких]] и самых длинных простых путей;&lt;br /&gt;
*[[Эйлеров_цикл,_Эйлеров_путь,_Эйлеровы_графы,_Эйлеровость_орграфов|Эйлеров]] и [[Гамильтоновы_графы|гамильтонов]] циклы;&lt;br /&gt;
*2-CNF и 3-CNF выполнимость.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Недетерминированные вычисления]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9B%D0%B5%D0%BC%D0%BC%D0%B0_%D0%BE_%D1%81%D0%BE%D0%BE%D1%82%D0%BD%D0%BE%D1%88%D0%B5%D0%BD%D0%B8%D0%B8_coNP_%D0%B8_IP&amp;diff=23731</id>
		<title>Лемма о соотношении coNP и IP</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9B%D0%B5%D0%BC%D0%BC%D0%B0_%D0%BE_%D1%81%D0%BE%D0%BE%D1%82%D0%BD%D0%BE%D1%88%D0%B5%D0%BD%D0%B8%D0%B8_coNP_%D0%B8_IP&amp;diff=23731"/>
				<updated>2012-06-04T13:40:03Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{\#SAT}=\{\langle \varphi, k \rangle \bigm| \varphi&amp;lt;/tex&amp;gt; имеет ровно &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; удовлетворяющих наборов &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=1&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\sum\limits_{x_1 = 0}^1 \ldots \sum\limits_{x_m = 0}^1  A_\phi(x_1, \ldots, x_m)=k \Leftrightarrow \langle\phi,k\rangle \in \mathrm{\#SAT}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=Следует из [[Арифметизация булевых формул с кванторами | леммы (1)]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=2&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{\#SAT} \in \mathrm{IP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Для доказательства леммы построим программы ''Verifier'' и ''Prover'' из [[Интерактивные протоколы. Класс IP. Класс AM#Класс IP|определения]] класса &amp;lt;tex&amp;gt;\mathrm{IP}&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;A(x_1, x_2, ..., x_m)&amp;lt;/tex&amp;gt; имеет степень &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По лемме (1) вместо условия &amp;lt;tex&amp;gt;\langle \phi, k \rangle \in \mathrm{\#SAT}&amp;lt;/tex&amp;gt;, можно проверять условие &amp;lt;tex&amp;gt;\sum\limits_{x_1 = 0}^1 \ldots \sum\limits_{x_m = 0}^1  A_\phi(x_1, \ldots, x_m)=k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приступим к описанию ''Verifier'''а.&lt;br /&gt;
&lt;br /&gt;
'''Шаг 0''' &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;d=0&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;m=0&amp;lt;/tex&amp;gt;, то ''Verifier'' может проверить указанное выше условие сам и вернуть соответствующий результат.&lt;br /&gt;
Иначе запросим у ''Prover'''а такое простое число &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;3dm \le p \le 6dm&amp;lt;/tex&amp;gt; (такое &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; существует в силу [http://ru.wikipedia.org/wiki/Постулат_Бертрана постулата Бертрана]). &lt;br /&gt;
Проверим &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; на простоту и на принадлежность заданному промежутку. Как мы [[Класс P#Примеры задач и языков из P|знаем]], &amp;lt;tex&amp;gt;\mathrm{Primes} \in \mathrm{P}&amp;lt;/tex&amp;gt;, следовательно на эти операции у ''Verifier'''а уйдёт полиномиальное от размера входа время.&lt;br /&gt;
&lt;br /&gt;
Далее будем проводить все вычисления модулю &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Попросим ''Prover'' 'а прислать ''Verifier'' 'у формулу &amp;lt;tex&amp;gt;A_0(x_1)= \sum\limits_{x_2 = 0}^{1}\ldots\sum\limits_{x_m = 0}^{1} A(x_1, x_2, ..., x_m)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Заметим, что размер формулы &amp;lt;tex&amp;gt;A_0(x_1)&amp;lt;/tex&amp;gt; будет полином от длины входа ''Verifier'' 'а, так как &amp;lt;tex&amp;gt;A_0(x_1)&amp;lt;/tex&amp;gt; — полином степени не выше, чем &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;, от одной переменной, а значит его можно представить в виде &amp;lt;tex&amp;gt;A_0(x) = \sum\limits_{i = 0}^{d} C_i \cdot x ^ i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Проверим следующее утверждение: &amp;lt;tex&amp;gt;A_0(0) + A_0(1) = k&amp;lt;/tex&amp;gt; (*) (здесь и далее под словом «проверим» будем подразумевать следующее: если утверждение верно, ''Verifier'' продолжает свою работу, иначе он прекращает свою работу и возвращет '''false''').&lt;br /&gt;
&lt;br /&gt;
'''Шаг i'''&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;r_i = random(0..p-1)&amp;lt;/tex&amp;gt;. Отправим &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; программе ''Prover''.&lt;br /&gt;
&lt;br /&gt;
Попросим ''Prover'' 'а прислать ''Verifier'' 'у формулу &amp;lt;tex&amp;gt;A_i(x_{i+1}) = \sum\limits_{x_{i+2} = 0}^{1}\ldots\sum\limits_{x_m = 0}^{1} A(r_1,\ldots, r_i, x_{i+1}, ..., x_m)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Проверим следующее утверждение: &amp;lt;tex&amp;gt;A_i(0) + A_i(1) = A_{i-1}(r_i)&amp;lt;/tex&amp;gt; (*). &lt;br /&gt;
&lt;br /&gt;
'''Шаг m'''&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;r_m = random(0..p-1)&amp;lt;/tex&amp;gt;. Отправим &amp;lt;tex&amp;gt;r_m&amp;lt;/tex&amp;gt; программе ''Prover''.&lt;br /&gt;
&lt;br /&gt;
Попросим программу ''Prover'' прислать ''Verifier'' 'у значение &amp;lt;tex&amp;gt;A_m()= A(r_1, r_2, ..., r_m)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Проверим следующее утверждение: &amp;lt;tex&amp;gt;A_m() = A_{m-1}(r_m)&amp;lt;/tex&amp;gt; (*).&lt;br /&gt;
А также сами подставим &amp;lt;tex&amp;gt;r_1, r_2, ..., r_m&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;A(x_1, x_2, ..., x_m)&amp;lt;/tex&amp;gt; и проверим правильность присланного значения &amp;lt;tex&amp;gt;A_m()&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возвращаем '''true'''.&lt;br /&gt;
&lt;br /&gt;
Докажем теперь, что построенный таким образом ''Verifier'' — корректный. Для этого нужно доказать следующие утверждения:&lt;br /&gt;
# Построенный ''Verifier'' - вероятностная машина Тьюринга, совершающая не более полинома от длины входа действий.&lt;br /&gt;
# &amp;lt;tex&amp;gt;\langle \varphi, k \rangle \in \mathrm{\#SAT} \Rightarrow \exists \mathit{Prover} : P(\mathit{Verifier^{Prover}}(\langle \varphi, k \rangle)=1) \ge 2/3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# &amp;lt;tex&amp;gt;\langle \varphi, k \rangle \notin \mathrm{\#SAT} \Rightarrow \forall \mathit{Prover} : P(\mathit{Verifier^{Prover}}(\langle \varphi, k \rangle)=1) \le 1/3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Докажем эти утверждения.&lt;br /&gt;
&lt;br /&gt;
#Первый факт следует из построения ''Verifier'' 'а.&lt;br /&gt;
#По [[Арифметизация булевых формул с кванторами | лемме (2)]], если &amp;lt;tex&amp;gt;\sum\limits_{x_1 = 0}^1 \ldots \sum\limits_{x_m = 0}^1  A_\phi(x_1, \ldots, x_m)=k&amp;lt;/tex&amp;gt;, то условия (*) выполнятются, следовательно существует такой ''Prover'', что &amp;lt;tex&amp;gt;P(\mathit{Verifier^{Prover}}(\langle\phi,k\rangle)) = 1&amp;lt;/tex&amp;gt;, для любой пары &amp;lt;tex&amp;gt;\langle\phi,k\rangle \in \mathrm{\#SAT}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Пусть количество наборов, удовлетворяющих &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;, не равно &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Для того, что бы ''Verifier'' вернул '''true''', ''Prover'' 'у необходимо посылать такие &amp;lt;tex&amp;gt;A_i&amp;lt;/tex&amp;gt;, чтобы выполнялись все проверяемые условия. Посмотрим на то, что он может послать:&lt;br /&gt;
:'''Шаг 0'''&lt;br /&gt;
:Так как количество наборов, удовлетворяющих &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;, не равно &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, то ''Prover'' не может послать правильное &amp;lt;tex&amp;gt;A_0&amp;lt;/tex&amp;gt;, поскольку в этом случае не выполнится условие &amp;lt;tex&amp;gt;A_0(0) + A_0(1) = k&amp;lt;/tex&amp;gt;. Поэтому он посылает не &amp;lt;tex&amp;gt;A_0&amp;lt;/tex&amp;gt;, а некое &amp;lt;tex&amp;gt;\tilde{A}_0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
:&amp;lt;tex&amp;gt;\ldots&amp;lt;/tex&amp;gt;&lt;br /&gt;
:'''Шаг i'''&lt;br /&gt;
:Заметим, что если на каком-то шаге &amp;lt;tex&amp;gt;A_{i-1}(r_i) = \tilde{A}_{i-1}(r_i)&amp;lt;/tex&amp;gt;, то начиная со следующего шага ''Prover'' может посылать правильные &amp;lt;tex&amp;gt;A_j&amp;lt;/tex&amp;gt; и в итоге ''Verifier'' вернёт '''true'''.&lt;br /&gt;
:Для некоторого случайно выбранного &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; вероятность того, что &amp;lt;tex&amp;gt;A_{i-1}(r_i) = \tilde{A}_{i-1}(r_i)&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; — корень полинома &amp;lt;tex&amp;gt;(A_{i-1} - \tilde{A}_{i-1})(r_i)&amp;lt;/tex&amp;gt;, имеющего степень не больше &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;, не превосходит &amp;lt;tex&amp;gt;\frac{d}{p}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
:&amp;lt;tex&amp;gt;\ldots&amp;lt;/tex&amp;gt;&lt;br /&gt;
:'''Шаг m'''&lt;br /&gt;
:Так как на последнем шаге ''Verifier'' полученным от ''Prover'' значение с непосредственно вычисленным, слово будет допущено только в том случае, когда ''Prover'' смог прислать верное значение, что в свою очередь возможно лишь если на одном из предыдущих шагов был верно угадан корень полинома.&lt;br /&gt;
:&lt;br /&gt;
:Вычислим вероятность того, что хотя бы раз корень был угадан.&lt;br /&gt;
:&amp;lt;tex&amp;gt;P(\mathit{Verifier^{Prover}}(\langle \varphi, k \rangle)=1) = 1 - (1 - \frac d p)^m \le 1 - (1 - \frac d {3dm})^m \le \frac 1 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, построенный нами ''Verifier'' корректен, а значит лемма доказана.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=3&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{coNP} \subset \mathrm{IP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Сведём язык &amp;lt;tex&amp;gt;\mathrm{TAUT}&amp;lt;/tex&amp;gt; к языку &amp;lt;tex&amp;gt;\mathrm{\#SAT}&amp;lt;/tex&amp;gt; следующим образом: &amp;lt;tex&amp;gt;\phi \mapsto \langle \phi, 2^k \rangle &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&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;\phi \in \mathrm{TAUT} \Leftrightarrow \langle \phi, 2^k \rangle \in \mathrm{\#SAT}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По лемме (2) &amp;lt;tex&amp;gt;\mathrm{\#SAT} \in \mathrm{IP}&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\mathrm{TAUT} \in \mathrm{IP}&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;\mathrm{TAUT} \in \mathrm{coNPC}&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\mathrm{coNP} \subset \mathrm{IP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9B%D0%B5%D0%BC%D0%BC%D0%B0_%D0%BE_%D1%81%D0%BE%D0%BE%D1%82%D0%BD%D0%BE%D1%88%D0%B5%D0%BD%D0%B8%D0%B8_coNP_%D0%B8_IP&amp;diff=23712</id>
		<title>Лемма о соотношении coNP и IP</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9B%D0%B5%D0%BC%D0%BC%D0%B0_%D0%BE_%D1%81%D0%BE%D0%BE%D1%82%D0%BD%D0%BE%D1%88%D0%B5%D0%BD%D0%B8%D0%B8_coNP_%D0%B8_IP&amp;diff=23712"/>
				<updated>2012-06-04T13:16:58Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{\#SAT}=\{\langle \varphi, k \rangle \bigm| \varphi&amp;lt;/tex&amp;gt; имеет ровно &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; удовлетворяющих наборов &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=1&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\sum\limits_{x_1 = 0}^1 \ldots \sum\limits_{x_m = 0}^1  A_\phi(x_1, \ldots, x_m)=k \Leftrightarrow \langle\phi,k\rangle \in \mathrm{\#SAT}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=Следует из [[Арифметизация булевых формул с кванторами | леммы (1)]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=2&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{\#SAT} \in \mathrm{IP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Для доказательства леммы построим программы ''Verifier'' и ''Prover'' из [[Интерактивные протоколы. Класс IP. Класс AM#Класс IP|определения]] класса &amp;lt;tex&amp;gt;\mathrm{IP}&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;A(x_1, x_2, ..., x_m)&amp;lt;/tex&amp;gt; имеет степень &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По лемме (1) вместо условия &amp;lt;tex&amp;gt;\langle \phi, k \rangle \in \mathrm{\#SAT}&amp;lt;/tex&amp;gt;, можно проверять условие &amp;lt;tex&amp;gt;\sum\limits_{x_1 = 0}^1 \ldots \sum\limits_{x_m = 0}^1  A_\phi(x_1, \ldots, x_m)=k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приступим к описанию ''Verifier'''а.&lt;br /&gt;
&lt;br /&gt;
'''Шаг 0''' &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;d=0&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;m=0&amp;lt;/tex&amp;gt;, то ''Verifier'' может проверить указанное выше условие сам и вернуть соответствующий результат.&lt;br /&gt;
Иначе запросим у ''Prover'''а такое простое число &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;3dm \le p \le 6dm&amp;lt;/tex&amp;gt; (такое &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; существует в силу [http://ru.wikipedia.org/wiki/Постулат_Бертрана постулата Бертрана]). &lt;br /&gt;
Проверим &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; на простоту и на принадлежность заданному промежутку. Как мы [[Класс P#Примеры задач и языков из P|знаем]], &amp;lt;tex&amp;gt;\mathrm{Primes} \in \mathrm{P}&amp;lt;/tex&amp;gt;, следовательно на эти операции у ''Verifier'''а уйдёт полиномиальное от размера входа время.&lt;br /&gt;
&lt;br /&gt;
Далее будем проводить все вычисления модулю &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Попросим ''Prover'' 'а прислать ''Verifier'' 'у формулу &amp;lt;tex&amp;gt;A_0(x_1)= \sum\limits_{x_2 = 0}^{1}\ldots\sum\limits_{x_m = 0}^{1} A(x_1, x_2, ..., x_m)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Заметим, что размер формулы &amp;lt;tex&amp;gt;A_0(x_1)&amp;lt;/tex&amp;gt; будет полином от длины входа ''Verifier'' 'а, так как &amp;lt;tex&amp;gt;A_0(x_1)&amp;lt;/tex&amp;gt; — полином степени не выше, чем &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;, от одной переменной, а значит его можно представить в виде &amp;lt;tex&amp;gt;A_0(x) = \sum\limits_{i = 0}^{d} C_i \cdot x ^ i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Проверим следующее утверждение: &amp;lt;tex&amp;gt;A_0(0) + A_0(1) = k&amp;lt;/tex&amp;gt; (*) (здесь и далее под словом «проверим» будем подразумевать следующее: если утверждение верно, ''Verifier'' продолжает свою работу, иначе он прекращает свою работу и возвращет '''false''').&lt;br /&gt;
&lt;br /&gt;
'''Шаг i'''&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;r_i = random(0..p-1)&amp;lt;/tex&amp;gt;. Отправим &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; программе ''Prover''.&lt;br /&gt;
&lt;br /&gt;
Попросим ''Prover'' 'а прислать ''Verifier'' 'у формулу &amp;lt;tex&amp;gt;A_i(x_{i+1}) = \sum\limits_{x_{i+2} = 0}^{1}\ldots\sum\limits_{x_m = 0}^{1} A(r_1,\ldots, r_i, x_{i+1}, ..., x_m)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Проверим следующее утверждение: &amp;lt;tex&amp;gt;A_i(0) + A_i(1) = A_{i-1}(r_i)&amp;lt;/tex&amp;gt; (*). &lt;br /&gt;
&lt;br /&gt;
'''Шаг m'''&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;r_m = random(0..p-1)&amp;lt;/tex&amp;gt;. Отправим &amp;lt;tex&amp;gt;r_m&amp;lt;/tex&amp;gt; программе ''Prover''.&lt;br /&gt;
&lt;br /&gt;
Попросим программу ''Prover'' прислать ''Verifier'' 'у значение &amp;lt;tex&amp;gt;A_m()= A(r_1, r_2, ..., r_m)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Проверим следующее утверждение: &amp;lt;tex&amp;gt;A_m() = A_{m-1}(r_m)&amp;lt;/tex&amp;gt; (*).&lt;br /&gt;
А также сами подставим &amp;lt;tex&amp;gt;r_1, r_2, ..., r_m&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;A(x_1, x_2, ..., x_m)&amp;lt;/tex&amp;gt; и проверим правильность присланного значения &amp;lt;tex&amp;gt;A_m()&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возвращаем '''true'''.&lt;br /&gt;
&lt;br /&gt;
Докажем теперь, что построенный таким образом ''Verifier'' — корректный. Для этого нужно доказать следующие утверждения:&lt;br /&gt;
# Построенный ''Verifier'' - вероятностная машина Тьюринга, совершающая не более полинома от длины входа действий.&lt;br /&gt;
# &amp;lt;tex&amp;gt;\langle \varphi, k \rangle \in \#SAT \Rightarrow \exists \mathit{Prover} : P(\mathit{Verifier^{Prover}}(\langle \varphi, k \rangle)=1) \ge 2/3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# &amp;lt;tex&amp;gt;\langle \varphi, k \rangle \notin \#SAT \Rightarrow \forall \mathit{Prover} : P(\mathit{Verifier^{Prover}}(\langle \varphi, k \rangle)=1) \le 1/3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Докажем эти утверждения.&lt;br /&gt;
&lt;br /&gt;
#Первый факт следует из построения ''Verifier'' 'а.&lt;br /&gt;
#По [[Арифметизация булевых формул с кванторами | лемме (2)]], если &amp;lt;tex&amp;gt;\sum\limits_{x_1 = 0}^1 \ldots \sum\limits_{x_m = 0}^1  A_\phi(x_1, \ldots, x_m)=k&amp;lt;/tex&amp;gt;, то условия (*) выполнятются, следовательно существует такой ''Prover'', что &amp;lt;tex&amp;gt;P(\mathit{Verifier^{Prover}}(\langle\phi,k\rangle)) = 1&amp;lt;/tex&amp;gt;, для любой пары &amp;lt;tex&amp;gt;\langle\phi,k\rangle \in \mathrm{\#SAT}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Пусть количество наборов, удовлетворяющих &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;, не равно &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Для того, что бы ''Verifier'' вернул '''true''', ''Prover'' 'у необходимо посылать такие &amp;lt;tex&amp;gt;A_i&amp;lt;/tex&amp;gt;, чтобы выполнялись все проверяемые условия. Посмотрим на то, что он может послать:&lt;br /&gt;
:'''Шаг 0'''&lt;br /&gt;
:Так как количество наборов, удовлетворяющих &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;, не равно &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, то ''Prover'' не может послать правильное &amp;lt;tex&amp;gt;A_0&amp;lt;/tex&amp;gt;, поскольку в этом случае не выполнится условие &amp;lt;tex&amp;gt;A_0(0) + A_0(1) = k&amp;lt;/tex&amp;gt;. Поэтому он посылает не &amp;lt;tex&amp;gt;A_0&amp;lt;/tex&amp;gt;, а некое &amp;lt;tex&amp;gt;\tilde{A}_0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
:&amp;lt;tex&amp;gt;\ldots&amp;lt;/tex&amp;gt;&lt;br /&gt;
:'''Шаг i'''&lt;br /&gt;
:Заметим, что если на каком-то шаге &amp;lt;tex&amp;gt;A_{i-1}(r_i) = \tilde{A}_{i-1}(r_i)&amp;lt;/tex&amp;gt;, то начиная со следующего шага ''Prover'' может посылать истинные значения &amp;lt;tex&amp;gt;A_j&amp;lt;/tex&amp;gt; и в итоге ''Verifier'' вернёт '''true'''.&lt;br /&gt;
:Для некоторого случайно выбранного &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; вероятность того, что &amp;lt;tex&amp;gt;A_{i-1}(r_i) = \tilde{A}_{i-1}(r_i)&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; — корень полинома &amp;lt;tex&amp;gt;(A_{i-1} - \tilde{A}_{i-1})(r_i)&amp;lt;/tex&amp;gt;, имеющего степень не больше &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;, не превосходит &amp;lt;tex&amp;gt;\frac{d}{p}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
:&amp;lt;tex&amp;gt;\ldots&amp;lt;/tex&amp;gt;&lt;br /&gt;
:'''Шаг m'''&lt;br /&gt;
:Так как на последнем шаге ''Verifier'' сверяет истинное значение с полученным от ''Prover'', слово будет допущено только в том случае, когда ''Prover'' смог прислать верное значение, что в свою очередь возможно лишь если на одном из предыдущих шагов был верно угадан корень полинома.&lt;br /&gt;
:&lt;br /&gt;
:&amp;lt;tex&amp;gt;P(\mathit{Verifier^{Prover}}(\langle \varphi, k \rangle)=1) \le \frac d p \sum \limits_{i=0}^{m-1} (1 - \frac d p)^i = 1 - (1 - \frac d p)^m \le 1 - (1 - \frac d {3dm})^m = 1 - (1 - \frac 1 {3m})^m \le \frac 1 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, построенный нами ''Verifier'' корректен, а значит лемма доказана.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=3&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{coNP} \subset \mathrm{IP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Сведём язык &amp;lt;tex&amp;gt;\mathrm{TAUT}&amp;lt;/tex&amp;gt; к языку &amp;lt;tex&amp;gt;\mathrm{\#SAT}&amp;lt;/tex&amp;gt; следующим образом: &amp;lt;tex&amp;gt;\phi \mapsto \langle \phi, 2^k \rangle &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&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;\phi \in \mathrm{TAUT} \Leftrightarrow \langle \phi, 2^k \rangle \in \mathrm{\#SAT}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По лемме (2) &amp;lt;tex&amp;gt;\mathrm{\#SAT} \in \mathrm{IP}&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\mathrm{TAUT} \in \mathrm{IP}&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;\mathrm{TAUT} \in \mathrm{coNPC}&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\mathrm{coNP} \subset \mathrm{IP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=23687</id>
		<title>Шаблон:Определение</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=23687"/>
				<updated>2012-06-04T12:51:13Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
Использование шаблона [[Шаблон:Определение|Определение]]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=идентификатор (необязательно), пример: def1. &lt;br /&gt;
|neat = 1 - параметр нужен для того, чтобы определение не растягивалось на всю страницу(не обязательно)&lt;br /&gt;
|definition=текст&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* После этого на определение можно ссылаться из статьи. Например: [[Метрическое пространство#def1 | определение метрики]]&lt;br /&gt;
* Все '''id''' должны быть уникальными внутри статьи и не совпадать с названиями секций.&lt;br /&gt;
{{Определение&lt;br /&gt;
|neat = 1&lt;br /&gt;
|definition = определение с параметром neat&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = определение без параметра neat&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{#if:{{{id|}}}|&amp;lt;span id=&amp;quot;{{{id}}}&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;|}}{{#if: {{{neat|}}}|&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #fcfcfc; float:left;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #ddd;&amp;quot;&amp;gt;'''Определение:'''&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px dashed #2f6fab; padding: 8px;&amp;quot;&amp;gt;{{{definition}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;|&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color: #ddd&amp;quot;&amp;gt;'''Определение:'''&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border:1px dashed #2f6fab; padding: 8px; background-color: #fcfcfc;&amp;quot;&amp;gt;{{{definition}}}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;}}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9B%D0%B5%D0%BC%D0%BC%D0%B0_%D0%BE_%D1%81%D0%BE%D0%BE%D1%82%D0%BD%D0%BE%D1%88%D0%B5%D0%BD%D0%B8%D0%B8_coNP_%D0%B8_IP&amp;diff=23682</id>
		<title>Лемма о соотношении coNP и IP</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9B%D0%B5%D0%BC%D0%BC%D0%B0_%D0%BE_%D1%81%D0%BE%D0%BE%D1%82%D0%BD%D0%BE%D1%88%D0%B5%D0%BD%D0%B8%D0%B8_coNP_%D0%B8_IP&amp;diff=23682"/>
				<updated>2012-06-04T12:39:02Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{\#SAT}=\{\langle \varphi, k \rangle \bigm| \varphi&amp;lt;/tex&amp;gt; имеет ровно &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; удовлетворяющих наборов &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=1&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\sum\limits_{x_1 = 0}^1 \ldots \sum\limits_{x_m = 0}^1  A_\phi(x_1, \ldots, x_m)=k \Leftrightarrow \langle\phi,k\rangle \in \mathrm{\#SAT}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=Следует из [[Арифметизация булевых формул с кванторами | леммы (1)]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=2&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{\#SAT} \in \mathrm{IP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Для доказательства леммы построим программы ''Verifier'' и ''Prover'' из [[Интерактивные протоколы. Класс IP. Класс AM#Класс IP|определения]] класса &amp;lt;tex&amp;gt;\mathrm{IP}&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;A(x_1, x_2, ..., x_m)&amp;lt;/tex&amp;gt; имеет степень &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По лемме (1) вместо условия &amp;lt;tex&amp;gt;\langle \phi, k \rangle \in \mathrm{\#SAT}&amp;lt;/tex&amp;gt;, можно проверять условие &amp;lt;tex&amp;gt;\sum\limits_{x_1 = 0}^1 \ldots \sum\limits_{x_m = 0}^1  A_\phi(x_1, \ldots, x_m)=k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приступим к описанию ''Verifier'''а.&lt;br /&gt;
&lt;br /&gt;
'''Шаг 0''' &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;d=0&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;m=0&amp;lt;/tex&amp;gt;, то ''Verifier'' может проверить указанное выше условие сам и вернуть соответствующий результат.&lt;br /&gt;
Иначе запросим у ''Prover'''а такое простое число &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;3dm \le p \le 6dm&amp;lt;/tex&amp;gt; (такое &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; существует в силу [http://ru.wikipedia.org/wiki/Постулат_Бертрана постулата Бертрана]). &lt;br /&gt;
Проверим &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; на простоту и на принадлежность заданному промежутку. Как мы [[Класс P#Примеры задач и языков из P|знаем]], &amp;lt;tex&amp;gt;\mathrm{Primes} \in \mathrm{P}&amp;lt;/tex&amp;gt;, следовательно на эти операции у ''Verifier'''а уйдёт полиномиальное от размера входа время.&lt;br /&gt;
&lt;br /&gt;
Далее будем проводить все вычисления модулю &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Попросим ''Prover'' 'а прислать ''Verifier'' 'у формулу &amp;lt;tex&amp;gt;A_0(x_1)= \sum\limits_{x_2 = 0}^{1}\ldots\sum\limits_{x_m = 0}^{1} A(x_1, x_2, ..., x_m)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Заметим, что размер формулы &amp;lt;tex&amp;gt;A_0(x_1)&amp;lt;/tex&amp;gt; будет полином от длины входа ''Verifier'' 'а, так как &amp;lt;tex&amp;gt;A_0(x_1)&amp;lt;/tex&amp;gt; — полином степени не выше, чем &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;, от одной переменной, а значит его можно представить в виде &amp;lt;tex&amp;gt;A_0(x) = \sum\limits_{i = 0}^{d} C_i \cdot x ^ i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Проверим следующее утверждение: &amp;lt;tex&amp;gt;A_0(0) + A_0(1) = k&amp;lt;/tex&amp;gt; (*) (здесь и далее под словом «проверим» будем подразумевать следующее: если утверждение верно, ''Verifier'' продолжает свою работу, иначе он прекращает свою работу и возвращет '''false''').&lt;br /&gt;
&lt;br /&gt;
'''Шаг i'''&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;r_i = random(p)&amp;lt;/tex&amp;gt;. Отправим &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; программе ''Prover''.&lt;br /&gt;
&lt;br /&gt;
Попросим ''Prover'' 'а прислать ''Verifier'' 'у формулу &amp;lt;tex&amp;gt;A_i(x_{i+1}) = \sum\limits_{x_{i+2} = 0}^{1}\ldots\sum\limits_{x_m = 0}^{1} A(r_1,\ldots, r_i, x_{i+1}, ..., x_m)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Проверим следующее утверждение: &amp;lt;tex&amp;gt;A_i(0) + A_i(1) = A_{i-1}(r_i)&amp;lt;/tex&amp;gt; (*). &lt;br /&gt;
&lt;br /&gt;
'''Шаг m'''&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;r_m = random(p)&amp;lt;/tex&amp;gt;. Отправим &amp;lt;tex&amp;gt;r_m&amp;lt;/tex&amp;gt; программе ''Prover''.&lt;br /&gt;
&lt;br /&gt;
Попросим программу ''Prover'' прислать ''Verifier'' 'у значение &amp;lt;tex&amp;gt;A_m()= A(r_1, r_2, ..., r_m)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Проверим следующее утверждение: &amp;lt;tex&amp;gt;A_m() = A_{m-1}(r_m)&amp;lt;/tex&amp;gt; (*).&lt;br /&gt;
А также сами подставим &amp;lt;tex&amp;gt;r_1, r_2, ..., r_m&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;A(x_1, x_2, ..., x_m)&amp;lt;/tex&amp;gt; и проверим правильность присланного значения &amp;lt;tex&amp;gt;A_m()&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возвращаем '''true'''.&lt;br /&gt;
&lt;br /&gt;
Докажем теперь, что построенный таким образом ''Verifier'' — корректный. Для этого нужно доказать следующие утверждения:&lt;br /&gt;
# Построенный ''Verifier'' - вероятностная машина Тьюринга, совершающая не более полинома от длины входа действий.&lt;br /&gt;
# &amp;lt;tex&amp;gt;\langle \varphi, k \rangle \in \#SAT \Rightarrow \exists \mathit{Prover} : P(\mathit{Verifier^{Prover}}(\langle \varphi, k \rangle)) \ge 2/3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# &amp;lt;tex&amp;gt;\langle \varphi, k \rangle \notin \#SAT \Rightarrow \forall \mathit{Prover} : P(\mathit{Verifier^{Prover}}(\langle \varphi, k \rangle)) \le 1/3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Докажем эти утверждения.&lt;br /&gt;
&lt;br /&gt;
#Первый факт следует из построения ''Verifier'' 'а.&lt;br /&gt;
#По [[Арифметизация булевых формул с кванторами | лемме (2)]], если &amp;lt;tex&amp;gt;\sum\limits_{x_1 = 0}^1 \ldots \sum\limits_{x_m = 0}^1  A_\phi(x_1, \ldots, x_m)=k&amp;lt;/tex&amp;gt;, то условия (*) выполнятются, следовательно существует такой ''Prover'', что &amp;lt;tex&amp;gt;P(\mathit{Verifier^{Prover}}(\langle\phi,k\rangle)) = 1&amp;lt;/tex&amp;gt;, для любой пары &amp;lt;tex&amp;gt;\langle\phi,k\rangle \in \mathrm{\#SAT}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Пусть количество наборов, удовлетворяющих &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;, не равно &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Для того, что бы ''Verifier'' вернул '''true''', ''Prover'' 'у необходимо посылать такие &amp;lt;tex&amp;gt;A_i&amp;lt;/tex&amp;gt;, чтобы выполнялись все проверяемые условия. Посмотрим на то, что он может послать:&lt;br /&gt;
:'''Шаг 0'''&lt;br /&gt;
:Так как количество наборов, удовлетворяющих &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;, не равно &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, то ''Prover'' не может послать правильное &amp;lt;tex&amp;gt;A_0&amp;lt;/tex&amp;gt;, поскольку в этом случае не выполнится условие &amp;lt;tex&amp;gt;A_0(0) + A_0(1) = k&amp;lt;/tex&amp;gt;. Поэтому он посылает не &amp;lt;tex&amp;gt;A_0&amp;lt;/tex&amp;gt;, а некое &amp;lt;tex&amp;gt;\tilde{A}_0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
:&amp;lt;tex&amp;gt;\ldots&amp;lt;/tex&amp;gt;&lt;br /&gt;
:'''Шаг i'''&lt;br /&gt;
:Заметим, что если на каком-то шаге &amp;lt;tex&amp;gt;A_{i-1}(r_i) = \tilde{A}_{i-1}(r_i)&amp;lt;/tex&amp;gt;, то начиная со следующего шага ''Prover'' может посылать истинные значения &amp;lt;tex&amp;gt;A_j&amp;lt;/tex&amp;gt; и в итоге ''Verifier'' вернёт '''true'''.&lt;br /&gt;
:Для некоторого случайно выбранного &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; вероятность того, что &amp;lt;tex&amp;gt;A_{i-1}(r_i) = \tilde{A}_{i-1}(r_i)&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; — корень полинома &amp;lt;tex&amp;gt;(A_{i-1} - \tilde{A}_{i-1})(r_i)&amp;lt;/tex&amp;gt;, имеющего степень не больше &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;, не превосходит &amp;lt;tex&amp;gt;\frac{d}{p}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
:&amp;lt;tex&amp;gt;\ldots&amp;lt;/tex&amp;gt;&lt;br /&gt;
:'''Шаг m'''&lt;br /&gt;
: &amp;lt;tex&amp;gt;P(A_{m-1}(r_m) \ne \tilde{A}_{m-1}(r_m)) \ge 1 - \frac d p&amp;lt;/tex&amp;gt;. Значит с такой вероятностью ''Verifier'' получит  &amp;lt;tex&amp;gt;\tilde{A}_m&amp;lt;/tex&amp;gt; вместо &amp;lt;tex&amp;gt;A_m&amp;lt;/tex&amp;gt;. Но так как на шаге &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ''Verifier'' вычисляет &amp;lt;tex&amp;gt;A_m&amp;lt;/tex&amp;gt; и сравнивает его с полученным от ''Prover'' 'а, то в этом случае ''Verifier'' вернет ''false''. &lt;br /&gt;
:&lt;br /&gt;
:Из описанного процесса видно, что с вероятностью большей либо равной &amp;lt;tex&amp;gt;(1 - \frac d p) ^ m&amp;lt;/tex&amp;gt; мы дойдем до последнего шага и будем имееть &amp;lt;tex&amp;gt;\tilde{A}_n&amp;lt;/tex&amp;gt; вместо &amp;lt;tex&amp;gt;A_n&amp;lt;/tex&amp;gt;. Так как на шаге &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; ''Verifier'' вычисляет &amp;lt;tex&amp;gt;A_n&amp;lt;/tex&amp;gt; и проверяет значение, то ''Verifier'' вернет ''false''. &lt;br /&gt;
:Оценим вероятность возврата ''Verifier'' 'ом ответа '''false'''.&lt;br /&gt;
:&amp;lt;tex&amp;gt;P(!\mathit{Verifier^{Prover}}(\langle \varphi, k \rangle)) \ge (1 - \frac d p) ^ m \ge (1 - \frac d {3dm})^m = (1 - \frac 1 {3m})^m = 1 - \frac 1 3 + \frac{m(m - 1)}{2 (3m)^2}  - \frac{m(m-1)(m-2)}{6 (3m)^3} + \ldots \ge \frac 2 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, построенный нами ''Verifier'' корректен, а значит лемма доказана.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=3&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{coNP} \subset \mathrm{IP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Сведём язык &amp;lt;tex&amp;gt;\mathrm{TAUT}&amp;lt;/tex&amp;gt; к языку &amp;lt;tex&amp;gt;\mathrm{\#SAT}&amp;lt;/tex&amp;gt; следующим образом: &amp;lt;tex&amp;gt;\phi \mapsto \langle \phi, 2^k \rangle &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&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;\phi \in \mathrm{TAUT} \Leftrightarrow \langle \phi, 2^k \rangle \in \mathrm{\#SAT}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По лемме (2) &amp;lt;tex&amp;gt;\mathrm{\#SAT} \in \mathrm{IP}&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\mathrm{TAUT} \in \mathrm{IP}&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;\mathrm{TAUT} \in \mathrm{coNPC}&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\mathrm{coNP} \subset \mathrm{IP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%B1%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB_%D1%81_%D0%BA%D0%B2%D0%B0%D0%BD%D1%82%D0%BE%D1%80%D0%B0%D0%BC%D0%B8&amp;diff=23667</id>
		<title>Арифметизация булевых формул с кванторами</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%B1%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB_%D1%81_%D0%BA%D0%B2%D0%B0%D0%BD%D1%82%D0%BE%D1%80%D0%B0%D0%BC%D0%B8&amp;diff=23667"/>
				<updated>2012-06-04T09:33:16Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Введём понятие арифметизации булевых формул. Пусть нам дана формула &amp;lt;tex&amp;gt;\phi(x_1 \ldots x_m)&amp;lt;/tex&amp;gt;. Сделаем следующие преобразования и получим формулу &amp;lt;tex&amp;gt;A_\phi(x_1, x_2, \ldots, x_m)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
* &amp;lt;tex&amp;gt;x_i \to x_i&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt;\lnot \varphi \to 1 - A_\varphi&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt;\varphi \land \psi \to A_\varphi \cdot A_\psi&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt;\varphi \lor \psi \to 1 - (1 - A_\varphi) \cdot (1 - A_\psi)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;tex&amp;gt;|A_\phi| \le C |\phi|&amp;lt;/tex&amp;gt; , где &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; {{---}} некоторая константа.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=1&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\phi(x_1 \ldots x_m) = A_\phi(x_1, \ldots, x_m)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=Непосредственно следует из построения.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для арифметизации булевых формул с кванторами добавим еще два правила преобразования:&lt;br /&gt;
* &amp;lt;tex&amp;gt;\exists x \varphi(x) \to \sum\limits_{x=0}^{1} A_\varphi(x)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt;\forall x \varphi(x) \to \prod\limits_{x=0}^{1} A_\varphi(x)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будем обозначать через &amp;lt;tex&amp;gt;Q_i&amp;lt;/tex&amp;gt; квантор, связывающий переменную &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;. Через &amp;lt;tex&amp;gt;R_i&amp;lt;/tex&amp;gt; будем обозначать операцию, в которую преобразуется квантор &amp;lt;tex&amp;gt;Q_i&amp;lt;/tex&amp;gt; в процессе арифметизации.&lt;br /&gt;
&lt;br /&gt;
Заметим, что любую булеву формулу можно привести к виду &amp;lt;tex&amp;gt;Q_1 \ldots Q_m \phi(x_1, \ldots, x_m)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; {{---}} формула, не содержащая кванторов. Кроме того, в процессе арифметизации &amp;lt;tex&amp;gt;Q_1 \ldots Q_m \phi(x_1, \ldots, x_m)&amp;lt;/tex&amp;gt; переходит в &amp;lt;tex&amp;gt;R_1 \ldots R_m A_\phi(x_1, \ldots, x_m)&amp;lt;/tex&amp;gt;. Поэтому далее будем рассматривать только формулы, которые имеют вид, указанный выше.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=2&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;Q_1 \ldots Q_m \phi(x_1, \ldots, x_m)&amp;lt;/tex&amp;gt; {{---}} булева формула с кванторами, переходящая в процессе арифметизации в &amp;lt;tex&amp;gt;s = R_1 \ldots R_m A_\phi(x_1, \ldots, x_m)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;c_1, \ldots, c_m&amp;lt;/tex&amp;gt; {{---}} двоичные константы.&lt;br /&gt;
&lt;br /&gt;
Обозначим через &amp;lt;tex&amp;gt;A_i(x_{i+1}) = R_{i+2} \ldots R_m A_\phi(c_1, \ldots, c_i, x_{i+1}, \ldots, x_m)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;0 \le i \le m - 1&amp;lt;/tex&amp;gt;. Тогда:&lt;br /&gt;
#&lt;br /&gt;
##Если &amp;lt;tex&amp;gt;R_1 = \sum&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;A_0(0) + A_0(1) = s&amp;lt;/tex&amp;gt;;&lt;br /&gt;
##Если &amp;lt;tex&amp;gt;R_1 = \prod&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;A_0(0) \cdot A_0(1) = s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# &amp;lt;tex&amp;gt;\forall i : 1 \le i \le m - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
##Если &amp;lt;tex&amp;gt;R_{i+1} = \sum&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; A_i(0) + A_i(1) = A_{i-1}(c_i)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
##Если &amp;lt;tex&amp;gt;R_{i+1} = \prod&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;A_i(0) \cdot A_i(1) = A_{i-1}(c_i)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем пункты 1.1 и 2.1. Для остальных пунктов доказательство аналогично.&lt;br /&gt;
&lt;br /&gt;
1.1. &amp;lt;tex&amp;gt;s=\sum\limits_{x_1 = 0}^{1}R_2\ldots R_m(x_1, x_2, \ldots, x_m)=R_2 \ldots R_m&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;(0, x_2, \ldots, x_m) + R_2 \ldots R_m(1, x_2, \ldots, x_m)=A_0(0) + A_0(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.1. &amp;lt;tex&amp;gt;A_{i-1}(c_i)=\sum\limits_{x_{i+1} = 0}^{1}R_{i+2}\ldots R_m&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;(c_1, \ldots, c_{i-1}, c_i, x_{i+1}, \ldots x_m)=R_{i+2} \ldots R_m&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;(c_1, \ldots, c_i, 0, x_{i+2}, \ldots, x_m) + R_{i+2} \ldots R_m&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;(c_1, \ldots, c_i, 1, x_{i+2}, \ldots, x_m)=A_i(0) + A_i(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Оператором линеаризации будем называть оператор &amp;lt;tex&amp;gt;L_{i}A(x_i)=(1-x_i) \cdot A&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;(0)+x_i \cdot A(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Заметим, что оператор линеаризации уменьшает степень &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; до единицы, при этом полученная формула эквивалентна исходной. Кроме того, если дано выражение &amp;lt;tex&amp;gt;R_1 \ldots R_m A_\phi(x_1, \ldots, x_m)&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;L_{i}&amp;lt;/tex&amp;gt; можно вставить в список &amp;lt;tex&amp;gt;R_1,\ldots,R_m&amp;lt;/tex&amp;gt; в любое место, после операции &amp;lt;tex&amp;gt;R_i&amp;lt;/tex&amp;gt; (для того, чтобы выражение, на которое действует оператор, было функцией от &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;). При этом значение выражения не изменится. Операторы &amp;lt;tex&amp;gt;L_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;L_j&amp;lt;/tex&amp;gt; можно вставлять в выражение независимо друг от друга для любых &amp;lt;tex&amp;gt;1 \le i, j \le m&amp;lt;/tex&amp;gt;. Для оператора линеаризации можно сформулировать лемму, аналогичную лемме (2).&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=3&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;Q_1 \ldots Q_m \phi(x_1, \ldots, x_m)&amp;lt;/tex&amp;gt; {{---}} булева формула с кванторами, переходящая в процессе арифметизации в &amp;lt;tex&amp;gt;s = R_1 \ldots R_m A_\phi(x_1, \ldots, x_m)=R_1 \ldots R_{i+1} L_j R_{i+2}\ldots R_m A_\phi(x_1, \ldots, x_m)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;j &amp;lt; i + 2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;c_1, \ldots, c_m&amp;lt;/tex&amp;gt; {{---}} двоичные константы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A_{i}'(x_1,\ldots,x_{i+1}) = L_j R_{i+2} \ldots R_m A_\phi(x_1, \ldots, x_m)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A_{i}(x_1,\ldots,x_{i+1}) = R_{i+2} \ldots R_m A_\phi(x_1, \ldots, x_m)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A_i'(c_1,\ldots,c_{i+1}) = (1-c_j) \cdot A_i&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;(c_1,\ldots,c_{j-1},0,c_{j+1},\ldots,c_{i+1}) + c_j \cdot A_i(c_1,\ldots,c_{j-1},1,c_{j+1},\ldots,c_{i+1})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB%D1%8B._%D0%9A%D0%BB%D0%B0%D1%81%D1%81_IP._%D0%9A%D0%BB%D0%B0%D1%81%D1%81_AM&amp;diff=23651</id>
		<title>Интерактивные протоколы. Класс IP. Класс AM</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB%D1%8B._%D0%9A%D0%BB%D0%B0%D1%81%D1%81_IP._%D0%9A%D0%BB%D0%B0%D1%81%D1%81_AM&amp;diff=23651"/>
				<updated>2012-06-04T07:34:24Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Класс IP==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
&amp;lt;b&amp;gt;Интерактивным протоколом&amp;lt;/b&amp;gt;, разрешающим язык &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, называется абстрактная машина (см. рис. 1), моделирующая вычисления как обмен сообщениями между двумя программами (Prover и Verifier, далее &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; соответственно), такими, что&lt;br /&gt;
# &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; заинтересован в том, чтобы &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; решил, что слово &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; принадлежит языку;&lt;br /&gt;
# &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; не ограничен в вычислительной мощности;&lt;br /&gt;
# &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; заинтересован установить, действительно ли слово &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; принадлежит языку;&lt;br /&gt;
# &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; — [[Вероятностные вычисления. Вероятностная машина Тьюринга|вероятностная машина Тьюринга]];&lt;br /&gt;
# &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; ограничен полиномиальным временем работы.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Файл:IPS.png|250px|thumb|right|Рис. 1. Схема интерактивного протокола.]] &lt;br /&gt;
&lt;br /&gt;
Интерактивные протоколы делятся на два типа в зависимости от доступа &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; к вероятностной ленте &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;:&lt;br /&gt;
# &amp;lt;b&amp;gt; public coins &amp;lt;/b&amp;gt; — &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; может видеть вероятностную ленту &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;b&amp;gt; private coins &amp;lt;/b&amp;gt; — &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; &amp;lt;b&amp;gt;не&amp;lt;/b&amp;gt; может видеть вероятностную ленту &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{IP}[f] = \{L\bigm|\exists \langle V, P \rangle : &amp;lt;/tex&amp;gt; &amp;lt;br/&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; не имеет доступа к вероятностной ленте &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; (private coins);&lt;br /&gt;
# &amp;lt;tex&amp;gt; \forall x \in L \Rightarrow P(V(x) = 1) \ge \frac{2}{3} &amp;lt;/tex&amp;gt;;&amp;lt;br/&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt; \forall x \notin L \Rightarrow P(V(x) = 1) \le \frac{1}{3} &amp;lt;/tex&amp;gt;;&amp;lt;br/&amp;gt;&lt;br /&gt;
# число раундов интерактивного протокола &amp;lt;tex&amp;gt; O(f(n)), n = |x|\}&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Язык &amp;lt;tex&amp;gt;\mathrm{AM}&amp;lt;/tex&amp;gt; (&amp;lt;i&amp;gt;Arthur–Merlin games&amp;lt;/i&amp;gt;) отличается от &amp;lt;tex&amp;gt;\mathrm{IP}&amp;lt;/tex&amp;gt; лишь тем, что &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; может видеть вероятностную ленту &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{AM}[f] = \{L\bigm|\exists \langle V, P \rangle : &amp;lt;/tex&amp;gt; &amp;lt;br/&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; может читать вероятностную ленту &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; (public coins);&lt;br /&gt;
# &amp;lt;tex&amp;gt; \forall x \in L \Rightarrow P(V(x) = 1) \ge \frac{2}{3} &amp;lt;/tex&amp;gt;;&amp;lt;br/&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt; \forall x \notin L \Rightarrow P(V(x) = 1) \le \frac{1}{3} &amp;lt;/tex&amp;gt;;&amp;lt;br/&amp;gt;&lt;br /&gt;
# число раундов интерактивного протокола &amp;lt;tex&amp;gt; O(f(n)), n = |x|\} &amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
Если для интерактивного протокола выполняется &amp;lt;tex&amp;gt; \forall x \in L \Rightarrow P(V(x) = 1) = 1 &amp;lt;/tex&amp;gt;, то говорят, что он обладает свойством &amp;lt;b&amp;gt; completeness &amp;lt;/b&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
Если для интерактивного протокола выполняется &amp;lt;tex&amp;gt; \forall x \notin L \Rightarrow P(V(x) = 1) = 0 &amp;lt;/tex&amp;gt;, то говорят, что он обладает свойством &amp;lt;b&amp;gt; soundness &amp;lt;/b&amp;gt;.&lt;br /&gt;
}} &lt;br /&gt;
Свойство completeness можно достичь, а soundness достичь нельзя.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{BPP} \subset \mathrm{IP}[0]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; сам по себе является вероятностной машиной Тьюринга и поэтому может разрешить язык из &amp;lt;tex&amp;gt;\mathrm{BPP}&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;
|statement=&amp;lt;tex&amp;gt;\mathrm{NP} \subset \mathrm{IP}[1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Для разрешения языка из &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt; будем использовать следующий протокол:&lt;br /&gt;
&amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; будет проверять на принадлежность слова &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; используя сертификат, который он запросит у &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; не ограничен в вычислительной мощности, он может подобрать подходящий сертификат и именно его и сообщит, так как он заинтересован в том, чтобы &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; принял слово. Для этого требуется лишь один раунд интерактивного протокола.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{GNI}&amp;lt;/tex&amp;gt; расшифровывается как Graph Non Isomorphism. Это язык пар неизоморфных друг другу графов.&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{GNI}=\{ \langle G, H \rangle, &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;\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{GNI} \in \mathrm{IP}[1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Будем использовать следующий алгоритм для &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;:&lt;br /&gt;
# Возьмём случайное число &amp;lt;tex&amp;gt;i \in \{0, 1\}&amp;lt;/tex&amp;gt; и случайную перестановку &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; с вероятностной ленты; &amp;lt;br/&amp;gt;&lt;br /&gt;
# Создадим новый граф, перемешав вершины графа c номером &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; перестановкой &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;; &amp;lt;br/&amp;gt;&lt;br /&gt;
# Перешлём &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; полученный граф с просьбой определить, из какого из исходных графов он был получен; &amp;lt;br/&amp;gt;&lt;br /&gt;
# Получив ответ, сравним его с правильным ответом — числом &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;; &amp;lt;br/&amp;gt;&lt;br /&gt;
# Если полученный ответ не совпадёт с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, то вернём &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;; &amp;lt;br/&amp;gt;&lt;br /&gt;
# Иначе повторим первые пять шагов ещё раз и перейдём к последнему шагу; &amp;lt;br/&amp;gt;&lt;br /&gt;
# Если мы ещё не вернули &amp;lt;tex&amp;gt;0&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;\mathrm{IP}[1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Во-первых, очевидно, что число раундов не превосходит двух. &amp;lt;br/&amp;gt;&lt;br /&gt;
Рассмотрим теперь случаи&lt;br /&gt;
* &amp;lt;tex&amp;gt; \langle G, H \rangle \in \mathrm{GNI}&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;P&amp;lt;/tex&amp;gt; сможет определить какой граф был перемешан &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;. Таким образом, &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; сможет два раза подряд вернуть правильный ответ и в итоге &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; вернёт 1.&lt;br /&gt;
* &amp;lt;tex&amp;gt; \langle G, H \rangle \notin \mathrm{GNI}&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;P&amp;lt;/tex&amp;gt; не сможет определить какой граф был перемешан &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;P&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;V&amp;lt;/tex&amp;gt; примет слово &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, когда оно не принадлежит языку (то есть &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; два раза подряд верно угадает номер графа), равна &amp;lt;tex&amp;gt;\frac{1}{4}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Таким образом, построенный протокол удовлетворяет условию теоремы.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Вероятностные вычисления. Вероятностная машина Тьюринга]]&lt;br /&gt;
*[[Недетерминированные вычисления. Классы NP и Σ₁]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB%D1%8B._%D0%9A%D0%BB%D0%B0%D1%81%D1%81_IP._%D0%9A%D0%BB%D0%B0%D1%81%D1%81_AM&amp;diff=23650</id>
		<title>Интерактивные протоколы. Класс IP. Класс AM</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB%D1%8B._%D0%9A%D0%BB%D0%B0%D1%81%D1%81_IP._%D0%9A%D0%BB%D0%B0%D1%81%D1%81_AM&amp;diff=23650"/>
				<updated>2012-06-04T07:27:29Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Класс IP==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
&amp;lt;b&amp;gt;Интерактивным протоколом&amp;lt;/b&amp;gt;, разрешающим язык &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, называется абстрактная машина (см. рис. 1), моделирующая вычисления как обмен сообщениями между двумя программами (Prover и Verifier, далее &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; соответственно), такими, что&lt;br /&gt;
# &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; заинтересован в том, чтобы &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; решил, что слово &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; принадлежит языку;&lt;br /&gt;
# &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; не ограничен в вычислительной мощности;&lt;br /&gt;
# &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; заинтересован установить, действительно ли слово &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; принадлежит языку;&lt;br /&gt;
# &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; — [[Вероятностные вычисления. Вероятностная машина Тьюринга|вероятностная машина Тьюринга]];&lt;br /&gt;
# &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; ограничен полиномиальным временем работы.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Файл:IPS.png|250px|thumb|right|Рис. 1. Схема интерактивного протокола.]] &lt;br /&gt;
&lt;br /&gt;
Интерактивные протоколы делятся на два типа в зависимости от доступа &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; к вероятностной ленте &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;:&lt;br /&gt;
# &amp;lt;b&amp;gt; public coins &amp;lt;/b&amp;gt; — &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; может видеть вероятностную ленту &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;b&amp;gt; private coins &amp;lt;/b&amp;gt; — &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; &amp;lt;b&amp;gt;не&amp;lt;/b&amp;gt; может видеть вероятностную ленту &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{IP[f]} = \{L\bigm|\exists \langle V, P \rangle : &amp;lt;/tex&amp;gt; &amp;lt;br/&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; не имеет доступа к вероятностной ленте &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; (private coins);&lt;br /&gt;
# &amp;lt;tex&amp;gt; \forall x \in L \Rightarrow P(V(x) = 1) \ge \frac{2}{3} &amp;lt;/tex&amp;gt;;&amp;lt;br/&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt; \forall x \notin L \Rightarrow P(V(x) = 1) \le \frac{1}{3} &amp;lt;/tex&amp;gt;;&amp;lt;br/&amp;gt;&lt;br /&gt;
# число раундов интерактивного протокола &amp;lt;tex&amp;gt; O(f(n)), n = |x|\}&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Язык &amp;lt;tex&amp;gt;\mathrm{AM}&amp;lt;/tex&amp;gt; (&amp;lt;i&amp;gt;Arthur–Merlin games&amp;lt;/i&amp;gt;) отличается от &amp;lt;tex&amp;gt;\mathrm{IP}&amp;lt;/tex&amp;gt; лишь тем, что &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; может видеть вероятностную ленту &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{AM[f]} = \{L\bigm|\exists \langle V, P \rangle : &amp;lt;/tex&amp;gt; &amp;lt;br/&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; может читать вероятностную ленту &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; (public coins);&lt;br /&gt;
# &amp;lt;tex&amp;gt; \forall x \in L \Rightarrow P(V(x) = 1) \ge \frac{2}{3} &amp;lt;/tex&amp;gt;;&amp;lt;br/&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt; \forall x \notin L \Rightarrow P(V(x) = 1) \le \frac{1}{3} &amp;lt;/tex&amp;gt;;&amp;lt;br/&amp;gt;&lt;br /&gt;
# число раундов интерактивного протокола &amp;lt;tex&amp;gt; O(f(n)), n = |x|\} &amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
Если для интерактивного протокола выполняется &amp;lt;tex&amp;gt; \forall x \in L \Rightarrow P(V(x) = 1) = 1 &amp;lt;/tex&amp;gt;, то говорят, что он обладает свойством &amp;lt;b&amp;gt; completeness &amp;lt;/b&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
Если для интерактивного протокола выполняется &amp;lt;tex&amp;gt; \forall x \notin L \Rightarrow P(V(x) = 1) = 0 &amp;lt;/tex&amp;gt;, то говорят, что он обладает свойством &amp;lt;b&amp;gt; soundness &amp;lt;/b&amp;gt;.&lt;br /&gt;
}} &lt;br /&gt;
Свойство completeness можно достичь, а soundness достичь нельзя.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{BPP} \subset \mathrm{IP[0]}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; сам по себе является вероятностной машиной Тьюринга и поэтому может разрешить язык из &amp;lt;tex&amp;gt;\mathrm{BPP}&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;
|statement=&amp;lt;tex&amp;gt;\mathrm{NP} \subset \mathrm{IP[1]}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Для разрешения языка из &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt; будем использовать следующий протокол:&lt;br /&gt;
&amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; будет проверять на принадлежность слова &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; используя сертификат, который он запросит у &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; не ограничен в вычислительной мощности, он может подобрать подходящий сертификат и именно его и сообщит, так как он заинтересован в том, чтобы &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; принял слово. Для этого требуется лишь один раунд интерактивного протокола.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{GNI}&amp;lt;/tex&amp;gt; расшифровывается как Graph Non Isomorphism. Это язык пар неизоморфных друг другу графов.&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{GNI}=\{ \langle G, H \rangle, &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;\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{GNI} \in \mathrm{IP[1]}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Будем использовать следующий алгоритм для &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;:&lt;br /&gt;
# Возьмём случайное число &amp;lt;tex&amp;gt;i \in \{0, 1\}&amp;lt;/tex&amp;gt; и случайную перестановку &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; с вероятностной ленты; &amp;lt;br/&amp;gt;&lt;br /&gt;
# Создадим новый граф, перемешав вершины графа c номером &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; перестановкой &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;; &amp;lt;br/&amp;gt;&lt;br /&gt;
# Перешлём &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; полученный граф с просьбой определить, из какого из исходных графов он был получен; &amp;lt;br/&amp;gt;&lt;br /&gt;
# Получив ответ, сравним его с правильным ответом — числом &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;; &amp;lt;br/&amp;gt;&lt;br /&gt;
# Если полученный ответ не совпадёт с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, то вернём &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;; &amp;lt;br/&amp;gt;&lt;br /&gt;
# Иначе повторим первые пять шагов ещё раз и перейдём к последнему шагу; &amp;lt;br/&amp;gt;&lt;br /&gt;
# Если мы ещё не вернули &amp;lt;tex&amp;gt;0&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;\mathrm{IP[1]}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Во-первых, очевидно, что число раундов не превосходит двух. &amp;lt;br/&amp;gt;&lt;br /&gt;
Рассмотрим теперь случаи&lt;br /&gt;
* &amp;lt;tex&amp;gt; \langle G, H \rangle \in \mathrm{GNI}&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;P&amp;lt;/tex&amp;gt; сможет определить какой граф был перемешан &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;. Таким образом, &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; сможет два раза подряд вернуть правильный ответ и в итоге &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; вернёт 1.&lt;br /&gt;
* &amp;lt;tex&amp;gt; \langle G, H \rangle \notin \mathrm{GNI}&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;P&amp;lt;/tex&amp;gt; не сможет определить какой граф был перемешан &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;P&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;V&amp;lt;/tex&amp;gt; примет слово &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, когда оно не принадлежит языку (то есть &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; два раза подряд верно угадает номер графа), равна &amp;lt;tex&amp;gt;\frac{1}{4}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Таким образом, построенный протокол удовлетворяет условию теоремы.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Вероятностные вычисления. Вероятностная машина Тьюринга]]&lt;br /&gt;
*[[Недетерминированные вычисления. Классы NP и Σ₁]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB%D1%8B._%D0%9A%D0%BB%D0%B0%D1%81%D1%81_IP._%D0%9A%D0%BB%D0%B0%D1%81%D1%81_AM&amp;diff=23599</id>
		<title>Обсуждение:Интерактивные протоколы. Класс IP. Класс AM</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB%D1%8B._%D0%9A%D0%BB%D0%B0%D1%81%D1%81_IP._%D0%9A%D0%BB%D0%B0%D1%81%D1%81_AM&amp;diff=23599"/>
				<updated>2012-06-03T22:01:13Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Надо написать, что V хочет установить истину. Надо расставить ссылки (например, на вероятностную МТ). Надо правильным начертанием оформить не только BPP и NP, но и всех остальных (IP, AM, GNI…). Надо закрыть фигурные скобки в определениях. Можно-нельзя достичь нельзя писать внутри определения, ибо это путает; надо, наверное, просто текстом после определения (или, лучше, обоих определений). Точки в формулирвоках теорем и последнем определении. [[Участник:Kirelagin|Кирилл Елагин]] 02:01, 4 июня 2012 (GST)&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB%D1%8B._%D0%9A%D0%BB%D0%B0%D1%81%D1%81_IP._%D0%9A%D0%BB%D0%B0%D1%81%D1%81_AM&amp;diff=23597</id>
		<title>Обсуждение:Интерактивные протоколы. Класс IP. Класс AM</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB%D1%8B._%D0%9A%D0%BB%D0%B0%D1%81%D1%81_IP._%D0%9A%D0%BB%D0%B0%D1%81%D1%81_AM&amp;diff=23597"/>
				<updated>2012-06-03T21:52:47Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: Новая страница: «Надо написать, что V хочет установить истину. Надо расставить ссылки (например, на вероят...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Надо написать, что V хочет установить истину. Надо расставить ссылки (например, на вероятностную МТ). Надо правильным начертанием оформить не только BPP и NP, но и всех остальных (IP, AM, GNI…). Надо закрыть фигурные скобки в определениях. Можно-нельзя достичь нельзя писать внутри определения, ибо это путает; надо, наверное, просто текстом после определения (или, лучше, обоих определений). Точки в формулирвоках теорем и последнем определении.&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB%D1%8B._%D0%9A%D0%BB%D0%B0%D1%81%D1%81_IP._%D0%9A%D0%BB%D0%B0%D1%81%D1%81_AM&amp;diff=23596</id>
		<title>Интерактивные протоколы. Класс IP. Класс AM</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB%D1%8B._%D0%9A%D0%BB%D0%B0%D1%81%D1%81_IP._%D0%9A%D0%BB%D0%B0%D1%81%D1%81_AM&amp;diff=23596"/>
				<updated>2012-06-03T21:52:22Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: /* Класс IP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Класс IP==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
&amp;lt;b&amp;gt;Интерактивным протоколом&amp;lt;/b&amp;gt;, разрешающим язык &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, называется абстрактная машина (см. рис. 1), моделирующая вычисления как обмен сообщениями между двумя программами (Prover и Verifier, далее &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; соответственно), такими, что&lt;br /&gt;
# &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; заинтересован в том, чтобы &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; решил, что слово &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; принадлежит языку;&lt;br /&gt;
# &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; не ограничен в вычислительной мощности;&lt;br /&gt;
# &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; — вероятностная машина Тьюринга;&lt;br /&gt;
# &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; ограничен полиномиальным временем работы.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Файл:IPS.png|250px|thumb|right|Рис. 1. Схема интерактивного протокола.]] &lt;br /&gt;
&lt;br /&gt;
Интерактивные протоколы делятся на два типа в зависимости от доступа &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; к вероятностной ленте &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;:&lt;br /&gt;
# &amp;lt;b&amp;gt; public coins &amp;lt;/b&amp;gt; — &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; может видеть вероятностную ленту &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;b&amp;gt; private coins &amp;lt;/b&amp;gt; — &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; &amp;lt;b&amp;gt;не&amp;lt;/b&amp;gt; может видеть вероятностную ленту &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
&amp;lt;tex&amp;gt;IP[f] = \{L|\exists \langle V, P \rangle : &amp;lt;/tex&amp;gt; &amp;lt;br/&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; не имеет доступа к вероятностной ленте &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; (private coins);&lt;br /&gt;
# &amp;lt;tex&amp;gt; \forall x \in L \Rightarrow P(V(x) = 1) \ge \frac{2}{3} &amp;lt;/tex&amp;gt;;&amp;lt;br/&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt; \forall x \notin L \Rightarrow P(V(x) = 1) \le \frac{1}{3} &amp;lt;/tex&amp;gt;;&amp;lt;br/&amp;gt;&lt;br /&gt;
# число раундов интерактивного протокола &amp;lt;tex&amp;gt; O(f(n)), n = |x| &amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Язык AM (&amp;lt;i&amp;gt;Arthur–Merlin games&amp;lt;/i&amp;gt;) отличается от IP лишь тем, что &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; может видеть вероятностную ленту &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
&amp;lt;tex&amp;gt;AM[f] = \{L|\exists \langle V, P \rangle : &amp;lt;/tex&amp;gt; &amp;lt;br/&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; может читать вероятностную ленту &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; (public coins);&lt;br /&gt;
# &amp;lt;tex&amp;gt; \forall x \in L \Rightarrow P(V(x) = 1) \ge \frac{2}{3} &amp;lt;/tex&amp;gt;;&amp;lt;br/&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt; \forall x \notin L \Rightarrow P(V(x) = 1) \le \frac{1}{3} &amp;lt;/tex&amp;gt;;&amp;lt;br/&amp;gt;&lt;br /&gt;
# число раундов интерактивного протокола &amp;lt;tex&amp;gt; O(f(n)), n = |x| &amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
Если для интерактивного протокола выполняется &amp;lt;tex&amp;gt; \forall x \in L \Rightarrow P(V(x) = 1) = 1 &amp;lt;/tex&amp;gt;, то говорят, что он обладает свойством &amp;lt;b&amp;gt; completeness &amp;lt;/b&amp;gt; (его можно достичь).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
Если для интерактивного протокола выполняется &amp;lt;tex&amp;gt; \forall x \notin L \Rightarrow P(V(x) = 1) = 0 &amp;lt;/tex&amp;gt;, то говорят, что он обладает свойством &amp;lt;b&amp;gt; soundness &amp;lt;/b&amp;gt; (его нельзя достичь).&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{BPP} \subset \mathrm{IP[0]}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; сам по себе является вероятностной машиной Тьюринга и поэтому может разрешить язык из &amp;lt;tex&amp;gt;\mathrm{BPP}&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;
|statement=&amp;lt;tex&amp;gt;\mathrm{NP} \subset \mathrm{IP[1]}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Для разрешения языка из &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt; будем использовать следующий протокол:&lt;br /&gt;
&amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; будет проверять на принадлежность слова &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; используя сертификат, который он запросит у &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; не ограничен в вычислительной мощности, он может подобрать подходящий сертификат и именно его и сообщит, так как он заинтересован в том, чтобы &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; принял слово. Для этого требуется лишь один раунд интерактивного протокола.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;GNI&amp;lt;/tex&amp;gt; расшифровывается как Graph Non Isomorphism. Это язык пар неизоморфных друг другу графов.&lt;br /&gt;
&amp;lt;tex&amp;gt;GNI=\{ \langle G, H \rangle, &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;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;GNI \in \mathrm{IP[1]}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Будем использовать следующий алгоритм для &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;:&lt;br /&gt;
# Возьмём случайное число &amp;lt;tex&amp;gt;i \in \{0, 1\}&amp;lt;/tex&amp;gt; и случайную перестановку &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; с вероятностной ленты; &amp;lt;br/&amp;gt;&lt;br /&gt;
# Создадим новый граф, перемешав вершины графа c номером &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; перестановкой &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;; &amp;lt;br/&amp;gt;&lt;br /&gt;
# Перешлём &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; полученный граф с просьбой определить, из какого из исходных графов он был получен; &amp;lt;br/&amp;gt;&lt;br /&gt;
# Получив ответ, сравним его с правильным ответом — числом &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;; &amp;lt;br/&amp;gt;&lt;br /&gt;
# Если полученный ответ не совпадёт с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, то вернём &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;; &amp;lt;br/&amp;gt;&lt;br /&gt;
# Иначе повторим первые пять шагов ещё раз и перейдём к последнему шагу; &amp;lt;br/&amp;gt;&lt;br /&gt;
# Если мы ещё не вернули &amp;lt;tex&amp;gt;0&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;\mathrm{IP[1]}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Во-первых, очевидно, что число раундов не превосходит двух. &amp;lt;br/&amp;gt;&lt;br /&gt;
Рассмотрим теперь случаи&lt;br /&gt;
* &amp;lt;tex&amp;gt; \langle G, H \rangle \in GNI&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;P&amp;lt;/tex&amp;gt; сможет определить какой граф был перемешан &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;. Таким образом, &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; сможет два раза подряд вернуть правильный ответ и в итоге &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; вернёт 1.&lt;br /&gt;
* &amp;lt;tex&amp;gt; \langle G, H \rangle \notin GNI&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;P&amp;lt;/tex&amp;gt; не сможет определить какой граф был перемешан &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;P&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;V&amp;lt;/tex&amp;gt; примет слово &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, когда оно не принадлежит языку (то есть &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; два раза подряд верно угадает номер графа), равна &amp;lt;tex&amp;gt;\frac{1}{4}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Таким образом, построенный протокол удовлетворяет условию теоремы.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kirelagin</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_RP_%D0%B8_coRP&amp;diff=23591</id>
		<title>Классы RP и coRP</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_RP_%D0%B8_coRP&amp;diff=23591"/>
				<updated>2012-06-03T21:23:43Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Определения ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Сложностный класс &amp;lt;tex&amp;gt;\mathrm{RP}&amp;lt;/tex&amp;gt; состоит из языков &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; таких, что существует [[Вероятностные вычисления. Вероятностная машина Тьюринга|ВМТ]] &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;:&lt;br /&gt;
# &amp;lt;tex&amp;gt;x \notin L \Rightarrow P(m(x) = 0) = 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;tex&amp;gt;x \in L \Rightarrow P(m(x) = 1) \geq \frac{1}{2}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;tex&amp;gt;T(m(x, r)) \le poly(|x|)&amp;lt;/tex&amp;gt; для любой вероятностной ленты &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Сложностный класс &amp;lt;tex&amp;gt;\mathrm{RP_{weak}}&amp;lt;/tex&amp;gt; состоит из языков &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; таких, что существует ВМТ &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;:&lt;br /&gt;
# &amp;lt;tex&amp;gt;x \notin L \Rightarrow P(m(x) = 0) = 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;tex&amp;gt;x \in L \Rightarrow P(m(x) = 1) \geq \frac{1}{q(|x|)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;q(|x|)&amp;lt;/tex&amp;gt; — некоторый полином, &amp;lt;tex&amp;gt;q(|x|) \geq 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;tex&amp;gt;T(m(x, r)) \le poly(|x|)&amp;lt;/tex&amp;gt; для любой вероятностной ленты &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Сложностный класс &amp;lt;tex&amp;gt;\mathrm{RP_{strong}}&amp;lt;/tex&amp;gt; состоит из языков &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; таких, что существует ВМТ &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;:&lt;br /&gt;
# &amp;lt;tex&amp;gt;x \notin L \Rightarrow P(m(x) = 0) = 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;tex&amp;gt;x \in L \Rightarrow P(m(x) = 1) \geq 1 - \frac{1}{2^{q(|x|)}}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;q(|x|)&amp;lt;/tex&amp;gt; — некоторый полином;&lt;br /&gt;
# &amp;lt;tex&amp;gt;T(m(x, r)) \le poly(|x|)&amp;lt;/tex&amp;gt; для любой вероятностной ленты &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Теорема об эквивалентности определений ==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{RP}=\mathrm{RP_{weak}}=\mathrm{RP_{strong}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{RP_{weak}} \subset \mathrm{RP}\colon&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Рассмотрим язык &amp;lt;tex&amp;gt;L \in \mathrm{RP_{weak}}&amp;lt;/tex&amp;gt;. Этому языку соответсвует программа &amp;lt;tex&amp;gt;p_{\mathrm{RP_{weak}}}&amp;lt;/tex&amp;gt;. Для доказательства утверждения необходимо написать программу &amp;lt;tex&amp;gt;p_{\mathrm{RP}}&amp;lt;/tex&amp;gt;, которая будет удолетворять ограничениям сложностного класса &amp;lt;tex&amp;gt;\mathrm{RP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
 &amp;lt;tex&amp;gt;p_{\mathrm{RP}}(x)&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''for''' &amp;lt;tex&amp;gt;i = 1 \ldots k&amp;lt;/tex&amp;gt; // &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; будет определено позже&lt;br /&gt;
         '''if''' &amp;lt;tex&amp;gt;p_{\mathrm{RP_{weak}}}(x)&amp;lt;/tex&amp;gt; &lt;br /&gt;
             '''return''' &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''return''' &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
Если слово &amp;lt;tex&amp;gt;x \notin L&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;p_{\mathrm{RP_{weak}}}(x)&amp;lt;/tex&amp;gt; всегда возвращает &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;P(p_{\mathrm{RP}}(x) = 0) = 1&amp;lt;/tex&amp;gt;, при &amp;lt;tex&amp;gt;x \notin L&amp;lt;/tex&amp;gt;. Если хотя бы один вызов программы &amp;lt;tex&amp;gt;p_{\mathrm{RP_{weak}}}(x)&amp;lt;/tex&amp;gt; вернёт &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, то слово &amp;lt;tex&amp;gt;x \in L&amp;lt;/tex&amp;gt;. Вероятность ошибки программы &amp;lt;tex&amp;gt;p_{\mathrm{RP_{weak}}}&amp;lt;/tex&amp;gt; меньше, чем &amp;lt;tex&amp;gt;1-\frac{1}{q(|x|)}&amp;lt;/tex&amp;gt;, то есть вероятность ошибки программы &amp;lt;tex&amp;gt;p_{\mathrm{RP}}&amp;lt;/tex&amp;gt; меньше, чем &amp;lt;tex&amp;gt;(1-\frac{1}{q(|x|)})^k&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; надо выбрать таким, что вероятность ошибки программы &amp;lt;tex&amp;gt;m_{\mathrm{RP}}&amp;lt;/tex&amp;gt; при &amp;lt;tex&amp;gt;x \in L&amp;lt;/tex&amp;gt; была меньше &amp;lt;tex&amp;gt;\frac {1}{2}&amp;lt;/tex&amp;gt;. Получается неравенство &amp;lt;tex&amp;gt;(1-\frac{1}{q(|x|)})^k &amp;lt; \frac{1}{2}&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt; Логарифмируя, получаем &amp;lt;br/&amp;gt; &amp;lt;tex&amp;gt;k\ ln(1-\frac{1}{q(|x|)}) &amp;lt; ln(\frac{1}{2})&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt; Разложив логарифм в ряд Тейлора, получаем&amp;lt;br/&amp;gt; &amp;lt;tex&amp;gt;k(-\frac{1}{q(|x|)} + o(\frac{1}{q(|x|)})) &amp;lt; -ln(2)&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt; Отсюда &amp;lt;tex&amp;gt;k &amp;gt; q(|x|)ln(2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{RP} \subset \mathrm{RP_{weak}}\colon&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Доказательство аналогично предыдущему пункту.&lt;br /&gt;
 &amp;lt;tex&amp;gt;p_{\mathrm{RP_{weak}}}(x)&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''for''' &amp;lt;tex&amp;gt;i = 1 \ldots k&amp;lt;/tex&amp;gt; // &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; будет определено позже&lt;br /&gt;
         '''if''' &amp;lt;tex&amp;gt;p_{\mathrm{RP}}(x)&amp;lt;/tex&amp;gt; &lt;br /&gt;
             '''return''' &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''return''' &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
Но здесь &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; выбирается так, чтобы выполнялось неравенство&amp;lt;br/&amp;gt; &amp;lt;tex&amp;gt;(\frac{1}{2})^k &amp;lt; \frac{1}{q(|x|)}&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
То есть &amp;lt;tex&amp;gt;k &amp;gt; log_2(q(|x|))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{RP} \subset \mathrm{RP_{strong}}\colon&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Напишем программу &amp;lt;tex&amp;gt;p_{\mathrm{RP_{strong}}}&amp;lt;/tex&amp;gt;, удолетворяющую ограничениям сложностного класса &amp;lt;tex&amp;gt;\mathrm{RP_{strong}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
 &amp;lt;tex&amp;gt;p_{\mathrm{RP_{strong}}}(x)&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''for''' &amp;lt;tex&amp;gt;i = 1 \ldots k&amp;lt;/tex&amp;gt; // &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; будет определено позже&lt;br /&gt;
         '''if''' &amp;lt;tex&amp;gt;p_{\mathrm{RP}}(x)&amp;lt;/tex&amp;gt; &lt;br /&gt;
             '''return''' &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''return''' &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
В этом случае &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; необходимо выбрать таким, что должно выполняться неравенство &amp;lt;tex&amp;gt;(\frac{1}{2})^k &amp;lt; 1 - \frac{1}{2^{q(|x|)}}&amp;lt;/tex&amp;gt;. То есть&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;k &amp;gt; -log_{2}(1-\frac{1}{2^{q(|x|)}})&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;Разложив в ряд Тейлора получаем, что&amp;lt;br/&amp;gt; &amp;lt;tex&amp;gt;-log_{2}(1-\frac{1}{2^{q(|x|)}}) = \frac{2^{-q(|x|)}}{ln(2)} + o(2^{-q(|x|)}) = \frac{(1+q(|x|)+o(q(|x|)))^{ln(\frac{1}{2})}}{ln(2)} &amp;lt; \frac{1+q(|x|)}{ln(2)}&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;То есть &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; надо взять больше, чем &amp;lt;tex&amp;gt;\frac{1+q(|x|)}{ln(2)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{RP_{strong}} \subset \mathrm{RP}\colon&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Для доказательства утверждения необходимо написать программу &amp;lt;tex&amp;gt;p_{\mathrm{RP}}&amp;lt;/tex&amp;gt;, которая будет удолетворять ограничениям сложностного класса &amp;lt;tex&amp;gt;\mathrm{RP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
 &amp;lt;tex&amp;gt;p_{\mathrm{RP}}(x)&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''for''' &amp;lt;tex&amp;gt;i = 1 \ldots k&amp;lt;/tex&amp;gt; // &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; будет определено позже&lt;br /&gt;
         '''if''' &amp;lt;tex&amp;gt;p_{\mathrm{RP_{strong}}}(x)&amp;lt;/tex&amp;gt; &lt;br /&gt;
             '''return''' &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''return''' &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; надо выбрать таким, чтобы выполнялось неравенство&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;(\frac{1}{2^{q(|x|)}})^k &amp;lt; \frac{1}{2}&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt; Отсюда &amp;lt;tex&amp;gt;k &amp;gt; \frac{1}{q(|x|)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Вероятностные вычисления. Вероятностная машина Тьюринга]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%A1%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D1%8B%D0%B5_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D1%8B._%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81_%D0%BE%D1%80%D0%B0%D0%BA%D1%83%D0%BB%D0%BE%D0%BC&amp;diff=23561</id>
		<title>Обсуждение:Сложностные классы. Вычисления с оракулом</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%A1%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D1%8B%D0%B5_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D1%8B._%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81_%D0%BE%D1%80%D0%B0%D0%BA%D1%83%D0%BB%D0%BE%D0%BC&amp;diff=23561"/>
				<updated>2012-06-03T19:12:09Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: /* Я не понял, ЭТО зачтено или нет? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ЭТО КАПЕЦ [[Участник:Kirelagin|Кирилл Елагин]] 01:54, 24 апреля 2012 (GST)&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;
* Если объединение по чему-то, то это что-то пишется строго под знаком объединения.&lt;br /&gt;
* Пропущенные запятые - это так, мелочи.&lt;br /&gt;
&lt;br /&gt;
== Я не понял, ЭТО зачтено или нет? ==&lt;br /&gt;
&lt;br /&gt;
Если что, я остался при своём мнении, изложенном в первой строчке данного обсуждения. [[Участник:Kirelagin|Кирилл Елагин]] 22:14, 31 мая 2012 (GST)&lt;br /&gt;
&lt;br /&gt;
: Действительно, стало заметно лучше ;). Но в первом определении всё ещё написан бред. «ограничение» — какое ещё ограничение? T — это просто ''время работы'' программы. С памятью аналогично. TS — вообще из другой оперы, поскольку это не число (время работы или объем памяти), а, как я понимаю из последующего использования, класс задач. И аргументы у него не программа и слово, а две функции. Ну и так дальше в том же духе… [[Участник:Kirelagin|Кирилл Елагин]] 22:51, 2 июня 2012 (GST)&lt;br /&gt;
: И вообще в TS надо еще написать пояснение про space-time tradeoff. [[Участник:Kirelagin|Кирилл Елагин]] 22:53, 2 июня 2012 (GST)&lt;br /&gt;
:: Нина зачем-то проигнорировала примерно половину комментария. Я, наверное, слишком длинно написал… [[Участник:Kirelagin|Кирилл Елагин]] 13:46, 3 июня 2012 (GST)&lt;br /&gt;
:::Кирилл, где ты взял space-time tradeoff? Я у Станка этого совсем не помню...&lt;br /&gt;
:::: Я зато помню. Это было пояснение, почему TS(f,g) != DTIME(f) &amp;amp;cap; DSPACE(g). Собственно, надо нормально написать определение TS (желательно, наверное, с большой фигурной скобочкой), причем ''после'' DTIME и DSPACE. А потом нужно пояснить, почему, собственно, не равно пересечению. Если не помнишь, почему, спроси у Никиты — он точно помнит, поскольку больше всех возмущался по этому поводу. [[Участник:Kirelagin|Кирилл Елагин]] 23:12, 3 июня 2012 (GST)&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D0%B5%D0%B9%D0%BA%D0%B5%D1%80%D0%B0_%E2%80%94_%D0%93%D0%B8%D0%BB%D0%BB%D0%B0_%E2%80%94_%D0%A1%D0%BE%D0%BB%D0%BE%D0%B2%D1%8D%D1%8F&amp;diff=23560</id>
		<title>Обсуждение:Теорема Бейкера — Гилла — Соловэя</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D0%B5%D0%B9%D0%BA%D0%B5%D1%80%D0%B0_%E2%80%94_%D0%93%D0%B8%D0%BB%D0%BB%D0%B0_%E2%80%94_%D0%A1%D0%BE%D0%BB%D0%BE%D0%B2%D1%8D%D1%8F&amp;diff=23560"/>
				<updated>2012-06-03T19:08:12Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: /* Мелкие по сравнению с остальным претензии */ Новая тема&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Во-первых, тебе не повезло: я думал, какой бы конспект почитать, ткнул наугад и попал в твой. Во-вторых, верни, пожалуйста, на место все знаки препинания особенно точки в концах предложений и что-нибудь в районе списков). В-третьих, использовать википедийные подзаголовки где-то внутри доказательства — плохая идея (и я, честно говоря, совсем не понимаю, что с этим делать). В-четвёртых, TQBF не PS-полная, а PS-полный. А теперь я буду читать статью. [[Участник:Kirelagin|Кирилл Елагин]] 00:55, 24 апреля 2012 (GST)&lt;br /&gt;
&lt;br /&gt;
Прочитай, пожалуйста, весь конспект ещё раз, исправь все проблемы согласования и лишние значки типа скобочек. Ставить тире внутри теха — идиотская идея (не только потому что такие тире отвратительно выглядят), а заодно, исправляя это, замени (как минимум) в одном месте тире на дефис. Было бы здорово, если бы ты придумал, как это доказательство записать по-нормальному, чтобы было понятно и можно было спокойно прочитать, потому что иначе это придётся делать мне и я буду не очень доволен. Особенно жутко, конечно, выглядит переход с 0-го на i-й шаг, где сразу же на ровном сыпятся какие-то утверждения про текущее состояние — надо, вероятно, поподробнее инвариант описать. [[Участник:Kirelagin|Кирилл Елагин]] 01:05, 24 апреля 2012 (GST)&lt;br /&gt;
&lt;br /&gt;
: Ну в основном все поправил. Вторая часть доказательства вообще не самая ясная в целом. Там как такого инварианта нет, а мы строим множество с выполнением этого некоторого инварианта. По-моему, я это более-менее ясно написал в конспекте&lt;br /&gt;
:: [http://ru.wikipedia.org/wiki/%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F:%D0%A1%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B_%D0%BE%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B9 Научись пользоваться страницами обсуждений]. И вообще довольно грустно, что ты забил на моё предложение перечитать конспект ещё раз. Да мне даже одно тире из теха пришлось самому вытащить! [[Участник:Kirelagin|Кирилл Елагин]] 00:19, 30 апреля 2012 (GST)&lt;br /&gt;
&lt;br /&gt;
== Первая часть доказательства ==&lt;br /&gt;
&lt;br /&gt;
Во втором утверждении, формально, написана неправда. Надо написать то же самое, но корректно.&lt;br /&gt;
&lt;br /&gt;
== Вторая часть доказательства ==&lt;br /&gt;
&lt;br /&gt;
В описании i-го шага прям черным по белому написано «конечное множество слов», но, блин, это вообще ниоткуа не следует (на момент прочтения) — это я и имел в виду, когда говорил про инварианты.&lt;br /&gt;
&lt;br /&gt;
После описания i-го шага начинается полный трэш и с точки зрения орфографии, и с согласованием. И со смыслом тоже какая-то беда.&lt;br /&gt;
&lt;br /&gt;
== Последствия ==&lt;br /&gt;
&lt;br /&gt;
Из этой теоремы делаются очень глубокие и важные выводы. Про них тоже обязательно надо написать.&lt;br /&gt;
: «который использует операции релятивизации» — чё это за бредятина? [[Участник:Kirelagin|Кирилл Елагин]] 18:40, 7 мая 2012 (GST)&lt;br /&gt;
&lt;br /&gt;
== Странное ограничение ==&lt;br /&gt;
&lt;br /&gt;
Я правильно понимаю, что на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ом шаге &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; не зависит от &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt;? Тогда я не понимаю: что плохого в том, что машина &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; не разрешает слово &amp;lt;tex&amp;gt;1^n&amp;lt;/tex&amp;gt; за &amp;lt;tex&amp;gt;2^{n - 1}&amp;lt;/tex&amp;gt; шагов, потому как временной полином для этой машины вполне может выглядеть как: &lt;br /&gt;
&amp;lt;tex&amp;gt;p(k) = 2^n k &amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
(Друзья, давайте, всё-таки, будем подписываться! Или, хотя бы, логиниться. -- [[Участник:Kirelagin|Кирилл Елагин]] 23:06, 3 июня 2012 (GST))&lt;br /&gt;
&lt;br /&gt;
Я понимаю, что такое время работы программы на данном входе. Я не понимаю, что такое «программа (не) разрешает такой-то язык за время &amp;lt;tex&amp;gt;2^{n-1}&amp;lt;/tex&amp;gt;». [[Участник:Kirelagin|Кирилл Елагин]] 23:06, 3 июня 2012 (GST)&lt;br /&gt;
&lt;br /&gt;
== Мелкие по сравнению с остальным претензии ==&lt;br /&gt;
&lt;br /&gt;
У тебя B написано то курсивным то прямым шрифтом (подсказка: посмотри в степени) (подсказка2: должно быть везде курсивным). [[Участник:Kirelagin|Кирилл Елагин]] 23:08, 3 июня 2012 (GST)&lt;br /&gt;
&lt;br /&gt;
Первое следствие надо удалить, потому что оно есть во втором. Второе следствие надо переписать по-человечески. [[Участник:Kirelagin|Кирилл Елагин]] 23:08, 3 июня 2012 (GST)&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D0%B5%D0%B9%D0%BA%D0%B5%D1%80%D0%B0_%E2%80%94_%D0%93%D0%B8%D0%BB%D0%BB%D0%B0_%E2%80%94_%D0%A1%D0%BE%D0%BB%D0%BE%D0%B2%D1%8D%D1%8F&amp;diff=23559</id>
		<title>Обсуждение:Теорема Бейкера — Гилла — Соловэя</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D0%B5%D0%B9%D0%BA%D0%B5%D1%80%D0%B0_%E2%80%94_%D0%93%D0%B8%D0%BB%D0%BB%D0%B0_%E2%80%94_%D0%A1%D0%BE%D0%BB%D0%BE%D0%B2%D1%8D%D1%8F&amp;diff=23559"/>
				<updated>2012-06-03T19:06:27Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: /* Странное ограничение */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Во-первых, тебе не повезло: я думал, какой бы конспект почитать, ткнул наугад и попал в твой. Во-вторых, верни, пожалуйста, на место все знаки препинания особенно точки в концах предложений и что-нибудь в районе списков). В-третьих, использовать википедийные подзаголовки где-то внутри доказательства — плохая идея (и я, честно говоря, совсем не понимаю, что с этим делать). В-четвёртых, TQBF не PS-полная, а PS-полный. А теперь я буду читать статью. [[Участник:Kirelagin|Кирилл Елагин]] 00:55, 24 апреля 2012 (GST)&lt;br /&gt;
&lt;br /&gt;
Прочитай, пожалуйста, весь конспект ещё раз, исправь все проблемы согласования и лишние значки типа скобочек. Ставить тире внутри теха — идиотская идея (не только потому что такие тире отвратительно выглядят), а заодно, исправляя это, замени (как минимум) в одном месте тире на дефис. Было бы здорово, если бы ты придумал, как это доказательство записать по-нормальному, чтобы было понятно и можно было спокойно прочитать, потому что иначе это придётся делать мне и я буду не очень доволен. Особенно жутко, конечно, выглядит переход с 0-го на i-й шаг, где сразу же на ровном сыпятся какие-то утверждения про текущее состояние — надо, вероятно, поподробнее инвариант описать. [[Участник:Kirelagin|Кирилл Елагин]] 01:05, 24 апреля 2012 (GST)&lt;br /&gt;
&lt;br /&gt;
: Ну в основном все поправил. Вторая часть доказательства вообще не самая ясная в целом. Там как такого инварианта нет, а мы строим множество с выполнением этого некоторого инварианта. По-моему, я это более-менее ясно написал в конспекте&lt;br /&gt;
:: [http://ru.wikipedia.org/wiki/%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F:%D0%A1%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B_%D0%BE%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B9 Научись пользоваться страницами обсуждений]. И вообще довольно грустно, что ты забил на моё предложение перечитать конспект ещё раз. Да мне даже одно тире из теха пришлось самому вытащить! [[Участник:Kirelagin|Кирилл Елагин]] 00:19, 30 апреля 2012 (GST)&lt;br /&gt;
&lt;br /&gt;
== Первая часть доказательства ==&lt;br /&gt;
&lt;br /&gt;
Во втором утверждении, формально, написана неправда. Надо написать то же самое, но корректно.&lt;br /&gt;
&lt;br /&gt;
== Вторая часть доказательства ==&lt;br /&gt;
&lt;br /&gt;
В описании i-го шага прям черным по белому написано «конечное множество слов», но, блин, это вообще ниоткуа не следует (на момент прочтения) — это я и имел в виду, когда говорил про инварианты.&lt;br /&gt;
&lt;br /&gt;
После описания i-го шага начинается полный трэш и с точки зрения орфографии, и с согласованием. И со смыслом тоже какая-то беда.&lt;br /&gt;
&lt;br /&gt;
== Последствия ==&lt;br /&gt;
&lt;br /&gt;
Из этой теоремы делаются очень глубокие и важные выводы. Про них тоже обязательно надо написать.&lt;br /&gt;
: «который использует операции релятивизации» — чё это за бредятина? [[Участник:Kirelagin|Кирилл Елагин]] 18:40, 7 мая 2012 (GST)&lt;br /&gt;
&lt;br /&gt;
== Странное ограничение ==&lt;br /&gt;
&lt;br /&gt;
Я правильно понимаю, что на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ом шаге &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; не зависит от &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt;? Тогда я не понимаю: что плохого в том, что машина &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; не разрешает слово &amp;lt;tex&amp;gt;1^n&amp;lt;/tex&amp;gt; за &amp;lt;tex&amp;gt;2^{n - 1}&amp;lt;/tex&amp;gt; шагов, потому как временной полином для этой машины вполне может выглядеть как: &lt;br /&gt;
&amp;lt;tex&amp;gt;p(k) = 2^n k &amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
(Друзья, давайте, всё-таки, будем подписываться! Или, хотя бы, логиниться. -- [[Участник:Kirelagin|Кирилл Елагин]] 23:06, 3 июня 2012 (GST))&lt;br /&gt;
&lt;br /&gt;
Я понимаю, что такое время работы программы на данном входе. Я не понимаю, что такое «программа (не) разрешает такой-то язык за время &amp;lt;tex&amp;gt;2^{n-1}&amp;lt;/tex&amp;gt;». [[Участник:Kirelagin|Кирилл Елагин]] 23:06, 3 июня 2012 (GST)&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9A%D0%B0%D1%80%D0%BF%D0%B0_%E2%80%94_%D0%9B%D0%B8%D0%BF%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=23555</id>
		<title>Обсуждение:Теорема Карпа — Липтона</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9A%D0%B0%D1%80%D0%BF%D0%B0_%E2%80%94_%D0%9B%D0%B8%D0%BF%D1%82%D0%BE%D0%BD%D0%B0&amp;diff=23555"/>
				<updated>2012-06-03T18:52:01Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: /* Новое доказательство — новые вопросы! */ Новая тема&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Доказательство ==&lt;br /&gt;
&lt;br /&gt;
Переход между первым и вторым предложениями неочевиден и вообще, по-моему, это неправда. [[Участник:Kirelagin|Кирилл Елагин]] 00:54, 30 апреля 2012 (GST)&lt;br /&gt;
: Доказательство этого было заданием на первом тесте. Можно, конечно, и повторить. --[[Участник:Grechko|Grechko]] 02:26, 30 апреля 2012 (GST)&lt;br /&gt;
:: Что-то я такого не припоминаю, но повторить надо в любом случае. [[Участник:Kirelagin|Кирилл Елагин]] 15:11, 30 апреля 2012 (GST)&lt;br /&gt;
::: Добавил например --[[Участник:Grechko|Grechko]] 19:58, 30 апреля 2012 (GST)&lt;br /&gt;
&lt;br /&gt;
== Пара вопросов ==&lt;br /&gt;
&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;, соответствующую схему для любой длины входа? Возможное решение: использовать схему как подсказку, тогда получим программу из &amp;lt;tex&amp;gt;P/poly&amp;lt;/tex&amp;gt; (вроде бы то что хотели).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\exists y\; \phi(x, y, z)&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;z&amp;lt;/tex&amp;gt;) и сослаться на доказательство &amp;lt;tex&amp;gt;P \subset P/\mathrm{poly}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Новое доказательство — новые вопросы! ==&lt;br /&gt;
&lt;br /&gt;
Предложение «Так как задача определения выходного значения таких схем принадлежит NP, то такие схемы существуют и имеют полиномиальный размер» немного странное, поскольку я не понял, о чем оно. Но независимо от этого мне кажется, что оно ничего не доказывает.&lt;br /&gt;
&lt;br /&gt;
Процесс построения схемы C_n описан, мягко говоря, мутно. Ну т.е. я вообще ничего не понял.&lt;br /&gt;
&lt;br /&gt;
[[Участник:Kirelagin|Кирилл Елагин]] 22:52, 3 июня 2012 (GST)&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_L,_NL,_coNL._NL-%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D0%B8%D0%B6%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8&amp;diff=23473</id>
		<title>Обсуждение:Классы L, NL, coNL. NL-полнота задачи о достижимости</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_L,_NL,_coNL._NL-%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D0%B8%D0%B6%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8&amp;diff=23473"/>
				<updated>2012-06-03T13:21:04Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Определеньки надо бы вынести из теорем.&lt;br /&gt;
&lt;br /&gt;
Я, видимо, туплю, но я не понимаю, как &amp;lt;tex&amp;gt;\mathrm{\overline{CONN}} \in \mathrm{NL} \Rightarrow \mathrm{NL} = \mathrm{coNL}&amp;lt;/tex&amp;gt;…&lt;br /&gt;
: А, я нашёл это в самом конце. Такое ощущение, что теорему и лемму нужно разделить. Во-первых, лемма внутри теоремы выглядит просто как-то не очень. Во-вторых, у тебя там всё смешалось и часть доказательства теоремы почему-то доказывается в конце леммы. Ну т.е. я зато, чтобы лемму вынести из теоремы, причем, возможно, надо написать ее ''после'' теоремы, а в теореме аккуратно сослаться, что, мол, вот, если мы докажем вот такую вот лемму, то тогда то-то и то-то, а вот лемму мы докажем попозже. И ещё есть ощущение, что у тебя возникнет проблема co-NLC — coNL-C, как у Андрея Дёмина в конспекте. Посмотри там у него, какая ерунда была, и сделай аккуратетько этот момент.&lt;br /&gt;
&lt;br /&gt;
По-моему, надо пояснить понятие «допускать &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt;». Не очень понятно, что имеется в виду.&lt;br /&gt;
&lt;br /&gt;
В первом куске кода что-то не так с форматированием. И наверное было бы здорово комментарии все выровнить. И return' — это, кажется, что-то вроде yield?&lt;br /&gt;
&lt;br /&gt;
[[Участник:Kirelagin|Кирилл Елагин]] 14:15, 3 июня 2012 (GST)&lt;br /&gt;
&lt;br /&gt;
Да, return' {{---}} это yield.&lt;br /&gt;
Вроде все поправила.&lt;br /&gt;
: сказала, что yield, а в статье сделала return o_0. Ну я тебе там в чятике еще написал.&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9B%D0%B0%D0%B4%D0%BD%D0%B5%D1%80%D0%B0&amp;diff=23468</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%B5%D0%BC%D0%B0_%D0%9B%D0%B0%D0%B4%D0%BD%D0%B5%D1%80%D0%B0&amp;diff=23468"/>
				<updated>2012-06-03T13:13:36Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Теорема Ладнера''' (Ladner's Theorem) утверждает, что если [[Класс P|P]] не совпадает с [[Класс NP|NP]], то существует язык, принадлежащий &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;, но не являющийся ни полиномиальным, ни [[NP-полнота|NP-полным]].&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=Ладнер&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP} \Rightarrow \mathrm{NP} \setminus (\mathrm{P} \cup \mathrm{NPC}) \neq \varnothing&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Предположим, что &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt;. Из этого следует, что никакой &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полный язык (например, [[Примеры NP-полных_языков. Теорема_Кука#NP-полнота_2|SAT]]) нельзя [[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи|свести по Карпу]] к полиномиальному. Будем искать такой язык &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, чтобы язык &amp;lt;tex&amp;gt;L = \mathrm{SAT} \cap A&amp;lt;/tex&amp;gt; удовлетворял следующим условиям:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt;L \in \mathrm{NP}&amp;lt;/tex&amp;gt; (для этого достаточно, чтобы выполнялось &amp;lt;tex&amp;gt;A \in \mathrm{P}&amp;lt;/tex&amp;gt;);&lt;br /&gt;
# &amp;lt;tex&amp;gt;L \not \in \mathrm{P}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;tex&amp;gt;\mathrm{SAT} \not \le L&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если выполнены все три свойства, то &amp;lt;tex&amp;gt;L \in \mathrm{NP} \setminus (\mathrm{P} \cup \mathrm{NPC})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;M_1, \ldots, M_n, \ldots&amp;lt;/tex&amp;gt; — все машины Тьюринга из &amp;lt;tex&amp;gt;\tilde{\mathrm{P}}&amp;lt;/tex&amp;gt; (возможно, с повторениями), расположенные в таком порядке, чтобы &amp;lt;tex&amp;gt;T(M_i, x) \le |x|^i&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;x \in \Sigma^*&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;f_1, \ldots, f_n, \ldots&amp;lt;/tex&amp;gt; — аналогичное множество полиномиальных функций: &amp;lt;tex&amp;gt;T(f_i, x) \le |x|^i&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;x \in \Sigma^*&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем считать, что &amp;lt;tex&amp;gt;|\Sigma| = 2&amp;lt;/tex&amp;gt;. Построим такую ''неубывающую'' функцию &amp;lt;tex&amp;gt;g \in \tilde{\mathrm{P}}&amp;lt;/tex&amp;gt;, что при &amp;lt;tex&amp;gt;A = \{x \in \Sigma^*: g(|x|) \equiv 0 \pmod{2} \}&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; выполняются три перечисленных свойства.&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм построения g ===&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;tex&amp;gt;g(0) = g(1) = 1&amp;lt;/tex&amp;gt;. Для &amp;lt;tex&amp;gt;n \ge 1&amp;lt;/tex&amp;gt; построим &amp;lt;tex&amp;gt;g(n + 1)&amp;lt;/tex&amp;gt; рекурсивно — с помощью &amp;lt;tex&amp;gt;g(0), g(1), \ldots, g(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;(\log_2 n)^{g(n)} \ge n&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;. Иначе выполняем один из следующих пунктов.&lt;br /&gt;
&lt;br /&gt;
* Пусть вычисленное значение &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; чётно. Определим &amp;lt;tex&amp;gt;g(n+1)&amp;lt;/tex&amp;gt; следущим образом:&lt;br /&gt;
&lt;br /&gt;
 for &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;|x| \le \log_2 n&amp;lt;/tex&amp;gt;&lt;br /&gt;
   if &amp;lt;tex&amp;gt;M_i(x)&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 1 \pmod{2}&amp;lt;/tex&amp;gt; or &amp;lt;tex&amp;gt;x \not \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
   if &amp;lt;tex&amp;gt;! M_i(x)&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 0 \pmod{2}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;x \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
 &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Пусть вычисленное значение &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; нечётно. Определим &amp;lt;tex&amp;gt;g(n+1)&amp;lt;/tex&amp;gt; следующим образом:&lt;br /&gt;
&lt;br /&gt;
 for &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;|x| \le \log_2 n, |f_i(x)| \le \log_2 n&amp;lt;/tex&amp;gt;&lt;br /&gt;
   if &amp;lt;tex&amp;gt;x \in \mathrm{SAT}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 1 \pmod{2}&amp;lt;/tex&amp;gt; or &amp;lt;tex&amp;gt;f_i(x) \not \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
   if &amp;lt;tex&amp;gt;x \not \in \mathrm{SAT}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 0 \pmod{2}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;f_i(x) \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
 &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Корректность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение второго и третьего свойств языка &amp;lt;tex&amp;gt;L = \mathrm{SAT} \cap A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; не имеет предела при &amp;lt;tex&amp;gt;n \to \infty&amp;lt;/tex&amp;gt;. Значит, для любой &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; существует элемент, на котором &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; «ошибается»; аналогично, для любой полиномиальной функции &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt; существует элемент, на котором &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt; неверно сводит &amp;lt;tex&amp;gt;\mathrm{SAT}&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. Оба свойства выполнены.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;\lim\limits_{n \to \infty} g(n) = 2i&amp;lt;/tex&amp;gt;. Значит, в нашем множестве существует такая машина Тьюринга &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt;, распознающая &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;\forall x \Rightarrow M_i(x) = [g(|x|) \equiv 0 \pmod{2} \wedge x \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;. С одной стороны, &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; работает за полином, и &amp;lt;tex&amp;gt;L \in \mathrm{P}&amp;lt;/tex&amp;gt;. С другой стороны, по определению &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; различается с &amp;lt;tex&amp;gt;\mathrm{SAT}&amp;lt;/tex&amp;gt; в конечном числе элементов, значит &amp;lt;tex&amp;gt;\mathrm{SAT} \le L&amp;lt;/tex&amp;gt;. Получено противоречие с предположением &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;\lim\limits_{n \to \infty} g(n) = 2i + 1&amp;lt;/tex&amp;gt;. Тогда в нашем множестве полиномиальных функций существует &amp;lt;tex&amp;gt;f_i : \forall x \Rightarrow [x \in SAT] = [g(|f_i(x)|) \equiv 0 \pmod{2} \wedge f_i(x) \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;. С одной стороны, &amp;lt;tex&amp;gt;\mathrm{SAT} \le L&amp;lt;/tex&amp;gt; с помощью &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt;. С другой стороны, из определения &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; выходит, что язык &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; конечен, значит &amp;lt;tex&amp;gt;L \in \mathrm{P}&amp;lt;/tex&amp;gt;. Снова получено противоречие с предположением.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при верности предположения &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt; второе и третье свойства &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; выполнены.&lt;br /&gt;
&lt;br /&gt;
=== Время работы алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение первого свойства языка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. Для этого достаточно установить полиномиальность &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;tex&amp;gt;g(n) \le n&amp;lt;/tex&amp;gt; по построению для &amp;lt;tex&amp;gt;n \ge 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисление значения &amp;lt;tex&amp;gt;g(n+1)&amp;lt;/tex&amp;gt; состоит из вычисления &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt;, проверки неравенства &amp;lt;tex&amp;gt;(\log_2 n)^{g(n)} \ge n&amp;lt;/tex&amp;gt; и, возможно, запуска одной из двух внутренних функций, время выполнения которых составляет:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;для случая &amp;lt;tex&amp;gt;g(n) \equiv 0 \pmod{2}&amp;lt;/tex&amp;gt;:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\parbox{0px}{&lt;br /&gt;
\begin{align*}&lt;br /&gt;
T(n) &amp;amp; \le 2^{\log_2 n} (T(M_i, x) + T(g, |x|) + T(x \in \mathrm{SAT})) \le \\&lt;br /&gt;
     &amp;amp; \le k_1 n (|x|^i + T(g, |x|) + 2^{|x|}|x|) \le \\&lt;br /&gt;
     &amp;amp; \le k_1 n ((\log_2 n)^{g(n)} + T(g, \log_2 n) + 2^{\log_2 n} \log_2 n) \le \\&lt;br /&gt;
     &amp;amp; \le k_1 (n^2 + n^2 \log_2 n + n T(g, \log_2 n)) \le \\&lt;br /&gt;
     &amp;amp; \le k_1 (2n^3 + n T(g, \log_2 n));&lt;br /&gt;
\end{align*}&lt;br /&gt;
}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;для случая &amp;lt;tex&amp;gt;g(n) \equiv 1 \pmod{2}&amp;lt;/tex&amp;gt;:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\parbox{0px}{&lt;br /&gt;
\begin{align*}&lt;br /&gt;
T(n) &amp;amp; \le 2^{\log_2 n} (T(x \in \mathrm{SAT}) + T(g, |f_i(x)|) + T(f_i(x) \in \mathrm{SAT})) \le \\&lt;br /&gt;
     &amp;amp; \le k_2 n (2^{\log_2 n} \log_2 n + T(g, \log_2 n) + 2^{\log_2 n} \log_2 n) \le \\&lt;br /&gt;
     &amp;amp; \le k_2 (2n^2 \log_2 n + n T(g, \log_2 n)) \le \\&lt;br /&gt;
     &amp;amp; \le k_2 (2n^3 + n T(g, \log_2 n)).&lt;br /&gt;
\end{align*}&lt;br /&gt;
}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычислить &amp;lt;tex&amp;gt;(\log_2 n)^{g(n)}&amp;lt;/tex&amp;gt; можно за&lt;br /&gt;
&amp;lt;tex&amp;gt;k_3 \log_2 g(n) |(\log_2 n)^{g(n)}|^2 \le k_3 (g(n) |log_2 n|)^2 log_2 n \le k_3 n^3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом,&lt;br /&gt;
&amp;lt;tex&amp;gt;T(g, n) \le T(g, n-1) + k (n^3 + n T(g, \log_2 n))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;T(g, 1) = d&amp;lt;/tex&amp;gt;. Существует константа &amp;lt;tex&amp;gt;c \ge d&amp;lt;/tex&amp;gt;, для которой при любом &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; верно&lt;br /&gt;
&amp;lt;tex&amp;gt;c (n-1)^4 + k n^3 + k n c (\log_2 n)^4 \le c n^4&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда, в силу &amp;lt;tex&amp;gt;T(g, 1) = d \le c \cdot 1^4&amp;lt;/tex&amp;gt; и неравенства строкой выше, по индукции легко доказать, что &amp;lt;tex&amp;gt;T(g, n)&amp;lt;/tex&amp;gt; ограничено сверху &amp;lt;tex&amp;gt;c n^4&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;g \in \tilde{\mathrm{P}}&amp;lt;/tex&amp;gt;, а, в свою очередь, &amp;lt;tex&amp;gt;A \in \mathrm{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Источник ==&lt;br /&gt;
* ''William Gasarch, Lance Fortnow''. [http://blog.computationalcomplexity.org/media/ladner.pdf Two Proofs of Ladner’s Theorem]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9B%D0%B0%D0%B4%D0%BD%D0%B5%D1%80%D0%B0&amp;diff=23467</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%B5%D0%BC%D0%B0_%D0%9B%D0%B0%D0%B4%D0%BD%D0%B5%D1%80%D0%B0&amp;diff=23467"/>
				<updated>2012-06-03T13:13:04Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Теорема Ладнера''' (Ladner's Theorem) утверждает, что если [[Класс P|P]] не совпадает с [[Класс NP|NP]], то существует язык, принадлежащий &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;, но не являющийся ни полиномиальным, ни [[NP-полнота|NP-полным]].&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=Ладнер&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP} \Rightarrow \mathrm{NP} \setminus (\mathrm{P} \cup \mathrm{NPC}) \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Предположим, что &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt;. Из этого следует, что никакой &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полный язык (например, [[Примеры NP-полных_языков. Теорема_Кука#NP-полнота_2|SAT]]) нельзя [[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи|свести по Карпу]] к полиномиальному. Будем искать такой язык &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, чтобы язык &amp;lt;tex&amp;gt;L = \mathrm{SAT} \cap A&amp;lt;/tex&amp;gt; удовлетворял следующим условиям:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt;L \in \mathrm{NP}&amp;lt;/tex&amp;gt; (для этого достаточно, чтобы выполнялось &amp;lt;tex&amp;gt;A \in \mathrm{P}&amp;lt;/tex&amp;gt;);&lt;br /&gt;
# &amp;lt;tex&amp;gt;L \not \in \mathrm{P}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;tex&amp;gt;\mathrm{SAT} \not \le L&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если выполнены все три свойства, то &amp;lt;tex&amp;gt;L \in \mathrm{NP} \setminus (\mathrm{P} \cup \mathrm{NPC})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;M_1, \ldots, M_n, \ldots&amp;lt;/tex&amp;gt; — все машины Тьюринга из &amp;lt;tex&amp;gt;\tilde{\mathrm{P}}&amp;lt;/tex&amp;gt; (возможно, с повторениями), расположенные в таком порядке, чтобы &amp;lt;tex&amp;gt;T(M_i, x) \le |x|^i&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;x \in \Sigma^*&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;f_1, \ldots, f_n, \ldots&amp;lt;/tex&amp;gt; — аналогичное множество полиномиальных функций: &amp;lt;tex&amp;gt;T(f_i, x) \le |x|^i&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;x \in \Sigma^*&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем считать, что &amp;lt;tex&amp;gt;|\Sigma| = 2&amp;lt;/tex&amp;gt;. Построим такую ''неубывающую'' функцию &amp;lt;tex&amp;gt;g \in \tilde{\mathrm{P}}&amp;lt;/tex&amp;gt;, что при &amp;lt;tex&amp;gt;A = \{x \in \Sigma^*: g(|x|) \equiv 0 \pmod{2} \}&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; выполняются три перечисленных свойства.&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм построения g ===&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;tex&amp;gt;g(0) = g(1) = 1&amp;lt;/tex&amp;gt;. Для &amp;lt;tex&amp;gt;n \ge 1&amp;lt;/tex&amp;gt; построим &amp;lt;tex&amp;gt;g(n + 1)&amp;lt;/tex&amp;gt; рекурсивно — с помощью &amp;lt;tex&amp;gt;g(0), g(1), \ldots, g(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;(\log_2 n)^{g(n)} \ge n&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;. Иначе выполняем один из следующих пунктов.&lt;br /&gt;
&lt;br /&gt;
* Пусть вычисленное значение &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; чётно. Определим &amp;lt;tex&amp;gt;g(n+1)&amp;lt;/tex&amp;gt; следущим образом:&lt;br /&gt;
&lt;br /&gt;
 for &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;|x| \le \log_2 n&amp;lt;/tex&amp;gt;&lt;br /&gt;
   if &amp;lt;tex&amp;gt;M_i(x)&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 1 \pmod{2}&amp;lt;/tex&amp;gt; or &amp;lt;tex&amp;gt;x \not \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
   if &amp;lt;tex&amp;gt;! M_i(x)&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 0 \pmod{2}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;x \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
 &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Пусть вычисленное значение &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; нечётно. Определим &amp;lt;tex&amp;gt;g(n+1)&amp;lt;/tex&amp;gt; следующим образом:&lt;br /&gt;
&lt;br /&gt;
 for &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;|x| \le \log_2 n, |f_i(x)| \le \log_2 n&amp;lt;/tex&amp;gt;&lt;br /&gt;
   if &amp;lt;tex&amp;gt;x \in \mathrm{SAT}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 1 \pmod{2}&amp;lt;/tex&amp;gt; or &amp;lt;tex&amp;gt;f_i(x) \not \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
   if &amp;lt;tex&amp;gt;x \not \in \mathrm{SAT}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 0 \pmod{2}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;f_i(x) \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
 &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Корректность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение второго и третьего свойств языка &amp;lt;tex&amp;gt;L = \mathrm{SAT} \cap A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; не имеет предела при &amp;lt;tex&amp;gt;n \to \infty&amp;lt;/tex&amp;gt;. Значит, для любой &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; существует элемент, на котором &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; «ошибается»; аналогично, для любой полиномиальной функции &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt; существует элемент, на котором &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt; неверно сводит &amp;lt;tex&amp;gt;\mathrm{SAT}&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. Оба свойства выполнены.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;\lim\limits_{n \to \infty} g(n) = 2i&amp;lt;/tex&amp;gt;. Значит, в нашем множестве существует такая машина Тьюринга &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt;, распознающая &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;\forall x \Rightarrow M_i(x) = [g(|x|) \equiv 0 \pmod{2} \wedge x \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;. С одной стороны, &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; работает за полином, и &amp;lt;tex&amp;gt;L \in \mathrm{P}&amp;lt;/tex&amp;gt;. С другой стороны, по определению &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; различается с &amp;lt;tex&amp;gt;\mathrm{SAT}&amp;lt;/tex&amp;gt; в конечном числе элементов, значит &amp;lt;tex&amp;gt;\mathrm{SAT} \le L&amp;lt;/tex&amp;gt;. Получено противоречие с предположением &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;\lim\limits_{n \to \infty} g(n) = 2i + 1&amp;lt;/tex&amp;gt;. Тогда в нашем множестве полиномиальных функций существует &amp;lt;tex&amp;gt;f_i : \forall x \Rightarrow [x \in SAT] = [g(|f_i(x)|) \equiv 0 \pmod{2} \wedge f_i(x) \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;. С одной стороны, &amp;lt;tex&amp;gt;\mathrm{SAT} \le L&amp;lt;/tex&amp;gt; с помощью &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt;. С другой стороны, из определения &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; выходит, что язык &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; конечен, значит &amp;lt;tex&amp;gt;L \in \mathrm{P}&amp;lt;/tex&amp;gt;. Снова получено противоречие с предположением.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при верности предположения &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt; второе и третье свойства &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; выполнены.&lt;br /&gt;
&lt;br /&gt;
=== Время работы алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение первого свойства языка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. Для этого достаточно установить полиномиальность &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;tex&amp;gt;g(n) \le n&amp;lt;/tex&amp;gt; по построению для &amp;lt;tex&amp;gt;n \ge 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисление значения &amp;lt;tex&amp;gt;g(n+1)&amp;lt;/tex&amp;gt; состоит из вычисления &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt;, проверки неравенства &amp;lt;tex&amp;gt;(\log_2 n)^{g(n)} \ge n&amp;lt;/tex&amp;gt; и, возможно, запуска одной из двух внутренних функций, время выполнения которых составляет:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;для случая &amp;lt;tex&amp;gt;g(n) \equiv 0 \pmod{2}&amp;lt;/tex&amp;gt;:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\parbox{0px}{&lt;br /&gt;
\begin{align*}&lt;br /&gt;
T(n) &amp;amp; \le 2^{\log_2 n} (T(M_i, x) + T(g, |x|) + T(x \in \mathrm{SAT})) \le \\&lt;br /&gt;
     &amp;amp; \le k_1 n (|x|^i + T(g, |x|) + 2^{|x|}|x|) \le \\&lt;br /&gt;
     &amp;amp; \le k_1 n ((\log_2 n)^{g(n)} + T(g, \log_2 n) + 2^{\log_2 n} \log_2 n) \le \\&lt;br /&gt;
     &amp;amp; \le k_1 (n^2 + n^2 \log_2 n + n T(g, \log_2 n)) \le \\&lt;br /&gt;
     &amp;amp; \le k_1 (2n^3 + n T(g, \log_2 n));&lt;br /&gt;
\end{align*}&lt;br /&gt;
}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;для случая &amp;lt;tex&amp;gt;g(n) \equiv 1 \pmod{2}&amp;lt;/tex&amp;gt;:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\parbox{0px}{&lt;br /&gt;
\begin{align*}&lt;br /&gt;
T(n) &amp;amp; \le 2^{\log_2 n} (T(x \in \mathrm{SAT}) + T(g, |f_i(x)|) + T(f_i(x) \in \mathrm{SAT})) \le \\&lt;br /&gt;
     &amp;amp; \le k_2 n (2^{\log_2 n} \log_2 n + T(g, \log_2 n) + 2^{\log_2 n} \log_2 n) \le \\&lt;br /&gt;
     &amp;amp; \le k_2 (2n^2 \log_2 n + n T(g, \log_2 n)) \le \\&lt;br /&gt;
     &amp;amp; \le k_2 (2n^3 + n T(g, \log_2 n)).&lt;br /&gt;
\end{align*}&lt;br /&gt;
}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычислить &amp;lt;tex&amp;gt;(\log_2 n)^{g(n)}&amp;lt;/tex&amp;gt; можно за&lt;br /&gt;
&amp;lt;tex&amp;gt;k_3 \log_2 g(n) |(\log_2 n)^{g(n)}|^2 \le k_3 (g(n) |log_2 n|)^2 log_2 n \le k_3 n^3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом,&lt;br /&gt;
&amp;lt;tex&amp;gt;T(g, n) \le T(g, n-1) + k (n^3 + n T(g, \log_2 n))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;T(g, 1) = d&amp;lt;/tex&amp;gt;. Существует константа &amp;lt;tex&amp;gt;c \ge d&amp;lt;/tex&amp;gt;, для которой при любом &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; верно&lt;br /&gt;
&amp;lt;tex&amp;gt;c (n-1)^4 + k n^3 + k n c (\log_2 n)^4 \le c n^4&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда, в силу &amp;lt;tex&amp;gt;T(g, 1) = d \le c \cdot 1^4&amp;lt;/tex&amp;gt; и неравенства строкой выше, по индукции легко доказать, что &amp;lt;tex&amp;gt;T(g, n)&amp;lt;/tex&amp;gt; ограничено сверху &amp;lt;tex&amp;gt;c n^4&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;g \in \tilde{\mathrm{P}}&amp;lt;/tex&amp;gt;, а, в свою очередь, &amp;lt;tex&amp;gt;A \in \mathrm{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Источник ==&lt;br /&gt;
* ''William Gasarch, Lance Fortnow''. [http://blog.computationalcomplexity.org/media/ladner.pdf Two Proofs of Ladner’s Theorem]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9B%D0%B0%D0%B4%D0%BD%D0%B5%D1%80%D0%B0&amp;diff=23465</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%B5%D0%BC%D0%B0_%D0%9B%D0%B0%D0%B4%D0%BD%D0%B5%D1%80%D0%B0&amp;diff=23465"/>
				<updated>2012-06-03T13:11:34Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Теорема Ладнера''' (Ladner's Theorem) утверждает, что если [[Класс P|P]] не совпадает с [[Класс NP|NP]], то существует язык, принадлежащий &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;, но не являющийся ни полиномиальным, ни [[NP-полнота|NP-полным]].&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=Ладнер&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP} \Rightarrow \mathrm{NP} \setminus (\mathrm{P} \cup \mathrm{NPC}) \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Предположим, что &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt;. Из этого следует, что никакой &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полный язык (например, [[Примеры NP-полных_языков. Теорема_Кука#NP-полнота_2|SAT]]) нельзя [[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи|свести по Карпу]] к полиномиальному. Будем искать такой язык &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, чтобы язык &amp;lt;tex&amp;gt;L = \mathrm{SAT} \cap A&amp;lt;/tex&amp;gt; удовлетворял следующим условиям:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt;L \in \mathrm{NP}&amp;lt;/tex&amp;gt; (для этого достаточно, чтобы выполнялось &amp;lt;tex&amp;gt;A \in \mathrm{P}&amp;lt;/tex&amp;gt;);&lt;br /&gt;
# &amp;lt;tex&amp;gt;L \not \in \mathrm{P}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;tex&amp;gt;\mathrm{SAT} \not \le L&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если выполнены все три свойства, то &amp;lt;tex&amp;gt;L \in \mathrm{NP} \setminus (\mathrm{P} \cup \mathrm{NPC})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;M_1, \ldots, M_n, \ldots&amp;lt;/tex&amp;gt; — все машины Тьюринга из &amp;lt;tex&amp;gt;\tilde{\mathrm{P}}&amp;lt;/tex&amp;gt; (возможно, с повторениями), расположенные в таком порядке, чтобы &amp;lt;tex&amp;gt;T(M_i, x) \le |x|^i&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;x \in \Sigma^*&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;f_1, \ldots, f_n, \ldots&amp;lt;/tex&amp;gt; — аналогичное множество полиномиальных функций: &amp;lt;tex&amp;gt;T(f_i, x) \le |x|^i&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;x \in \Sigma^*&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем считать, что &amp;lt;tex&amp;gt;|\Sigma| = 2&amp;lt;/tex&amp;gt;. Построим такую ''неубывающую'' функцию &amp;lt;tex&amp;gt;g \in \tilde{\mathrm{P}}&amp;lt;/tex&amp;gt;, что при &amp;lt;tex&amp;gt;A = \{x \in \Sigma^*: g(|x|) \equiv 0 \pmod{2} \}&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; выполняются три перечисленных свойства.&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм построения g ===&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;tex&amp;gt;g(0) = g(1) = 1&amp;lt;/tex&amp;gt;. Для &amp;lt;tex&amp;gt;n \ge 1&amp;lt;/tex&amp;gt; построим &amp;lt;tex&amp;gt;g(n + 1)&amp;lt;/tex&amp;gt; рекурсивно — с помощью &amp;lt;tex&amp;gt;g(0), g(1), \ldots, g(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;(\log_2 n)^{g(n)} \ge n&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;. Иначе выполняем один из следующих пунктов.&lt;br /&gt;
&lt;br /&gt;
* Пусть вычисленное значение &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; чётно. Определим &amp;lt;tex&amp;gt;g(n+1)&amp;lt;/tex&amp;gt; так:&lt;br /&gt;
&lt;br /&gt;
 for &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;|x| \le \log_2 n&amp;lt;/tex&amp;gt;&lt;br /&gt;
   if &amp;lt;tex&amp;gt;M_i(x)&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 1 \pmod{2}&amp;lt;/tex&amp;gt; or &amp;lt;tex&amp;gt;x \not \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
   if &amp;lt;tex&amp;gt;! M_i(x)&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 0 \pmod{2}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;x \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
 &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Пусть вычисленное значение &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; нечётно. Определим &amp;lt;tex&amp;gt;g(n+1)&amp;lt;/tex&amp;gt; так:&lt;br /&gt;
&lt;br /&gt;
 for &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;|x| \le \log_2 n, |f_i(x)| \le \log_2 n&amp;lt;/tex&amp;gt;&lt;br /&gt;
   if &amp;lt;tex&amp;gt;x \in \mathrm{SAT}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 1 \pmod{2}&amp;lt;/tex&amp;gt; or &amp;lt;tex&amp;gt;f_i(x) \not \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
   if &amp;lt;tex&amp;gt;x \not \in \mathrm{SAT}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 0 \pmod{2}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;f_i(x) \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
 &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Корректность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение второго и третьего свойств языка &amp;lt;tex&amp;gt;L = \mathrm{SAT} \cap A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; не имеет предела при &amp;lt;tex&amp;gt;n \to \infty&amp;lt;/tex&amp;gt;. Значит, для любой &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; существует элемент, на котором &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; «ошибается»; аналогично, для любой полиномиальной функции &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt; существует элемент, на котором &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt; неверно сводит &amp;lt;tex&amp;gt;\mathrm{SAT}&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. Оба свойства выполнены.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;\lim\limits_{n \to \infty} g(n) = 2i&amp;lt;/tex&amp;gt;. Значит, в нашем множестве существует такая машина Тьюринга &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt;, распознающая &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;\forall x \Rightarrow M_i(x) = [g(|x|) \equiv 0 \pmod{2} \wedge x \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;. С одной стороны, &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; работает за полином, и &amp;lt;tex&amp;gt;L \in \mathrm{P}&amp;lt;/tex&amp;gt;. С другой стороны, по определению &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; различается с &amp;lt;tex&amp;gt;\mathrm{SAT}&amp;lt;/tex&amp;gt; в конечном числе элементов, значит &amp;lt;tex&amp;gt;\mathrm{SAT} \le L&amp;lt;/tex&amp;gt;. Получено противоречие с предположением &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;\lim\limits_{n \to \infty} g(n) = 2i + 1&amp;lt;/tex&amp;gt;. Тогда в нашем множестве полиномиальных функций существует &amp;lt;tex&amp;gt;f_i : \forall x \Rightarrow [x \in SAT] = [g(|f_i(x)|) \equiv 0 \pmod{2} \wedge f_i(x) \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;. С одной стороны, &amp;lt;tex&amp;gt;\mathrm{SAT} \le L&amp;lt;/tex&amp;gt; с помощью &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt;. С другой стороны, из определения &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; выходит, что язык &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; конечен, значит &amp;lt;tex&amp;gt;L \in \mathrm{P}&amp;lt;/tex&amp;gt;. Снова получено противоречие с предположением.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при верности предположения &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt; второе и третье свойства &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; выполнены.&lt;br /&gt;
&lt;br /&gt;
=== Время работы алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение первого свойства языка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. Для этого достаточно установить полиномиальность &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;tex&amp;gt;g(n) \le n&amp;lt;/tex&amp;gt; по построению для &amp;lt;tex&amp;gt;n \ge 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисление значения &amp;lt;tex&amp;gt;g(n+1)&amp;lt;/tex&amp;gt; состоит из вычисления &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt;, проверки неравенства &amp;lt;tex&amp;gt;(\log_2 n)^{g(n)} \ge n&amp;lt;/tex&amp;gt; и, возможно, запуска одной из двух внутренних функций, время выполнения которых составляет:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;для случая &amp;lt;tex&amp;gt;g(n) \equiv 0 \pmod{2}&amp;lt;/tex&amp;gt;:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\parbox{0px}{&lt;br /&gt;
\begin{align*}&lt;br /&gt;
T(n) &amp;amp; \le 2^{\log_2 n} (T(M_i, x) + T(g, |x|) + T(x \in \mathrm{SAT})) \le \\&lt;br /&gt;
     &amp;amp; \le k_1 n (|x|^i + T(g, |x|) + 2^{|x|}|x|) \le \\&lt;br /&gt;
     &amp;amp; \le k_1 n ((\log_2 n)^{g(n)} + T(g, \log_2 n) + 2^{\log_2 n} \log_2 n) \le \\&lt;br /&gt;
     &amp;amp; \le k_1 (n^2 + n^2 \log_2 n + n T(g, \log_2 n)) \le \\&lt;br /&gt;
     &amp;amp; \le k_1 (2n^3 + n T(g, \log_2 n));&lt;br /&gt;
\end{align*}&lt;br /&gt;
}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;для случая &amp;lt;tex&amp;gt;g(n) \equiv 1 \pmod{2}&amp;lt;/tex&amp;gt;:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\parbox{0px}{&lt;br /&gt;
\begin{align*}&lt;br /&gt;
T(n) &amp;amp; \le 2^{\log_2 n} (T(x \in \mathrm{SAT}) + T(g, |f_i(x)|) + T(f_i(x) \in \mathrm{SAT})) \le \\&lt;br /&gt;
     &amp;amp; \le k_2 n (2^{\log_2 n} \log_2 n + T(g, \log_2 n) + 2^{\log_2 n} \log_2 n) \le \\&lt;br /&gt;
     &amp;amp; \le k_2 (2n^2 \log_2 n + n T(g, \log_2 n)) \le \\&lt;br /&gt;
     &amp;amp; \le k_2 (2n^3 + n T(g, \log_2 n)).&lt;br /&gt;
\end{align*}&lt;br /&gt;
}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычислить &amp;lt;tex&amp;gt;(\log_2 n)^{g(n)}&amp;lt;/tex&amp;gt; можно за&lt;br /&gt;
&amp;lt;tex&amp;gt;k_3 \log_2 g(n) |(\log_2 n)^{g(n)}|^2 \le k_3 (g(n) |log_2 n|)^2 log_2 n \le k_3 n^3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом,&lt;br /&gt;
&amp;lt;tex&amp;gt;T(g, n) \le T(g, n-1) + k (n^3 + n T(g, \log_2 n))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;T(g, 1) = d&amp;lt;/tex&amp;gt;. Существует константа &amp;lt;tex&amp;gt;c \ge d&amp;lt;/tex&amp;gt;, для которой при любом &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; верно&lt;br /&gt;
&amp;lt;tex&amp;gt;c (n-1)^4 + k n^3 + k n c (\log_2 n)^4 \le c n^4&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда, в силу &amp;lt;tex&amp;gt;T(g, 1) = d \le c \cdot 1^4&amp;lt;/tex&amp;gt; и неравенства строкой выше, по индукции легко доказать, что &amp;lt;tex&amp;gt;T(g, n)&amp;lt;/tex&amp;gt; ограничено сверху &amp;lt;tex&amp;gt;c n^4&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;g \in \tilde{\mathrm{P}}&amp;lt;/tex&amp;gt;, а, в свою очередь, &amp;lt;tex&amp;gt;A \in \mathrm{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Источник ==&lt;br /&gt;
* ''William Gasarch, Lance Fortnow''. [http://blog.computationalcomplexity.org/media/ladner.pdf Two Proofs of Ladner’s Theorem]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9B%D0%B0%D0%B4%D0%BD%D0%B5%D1%80%D0%B0&amp;diff=23464</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%B5%D0%BC%D0%B0_%D0%9B%D0%B0%D0%B4%D0%BD%D0%B5%D1%80%D0%B0&amp;diff=23464"/>
				<updated>2012-06-03T13:10:39Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Теорема Ладнера''' (Ladner's Theorem) утверждает, что если [[Класс P|P]] не совпадает с [[Класс NP|NP]], то существует язык, принадлежащий &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;, но не являющийся ни полиномиальным, ни [[NP-полнота|NP-полным]].&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=Ладнер&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP} \Rightarrow \mathrm{NP} \setminus (\mathrm{P} \cup \mathrm{NPC}) \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Предположим, что &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt;. Из этого следует, что никакой &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полный язык (например, [[Примеры NP-полных_языков. Теорема_Кука#NP-полнота_2|SAT]]) нельзя [[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи|свести по Карпу]] к полиномиальному. Будем искать такой язык &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, чтобы язык &amp;lt;tex&amp;gt;L = \mathrm{SAT} \cap A&amp;lt;/tex&amp;gt; удовлетворял следующим условиям:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt;L \in \mathrm{NP}&amp;lt;/tex&amp;gt; (для этого достаточно, чтобы выполнялось &amp;lt;tex&amp;gt;A \in \mathrm{P}&amp;lt;/tex&amp;gt;);&lt;br /&gt;
# &amp;lt;tex&amp;gt;L \not \in \mathrm{P}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;tex&amp;gt;\mathrm{SAT} \not \le L&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если выполнены все три свойства, то &amp;lt;tex&amp;gt;L \in \mathrm{NP} \setminus (\mathrm{P} \cup \mathrm{NPC})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;M_1, \ldots, M_n, \ldots&amp;lt;/tex&amp;gt; — все машины Тьюринга из &amp;lt;tex&amp;gt;\tilde{\mathrm{P}}&amp;lt;/tex&amp;gt; (возможно, с повторениями), расположенные в таком порядке, чтобы &amp;lt;tex&amp;gt;T(M_i, x) \le |x|^i&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;x \in \Sigma^*&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;f_1, \ldots, f_n, \ldots&amp;lt;/tex&amp;gt; — аналогичное множество полиномиальных функций: &amp;lt;tex&amp;gt;T(f_i, x) \le |x|^i&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;x \in \Sigma^*&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем считать, что &amp;lt;tex&amp;gt;|\Sigma| = 2&amp;lt;/tex&amp;gt;. Построим такую ''неубывающую'' функцию &amp;lt;tex&amp;gt;g \in \tilde{\mathrm{P}}&amp;lt;/tex&amp;gt;, что при &amp;lt;tex&amp;gt;A = \{x \in \Sigma^*: g(|x|) \equiv 0 \pmod{2} \}&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; выполняются три перечисленных свойства.&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм построения g ===&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;tex&amp;gt;g(0) = g(1) = 1&amp;lt;/tex&amp;gt;. Для &amp;lt;tex&amp;gt;n \ge 1&amp;lt;/tex&amp;gt; построим &amp;lt;tex&amp;gt;g(n + 1)&amp;lt;/tex&amp;gt; рекурсивно — с помощью &amp;lt;tex&amp;gt;g(0), g(1), \ldots, g(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;(\log_2 n)^{g(n)} \ge n&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;. Иначе выполняем один из следующих пунктов.&lt;br /&gt;
&lt;br /&gt;
* Пусть вычисленное значение &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; чётно. Определим &amp;lt;tex&amp;gt;g(n+1)&amp;lt;/tex&amp;gt; так:&lt;br /&gt;
&lt;br /&gt;
 for &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;|x| \le \log_2 n&amp;lt;/tex&amp;gt;&lt;br /&gt;
   if &amp;lt;tex&amp;gt;M_i(x)&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 1 \pmod{2}&amp;lt;/tex&amp;gt; or &amp;lt;tex&amp;gt;x \not \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
   if &amp;lt;tex&amp;gt;! M_i(x)&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 0 \pmod{2}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;x \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
 &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Пусть вычисленное значение &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; нечётно. Определим &amp;lt;tex&amp;gt;g(n+1)&amp;lt;/tex&amp;gt; так:&lt;br /&gt;
&lt;br /&gt;
 for &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;|x| \le \log_2 n, |f_i(x)| \le \log_2 n&amp;lt;/tex&amp;gt;&lt;br /&gt;
   if &amp;lt;tex&amp;gt;x \in \mathrm{SAT}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 1 \pmod{2}&amp;lt;/tex&amp;gt; or &amp;lt;tex&amp;gt;f_i(x) \not \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
   if &amp;lt;tex&amp;gt;x \not \in \mathrm{SAT}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 0 \pmod{2}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;f_i(x) \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
 &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Корректность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение второго и третьего свойств языка &amp;lt;tex&amp;gt;L = \mathrm{SAT} \cap A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; не имеет предела при &amp;lt;tex&amp;gt;n \to \infty&amp;lt;/tex&amp;gt;. Значит, для любой &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; существует элемент, на котором &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; «ошибается»; аналогично, для любой полиномиальной функции &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt; существует элемент, на котором &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt; неверно сводит &amp;lt;tex&amp;gt;\mathrm{SAT}&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. Оба свойства выполнены.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;\lim\limits_{n \to \infty} g(n) = 2i&amp;lt;/tex&amp;gt;. Значит, в нашем множестве существует такая машина Тьюринга &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt;, распознающая &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;\forall x \Rightarrow M_i(x) = [g(|x|) \equiv 0 \pmod{2} \wedge x \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;. С одной стороны, &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; работает за полином, и &amp;lt;tex&amp;gt;L \in \mathrm{P}&amp;lt;/tex&amp;gt;. С другой стороны, по определению &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; различается с &amp;lt;tex&amp;gt;\mathrm{SAT}&amp;lt;/tex&amp;gt; в конечном числе элементов, значит &amp;lt;tex&amp;gt;\mathrm{SAT} \le L&amp;lt;/tex&amp;gt;. Получено противоречие с предположением &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;\lim\limits_{n \to \infty} g(n) = 2i + 1&amp;lt;/tex&amp;gt;. Тогда в нашем множестве полиномиальных функций существует &amp;lt;tex&amp;gt;f_i : \forall x \Rightarrow [x \in SAT] = [g(|f_i(x)|) \equiv 0 \pmod{2} \wedge f_i(x) \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;. С одной стороны, &amp;lt;tex&amp;gt;\mathrm{SAT} \le L&amp;lt;/tex&amp;gt; с помощью &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt;. С другой стороны, из определения &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; выходит, что язык &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; конечен, значит &amp;lt;tex&amp;gt;L \in \mathrm{P}&amp;lt;/tex&amp;gt;. Снова получено противоречие с предположением.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при верности предположения &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt; второе и третье свойства &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; выполнены.&lt;br /&gt;
&lt;br /&gt;
=== Время работы алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение первого свойства языка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. Для этого достаточно установить полиномиальность &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;tex&amp;gt;g(n) \le n&amp;lt;/tex&amp;gt; по построению для &amp;lt;tex&amp;gt;n \ge 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисление значения &amp;lt;tex&amp;gt;g(n+1)&amp;lt;/tex&amp;gt; состоит из вычисления &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt;, проверки неравенства &amp;lt;tex&amp;gt;(\log_2 n)^{g(n)} \ge n&amp;lt;/tex&amp;gt; и, возможно, запуска одной из двух внутренних функций, время выполнения которых составляет:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;для случая &amp;lt;tex&amp;gt;g(n) \equiv 0 \pmod{2}&amp;lt;/tex&amp;gt;:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\parbox{0px}{&lt;br /&gt;
\begin{align*}&lt;br /&gt;
T(n) &amp;amp; \le 2^{\log_2 n} (T(M_i, x) + T(g, |x|) + T(x \in \mathrm{SAT})) \le \\&lt;br /&gt;
     &amp;amp; \le k_1 n (|x|^i + T(g, |x|) + 2^{|x|}|x|) \le \\&lt;br /&gt;
     &amp;amp; \le k_1 n ((\log_2 n)^{g(n)} + T(g, \log_2 n) + 2^{\log_2 n} \log_2 n) \le \\&lt;br /&gt;
     &amp;amp; \le k_1 (n^2 + n^2 \log_2 n + n T(g, \log_2 n)) \le \\&lt;br /&gt;
     &amp;amp; \le k_1 (2n^3 + n T(g, \log_2 n));&lt;br /&gt;
\end{align*}&lt;br /&gt;
}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;для случая &amp;lt;tex&amp;gt;g(n) \equiv 1 \pmod{2}&amp;lt;/tex&amp;gt;:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\parbox{0px}{&lt;br /&gt;
\begin{align*}&lt;br /&gt;
T(n) &amp;amp; \le 2^{\log_2 n} (T(x \in \mathrm{SAT}) + T(g, |f_i(x)|) + T(f_i(x) \in \mathrm{SAT})) \le \\&lt;br /&gt;
     &amp;amp; \le k_2 n (2^{\log_2 n} \log_2 n + T(g, \log_2 n) + 2^{\log_2 n} \log_2 n) \le \\&lt;br /&gt;
     &amp;amp; \le k_2 (2n^2 \log_2 n + n T(g, \log_2 n)) \le \\&lt;br /&gt;
     &amp;amp; \le k_2 (2n^3 + n T(g, \log_2 n)).&lt;br /&gt;
\end{align*}&lt;br /&gt;
}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычислить &amp;lt;tex&amp;gt;(\log_2 n)^{g(n)}&amp;lt;/tex&amp;gt; можно за&lt;br /&gt;
&amp;lt;tex&amp;gt;k_3 \log_2 g(n) |(\log_2 n)^{g(n)}|^2 \le k_3 (g(n) |log_2 n|)^2 log_2 n \le k_3 n^3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом,&lt;br /&gt;
&amp;lt;tex&amp;gt;T(g, n) \le T(g, n-1) + k (n^3 + n T(g, \log_2 n))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;T(g, 1) = d&amp;lt;/tex&amp;gt;. Существует константа &amp;lt;tex&amp;gt;c \ge d&amp;lt;/tex&amp;gt;, для которой при любом &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; верно&lt;br /&gt;
&amp;lt;tex&amp;gt;c (n-1)^4 + k n^3 + k n c (\log_2 n)^4 \le c n^4&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда, в силу &amp;lt;tex&amp;gt;T(g, 1) = d \le c \cdot 1^4&amp;lt;/tex&amp;gt; и неравенства выше, по индукции легко доказать, что &amp;lt;tex&amp;gt;T(g, n)&amp;lt;/tex&amp;gt; ограничено сверху &amp;lt;tex&amp;gt;c n^4&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;g \in \tilde{\mathrm{P}}&amp;lt;/tex&amp;gt;, а, в свою очередь, &amp;lt;tex&amp;gt;A \in \mathrm{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Источник ==&lt;br /&gt;
* ''William Gasarch, Lance Fortnow''. [http://blog.computationalcomplexity.org/media/ladner.pdf Two Proofs of Ladner’s Theorem]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9B%D0%B0%D0%B4%D0%BD%D0%B5%D1%80%D0%B0&amp;diff=23463</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%B5%D0%BC%D0%B0_%D0%9B%D0%B0%D0%B4%D0%BD%D0%B5%D1%80%D0%B0&amp;diff=23463"/>
				<updated>2012-06-03T13:07:57Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Теорема Ладнера''' (Ladner's Theorem) утверждает, что если [[Класс P|P]] не совпадает с [[Класс NP|NP]], то существует язык, принадлежащий &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;, но не являющийся ни полиномиальным, ни [[NP-полнота|NP-полным]].&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=Ладнер&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP} \Rightarrow \mathrm{NP} \setminus (\mathrm{P} \cup \mathrm{NPC}) \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Предположим, что &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt;. Из этого следует, что никакой &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полный язык (например, [[Примеры NP-полных_языков. Теорема_Кука#NP-полнота_2|SAT]]) нельзя [[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи|свести по Карпу]] к полиномиальному. Будем искать такой язык &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, чтобы язык &amp;lt;tex&amp;gt;L = \mathrm{SAT} \cap A&amp;lt;/tex&amp;gt; удовлетворял следующим условиям:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt;L \in \mathrm{NP}&amp;lt;/tex&amp;gt; (для этого достаточно, чтобы выполнялось &amp;lt;tex&amp;gt;A \in \mathrm{P}&amp;lt;/tex&amp;gt;);&lt;br /&gt;
# &amp;lt;tex&amp;gt;L \not \in \mathrm{P}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;tex&amp;gt;\mathrm{SAT} \not \le L&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если выполнены все три свойства, то &amp;lt;tex&amp;gt;L \in \mathrm{NP} \setminus (\mathrm{P} \cup \mathrm{NPC})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;M_1, \ldots, M_n, \ldots&amp;lt;/tex&amp;gt; — все машины Тьюринга из &amp;lt;tex&amp;gt;\tilde{\mathrm{P}}&amp;lt;/tex&amp;gt; (возможно, с повторениями), расположенные в таком порядке, чтобы &amp;lt;tex&amp;gt;T(M_i, x) \le |x|^i&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;x \in \Sigma^*&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;f_1, \ldots, f_n, \ldots&amp;lt;/tex&amp;gt; — аналогичное множество полиномиальных функций: &amp;lt;tex&amp;gt;T(f_i, x) \le |x|^i&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;x \in \Sigma^*&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем считать, что &amp;lt;tex&amp;gt;|\Sigma| = 2&amp;lt;/tex&amp;gt;. Построим такую ''неубывающую'' функцию &amp;lt;tex&amp;gt;g \in \tilde{\mathrm{P}}&amp;lt;/tex&amp;gt;, что при &amp;lt;tex&amp;gt;A = \{x \in \Sigma^*: g(|x|) \equiv 0 \pmod{2} \}&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; выполняются три перечисленных свойства.&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм построения g ===&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;tex&amp;gt;g(0) = g(1) = 1&amp;lt;/tex&amp;gt;. Для &amp;lt;tex&amp;gt;n \ge 1&amp;lt;/tex&amp;gt; построим &amp;lt;tex&amp;gt;g(n + 1)&amp;lt;/tex&amp;gt; рекурсивно — с помощью &amp;lt;tex&amp;gt;g(0), g(1), \ldots, g(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;(\log_2 n)^{g(n)} \ge n&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;. Иначе выполняем один из следующих пунктов.&lt;br /&gt;
&lt;br /&gt;
* Пусть вычисленное значение &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; чётно. Определим &amp;lt;tex&amp;gt;g(n+1)&amp;lt;/tex&amp;gt; так:&lt;br /&gt;
&lt;br /&gt;
 for &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;|x| \le \log_2 n&amp;lt;/tex&amp;gt;&lt;br /&gt;
   if &amp;lt;tex&amp;gt;M_i(x)&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 1 \pmod{2}&amp;lt;/tex&amp;gt; or &amp;lt;tex&amp;gt;x \not \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
   if &amp;lt;tex&amp;gt;! M_i(x)&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 0 \pmod{2}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;x \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
 &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Пусть вычисленное значение &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; нечётно. Определим &amp;lt;tex&amp;gt;g(n+1)&amp;lt;/tex&amp;gt; так:&lt;br /&gt;
&lt;br /&gt;
 for &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;|x| \le \log_2 n, |f_i(x)| \le \log_2 n&amp;lt;/tex&amp;gt;&lt;br /&gt;
   if &amp;lt;tex&amp;gt;x \in \mathrm{SAT}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 1 \pmod{2}&amp;lt;/tex&amp;gt; or &amp;lt;tex&amp;gt;f_i(x) \not \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
   if &amp;lt;tex&amp;gt;x \not \in \mathrm{SAT}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 0 \pmod{2}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;f_i(x) \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
 &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Корректность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение второго и третьего свойств языка &amp;lt;tex&amp;gt;L = \mathrm{SAT} \cap A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; не имеет предела при &amp;lt;tex&amp;gt;n \to \infty&amp;lt;/tex&amp;gt;. Значит, для любой &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; существует элемент, на котором &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; «ошибается»; аналогично, для любой полиномиальной функции &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt; существует элемент, на котором &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt; неверно сводит &amp;lt;tex&amp;gt;\mathrm{SAT}&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. Оба свойства выполнены.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;\lim\limits_{n \to \infty} g(n) = 2i&amp;lt;/tex&amp;gt;. Значит, в нашем множестве существует такая машина Тьюринга &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt;, распознающая &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;\forall x \Rightarrow M_i(x) = [g(|x|) \equiv 0 \pmod{2} \wedge x \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;. С одной стороны, &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; работает за полином, и &amp;lt;tex&amp;gt;L \in \mathrm{P}&amp;lt;/tex&amp;gt;. С другой стороны, по определению &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; различается с &amp;lt;tex&amp;gt;\mathrm{SAT}&amp;lt;/tex&amp;gt; в конечном числе элементов, значит &amp;lt;tex&amp;gt;\mathrm{SAT} \le L&amp;lt;/tex&amp;gt;. Получено противоречие с предположением &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;\lim\limits_{n \to \infty} g(n) = 2i + 1&amp;lt;/tex&amp;gt;. Тогда в нашем множестве полиномиальных функций существует &amp;lt;tex&amp;gt;f_i : \forall x \Rightarrow [x \in SAT] = [g(|f_i(x)|) \equiv 0 \pmod{2} \wedge f_i(x) \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;. С одной стороны, &amp;lt;tex&amp;gt;\mathrm{SAT} \le L&amp;lt;/tex&amp;gt; с помощью &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt;. С другой стороны, из определения &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; выходит, что язык &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; конечен, значит &amp;lt;tex&amp;gt;L \in \mathrm{P}&amp;lt;/tex&amp;gt;. Снова получено противоречие с предположением.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при верности предположения &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt; второе и третье свойства &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; выполнены.&lt;br /&gt;
&lt;br /&gt;
=== Время работы алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение первого свойства языка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. Для этого достаточно установить полиномиальность &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;tex&amp;gt;g(n) \le n&amp;lt;/tex&amp;gt; по построению для &amp;lt;tex&amp;gt;n \ge 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисление значения &amp;lt;tex&amp;gt;g(n+1)&amp;lt;/tex&amp;gt; состоит из вычисления &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt;, проверки неравенства &amp;lt;tex&amp;gt;(\log_2 n)^{g(n)} \ge n&amp;lt;/tex&amp;gt; и, возможно, запуска одной из двух внутренних функций. Время выполнения этих функций составляет:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;для случая &amp;lt;tex&amp;gt;g(n) \equiv 0 \pmod{2}&amp;lt;/tex&amp;gt;:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\parbox{0px}{&lt;br /&gt;
\begin{align*}&lt;br /&gt;
T(n) &amp;amp; \le 2^{\log_2 n} (T(M_i, x) + T(g, |x|) + T(x \in \mathrm{SAT})) \le \\&lt;br /&gt;
     &amp;amp; \le k_1 n (|x|^i + T(g, |x|) + 2^{|x|}|x|) \le \\&lt;br /&gt;
     &amp;amp; \le k_1 n ((\log_2 n)^{g(n)} + T(g, \log_2 n) + 2^{\log_2 n} \log_2 n) \le \\&lt;br /&gt;
     &amp;amp; \le k_1 (n^2 + n^2 \log_2 n + n T(g, \log_2 n)) \le \\&lt;br /&gt;
     &amp;amp; \le k_1 (2n^3 + n T(g, \log_2 n));&lt;br /&gt;
\end{align*}&lt;br /&gt;
}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;для случая &amp;lt;tex&amp;gt;g(n) \equiv 1 \pmod{2}&amp;lt;/tex&amp;gt;:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\parbox{0px}{&lt;br /&gt;
\begin{align*}&lt;br /&gt;
T(n) &amp;amp; \le 2^{\log_2 n} (T(x \in \mathrm{SAT}) + T(g, |f_i(x)|) + T(f_i(x) \in \mathrm{SAT})) \le \\&lt;br /&gt;
     &amp;amp; \le k_2 n (2^{\log_2 n} \log_2 n + T(g, \log_2 n) + 2^{\log_2 n} \log_2 n) \le \\&lt;br /&gt;
     &amp;amp; \le k_2 (2n^2 \log_2 n + n T(g, \log_2 n)) \le \\&lt;br /&gt;
     &amp;amp; \le k_2 (2n^3 + n T(g, \log_2 n)).&lt;br /&gt;
\end{align*}&lt;br /&gt;
}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычислить &amp;lt;tex&amp;gt;(\log_2 n)^{g(n)}&amp;lt;/tex&amp;gt; можно за&lt;br /&gt;
&amp;lt;tex&amp;gt;k_3 \log_2 g(n) |(\log_2 n)^{g(n)}|^2 \le k_3 (g(n) |log_2 n|)^2 log_2 n \le k_3 n^3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом,&lt;br /&gt;
&amp;lt;tex&amp;gt;T(g, n) \le T(g, n-1) + k (n^3 + n T(g, \log_2 n))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;T(g, 1) = d&amp;lt;/tex&amp;gt;. Существует константа &amp;lt;tex&amp;gt;c \ge d&amp;lt;/tex&amp;gt;, для которой при любом &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; верно&lt;br /&gt;
&amp;lt;tex&amp;gt;c (n-1)^4 + k n^3 + k n c (\log_2 n)^4 \le c n^4&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда, в силу &amp;lt;tex&amp;gt;T(g, 1) = d \le c \cdot 1^4&amp;lt;/tex&amp;gt; и неравенства выше, по индукции легко доказать, что &amp;lt;tex&amp;gt;T(g, n)&amp;lt;/tex&amp;gt; ограничено сверху &amp;lt;tex&amp;gt;c n^4&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;g \in \tilde{\mathrm{P}}&amp;lt;/tex&amp;gt;, а, в свою очередь, &amp;lt;tex&amp;gt;A \in \mathrm{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Источник ==&lt;br /&gt;
* ''William Gasarch, Lance Fortnow''. [http://blog.computationalcomplexity.org/media/ladner.pdf Two Proofs of Ladner’s Theorem]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9B%D0%B0%D0%B4%D0%BD%D0%B5%D1%80%D0%B0&amp;diff=23461</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%B5%D0%BC%D0%B0_%D0%9B%D0%B0%D0%B4%D0%BD%D0%B5%D1%80%D0%B0&amp;diff=23461"/>
				<updated>2012-06-03T13:02:05Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Теорема Ладнера''' (Ladner's Theorem) утверждает, что если [[Класс P|P]] не совпадает с [[Класс NP|NP]], то существует язык, принадлежащий &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;, но не являющийся ни полиномиальным, ни [[NP-полнота|NP-полным]].&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=Ладнер&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP} \Rightarrow \mathrm{NP} \setminus (\mathrm{P} \cup \mathrm{NPC}) \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Предположим, что &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt;. Из этого следует, что никакой &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полный язык (например, [[Примеры NP-полных_языков. Теорема_Кука#NP-полнота_2|SAT]]) нельзя [[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи|свести по Карпу]] к полиномиальному. Будем искать такой язык &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, чтобы язык &amp;lt;tex&amp;gt;L = \mathrm{SAT} \cap A&amp;lt;/tex&amp;gt; удовлетворял следующим условиям:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt;L \in \mathrm{NP}&amp;lt;/tex&amp;gt; (для этого достаточно, чтобы выполнялось &amp;lt;tex&amp;gt;A \in \mathrm{P}&amp;lt;/tex&amp;gt;);&lt;br /&gt;
# &amp;lt;tex&amp;gt;L \not \in \mathrm{P}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;tex&amp;gt;\mathrm{SAT} \not \le L&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если выполнены все три свойства, то &amp;lt;tex&amp;gt;L \in \mathrm{NP} \setminus (\mathrm{P} \cup \mathrm{NPC})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;M_1, \ldots, M_n, \ldots&amp;lt;/tex&amp;gt; — все машины Тьюринга из &amp;lt;tex&amp;gt;\tilde{\mathrm{P}}&amp;lt;/tex&amp;gt; (возможно, с повторениями), расположенные в таком порядке, чтобы &amp;lt;tex&amp;gt;T(M_i, x) \le |x|^i&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;x \in \Sigma^*&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;f_1, \ldots, f_n, \ldots&amp;lt;/tex&amp;gt; — аналогичное множество полиномиальных функций: &amp;lt;tex&amp;gt;T(f_i, x) \le |x|^i&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;x \in \Sigma^*&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем считать, что &amp;lt;tex&amp;gt;|\Sigma| = 2&amp;lt;/tex&amp;gt;. Построим такую ''неубывающую'' функцию &amp;lt;tex&amp;gt;g \in \tilde{\mathrm{P}}&amp;lt;/tex&amp;gt;, что при &amp;lt;tex&amp;gt;A = \{x \in \Sigma^*: g(|x|) \equiv 0 \pmod{2} \}&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; выполняются три перечисленных свойства.&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм построения g ===&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;tex&amp;gt;g(0) = g(1) = 1&amp;lt;/tex&amp;gt;. Для &amp;lt;tex&amp;gt;n \ge 1&amp;lt;/tex&amp;gt; построим &amp;lt;tex&amp;gt;g(n + 1)&amp;lt;/tex&amp;gt; рекурсивно — с помощью &amp;lt;tex&amp;gt;g(0), g(1), \ldots, g(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;(\log_2 n)^{g(n)} \ge n&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;. Иначе выполняем один из следующих пунктов.&lt;br /&gt;
&lt;br /&gt;
* Пусть вычисленное значение &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; чётно. Определим &amp;lt;tex&amp;gt;g(n+1)&amp;lt;/tex&amp;gt; так:&lt;br /&gt;
&lt;br /&gt;
 for &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;|x| \le \log_2 n&amp;lt;/tex&amp;gt;&lt;br /&gt;
   if &amp;lt;tex&amp;gt;M_i(x)&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 1 \pmod{2}&amp;lt;/tex&amp;gt; or &amp;lt;tex&amp;gt;x \not \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
   if &amp;lt;tex&amp;gt;! M_i(x)&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 0 \pmod{2}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;x \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
 &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Пусть вычисленное значение &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; нечётно. Определим &amp;lt;tex&amp;gt;g(n+1)&amp;lt;/tex&amp;gt; так:&lt;br /&gt;
&lt;br /&gt;
 for &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;|x| \le \log_2 n, |f_i(x)| \le \log_2 n&amp;lt;/tex&amp;gt;&lt;br /&gt;
   if &amp;lt;tex&amp;gt;x \in \mathrm{SAT}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 1 \pmod{2}&amp;lt;/tex&amp;gt; or &amp;lt;tex&amp;gt;f_i(x) \not \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
   if &amp;lt;tex&amp;gt;x \not \in \mathrm{SAT}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 0 \pmod{2}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;f_i(x) \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
 &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Корректность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение второго и третьего свойств языка &amp;lt;tex&amp;gt;L = \mathrm{SAT} \cap A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; не имеет предела при &amp;lt;tex&amp;gt;n \to \infty&amp;lt;/tex&amp;gt;. Значит, для любой &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; существует элемент, на котором &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; «ошибается»; аналогично, для любой полиномиальной функции &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt; существует элемент, на котором &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt; неверно сводит &amp;lt;tex&amp;gt;\mathrm{SAT}&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. Оба свойства выполнены.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;\lim\limits_{n \to \infty} g(n) = 2i&amp;lt;/tex&amp;gt;. Значит, в нашем множестве существует такая машина Тьюринга &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt;, распознающая &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;\forall x \Rightarrow M_i(x) = [g(|x|) \equiv 0 \pmod{2} \wedge x \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;. С одной стороны, &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; работает за полином, и &amp;lt;tex&amp;gt;L \in \mathrm{P}&amp;lt;/tex&amp;gt;. С другой стороны, по определению &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; различается с &amp;lt;tex&amp;gt;\mathrm{SAT}&amp;lt;/tex&amp;gt; в конечном числе элементов, значит &amp;lt;tex&amp;gt;\mathrm{SAT} \le L&amp;lt;/tex&amp;gt;. Получено противоречие с предположением &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;\lim\limits_{n \to \infty} g(n) = 2i + 1&amp;lt;/tex&amp;gt;. Тогда в нашем множестве полиномиальных функций существует &amp;lt;tex&amp;gt;f_i : \forall x \Rightarrow [x \in SAT] = [g(|f_i(x)|) \equiv 0 \pmod{2} \wedge f_i(x) \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;. С одной стороны, &amp;lt;tex&amp;gt;\mathrm{SAT} \le L&amp;lt;/tex&amp;gt; с помощью &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt;. С другой стороны, из определения &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; выходит, что язык &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; конечен, значит &amp;lt;tex&amp;gt;L \in \mathrm{P}&amp;lt;/tex&amp;gt;. Снова получено противоречие с предположением.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при верности предположения &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt; второе и третье свойства &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; выполнены.&lt;br /&gt;
&lt;br /&gt;
=== Время работы алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение первого свойства языка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. Для этого достаточно установить полиномиальность &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;tex&amp;gt;g(n) \le n&amp;lt;/tex&amp;gt; по построению для &amp;lt;tex&amp;gt;n \ge 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисление значения &amp;lt;tex&amp;gt;g(n+1)&amp;lt;/tex&amp;gt; состоит из вычисления &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt;, проверки неравенства &amp;lt;tex&amp;gt;(\log_2 n)^{g(n)} \ge n&amp;lt;/tex&amp;gt; и, возможно, запуска одной из двух внутренних функций. Время выполнения этих функций составляет:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;для случая &amp;lt;tex&amp;gt;g(n) \equiv 0 \pmod{2}&amp;lt;/tex&amp;gt;:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\parbox{0px}{&lt;br /&gt;
\begin{align*}&lt;br /&gt;
T(n) &amp;amp; \le 2^{\log_2 n} (T(M_i, x) + T(g, |x|) + T(x \in \mathrm{SAT})) \le \\&lt;br /&gt;
     &amp;amp; \le k_1 n (|x|^i + T(g, |x|) + 2^{|x|}|x|) \le \\&lt;br /&gt;
     &amp;amp; \le k_1 n ((\log_2 n)^{g(n)} + T(g, \log_2 n) + 2^{\log_2 n} \log_2 n) \le \\&lt;br /&gt;
     &amp;amp; \le k_1 (n^2 + n^2 \log_2 n + n T(g, \log_2 n)) \le \\&lt;br /&gt;
     &amp;amp; \le k_1 (2n^3 + n T(g, \log_2 n))&lt;br /&gt;
\end{align*}&lt;br /&gt;
}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;для случая &amp;lt;tex&amp;gt;g(n) \equiv 1 \pmod{2}&amp;lt;/tex&amp;gt;:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\parbox{0px}{&lt;br /&gt;
\begin{align*}&lt;br /&gt;
T(n) &amp;amp; \le 2^{\log_2 n} (T(x \in \mathrm{SAT}) + T(g, |f_i(x)|) + T(f_i(x) \in \mathrm{SAT})) \le \\&lt;br /&gt;
     &amp;amp; \le k_2 n (2^{\log_2 n} \log_2 n + T(g, \log_2 n) + 2^{\log_2 n} \log_2 n) \le \\&lt;br /&gt;
     &amp;amp; \le k_2 (2n^2 \log_2 n + n T(g, \log_2 n)) \le \\&lt;br /&gt;
     &amp;amp; \le k_2 (2n^3 + n T(g, \log_2 n))&lt;br /&gt;
\end{align*}&lt;br /&gt;
}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычислить &amp;lt;tex&amp;gt;(\log_2 n)^{g(n)}&amp;lt;/tex&amp;gt; можно за&lt;br /&gt;
&amp;lt;tex&amp;gt;k_3 \log_2 g(n) |(\log_2 n)^{g(n)}|^2 \le k_3 (g(n) |log_2 n|)^2 log_2 n \le k_3 n^3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом,&lt;br /&gt;
&amp;lt;tex&amp;gt;T(g, n) \le T(g, n-1) + k (n^3 + n T(g, \log_2 n))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;T(g, 1) = d&amp;lt;/tex&amp;gt;. Существует константа &amp;lt;tex&amp;gt;c \ge d&amp;lt;/tex&amp;gt;, для которой при любом &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; верно&lt;br /&gt;
&amp;lt;tex&amp;gt;c (n-1)^4 + k n^3 + k n c (\log_2 n)^4 \le c n^4&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда, в силу &amp;lt;tex&amp;gt;T(g, 1) = d \le c \cdot 1^4&amp;lt;/tex&amp;gt; и неравенства выше, по индукции легко доказать, что &amp;lt;tex&amp;gt;T(g, n)&amp;lt;/tex&amp;gt; ограничено сверху &amp;lt;tex&amp;gt;c n^4&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;g \in \tilde{\mathrm{P}}&amp;lt;/tex&amp;gt;, а, в свою очередь, &amp;lt;tex&amp;gt;A \in \mathrm{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Источник ==&lt;br /&gt;
* ''William Gasarch, Lance Fortnow''. [http://blog.computationalcomplexity.org/media/ladner.pdf Two Proofs of Ladner’s Theorem]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9B%D0%B0%D0%B4%D0%BD%D0%B5%D1%80%D0%B0&amp;diff=23439</id>
		<title>Обсуждение:Теорема Ладнера</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9B%D0%B0%D0%B4%D0%BD%D0%B5%D1%80%D0%B0&amp;diff=23439"/>
				<updated>2012-06-03T12:27:59Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Есть мнение, что эту теорему надо оформить как теорему.&lt;br /&gt;
: Done&lt;br /&gt;
&lt;br /&gt;
В первой же строке явно просится ссылка на P.&lt;br /&gt;
Ссылка на NP-полноту SAT'а.&lt;br /&gt;
Ссылка на сведение.&lt;br /&gt;
: Done&lt;br /&gt;
&lt;br /&gt;
Про функции не понял. Чем они от машин отличаются? Типа, могут быть невычислимы (тогда надо это явно указать)?&lt;br /&gt;
: [http://ru.wikipedia.org/wiki/%D0%9A%D0%BB%D0%B0%D1%81%D1%81_P#.D0.A4.D0.BE.D1.80.D0.BC.D0.B0.D0.BB.D1.8C.D0.BD.D0.BE.D0.B5_.D0.BE.D0.BF.D1.80.D0.B5.D0.B4.D0.B5.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5] Полиномиальная функция — объект, который пользуется полиномиальной МТ для получения результата из &amp;lt;tex&amp;gt;\Sigma^*&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Делимость процентиком не в программах — не очень. Поставь лучше три точки, наверное…&lt;br /&gt;
: Done — заменил на модульное сравнение, потому как точки смотрятся плохо.&lt;br /&gt;
&lt;br /&gt;
«названных свойства» — буэ. Указанных,требуемых, перечисленных, не знаю…&lt;br /&gt;
: Done&lt;br /&gt;
&lt;br /&gt;
Определение g — АД. Там ничего не понятно. Серьёзно. Перепиши, чтобы было понятно «если &amp;lt;что&amp;gt;, то &amp;lt;что&amp;gt;». Если хочешь при этом использовать списки, то делай обычные html'ные — вики-разметка не вытянет то, что тебе надо.&lt;br /&gt;
: Done — надеюсь, стало лучше читаться&lt;br /&gt;
:: Стало хуже читаться, потому что теперь не указано, что последние два пункта — если не выполняется то странное неравенство.&lt;br /&gt;
&lt;br /&gt;
Я сверху вынес степень логарифма за скобочки. Не знаю, надо ли это же сделать внизу в доказательстве времени. Если сильно ухудшит читабельность, то не надо.&lt;br /&gt;
: Done&lt;br /&gt;
&lt;br /&gt;
Используй обозначение T(программа, вход) — это относится и к началу статьи и к концу.&lt;br /&gt;
: Done&lt;br /&gt;
&lt;br /&gt;
Что за Т со звездой? Каких шагов время считаем? Ничерта не понятно в последней части. И, ты меня прости, но мне кажется, что если не разбивать по строкам формулы, то читаться будет лучше.&lt;br /&gt;
: Done: выпилил&lt;br /&gt;
&lt;br /&gt;
Название заголовка «корректность алгоритма» — так себе. Формально-то нет тут никакого алгоритма, корректность которого доказывать надо было бы.&lt;br /&gt;
: Done: добавил слово «алгоритм»&lt;br /&gt;
:: Хитрый.&lt;br /&gt;
&lt;br /&gt;
------------&lt;br /&gt;
&lt;br /&gt;
[[Участник:Kirelagin|Кирилл Елагин]] 13:58, 2 июня 2012 (GST)&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9B%D0%B0%D0%B4%D0%BD%D0%B5%D1%80%D0%B0&amp;diff=23426</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%B5%D0%BC%D0%B0_%D0%9B%D0%B0%D0%B4%D0%BD%D0%B5%D1%80%D0%B0&amp;diff=23426"/>
				<updated>2012-06-03T12:17:30Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Теорема Ладнера''' (Ladner's Theorem) утверждает, что если [[Класс P|P]] не совпадает с [[Класс NP|NP]], то существует язык, принадлежащий &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;, но не являющийся ни полиномиальным, ни [[NP-полнота|NP-полным]].&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=Ладнер&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP} \Rightarrow \mathrm{NP} \setminus (\mathrm{P} \cup \mathrm{NPC}) \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Предположим, что &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt;. Из этого следует, что никакой &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полный язык (например, [[Примеры NP-полных_языков. Теорема_Кука#NP-полнота_2|SAT]]) нельзя [[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи|свести по Карпу]] к полиномиальному. Будем искать такой язык &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, чтобы язык &amp;lt;tex&amp;gt;L = \mathrm{SAT} \cap A&amp;lt;/tex&amp;gt; удовлетворял следующим условиям:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt;L \in \mathrm{NP}&amp;lt;/tex&amp;gt; (для этого достаточно, чтобы выполнялось &amp;lt;tex&amp;gt;A \in \mathrm{P}&amp;lt;/tex&amp;gt;);&lt;br /&gt;
# &amp;lt;tex&amp;gt;L \not \in \mathrm{P}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;tex&amp;gt;\mathrm{SAT} \not \le L&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если выполнены все три свойства, то &amp;lt;tex&amp;gt;L \in \mathrm{NP} \setminus (\mathrm{P} \cup \mathrm{NPC})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;M_1, \ldots, M_n, \ldots&amp;lt;/tex&amp;gt; — все машины Тьюринга из &amp;lt;tex&amp;gt;\tilde{\mathrm{P}}&amp;lt;/tex&amp;gt;, расположенные в таком порядке (возможно, с повторениями), чтобы &amp;lt;tex&amp;gt;T(M_i, x) \le |x|^i&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;x \in \Sigma^*&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;f_1, \ldots, f_n, \ldots&amp;lt;/tex&amp;gt; — аналогичное множество полиномиальных функций: &amp;lt;tex&amp;gt;T(f_i, x) \le |x|^i&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;x \in \Sigma^*&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем считать, что &amp;lt;tex&amp;gt;|\Sigma| = 2&amp;lt;/tex&amp;gt;. Построим такую ''неубывающую'' функцию &amp;lt;tex&amp;gt;g \in \tilde{\mathrm{P}}&amp;lt;/tex&amp;gt;, что для &amp;lt;tex&amp;gt;A = \{x \in \Sigma^*: g(|x|) \equiv 0 \pmod{2} \}&amp;lt;/tex&amp;gt; выполняются три перечисленных свойства.&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм построения g ===&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;tex&amp;gt;g(0) = g(1) = 1&amp;lt;/tex&amp;gt;. Для &amp;lt;tex&amp;gt;n \ge 1&amp;lt;/tex&amp;gt; построим &amp;lt;tex&amp;gt;g(n + 1)&amp;lt;/tex&amp;gt; рекурсивно — с помощью &amp;lt;tex&amp;gt;g(0), g(1), \ldots, g(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;(\log_2 n)^{g(n)} \ge n&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Пусть вычисленное значение &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; чётно. Определим &amp;lt;tex&amp;gt;g(n+1)&amp;lt;/tex&amp;gt; так:&lt;br /&gt;
&lt;br /&gt;
 for &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;|x| \le \log_2 n&amp;lt;/tex&amp;gt;&lt;br /&gt;
   if &amp;lt;tex&amp;gt;M_i(x)&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 1 \pmod{2}&amp;lt;/tex&amp;gt; or &amp;lt;tex&amp;gt;x \not \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
   if &amp;lt;tex&amp;gt;! M_i(x)&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 0 \pmod{2}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;x \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
 &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Пусть вычисленное значение &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; нечётно. Определим &amp;lt;tex&amp;gt;g(n+1)&amp;lt;/tex&amp;gt; так:&lt;br /&gt;
&lt;br /&gt;
 for &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;|x| \le \log_2 n, |f_i(x)| \le \log_2 n&amp;lt;/tex&amp;gt;&lt;br /&gt;
   if &amp;lt;tex&amp;gt;x \in \mathrm{SAT}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 1 \pmod{2}&amp;lt;/tex&amp;gt; or &amp;lt;tex&amp;gt;f_i(x) \not \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
   if &amp;lt;tex&amp;gt;x \not \in \mathrm{SAT}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 0 \pmod{2}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;f_i(x) \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
 &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Корректность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение второго и третьего свойств языка &amp;lt;tex&amp;gt;L = \mathrm{SAT} \cap A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; не имеет предела при &amp;lt;tex&amp;gt;n \to \infty&amp;lt;/tex&amp;gt;. Значит, для любой &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; существует элемент, на котором &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; «ошибается»; аналогично, для любой полиномиальной функции &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt; существует элемент, на котором &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt; неверно сводит &amp;lt;tex&amp;gt;\mathrm{SAT}&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. Оба свойства выполнены.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;\lim\limits_{n \to \infty} g(n) = 2i&amp;lt;/tex&amp;gt;. Значит, в нашем множестве существует такая машина Тьюринга &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt;, распознающая &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;\forall x \Rightarrow M_i(x) = [g(|x|) \equiv 0 \pmod{2} \wedge x \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;. С одной стороны, &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; работает за полином, и &amp;lt;tex&amp;gt;L \in \mathrm{P}&amp;lt;/tex&amp;gt;. С другой стороны, по определению &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; различается с &amp;lt;tex&amp;gt;\mathrm{SAT}&amp;lt;/tex&amp;gt; в конечном числе элементов, значит &amp;lt;tex&amp;gt;\mathrm{SAT} \le L&amp;lt;/tex&amp;gt;. Получено противоречие с предположением &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;\lim\limits_{n \to \infty} g(n) = 2i + 1&amp;lt;/tex&amp;gt;. Тогда в нашем множестве полиномиальных функций существует &amp;lt;tex&amp;gt;f_i : \forall x \Rightarrow [x \in SAT] = [g(|f_i(x)|) \equiv 0 \pmod{2} \wedge f_i(x) \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;. С одной стороны, &amp;lt;tex&amp;gt;\mathrm{SAT} \le L&amp;lt;/tex&amp;gt; с помощью &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt;. С другой стороны, из определения &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; выходит, что язык &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; конечен, значит &amp;lt;tex&amp;gt;L \in \mathrm{P}&amp;lt;/tex&amp;gt;. Снова получено противоречие с предположением.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при верности предположения &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt; второе и третье свойства &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; выполнены.&lt;br /&gt;
&lt;br /&gt;
=== Время работы алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение первого свойства языка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. Для этого достаточно установить полиномиальность &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;tex&amp;gt;g(n) \le n&amp;lt;/tex&amp;gt; по построению для &amp;lt;tex&amp;gt;n \ge 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время выполнения шагов составляет:&lt;br /&gt;
&lt;br /&gt;
* для случая &amp;lt;tex&amp;gt;g(n) = 2i&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le 2^{\log_2 n} (T(M_i, x) + T(g, |x|) + T(x \in \mathrm{SAT}))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le k_1 n (|x|^i + T(g, |x|) + 2^{|x|}|x|)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le k_1 n ((\log_2 n)^{g(n)} + T(g, \log_2 n) + 2^{\log_2 n} \log_2 n)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le k_1 (n^2 + n^2 \log_2 n + n T(g, \log_2 n))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le k_1 (2n^3 + n T(g, \log_2 n))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* для случая &amp;lt;tex&amp;gt;g(n) = 2i + 1&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le 2^{\log_2 n} (T(x \in \mathrm{SAT}) + T(g, |f_i(x)|) + T(f_i(x) \in \mathrm{SAT}))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le k_2 n (2^{\log_2 n} \log_2 n + T(g, \log_2 n) + 2^{\log_2 n} \log_2 n)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le k_2 (2n^2 \log_2 n + n T(g, \log_2 n))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le k_2 (2n^3 + n T(g, \log_2 n))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Кроме того, необходимо &lt;br /&gt;
&lt;br /&gt;
* знать значение &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt;, получаемое на &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; шаге;&lt;br /&gt;
&lt;br /&gt;
* вычислить &amp;lt;tex&amp;gt;(\log_2 n)^{g(n)}&amp;lt;/tex&amp;gt;, что можно сделать за&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;k_3 \log_2 g(n) |(\log_2 n)^{g(n)}|^2 \le k_3 (g(n) |log_2 n|)^2 log_2 n \le k_3 n^3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(g, n) \le T(g, n-1) + k (n^3 + n T(g, \log_2 n))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;T(g, 1) = d&amp;lt;/tex&amp;gt;. Существует константа &amp;lt;tex&amp;gt;c \ge d&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;c (n-1)^4 + k n^3 + k n c (\log_2 n)^4 \le c n^4&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда, в силу &amp;lt;tex&amp;gt;T(g, 1) = d \le c \cdot 1^4&amp;lt;/tex&amp;gt; и неравенства выше, по индукции легко доказать, что &amp;lt;tex&amp;gt;T(g, n)&amp;lt;/tex&amp;gt; ограничено сверху &amp;lt;tex&amp;gt;c n^4&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;g \in \tilde{\mathrm{P}}&amp;lt;/tex&amp;gt;, а, в свою очередь, &amp;lt;tex&amp;gt;A \in \mathrm{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Источник ==&lt;br /&gt;
* ''William Gasarch, Lance Fortnow''. [http://blog.computationalcomplexity.org/media/ladner.pdf Two Proofs of Ladner’s Theorem]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9B%D0%B0%D0%B4%D0%BD%D0%B5%D1%80%D0%B0&amp;diff=23423</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%B5%D0%BC%D0%B0_%D0%9B%D0%B0%D0%B4%D0%BD%D0%B5%D1%80%D0%B0&amp;diff=23423"/>
				<updated>2012-06-03T12:15:09Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: Отмена правки 23418 участника Kirelagin (обсуждение)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Теорема Ладнера''' (Ladner's Theorem) утверждает, что если [[Класс P|P]] не совпадает с [[Класс NP|NP]], то существует язык, принадлежащий &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;, но не являющийся ни полиномиальным, ни [[NP-полнота|NP-полным]].&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=Ладнер&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP} \Rightarrow \mathrm{NP} \setminus (\mathrm{P} \cup \mathrm{NPC}) \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Предположим, что &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt;. Из этого следует, что никакой &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полный язык (например, [[Примеры NP-полных_языков. Теорема_Кука#NP-полнота_2|SAT]]) нельзя [[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи|свести по Карпу]] к полиномиальному. Будем искать такой язык &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, чтобы язык &amp;lt;tex&amp;gt;L = \mathrm{SAT} \cap A&amp;lt;/tex&amp;gt; удовлетворял следующим условиям:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt;L \in \mathrm{NP}&amp;lt;/tex&amp;gt; (для этого достаточно, чтобы выполнялось &amp;lt;tex&amp;gt;A \in \mathrm{P}&amp;lt;/tex&amp;gt;);&lt;br /&gt;
# &amp;lt;tex&amp;gt;L \not \in \mathrm{P}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;tex&amp;gt;\mathrm{SAT} \not \le L&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если выполнены все три свойства, то &amp;lt;tex&amp;gt;L \in \mathrm{NP} \setminus (\mathrm{P} \cup \mathrm{NPC})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;M_1, \ldots, M_n, \ldots&amp;lt;/tex&amp;gt; — все машины Тьюринга из &amp;lt;tex&amp;gt;\tilde{\mathrm{P}}&amp;lt;/tex&amp;gt;, причём &amp;lt;tex&amp;gt;T(M_i, x) \le |x|^i&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;x \in \Sigma^*&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;f_1, \ldots, f_n, \ldots&amp;lt;/tex&amp;gt; — аналогичное множество полиномиальных функций: &amp;lt;tex&amp;gt;T(f_i, x) \le |x|^i&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;x \in \Sigma^*&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем считать, что &amp;lt;tex&amp;gt;|\Sigma| = 2&amp;lt;/tex&amp;gt;. Построим такую ''неубывающую'' функцию &amp;lt;tex&amp;gt;g \in \tilde{\mathrm{P}}&amp;lt;/tex&amp;gt;, что для &amp;lt;tex&amp;gt;A = \{x \in \Sigma^*: g(|x|) \equiv 0 \pmod{2} \}&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;g(0) = g(1) = 1&amp;lt;/tex&amp;gt;. Для &amp;lt;tex&amp;gt;n \ge 1&amp;lt;/tex&amp;gt; построим &amp;lt;tex&amp;gt;g(n + 1)&amp;lt;/tex&amp;gt; рекурсивно — с помощью &amp;lt;tex&amp;gt;g(0), g(1), \ldots, g(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;(\log_2 n)^{g(n)} \ge n&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Пусть вычисленное значение &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; чётно. Определим &amp;lt;tex&amp;gt;g(n+1)&amp;lt;/tex&amp;gt; так:&lt;br /&gt;
&lt;br /&gt;
 for &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;|x| \le \log_2 n&amp;lt;/tex&amp;gt;&lt;br /&gt;
   if &amp;lt;tex&amp;gt;M_i(x)&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 1 \pmod{2}&amp;lt;/tex&amp;gt; or &amp;lt;tex&amp;gt;x \not \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
   if &amp;lt;tex&amp;gt;! M_i(x)&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 0 \pmod{2}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;x \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
 &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Пусть вычисленное значение &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; нечётно. Определим &amp;lt;tex&amp;gt;g(n+1)&amp;lt;/tex&amp;gt; так:&lt;br /&gt;
&lt;br /&gt;
 for &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;|x| \le \log_2 n, |f_i(x)| \le \log_2 n&amp;lt;/tex&amp;gt;&lt;br /&gt;
   if &amp;lt;tex&amp;gt;x \in \mathrm{SAT}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 1 \pmod{2}&amp;lt;/tex&amp;gt; or &amp;lt;tex&amp;gt;f_i(x) \not \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
   if &amp;lt;tex&amp;gt;x \not \in \mathrm{SAT}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 0 \pmod{2}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;f_i(x) \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
 &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Корректность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение второго и третьего свойств языка &amp;lt;tex&amp;gt;L = \mathrm{SAT} \cap A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; не имеет предела при &amp;lt;tex&amp;gt;n \to \infty&amp;lt;/tex&amp;gt;. Значит, для любой &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; существует элемент, на котором &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; «ошибается»; аналогично, для любой полиномиальной функции &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt; существует элемент, на котором &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt; неверно сводит &amp;lt;tex&amp;gt;\mathrm{SAT}&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. Оба свойства выполнены.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;\lim\limits_{n \to \infty} g(n) = 2i&amp;lt;/tex&amp;gt;. Значит, в нашем множестве существует такая машина Тьюринга &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt;, распознающая &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;\forall x \Rightarrow M_i(x) = [g(|x|) \equiv 0 \pmod{2} \wedge x \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;. С одной стороны, &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; работает за полином, и &amp;lt;tex&amp;gt;L \in \mathrm{P}&amp;lt;/tex&amp;gt;. С другой стороны, по определению &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; различается с &amp;lt;tex&amp;gt;\mathrm{SAT}&amp;lt;/tex&amp;gt; в конечном числе элементов, значит &amp;lt;tex&amp;gt;\mathrm{SAT} \le L&amp;lt;/tex&amp;gt;. Получено противоречие с предположением &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;\lim\limits_{n \to \infty} g(n) = 2i + 1&amp;lt;/tex&amp;gt;. Тогда в нашем множестве полиномиальных функций существует &amp;lt;tex&amp;gt;f_i : \forall x \Rightarrow [x \in SAT] = [g(|f_i(x)|) \equiv 0 \pmod{2} \wedge f_i(x) \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;. С одной стороны, &amp;lt;tex&amp;gt;\mathrm{SAT} \le L&amp;lt;/tex&amp;gt; с помощью &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt;. С другой стороны, из определения &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; выходит, что язык &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; конечен, значит &amp;lt;tex&amp;gt;L \in \mathrm{P}&amp;lt;/tex&amp;gt;. Снова получено противоречие с предположением.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при верности предположения &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt; второе и третье свойства &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; выполнены.&lt;br /&gt;
&lt;br /&gt;
=== Время работы алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение первого свойства языка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. Для этого достаточно установить полиномиальность &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;tex&amp;gt;g(n) \le n&amp;lt;/tex&amp;gt; по построению для &amp;lt;tex&amp;gt;n \ge 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время выполнения шагов составляет:&lt;br /&gt;
&lt;br /&gt;
* для случая &amp;lt;tex&amp;gt;g(n) = 2i&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le 2^{\log_2 n} (T(M_i, x) + T(g, |x|) + T(x \in \mathrm{SAT}))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le k_1 n (|x|^i + T(g, |x|) + 2^{|x|}|x|)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le k_1 n ((\log_2 n)^{g(n)} + T(g, \log_2 n) + 2^{\log_2 n} \log_2 n)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le k_1 (n^2 + n^2 \log_2 n + n T(g, \log_2 n))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le k_1 (2n^3 + n T(g, \log_2 n))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* для случая &amp;lt;tex&amp;gt;g(n) = 2i + 1&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le 2^{\log_2 n} (T(x \in \mathrm{SAT}) + T(g, |f_i(x)|) + T(f_i(x) \in \mathrm{SAT}))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le k_2 n (2^{\log_2 n} \log_2 n + T(g, \log_2 n) + 2^{\log_2 n} \log_2 n)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le k_2 (2n^2 \log_2 n + n T(g, \log_2 n))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le k_2 (2n^3 + n T(g, \log_2 n))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Кроме того, необходимо &lt;br /&gt;
&lt;br /&gt;
* знать значение &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt;, получаемое на &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; шаге;&lt;br /&gt;
&lt;br /&gt;
* вычислить &amp;lt;tex&amp;gt;(\log_2 n)^{g(n)}&amp;lt;/tex&amp;gt;, что можно сделать за&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;k_3 \log_2 g(n) |(\log_2 n)^{g(n)}|^2 \le k_3 (g(n) |log_2 n|)^2 log_2 n \le k_3 n^3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(g, n) \le T(g, n-1) + k (n^3 + n T(g, \log_2 n))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;T(g, 1) = const = d&amp;lt;/tex&amp;gt;. Существует константа &amp;lt;tex&amp;gt;c \ge d&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;c (n-1)^4 + k n^3 + k n c (\log_2 n)^4 \le c n^4&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда, в силу &amp;lt;tex&amp;gt;T(g, 1) = d \le c \cdot 1^4&amp;lt;/tex&amp;gt; и неравенства выше, по индукции легко доказать, что &amp;lt;tex&amp;gt;T(g, n)&amp;lt;/tex&amp;gt; ограничено сверху &amp;lt;tex&amp;gt;c n^4&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;g \in \tilde{\mathrm{P}}&amp;lt;/tex&amp;gt;, а, в свою очередь, &amp;lt;tex&amp;gt;A \in \mathrm{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Источник ==&lt;br /&gt;
* ''William Gasarch, Lance Fortnow''. [http://blog.computationalcomplexity.org/media/ladner.pdf Two Proofs of Ladner’s Theorem]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9B%D0%B0%D0%B4%D0%BD%D0%B5%D1%80%D0%B0&amp;diff=23418</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%B5%D0%BC%D0%B0_%D0%9B%D0%B0%D0%B4%D0%BD%D0%B5%D1%80%D0%B0&amp;diff=23418"/>
				<updated>2012-06-03T12:09:54Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Теорема Ладнера''' (Ladner's Theorem) утверждает, что если [[Класс P|P]] не совпадает с [[Класс NP|NP]], то существует язык, принадлежащий &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;, но не являющийся ни полиномиальным, ни [[NP-полнота|NP-полным]].&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=Ладнер&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP} \Rightarrow \mathrm{NP} \setminus (\mathrm{P} \cup \mathrm{NPC}) \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Предположим, что &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt;. Из этого следует, что никакой &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полный язык (например, [[Примеры NP-полных_языков. Теорема_Кука#NP-полнота_2|SAT]]) нельзя [[Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи|свести по Карпу]] к полиномиальному. Будем искать такой язык &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, чтобы язык &amp;lt;tex&amp;gt;L = \mathrm{SAT} \cap A&amp;lt;/tex&amp;gt; удовлетворял следующим условиям:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt;L \in \mathrm{NP}&amp;lt;/tex&amp;gt; (для этого достаточно, чтобы выполнялось &amp;lt;tex&amp;gt;A \in \mathrm{P}&amp;lt;/tex&amp;gt;);&lt;br /&gt;
# &amp;lt;tex&amp;gt;L \not \in \mathrm{P}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;tex&amp;gt;\mathrm{SAT} \not \le L&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если выполнены все три свойства, то &amp;lt;tex&amp;gt;L \in \mathrm{NP} \setminus (\mathrm{P} \cup \mathrm{NPC})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;M_1, \ldots, M_n, \ldots&amp;lt;/tex&amp;gt; — все такие машины Тьюринга из &amp;lt;tex&amp;gt;\tilde{\mathrm{P}}&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;T(M_i, x) \le |x|^i&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;x \in \Sigma^*&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;f_1, \ldots, f_n, \ldots&amp;lt;/tex&amp;gt; — аналогичное множество полиномиальных функций: &amp;lt;tex&amp;gt;T(f_i, x) \le |x|^i&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;x \in \Sigma^*&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для простоты будем считать, что &amp;lt;tex&amp;gt;|\Sigma| = 2&amp;lt;/tex&amp;gt;. Построим такую ''неубывающую'' функцию &amp;lt;tex&amp;gt;g \in \tilde{\mathrm{P}}&amp;lt;/tex&amp;gt;, что для &amp;lt;tex&amp;gt;A = \{x \in \Sigma^*: g(|x|) \equiv 0 \pmod{2} \}&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;g(0) = g(1) = 1&amp;lt;/tex&amp;gt;. Для &amp;lt;tex&amp;gt;n \ge 1&amp;lt;/tex&amp;gt; построим &amp;lt;tex&amp;gt;g(n + 1)&amp;lt;/tex&amp;gt; рекурсивно — с помощью &amp;lt;tex&amp;gt;g(1), g(2), \ldots, g(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;(\log_2 n)^{g(n)} \ge n&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Пусть вычисленное значение &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; чётно. Определим &amp;lt;tex&amp;gt;g(n+1)&amp;lt;/tex&amp;gt; так:&lt;br /&gt;
&lt;br /&gt;
 for &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;|x| \le \log_2 n&amp;lt;/tex&amp;gt;&lt;br /&gt;
   if &amp;lt;tex&amp;gt;M_i(x)&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 1 \pmod{2}&amp;lt;/tex&amp;gt; or &amp;lt;tex&amp;gt;x \not \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
   if &amp;lt;tex&amp;gt;! M_i(x)&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 0 \pmod{2}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;x \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
 &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Пусть вычисленное значение &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; нечётно. Определим &amp;lt;tex&amp;gt;g(n+1)&amp;lt;/tex&amp;gt; так:&lt;br /&gt;
&lt;br /&gt;
 for &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;|x| \le \log_2 n, |f_i(x)| \le \log_2 n&amp;lt;/tex&amp;gt;&lt;br /&gt;
   if &amp;lt;tex&amp;gt;x \in \mathrm{SAT}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 1 \pmod{2}&amp;lt;/tex&amp;gt; or &amp;lt;tex&amp;gt;f_i(x) \not \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
   if &amp;lt;tex&amp;gt;x \not \in \mathrm{SAT}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;[g(|x|) \equiv 0 \pmod{2}&amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt;f_i(x) \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g(n+1) := g(n)+1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
 &amp;lt;tex&amp;gt;g(n+1) := g(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Корректность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение второго и третьего свойств языка &amp;lt;tex&amp;gt;L = \mathrm{SAT} \cap A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt; не имеет предела при &amp;lt;tex&amp;gt;n \to \infty&amp;lt;/tex&amp;gt;. Значит, для любой &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; существует элемент, на котором &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; «ошибается»; аналогично, для любой полиномиальной функции &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt; существует элемент, на котором &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt; неверно сводит &amp;lt;tex&amp;gt;\mathrm{SAT}&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. Оба свойства выполнены.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;\lim\limits_{n \to \infty} g(n) = 2i&amp;lt;/tex&amp;gt;. Значит, в нашем множестве существует такая машина Тьюринга &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt;, распознающая &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;\forall x \Rightarrow M_i(x) = [g(|x|) \equiv 0 \pmod{2} \wedge x \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;. С одной стороны, &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; работает за полином, и &amp;lt;tex&amp;gt;L \in \mathrm{P}&amp;lt;/tex&amp;gt;. С другой стороны, по определению &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; различается с &amp;lt;tex&amp;gt;\mathrm{SAT}&amp;lt;/tex&amp;gt; в конечном числе элементов, значит &amp;lt;tex&amp;gt;\mathrm{SAT} \le L&amp;lt;/tex&amp;gt;. Получено противоречие с предположением &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;\lim\limits_{n \to \infty} g(n) = 2i + 1&amp;lt;/tex&amp;gt;. Тогда в нашем множестве полиномиальных функций существует &amp;lt;tex&amp;gt;f_i : \forall x \Rightarrow [x \in SAT] = [g(|f_i(x)|) \equiv 0 \pmod{2} \wedge f_i(x) \in \mathrm{SAT}]&amp;lt;/tex&amp;gt;. С одной стороны, &amp;lt;tex&amp;gt;\mathrm{SAT} \le L&amp;lt;/tex&amp;gt; с помощью &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt;. С другой стороны, из определения &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; выходит, что язык &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; конечен, значит &amp;lt;tex&amp;gt;L \in \mathrm{P}&amp;lt;/tex&amp;gt;. Снова получено противоречие с предположением.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при верности предположения &amp;lt;tex&amp;gt;\mathrm{P} \neq \mathrm{NP}&amp;lt;/tex&amp;gt; второе и третье свойства &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; выполнены.&lt;br /&gt;
&lt;br /&gt;
=== Время работы алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение первого свойства языка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. Для этого достаточно установить полиномиальность &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;tex&amp;gt;g(n) \le n&amp;lt;/tex&amp;gt; по построению для &amp;lt;tex&amp;gt;n \ge 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время выполнения шагов составляет:&lt;br /&gt;
&lt;br /&gt;
* для случая &amp;lt;tex&amp;gt;g(n) = 2i&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le 2^{\log_2 n} (T(M_i, x) + T(g, |x|) + T(x \in \mathrm{SAT}))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le k_1 n (|x|^i + T(g, |x|) + 2^{|x|}|x|)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le k_1 n ((\log_2 n)^{g(n)} + T(g, \log_2 n) + 2^{\log_2 n} \log_2 n)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le k_1 (n^2 + n^2 \log_2 n + n T(g, \log_2 n))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le k_1 (2n^3 + n T(g, \log_2 n))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* для случая &amp;lt;tex&amp;gt;g(n) = 2i + 1&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le 2^{\log_2 n} (T(x \in \mathrm{SAT}) + T(g, |f_i(x)|) + T(f_i(x) \in \mathrm{SAT}))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le k_2 n (2^{\log_2 n} \log_2 n + T(g, \log_2 n) + 2^{\log_2 n} \log_2 n)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le k_2 (2n^2 \log_2 n + n T(g, \log_2 n))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) \le k_2 (2n^3 + n T(g, \log_2 n))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Кроме того, необходимо &lt;br /&gt;
&lt;br /&gt;
* знать значение &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt;, получаемое на &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; шаге;&lt;br /&gt;
&lt;br /&gt;
* вычислить &amp;lt;tex&amp;gt;(\log_2 n)^{g(n)}&amp;lt;/tex&amp;gt;, что можно сделать за&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;k_3 \log_2 g(n) |(\log_2 n)^{g(n)}|^2 \le k_3 (g(n) |log_2 n|)^2 log_2 n \le k_3 n^3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(g, n) \le T(g, n-1) + k (n^3 + n T(g, \log_2 n))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;T(g, 1) = const = d&amp;lt;/tex&amp;gt;. Существует константа &amp;lt;tex&amp;gt;c \ge d&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;c (n-1)^4 + k n^3 + k n c (\log_2 n)^4 \le c n^4&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда, в силу &amp;lt;tex&amp;gt;T(g, 1) = d \le c \cdot 1^4&amp;lt;/tex&amp;gt; и неравенства выше, по индукции легко доказать, что &amp;lt;tex&amp;gt;T(g, n)&amp;lt;/tex&amp;gt; ограничено сверху &amp;lt;tex&amp;gt;c n^4&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;g \in \tilde{\mathrm{P}}&amp;lt;/tex&amp;gt;, а, в свою очередь, &amp;lt;tex&amp;gt;A \in \mathrm{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Источник ==&lt;br /&gt;
* ''William Gasarch, Lance Fortnow''. [http://blog.computationalcomplexity.org/media/ladner.pdf Two Proofs of Ladner’s Theorem]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9B%D0%B0%D0%B4%D0%BD%D0%B5%D1%80%D0%B0&amp;diff=23416</id>
		<title>Обсуждение:Теорема Ладнера</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9B%D0%B0%D0%B4%D0%BD%D0%B5%D1%80%D0%B0&amp;diff=23416"/>
				<updated>2012-06-03T12:08:11Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Есть мнение, что эту теорему надо оформить как теорему.&lt;br /&gt;
: Done&lt;br /&gt;
&lt;br /&gt;
В первой же строке явно просится ссылка на P.&lt;br /&gt;
Ссылка на NP-полноту SAT'а.&lt;br /&gt;
Ссылка на сведение.&lt;br /&gt;
: Done&lt;br /&gt;
&lt;br /&gt;
Про функции не понял. Чем они от машин отличаются? Типа, могут быть невычислимы (тогда надо это явно указать)?&lt;br /&gt;
: [http://ru.wikipedia.org/wiki/%D0%9A%D0%BB%D0%B0%D1%81%D1%81_P#.D0.A4.D0.BE.D1.80.D0.BC.D0.B0.D0.BB.D1.8C.D0.BD.D0.BE.D0.B5_.D0.BE.D0.BF.D1.80.D0.B5.D0.B4.D0.B5.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5] Полиномиальная функция — объект, который пользуется полиномиальной МТ для получения результата из &amp;lt;tex&amp;gt;\Sigma^*&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Делимость процентиком не в программах — не очень. Поставь лучше три точки, наверное…&lt;br /&gt;
: Done — заменил на модульное сравнение, потому как точки смотрятся плохо.&lt;br /&gt;
&lt;br /&gt;
«названных свойства» — буэ. Указанных,требуемых, перечисленных, не знаю…&lt;br /&gt;
: Done&lt;br /&gt;
&lt;br /&gt;
Определение g — АД. Там ничего не понятно. Серьёзно. Перепиши, чтобы было понятно «если &amp;lt;что&amp;gt;, то &amp;lt;что&amp;gt;». Если хочешь при этом использовать списки, то делай обычные html'ные — вики-разметка не вытянет то, что тебе надо.&lt;br /&gt;
: Done — надеюсь, стало лучше читаться&lt;br /&gt;
:: Стало хуже читаться, потому что теперь не указано, что последние два пункта — если не выполняется то странное неравенство.&lt;br /&gt;
&lt;br /&gt;
Я сверху вынес степень логарифма за скобочки. Не знаю, надо ли это же сделать внизу в доказательстве времени. Если сильно ухудшит читабельность, то не надо.&lt;br /&gt;
: Done&lt;br /&gt;
&lt;br /&gt;
Используй обозначение T(программа, вход) — это относится и к началу статьи и к концу.&lt;br /&gt;
: Done&lt;br /&gt;
&lt;br /&gt;
Что за Т со звездой? Каких шагов время считаем? Ничерта не понятно в последней части. И, ты меня прости, но мне кажется, что если не разбивать по строкам формулы, то читаться будет лучше.&lt;br /&gt;
: Done: выпилил&lt;br /&gt;
&lt;br /&gt;
Название заголовка «корректность алгоритма» — так себе. Формально-то нет тут никакого алгоритма, корректность которого доказывать надо было бы.&lt;br /&gt;
&lt;br /&gt;
------------&lt;br /&gt;
&lt;br /&gt;
[[Участник:Kirelagin|Кирилл Елагин]] 13:58, 2 июня 2012 (GST)&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_L,_NL,_coNL._NL-%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D0%B8%D0%B6%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8&amp;diff=23413</id>
		<title>Обсуждение:Классы L, NL, coNL. NL-полнота задачи о достижимости</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_L,_NL,_coNL._NL-%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D0%B8%D0%B6%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8&amp;diff=23413"/>
				<updated>2012-06-03T11:54:15Z</updated>
		
		<summary type="html">&lt;p&gt;Kirelagin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Определеньки надо бы вынести из теорем.&lt;br /&gt;
&lt;br /&gt;
Я, видимо, туплю, но я не понимаю, как &amp;lt;tex&amp;gt;\mathrm{\overline{CONN}} \in \mathrm{NL} \Rightarrow \mathrm{NL} = \mathrm{coNL}&amp;lt;/tex&amp;gt;…&lt;br /&gt;
: А, я нашёл это в самом конце. Такое ощущение, что теорему и лемму нужно разделить. Во-первых, лемма внутри теоремы выглядит просто как-то не очень. Во-вторых, у тебя там всё смешалось и часть доказательства теоремы почему-то доказывается в конце леммы. Ну т.е. я зато, чтобы лемму вынести из теоремы, причем, возможно, надо написать ее ''после'' теоремы, а в теореме аккуратно сослаться, что, мол, вот, если мы докажем вот такую вот лемму, то тогда то-то и то-то, а вот лемму мы докажем попозже. И ещё есть ощущение, что у тебя возникнет проблема co-NLC — coNL-C, как у Андрея Дёмина в конспекте. Посмотри там у него, какая ерунда была, и сделай аккуратетько этот момент.&lt;br /&gt;
&lt;br /&gt;
По-моему, надо пояснить понятие «допускать &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt;». Не очень понятно, что имеется в виду.&lt;br /&gt;
&lt;br /&gt;
В первом куске кода что-то не так с форматированием. И наверное было бы здорово комментарии все выровнить. И return' — это, кажется, что-то вроде yield?&lt;br /&gt;
&lt;br /&gt;
[[Участник:Kirelagin|Кирилл Елагин]] 14:15, 3 июня 2012 (GST)&lt;/div&gt;</summary>
		<author><name>Kirelagin</name></author>	</entry>

	</feed>