<?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=5.18.154.236&amp;*</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=5.18.154.236&amp;*"/>
		<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/5.18.154.236"/>
		<updated>2026-06-11T14:08:36Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9B%D0%B5%D0%BC%D0%BC%D0%B0_%D0%BE_%D0%B4%D0%B5%D0%B4%D1%83%D0%BA%D1%86%D0%B8%D0%B8,_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2%D1%8B%D1%81%D0%BA%D0%B0%D0%B7%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=55377</id>
		<title>Лемма о дедукции, полнота исчисления высказываний</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_%D0%B4%D0%B5%D0%B4%D1%83%D0%BA%D1%86%D0%B8%D0%B8,_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2%D1%8B%D1%81%D0%BA%D0%B0%D0%B7%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=55377"/>
				<updated>2016-09-08T16:48:05Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.154.236: /* Теорема о дедукции */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Категория: Математическая логика]]&lt;br /&gt;
&lt;br /&gt;
[[Лекция 2 | &amp;lt;&amp;lt;]][[Лекция 4 | &amp;gt;&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==Теорема о дедукции==&lt;br /&gt;
&lt;br /&gt;
Будем обозначать буквами &amp;lt;tex&amp;gt;\Gamma, \Delta, \Sigma&amp;lt;/tex&amp;gt; списки формул (возможно, пустые).&lt;br /&gt;
&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt; - некоторый список высказываний, &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; - некоторое высказывание в исчислении &amp;lt;tex&amp;gt;\langle L, A, R \rangle&amp;lt;/tex&amp;gt;. Тогда будем говорить, что &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; '''выводится''' из &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt; (запись: &amp;lt;tex&amp;gt;\Gamma \vdash \alpha&amp;lt;/tex&amp;gt;), если существует доказательство &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; в исчислении &amp;lt;tex&amp;gt;\langle L, A_1, R \rangle&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A_1&amp;lt;/tex&amp;gt; - это &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; с добавленными формулами из &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;. Элементы &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt; называются допущениями, предположениями, или гипотезами.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Замечание: в этом определении появляются дополнительные предположения, поэтому речь идет именно о ''выводе'', а не о ''доказательстве''. Очевидно, что, если &amp;lt;tex&amp;gt;\Gamma = \varnothing&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\Gamma \vdash \alpha&amp;lt;/tex&amp;gt; соответствует &amp;lt;tex&amp;gt;\vdash \alpha&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть справедливо &amp;lt;tex&amp;gt;\Gamma \vdash \alpha \rightarrow \beta&amp;lt;/tex&amp;gt;. Тогда справедливо &amp;lt;tex&amp;gt;\Gamma \cup \{\alpha\} \vdash \beta&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Возьмем &amp;lt;tex&amp;gt;\delta_1, ..., \delta_m&amp;lt;/tex&amp;gt; --- вывод формулы &amp;lt;tex&amp;gt;\alpha \rightarrow \beta&amp;lt;/tex&amp;gt;. В ней &amp;lt;tex&amp;gt;\delta_m = \alpha \rightarrow \beta&amp;lt;/tex&amp;gt;. Добавим &amp;lt;tex&amp;gt;\delta_{m+1} = \alpha&amp;lt;/tex&amp;gt; --- это добавленная аксиома, и &amp;lt;tex&amp;gt;\delta_{m+2} = \beta&amp;lt;/tex&amp;gt;, получим вывод &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt; как М.Р. &amp;lt;tex&amp;gt;\delta_m&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\delta_{m+1}&amp;lt;/tex&amp;gt;. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\vdash \alpha \rightarrow \alpha&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
#&amp;lt;tex&amp;gt;\alpha \rightarrow (\alpha \rightarrow \alpha)&amp;lt;/tex&amp;gt; (Сх. акс. 1)&lt;br /&gt;
#&amp;lt;tex&amp;gt;(\alpha \rightarrow (\alpha \rightarrow \alpha)) \rightarrow (\alpha \rightarrow ((\alpha \rightarrow \alpha) \rightarrow \alpha)) \rightarrow (\alpha \rightarrow \alpha)&amp;lt;/tex&amp;gt; (Сх. акс. 2)&lt;br /&gt;
#&amp;lt;tex&amp;gt;(\alpha \rightarrow ((\alpha \rightarrow \alpha) \rightarrow \alpha)) \rightarrow (\alpha \rightarrow \alpha)&amp;lt;/tex&amp;gt; (М.Р. 1, 2)&lt;br /&gt;
#&amp;lt;tex&amp;gt;(\alpha \rightarrow ((\alpha \rightarrow \alpha) \rightarrow \alpha))&amp;lt;/tex&amp;gt; (Сх. акс. 1)&lt;br /&gt;
#&amp;lt;tex&amp;gt;\alpha \rightarrow \alpha&amp;lt;/tex&amp;gt; (М.Р. 4, 3)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about= о дедукции&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть справедливо &amp;lt;tex&amp;gt;\Gamma \cup \{\alpha\} \vdash \beta&amp;lt;/tex&amp;gt;. Тогда справедливо &amp;lt;tex&amp;gt;\Gamma \vdash \alpha \rightarrow \beta&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Имеется вывод &amp;lt;tex&amp;gt;\delta_1, ..., \delta_{m-1}, \beta&amp;lt;/tex&amp;gt;. Набросаем план вывода, формулы в нем занумеруем через 10 ('''&amp;lt;s&amp;gt;Ну да, логика же&amp;lt;/s&amp;gt;'''):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(10)&amp;lt;/tex&amp;gt;   &amp;lt;tex&amp;gt;\Gamma \vdash \alpha \rightarrow \delta_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(10m - 10)&amp;lt;/tex&amp;gt;   &amp;lt;tex&amp;gt;\Gamma \vdash \alpha \rightarrow \delta_{m-1}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(10m)&amp;lt;/tex&amp;gt;   &amp;lt;tex&amp;gt;\Gamma \vdash \alpha \rightarrow \beta&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Дополним план до полноценного вывода. Рассмотрим формулу номер &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. Возможны следующие варианты:&lt;br /&gt;
# &amp;lt;tex&amp;gt;\delta_i&amp;lt;/tex&amp;gt; --- аксиома или предположение, входящее в &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;. Тогда вставим перед этой формулой &amp;lt;tex&amp;gt;\delta_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\delta_i \rightarrow (\alpha \rightarrow \delta_i)&amp;lt;/tex&amp;gt;, формула верна по M.P.&lt;br /&gt;
# &amp;lt;tex&amp;gt;\delta_i = \alpha&amp;lt;/tex&amp;gt;. Тогда вставляем перед формулой 4 формулы из леммы.&lt;br /&gt;
# &amp;lt;tex&amp;gt;\delta_i&amp;lt;/tex&amp;gt; выводится по M.P. из &amp;lt;tex&amp;gt;\delta_j&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\delta_k&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;j, k &amp;lt; i&amp;lt;/tex&amp;gt;.  Выведем &amp;lt;tex&amp;gt;\alpha \rightarrow \delta_i&amp;lt;/tex&amp;gt;, добавив &amp;lt;tex&amp;gt;(\alpha \rightarrow \delta_j) \rightarrow ((\alpha \rightarrow (\delta_j \rightarrow \delta_i)) \rightarrow (\alpha \rightarrow \delta_i))&amp;lt;/tex&amp;gt; (сх. акс. 2) и &amp;lt;tex&amp;gt;(\alpha \rightarrow (\delta_j \rightarrow \delta_i)) \rightarrow (\alpha \rightarrow \delta_i)&amp;lt;/tex&amp;gt; (M.P. из &amp;lt;tex&amp;gt;j&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;\alpha&amp;lt;/tex&amp;gt; следует из высказываний &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;, если при любой оценке пропозициональных переменных, входящих в высказывания, на которых все высказывания из &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt; истинны, &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; также истинно. Запись: &amp;lt;tex&amp;gt;\Gamma \models \alpha&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Теорема о полноте исчисления высказываний==&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement= &lt;br /&gt;
Если &amp;lt;tex&amp;gt;\Gamma \vdash \alpha&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\Gamma, \gamma \vdash \alpha&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;\Gamma_1, \Gamma_2 \vdash \alpha&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\Gamma_2, \Gamma_1 \vdash \alpha&amp;lt;/tex&amp;gt;. Аналогично для следствия.&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
'''КТО МОЖЕТ НАПИСАТЬ ЭТО ФОРМАЛЬНО?'''&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>5.18.154.236</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_%D0%B4%D0%B5%D0%B4%D1%83%D0%BA%D1%86%D0%B8%D0%B8,_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2%D1%8B%D1%81%D0%BA%D0%B0%D0%B7%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=55376</id>
		<title>Лемма о дедукции, полнота исчисления высказываний</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_%D0%B4%D0%B5%D0%B4%D1%83%D0%BA%D1%86%D0%B8%D0%B8,_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2%D1%8B%D1%81%D0%BA%D0%B0%D0%B7%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=55376"/>
				<updated>2016-09-08T16:46:04Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.154.236: /* Теорема о дедукции */ убрана возможно лишняя скобка в третьем пункте док-ва&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Категория: Математическая логика]]&lt;br /&gt;
&lt;br /&gt;
[[Лекция 2 | &amp;lt;&amp;lt;]][[Лекция 4 | &amp;gt;&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==Теорема о дедукции==&lt;br /&gt;
&lt;br /&gt;
Будем обозначать буквами &amp;lt;tex&amp;gt;\Gamma, \Delta, \Sigma&amp;lt;/tex&amp;gt; списки формул (возможно, пустые).&lt;br /&gt;
&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt; - некоторый список высказываний, &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; - некоторое высказывание в исчислении &amp;lt;tex&amp;gt;\langle L, A, R \rangle&amp;lt;/tex&amp;gt;. Тогда будем говорить, что &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; '''выводится''' из &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt; (запись: &amp;lt;tex&amp;gt;\Gamma \vdash \alpha&amp;lt;/tex&amp;gt;), если существует доказательство &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; в исчислении &amp;lt;tex&amp;gt;\langle L, A_1, R \rangle&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A_1&amp;lt;/tex&amp;gt; - это &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; с добавленными формулами из &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;. Элементы &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt; называются допущениями, предположениями, или гипотезами.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Замечание: в этом определении появляются дополнительные предположения, поэтому речь идет именно о ''выводе'', а не о ''доказательстве''. Очевидно, что, если &amp;lt;tex&amp;gt;\Gamma = \varnothing&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\Gamma \vdash \alpha&amp;lt;/tex&amp;gt; соответствует &amp;lt;tex&amp;gt;\vdash \alpha&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть справедливо &amp;lt;tex&amp;gt;\Gamma \vdash \alpha \rightarrow \beta&amp;lt;/tex&amp;gt;. Тогда справедливо &amp;lt;tex&amp;gt;\Gamma \cup \{\alpha\} \vdash \beta&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Возьмем &amp;lt;tex&amp;gt;\delta_1, ..., \delta_m&amp;lt;/tex&amp;gt; --- вывод формулы &amp;lt;tex&amp;gt;\alpha \rightarrow \beta&amp;lt;/tex&amp;gt;. В ней &amp;lt;tex&amp;gt;\delta_m = \alpha \rightarrow \beta&amp;lt;/tex&amp;gt;. Добавим &amp;lt;tex&amp;gt;\delta_{m+1} = \alpha&amp;lt;/tex&amp;gt; --- это добавленная аксиома, и &amp;lt;tex&amp;gt;\delta_{m+2} = \beta&amp;lt;/tex&amp;gt;, получим вывод &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt; как М.Р. &amp;lt;tex&amp;gt;\delta_m&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\delta_{m+1}&amp;lt;/tex&amp;gt;. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\vdash \alpha \rightarrow \alpha&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
#&amp;lt;tex&amp;gt;\alpha \rightarrow (\alpha \rightarrow \alpha)&amp;lt;/tex&amp;gt; (Сх. акс. 1)&lt;br /&gt;
#&amp;lt;tex&amp;gt;(\alpha \rightarrow (\alpha \rightarrow \alpha)) \rightarrow (\alpha \rightarrow ((\alpha \rightarrow \alpha) \rightarrow \alpha)) \rightarrow (\alpha \rightarrow \alpha)&amp;lt;/tex&amp;gt; (Сх. акс. 2)&lt;br /&gt;
#&amp;lt;tex&amp;gt;(\alpha \rightarrow ((\alpha \rightarrow \alpha) \rightarrow \alpha)) \rightarrow (\alpha \rightarrow \alpha)&amp;lt;/tex&amp;gt; (М.Р. 1, 2)&lt;br /&gt;
#&amp;lt;tex&amp;gt;(\alpha \rightarrow ((\alpha \rightarrow \alpha) \rightarrow \alpha))&amp;lt;/tex&amp;gt; (Сх. акс. 1)&lt;br /&gt;
#&amp;lt;tex&amp;gt;\alpha \rightarrow \alpha&amp;lt;/tex&amp;gt; (М.Р. 4, 3)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about= о дедукции&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть справедливо &amp;lt;tex&amp;gt;\Gamma \cup \{\alpha\} \vdash \beta&amp;lt;/tex&amp;gt;. Тогда справедливо &amp;lt;tex&amp;gt;\Gamma \vdash \alpha \rightarrow \beta&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Имеется вывод &amp;lt;tex&amp;gt;\delta_1, ..., \delta_{m-1}, \beta&amp;lt;/tex&amp;gt;. Набросаем план вывода, формулы в нем занумеруем через 10 ('''&amp;lt;s&amp;gt;Ну да, логика же&amp;lt;/s&amp;gt;'''):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(10)&amp;lt;/tex&amp;gt;   &amp;lt;tex&amp;gt;\Gamma \vdash \alpha \rightarrow \delta_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(10m - 10)&amp;lt;/tex&amp;gt;   &amp;lt;tex&amp;gt;\Gamma \vdash \alpha \rightarrow \delta_{m-1}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(10m)&amp;lt;/tex&amp;gt;   &amp;lt;tex&amp;gt;\Gamma \vdash \alpha \rightarrow \beta&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Дополним план до полноценного вывода. Рассмотрим формулу номер &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. Возможны следующие варианты:&lt;br /&gt;
# &amp;lt;tex&amp;gt;\delta_i&amp;lt;/tex&amp;gt; --- аксиома или предположение, входящее в &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;. Тогда вставим перед этой формулой &amp;lt;tex&amp;gt;\delta_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\delta_i \rightarrow (\alpha \rightarrow \delta_i)&amp;lt;/tex&amp;gt;, формула верна по M.P.&lt;br /&gt;
# &amp;lt;tex&amp;gt;\delta_i = \alpha&amp;lt;/tex&amp;gt;. Тогда вставляем перед формулой 4 формулы из леммы.&lt;br /&gt;
# &amp;lt;tex&amp;gt;\delta_i&amp;lt;/tex&amp;gt; выводится по M.P. из &amp;lt;tex&amp;gt;\delta_j&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\delta_k&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;j, k &amp;lt; i&amp;lt;/tex&amp;gt;.  Выведем &amp;lt;tex&amp;gt;\alpha \rightarrow \delta_i&amp;lt;/tex&amp;gt;, добавив &amp;lt;tex&amp;gt;(\alpha \rightarrow \delta_j) \rightarrow ((\alpha \rightarrow (\delta_j \rightarrow \delta_i)) \rightarrow (\alpha \rightarrow \delta_i))&amp;lt;/tex&amp;gt; (сх. акс. 2) и &amp;lt;tex&amp;gt;((\alpha \rightarrow (\delta_j \rightarrow \delta_i)) \rightarrow (\alpha \rightarrow \delta_i)&amp;lt;/tex&amp;gt; (M.P. из &amp;lt;tex&amp;gt;j&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;\alpha&amp;lt;/tex&amp;gt; следует из высказываний &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;, если при любой оценке пропозициональных переменных, входящих в высказывания, на которых все высказывания из &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt; истинны, &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; также истинно. Запись: &amp;lt;tex&amp;gt;\Gamma \models \alpha&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Теорема о полноте исчисления высказываний==&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement= &lt;br /&gt;
Если &amp;lt;tex&amp;gt;\Gamma \vdash \alpha&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\Gamma, \gamma \vdash \alpha&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;\Gamma_1, \Gamma_2 \vdash \alpha&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\Gamma_2, \Gamma_1 \vdash \alpha&amp;lt;/tex&amp;gt;. Аналогично для следствия.&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
'''КТО МОЖЕТ НАПИСАТЬ ЭТО ФОРМАЛЬНО?'''&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>5.18.154.236</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D0%B8_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=55363</id>
		<title>Основные определения теории графов</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D0%B8_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=55363"/>
				<updated>2016-06-28T12:44:15Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.154.236: /* Пути в графах */  опечатка&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Ориентированные графы==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id = oriented_grath&lt;br /&gt;
|definition =&lt;br /&gt;
'''Ориентированным графом''' (англ. ''directed graph'') &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется пара &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; {{---}} множество вершин (англ. ''vertices''), а &amp;lt;tex&amp;gt; E \subset V \times V &amp;lt;/tex&amp;gt; {{---}} множество рёбер.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Конечным графом''' (англ. ''finite graph'') &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется граф, в котором множества &amp;lt;tex&amp;gt;V&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;
|id = def_graph_edge_1&lt;br /&gt;
|definition =&lt;br /&gt;
'''Ребром''' (англ. ''edge'', дугой (англ. ''arc''), линией (англ. ''line'')) ориентированного графа называют упорядоченную пару вершин &amp;lt;tex&amp;gt; (v, u) \in E &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Изоморфные графы''' (англ. ''isomorphic graphs'') {{---}} два графа &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;
В графе ребро, концы которого совпадают, то есть &amp;lt;tex&amp;gt;e=(v, v)&amp;lt;/tex&amp;gt;, называется &amp;lt;b&amp;gt;петлей&amp;lt;/b&amp;gt; (англ. ''loop'').&lt;br /&gt;
&lt;br /&gt;
Два ребра, имеющие общую концевую вершину, то есть &amp;lt;tex&amp;gt;e_1=(v, u_1)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e_2=(v, u_2)&amp;lt;/tex&amp;gt;, называются '''смежными''' (англ. ''adjacent''). &lt;br /&gt;
&lt;br /&gt;
Если имеется ребро &amp;lt;tex&amp;gt; (v, u) \in E &amp;lt;/tex&amp;gt;, то говорят:&lt;br /&gt;
* &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; {{---}} '''предок''' (англ. ''direct predecessor'') &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt;.&lt;br /&gt;
* &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; {{---}} '''смежные'''.&lt;br /&gt;
* Вершина &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; '''инцидентна''' ребру &amp;lt;tex&amp;gt; (v, u) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Вершина &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; '''инцидентна''' ребру &amp;lt;tex&amp;gt; (v, u) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Инцидентность''' (англ. ''incidence'') {{---}} понятие, используемое только в отношении ребра и вершины. Две вершины или два ребра не могут быть инцидентны.&lt;br /&gt;
&lt;br /&gt;
Граф с &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; вершинами и &amp;lt;tex&amp;gt; q &amp;lt;/tex&amp;gt; ребрами называют &amp;lt;tex&amp;gt; (p, q) &amp;lt;/tex&amp;gt;-графом.  &amp;lt;tex&amp;gt; (1, 0) &amp;lt;/tex&amp;gt;-граф называют &amp;lt;b&amp;gt;тривиальным&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что по определению ориентированного графа, данному выше, любые две вершины &amp;lt;tex&amp;gt;u,~v&amp;lt;/tex&amp;gt; нельзя соединить более чем одним ребром &amp;lt;tex&amp;gt;(u, v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Поэтому часто используют другое определение. &lt;br /&gt;
{{Определение&lt;br /&gt;
|id = def1&lt;br /&gt;
|definition =&lt;br /&gt;
'''Ориентированным графом''' &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется четверка &amp;lt;tex&amp;gt;G = (V, E, \operatorname{beg}, \operatorname{end})&amp;lt;/tex&amp;gt; , где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; {{---}} некоторые множества, а &amp;lt;tex&amp;gt;\operatorname{beg}, \operatorname{end} : E \rightarrow V&amp;lt;/tex&amp;gt;. &lt;br /&gt;
}} &lt;br /&gt;
Данное определение разрешает соединять вершины более чем одним ребром. Такие ребра называются '''кратными''' (иначе {{---}} '''параллельные''', англ. ''multi-edge'', ''parallel edge''). Граф с кратными рёбрами принято называть '''мультиграфом''' (англ. ''multigraph''). Если в мультиграфе присутствуют петли, то такой граф называют '''псевдографом''' (англ. ''pseudograph'').&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; width=30% align=center&lt;br /&gt;
|[[Файл: Graph_definition_1.png|thumb|210px|center|&amp;lt;font color=#ff2a2a&amp;gt;Красным&amp;lt;/font&amp;gt; выделено кратное ребро (6, 2)&amp;lt;br&amp;gt;&amp;lt;font color=#3771c8&amp;gt;Синим&amp;lt;/font&amp;gt; обозначена петля (6, 6)]]&lt;br /&gt;
|[[Файл: Multi_graph.png|thumb|150px|center|Мультиграф]]&lt;br /&gt;
|[[Файл: Pseudo_graph.png|thumb|150px|center|Псевдограф]]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Для ориентированных графов определяют '''полустепень исхода вершины''' (англ. ''outdegree'') &amp;lt;tex&amp;gt;\operatorname{deg}^+v_i = |\{e \mid \operatorname{beg(e)} = v_i\}|&amp;lt;/tex&amp;gt; и '''полустепень захода вершины''' (англ. ''indegree'') &amp;lt;tex&amp;gt;\operatorname{deg}^-v_i = |\{e \mid \operatorname{end(e)} = v_i\}|&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;
|id = def_undirected_graph_1&lt;br /&gt;
|definition =&lt;br /&gt;
'''Неориентированным графом''' (англ. ''undirected graph'') &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется пара &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; {{---}} множество вершин, а &amp;lt;tex&amp;gt; E \subset \{\{v, u\}: v, u \in V\}&amp;lt;/tex&amp;gt; {{---}} множество рёбер.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Ребром''' в неориентированном графе называют неупорядоченную пару вершин &amp;lt;tex&amp;gt; \{v, u\} \in E &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
[[Файл: Graph_definition_2.png|thumb|210px|center|Неориентированный граф&amp;lt;br&amp;gt;]]&lt;br /&gt;
Иное определение:&lt;br /&gt;
{{Определение&lt;br /&gt;
|id = def_undirected_graph_2&lt;br /&gt;
|definition =&lt;br /&gt;
'''Неориентированным графом''' &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется тройка &amp;lt;tex&amp;gt;G = (V, E, \operatorname{ends})&amp;lt;/tex&amp;gt; , где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; {{---}} множество вершин, &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; {{---}} множество ребер, а &amp;lt;tex&amp;gt;\operatorname{ends} : E \to \{\{u, v\}, u, v \in V\}&amp;lt;/tex&amp;gt;. Это определение, в отличие от предыдущего, позволяет задавать графы с кратными ребрами.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id = def_simple_graph&lt;br /&gt;
|definition =&lt;br /&gt;
'''Простым графом''' &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется граф, в котором нет петель и кратных ребер.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id = def_graph_degree_1&lt;br /&gt;
|definition =&lt;br /&gt;
'''Степенью''' (англ. ''degree'', ''valency'') вершины &amp;lt;tex&amp;gt;\operatorname{deg} v_i&amp;lt;/tex&amp;gt; в неориентированном графе называют число ребер, инцидентных &amp;lt;tex&amp;gt;v_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Будем считать, что петли добавляют к степени вершины &amp;lt;tex&amp;gt;2&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;
Граф можно представить в виде [[Матрица смежности графа|матрицы смежности]] (англ. ''adjacency matrix''), где &amp;lt;tex&amp;gt;graph[v][u] = true \Leftrightarrow (v, u) \in E&amp;lt;/tex&amp;gt;. Также в ячейке матрицы можно хранить вес ребра или их количество (если в графе разрешены параллельные ребра).&lt;br /&gt;
Для матрицы смежности существует [[Связь степени матрицы смежности и количества путей|теорема]], позволяющая связать степень матрицы  и количество путей из вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; в вершину &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если граф '''разрежен''' (англ. ''sparse graph''), &amp;lt;tex&amp;gt;|E| \ll |V^2|&amp;lt;/tex&amp;gt;, то есть, неформально говоря, в нем не очень много ребер. Формально говорить не получается, потому что везде разреженные графы определяются по-разному, его лучше представить в виде списков смежности, где список для вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; будет содержать вершины &amp;lt;tex&amp;gt;u: (v, u) \in E&amp;lt;/tex&amp;gt;. Данный способ позволит сэкономить память, так как не придется хранить много нулей.&lt;br /&gt;
&lt;br /&gt;
=== Пути в графах ===&lt;br /&gt;
{{Определение&lt;br /&gt;
|id = path&lt;br /&gt;
|definition =&lt;br /&gt;
'''Путём''' (маршрутом,англ. ''path'') в графе называется последовательность вида &amp;lt;tex&amp;gt;v_0 e_1 v_1 ... e_k v_k&amp;lt;/tex&amp;gt;,  где &amp;lt;tex&amp;gt;e_i \in E,~e_i = (v_{i-1}, v_i), k&amp;lt;/tex&amp;gt; {{---}} '''длина''' (англ. ''length'') пути.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Длина пути''' {{---}} количество [[Основные определения теории графов|рёбер]], входящих в последовательность, задающую этот путь.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Циклическим путём''' (англ. ''closed walk'') в ''ориентированном графе'' называется путь, в котором &amp;lt;tex&amp;gt;v_0 = v_k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id = def_no_graph_path&lt;br /&gt;
|definition =&lt;br /&gt;
'''Циклическим путём''' в ''неориентированном графе'' называется путь, в котором &amp;lt;tex&amp;gt;v_0 = v_k&amp;lt;/tex&amp;gt;, а также &amp;lt;tex&amp;gt; e_i \ne e_{i \bmod k + 1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id = def_graph_cycle_1&lt;br /&gt;
|definition =&lt;br /&gt;
'''Цикл''' (англ. ''integral cycle'') {{---}} это [[Отношение эквивалентности#Классы эквивалентности|класс эквивалентности]] циклических путей на отношении эквивалентности таком, что два пути эквивалентны, если &amp;lt;tex&amp;gt; \exists  j \forall i : e_{(i \mod k)} = e'_{(i + j) \bmod k}&amp;lt;/tex&amp;gt;; где &amp;lt;tex&amp;gt;e&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;
|definition=&lt;br /&gt;
'''Простой (вершинно-простой) путь''' (англ. ''simple path'') {{---}} путь, в котором каждая из вершин графа встречается не более одного раза.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реберно-простой путь''' {{---}} путь, в котором каждое из ребер графа встречается не более одного раза.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Часто используемые графы ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Полный граф''' (англ. ''complete graph'') {{---}} граф, в котором каждая пара различных вершин смежна. Полный граф с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами имеет &amp;lt;tex&amp;gt;n(n-1)/2&amp;lt;/tex&amp;gt; рёбер и обозначается &amp;lt;tex&amp;gt;K_n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;span id=&amp;quot;Двудольный_граф&amp;quot;&amp;gt;'''Двудольный граф'''&amp;lt;/span&amp;gt; или '''биграф''' (англ. ''bipartite graph'') {{---}} граф, множество вершин которого можно разбить на две части таким образом, что каждое ребро графа соединяет какую-то вершину из одной части с какой-то вершиной другой части, то есть не существует ребра, соединяющего две вершины из одной и той же части. Двудольный граф с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами в одной доле и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; во второй обозначается &amp;lt;tex&amp;gt;K_{n,m}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Регулярный граф''' (англ. ''regular graph'') {{---}} граф, степени всех вершин которого равны, то есть каждая вершина имеет одинаковое количество соседей. Регулярный граф с вершинами степени &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;‑регулярным, или регулярным графом степени &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{main|Дерево, эквивалентные определения}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''Дерево''' (англ. ''tree'') {{---}} связный ациклический граф.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{main|Эйлеров цикл, Эйлеров путь, Эйлеровы графы, Эйлеровость орграфов}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Граф называется '''эйлеровым''' (англ. ''eulerian graph''), если он содержит эйлеров цикл. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{main|Гамильтоновы графы}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Граф называется '''гамильтоновым''' (англ. ''hamiltonian graph''), если он содержит гамильтонов цикл.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{main|Укладка графа на плоскости}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Граф называется '''планарным''' (англ. ''planar graph''), если он обладает укладкой на плоскости. '''Плоским''' (англ. ''plane graph'', ''planar embedding of the graph'') называется граф уже уложенный на плоскости.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{main|Лемма о безопасном ребре}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Остовное дерево''' (англ. ''spanning tree'') {{---}} ациклический связный подграф данного связного неориентированного графа, в который входят все его вершины.&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:ru:Граф_(математика) | Википедия {{---}} Граф]]&lt;br /&gt;
* [[wikipedia:Graph_(mathematics) | Wikipedia {{---}} Graph]]&lt;br /&gt;
* [http://mathworld.wolfram.com/Graph.html Wolfram Mathworld: Graph]&lt;br /&gt;
* Харари Фрэнк '''Теория графов''' = Graph theory/Пер. с англ. и предисл. В. П. Козырева. Под ред. Г.П.Гаврилова. Изд. 2-е. — М.: Едиториал УРСС, 2003. — 296 с. — ISBN 5-354-00301-6&lt;br /&gt;
* Асанов М. О., Баранский В. А., Расин В. В. '''Дискретная математика: графы, матроиды, алгоритмы''' — НИЦ РХД, 2001. — 288 с. — ISBN 5-93972-076-5&lt;br /&gt;
* ''Кормен, Томас Х., Лейзерсон, Чарльз И., Ривест, Рональд Л., Штайн Клиффорд'' '''Алгоритмы: построение и анализ''', 2-е издание. Пер. с англ. — М.:Издательский дом &amp;quot;Вильямс&amp;quot;, 2010. — 1296 с.: ил. — Парал. тит. англ. — ISBN 978-5-8459-0857-5 (рус.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Основные определения теории графов]]&lt;/div&gt;</summary>
		<author><name>5.18.154.236</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B3%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0&amp;diff=53401</id>
		<title>Получение следующего объекта</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B3%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0&amp;diff=53401"/>
				<updated>2016-04-21T19:18:08Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.154.236: /* Специализация алгоритма для генерации следующей перестановки */ исправление опечатки в алгоритме&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
{{Определение|definition= '''Получение следующего объекта''' {{---}} это нахождение объекта, следующего за данным в [[Лексикографический порядок|лексикографическом порядке]].&lt;br /&gt;
}}&lt;br /&gt;
Объект &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; называется следующим за &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;P &amp;lt; Q&amp;lt;/tex&amp;gt; и не найдется такого &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;P &amp;lt; R &amp;lt; Q&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Отсюда понятен алгоритм:&lt;br /&gt;
* находим суффикс минимальной длины, который можно изменить без изменения префикса текущего объекта &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;,&lt;br /&gt;
* к оставшейся части дописываем минимальный возможный элемент (чтобы было выполнено правило &amp;lt;tex&amp;gt;P &amp;lt; Q&amp;lt;/tex&amp;gt;),&lt;br /&gt;
* дописываем минимальный возможный хвост.&lt;br /&gt;
По построению получаем, что &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; {{---}} минимально возможный.&lt;br /&gt;
&lt;br /&gt;
== Специализация алгоритма для генерации следующего битового вектора ==&lt;br /&gt;
* Находим минимальный суффикс, в котором есть &amp;lt;tex&amp;gt;0&amp;lt;/tex&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;
 '''int[]''' nextVector('''int[]''' a): &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} длина вектора&amp;lt;/font&amp;gt;&lt;br /&gt;
   '''while''' (n &amp;gt;= 0) '''and''' (a[n] != 0)&lt;br /&gt;
       a[n] = 0&lt;br /&gt;
       n--&lt;br /&gt;
   '''if''' n == -1&lt;br /&gt;
     '''return''' ''null''&lt;br /&gt;
   a[n] = 1&lt;br /&gt;
   '''return''' a&lt;br /&gt;
Приведённый алгоритм эквивалентен прибавлению единицы к битовому вектору. &lt;br /&gt;
=== Пример работы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|0||1||0||1||style=&amp;quot;background:#FFCC00&amp;quot;|1||исходный битовый вектор&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||^|| начинаем идти с конца&lt;br /&gt;
|-&lt;br /&gt;
|0||1||0||style=&amp;quot;background:#FFCC00&amp;quot;|0||style=&amp;quot;background:#FFCC00&amp;quot;|0|| пока элементы равны 1, заменяем их на 0&lt;br /&gt;
|-&lt;br /&gt;
|0||1||style=&amp;quot;background:#FFCC00&amp;quot;|1||0||0|| меняем первый не удовлетворяющий условию цикла элемент на 1&lt;br /&gt;
|-&lt;br /&gt;
|'''0'''||'''1'''||'''1'''||'''0'''||'''0'''||следующий битовый вектор&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Специализация алгоритма для генерации следующей перестановки ==&lt;br /&gt;
* Двигаясь справа налево, находим элемент, нарушающий убывающую последовательность (в обычном порядке, слева направо, см. пример)&lt;br /&gt;
* Меняем его с минимальным элементом, большим нашего, стоящим правее&lt;br /&gt;
* Перевернем правую часть&lt;br /&gt;
&lt;br /&gt;
 '''int[]''' nextPermutation('''int[]''' a): &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} длина перестановки&amp;lt;/font&amp;gt;&lt;br /&gt;
   '''for''' i = n - 2 '''downto''' 0&lt;br /&gt;
     '''if''' a[i] &amp;lt; a[i + 1]&lt;br /&gt;
       min = i&lt;br /&gt;
       '''for''' j = i + 1 '''to''' n - 1&lt;br /&gt;
         '''if''' (a[j] &amp;lt; a[min]) '''and''' (a[j] &amp;gt; a[i])&lt;br /&gt;
           min = j&lt;br /&gt;
       swap(a[i], a[min])&lt;br /&gt;
       reverse(a, i + 1, n - 1)&lt;br /&gt;
       '''return''' a&lt;br /&gt;
   '''return''' ''null'' &lt;br /&gt;
&lt;br /&gt;
=== Пример работы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|1||3||style=&amp;quot;background:#FFCC00&amp;quot;|2||5||style=&amp;quot;background:#FFCC00&amp;quot;|4||исходная перестановка&lt;br /&gt;
|-&lt;br /&gt;
| || ||^|| || ||находим элемент, нарушающий убывающую последовательность&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||^||минимальный элемент больше нашего&lt;br /&gt;
|-&lt;br /&gt;
|1||3||style=&amp;quot;background:#FFCC00&amp;quot;|4||5||style=&amp;quot;background:#FFCC00&amp;quot;|2||меняем их местами&lt;br /&gt;
|-&lt;br /&gt;
|1||3||4||style=&amp;quot;background:#FFCC00&amp;quot;|2||style=&amp;quot;background:#FFCC00&amp;quot;|5||разворачивам правую часть&lt;br /&gt;
|-&lt;br /&gt;
|'''1'''||'''3'''||'''4'''||'''2'''||'''5'''||следующая перестановка&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Специализация алгоритма для генерации следующей мультиперестановки ==&lt;br /&gt;
* Двигаясь справа налево, находим элемент, нарушающий убывающую последовательность (в обычном порядке, слева направо, см. пример).&lt;br /&gt;
* Меняем его с минимальным элементом, большим нашего, стоящим правее.&lt;br /&gt;
* Переворачиваем правую часть.&lt;br /&gt;
 '''int[]''' nextMultiperm('''int[]''' b):  &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} длина мультиперестановки&amp;lt;/font&amp;gt;&lt;br /&gt;
     i = n - 2&lt;br /&gt;
     '''while''' (i &amp;gt; 0) '''and''' (b[i] &amp;gt;= b[i + 1]) &lt;br /&gt;
       i--&lt;br /&gt;
     '''if''' i &amp;gt;= 0 &lt;br /&gt;
       j = i + 1&lt;br /&gt;
       '''while''' (j &amp;lt; n - 1) '''and''' (b[j + 1] &amp;gt; b[i]) &lt;br /&gt;
         j++&lt;br /&gt;
       swap(b[i] , b[j])&lt;br /&gt;
       reverse(b, i + 1, n - 1)&lt;br /&gt;
       '''return''' b&lt;br /&gt;
     '''else'''&lt;br /&gt;
       '''return''' ''null''&lt;br /&gt;
&lt;br /&gt;
=== Пример работы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|1||2||3||1||style=&amp;quot;background:#FFCC00&amp;quot;|2||style=&amp;quot;background:#FFCC00&amp;quot;|3||Исходная перестановка.&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||^|| ||Находим элемент, нарушающий убывающую последовательность.&lt;br /&gt;
|-&lt;br /&gt;
| || || || || ||^||Минимальный элемент больше нашего.&lt;br /&gt;
|-&lt;br /&gt;
|1||2||3||1||style=&amp;quot;background:#FFCC00&amp;quot;|3||style=&amp;quot;background:#FFCC00&amp;quot;|2||Меняем их местами.&lt;br /&gt;
|-&lt;br /&gt;
|'''1'''||'''2'''||'''3'''||'''1'''||'''3'''||'''2'''||Следующая мультиперестановка.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Специализация алгоритма для генерации следующего сочетания ==&lt;br /&gt;
&lt;br /&gt;
* Добавим в конец массива с сочетанием &amp;lt;tex&amp;gt;N+1&amp;lt;/tex&amp;gt; – максимальный элемент.&lt;br /&gt;
* Пойдём справа налево. Будем искать номер элемента, который отличается от предыдущего на &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Увеличим найденный элемент на &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, и допишем в конец минимально возможный хвост, если такого элемента нет – на вход было дано последнее сочетание.&lt;br /&gt;
 '''int[]''' nextChoose('''int[]''' a, '''int''' n, '''int''' k): &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n,k &amp;lt;/tex&amp;gt; {{---}} параметры сочетания&amp;lt;/font&amp;gt;&lt;br /&gt;
   '''for''' i = 0 '''to''' k - 1 &lt;br /&gt;
     b[i] = a[i]&lt;br /&gt;
   b[k] = n + 1&lt;br /&gt;
   i = n - 1&lt;br /&gt;
   '''while''' (i &amp;gt;= 0) '''and''' (b[i + 1] - b[i]) &amp;lt; 2) &lt;br /&gt;
     i--&lt;br /&gt;
   '''if''' i &amp;gt;= 0 &lt;br /&gt;
      b[i]++&lt;br /&gt;
      '''for''' j = i + 1 '''to''' k - 1 &lt;br /&gt;
        b[j] = b[j - 1] + 1&lt;br /&gt;
      '''for''' i = 0 '''to''' k - 1 &lt;br /&gt;
        a[i] = b[i]&lt;br /&gt;
      '''return''' a&lt;br /&gt;
   '''else'''&lt;br /&gt;
     '''return''' ''null''&lt;br /&gt;
&lt;br /&gt;
=== Пример работы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|1||2||5||6||style=&amp;quot;background:#FFCC00&amp;quot;|'''7'''||Дописываем 7 в конец сочетания.&lt;br /&gt;
|-&lt;br /&gt;
|1||style=&amp;quot;background:#FFCC00&amp;quot;|2||5||6||'''7'''||&lt;br /&gt;
|-&lt;br /&gt;
| ||^|| || || ||Находим элемент i, a[i + 1] - a[ i ] &amp;gt;= 2&lt;br /&gt;
|-&lt;br /&gt;
|1||style=&amp;quot;background:#FFCC00&amp;quot;|3||5||6||'''7'''||Увеличиваем его на 1.&lt;br /&gt;
|-&lt;br /&gt;
|1||3||style=&amp;quot;background:#FFCC00&amp;quot;|4||style=&amp;quot;background:#FFCC00&amp;quot;|5||style=&amp;quot;background:#FFCC00&amp;quot;|'''6'''||Дописываем минимальный хвост.&lt;br /&gt;
|-&lt;br /&gt;
|'''1'''||'''3'''||'''4'''||'''5'''||''' '''||Следующее сочетание.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Специализация алгоритма для генерации следующего разбиения на слагаемые ==&lt;br /&gt;
Рассматриваемый алгоритм находит следующее [[комбинаторные объекты|разбиение на слагаемые]], при этом разбиение упорядоченно по возрастанию.&lt;br /&gt;
* Увеличим предпоследнее слагаемое на &amp;lt;tex&amp;gt;1&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;s&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; таких, что &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; равно предпоследнему слагаемому, а &amp;lt;tex&amp;gt;b = s - a&amp;lt;/tex&amp;gt;. Повторяем этот процесс, пока разбиение остается корректным, то есть предпоследнее слагаемое хотя бы в два раза меньше последнего.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; {{---}} список, содержащий разбиение данного числа &amp;lt;tex&amp;gt;b.size&amp;lt;/tex&amp;gt;{{---}} его размер &amp;lt;/font&amp;gt;&lt;br /&gt;
 '''list&amp;lt;int&amp;gt;'''  nextPartition('''list&amp;lt;int&amp;gt;''' b): &lt;br /&gt;
    b[b.size - 1]--&lt;br /&gt;
    b[b.size - 2]++&lt;br /&gt;
    '''if''' b[b.size - 2] &amp;gt; b[b.size - 1] &lt;br /&gt;
       b[b.size - 2] += b[b.size - 1]&lt;br /&gt;
       b.remove(b.size - 1)&lt;br /&gt;
    '''else'''&lt;br /&gt;
      '''while''' b[b.size - 2] * 2 &amp;lt;= b[b.size - 1] &lt;br /&gt;
        b.add(b[b.size - 1] - b[b.size - 2])&lt;br /&gt;
        b[b.size - 2] = b[b.size - 3]&lt;br /&gt;
    '''return''' b&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Пример работы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|1||style=&amp;quot;background:#FFCC00&amp;quot;|1||style=&amp;quot;background:#FFCC00&amp;quot;|7|| || ||Прибавим 1 + 1, вычтем 7 - 1.&lt;br /&gt;
|-&lt;br /&gt;
|1||style=&amp;quot;background:#FFCC00&amp;quot;|2||style=&amp;quot;background:#FFCC00&amp;quot;|6|| || ||Проверяем: 2 &amp;lt; 6, значит разбиваем 6 пока оно не станет меньше 4&lt;br /&gt;
|-&lt;br /&gt;
|1||2||style=&amp;quot;background:#FFCC00&amp;quot;|2||style=&amp;quot;background:#FFCC00&amp;quot;|4|| ||&lt;br /&gt;
|-&lt;br /&gt;
|1||2||2||style=&amp;quot;background:#FFCC00&amp;quot;|2||style=&amp;quot;background:#FFCC00&amp;quot;|2||&lt;br /&gt;
|-&lt;br /&gt;
|'''1'''||'''2'''||'''2'''||'''2'''||'''2'''||Следующее разбиение на слагаемые числа 9.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|1||style=&amp;quot;background:#FFCC00&amp;quot;|4||style=&amp;quot;background:#FFCC00&amp;quot;|5||Прибавим 4 + 1, вычтем 5 - 1.&lt;br /&gt;
|-&lt;br /&gt;
|1||style=&amp;quot;background:#FFCC00&amp;quot;|5||style=&amp;quot;background:#FFCC00&amp;quot;|4||Проверяем: 5 &amp;gt; 4, значит прибавим к 5 + 4.&lt;br /&gt;
|-&lt;br /&gt;
|1||9||style=&amp;quot;background:#FFCC00&amp;quot;|4||Удалим последний элемент.&lt;br /&gt;
|-&lt;br /&gt;
|'''1'''||'''9'''||||Следующее разбиение на слагаемые числа 10.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Специализация алгоритма для генерации следующего разбиения на подмножества ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим множество первых n натуральных чисел:&amp;lt;tex&amp;gt;N_n = \{1, 2, ..., n\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Упорядочим все разбиения на множества &amp;lt;tex&amp;gt;N_n&amp;lt;/tex&amp;gt; лексикографически. Для этого, во-первых, в каждом разбиении упорядочим множества лексикографически. Будем говорить, что подмножество &amp;lt;tex&amp;gt; A \subset N_n &amp;lt;/tex&amp;gt; лексикографически меньше подмножества &amp;lt;tex&amp;gt; B \subset N_n &amp;lt;/tex&amp;gt; , если верно одно из следующих условий:&lt;br /&gt;
&lt;br /&gt;
*существует &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; такое, что &amp;lt;tex&amp;gt;i \in A&amp;lt;/tex&amp;gt; , &amp;lt;tex&amp;gt;i \notin B&amp;lt;/tex&amp;gt;, для всех &amp;lt;tex&amp;gt;j &amp;lt; i: j \in A&amp;lt;/tex&amp;gt; если и только если &amp;lt;tex&amp;gt;j \in B&amp;lt;/tex&amp;gt; , и существует &amp;lt;tex&amp;gt;k &amp;gt; i&amp;lt;/tex&amp;gt; такое что &amp;lt;tex&amp;gt;k \in B&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt; A \subset B &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;i &amp;lt; j&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;i \in A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;j \in B&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;N_n = A_1 \cup A_2 \cup . . . \cup A_k&amp;lt;/tex&amp;gt; лексикографически меньше разбиения &amp;lt;tex&amp;gt;N_n = B_1 \cup B_2 \cup . . . \cup B_l&amp;lt;/tex&amp;gt; если существует такое &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;A_1 = B_1, A_2 = B_2, . . . ,A_{i - 1} = B_{i - 1}, A_i &amp;lt; B_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Рассмотрим алгоритм нахождения лексикографически следующего разбиения на подмножества:'''&lt;br /&gt;
*Будем хранить подмножества в списке списков, например, разбиение &amp;lt;tex&amp;gt; \{1, 2, 3\}~ \{4, 5\}&amp;lt;/tex&amp;gt; будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|1||2||3&lt;br /&gt;
|-&lt;br /&gt;
|4||5|| &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;code&amp;gt;&lt;br /&gt;
 '''list&amp;lt;list&amp;lt;int&amp;gt;&amp;gt;''' nextSetPartition('''list&amp;lt;list&amp;lt;int&amp;gt;&amp;gt;''' a):&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; {{---}} список, содержащий подмножества&amp;lt;/font&amp;gt;&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;used&amp;lt;/tex&amp;gt; {{---}} список, в котором мы храним удаленные элементы&amp;lt;/font&amp;gt;&lt;br /&gt;
  used = '''list&amp;lt;int&amp;gt;'''&lt;br /&gt;
  fl = ''false''&lt;br /&gt;
  '''for''' i = a.size - 1 '''downto''' 0&lt;br /&gt;
      '''if''' (used.size != 0) '''and''' (used[used.size - 1] &amp;gt; a[i][a[i].size - 1])   &amp;lt;font color=green&amp;gt;// если можем добавить в конец подмножества элемент из &amp;lt;tex&amp;gt;used&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
          a[i].add(used[used.size - 1])   &amp;lt;font color=green&amp;gt;//добавляем&amp;lt;/font&amp;gt;&lt;br /&gt;
          used.remove(used.size - 1)&lt;br /&gt;
          '''break'''&lt;br /&gt;
      '''for''' j = a[i].size - 1 '''downto''' 0&lt;br /&gt;
          '''if''' (used.size != 0) '''and''' (j != 0) '''and''' (used[used.size - 1] &amp;gt; a[i][j])    &amp;lt;font color=green&amp;gt;//если можем заменить элемент, другим элементом из списка &amp;lt;tex&amp;gt;used&amp;lt;/tex&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
             a[i][j] = used[used.size - 1]   &amp;lt;font color=green&amp;gt;//заменяем&amp;lt;/font&amp;gt;&lt;br /&gt;
             fl = ''true''&lt;br /&gt;
             '''break'''&lt;br /&gt;
      '''if''' fl '''break'''&lt;br /&gt;
      used.add(a[i][j])   &amp;lt;font color=green&amp;gt;//добавляем в &amp;lt;tex&amp;gt;used&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; элемент &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го подмножества&amp;lt;/font&amp;gt; &lt;br /&gt;
      a[i].remove(j)   &amp;lt;font color=green&amp;gt;//удаляем &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; элемент &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го подмножества&amp;lt;/font&amp;gt;&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;//далее выведем все получившиеся подмножества&amp;lt;/font&amp;gt;&lt;br /&gt;
  sort(used)&lt;br /&gt;
  '''for''' i = 0 '''to''' used.size - 1&lt;br /&gt;
     a.add('''list&amp;lt;int&amp;gt;'''(used[i]))   &amp;lt;font color=green&amp;gt;//добавляем лексикографически минимальных хвост&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''return''' a&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Пример работы ===&lt;br /&gt;
&lt;br /&gt;
'''Рассмотрим следующее разбиение:'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|1||2||3&lt;br /&gt;
|-&lt;br /&gt;
|4||5|| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''1 Шаг:'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|1||2||3||&lt;br /&gt;
|-&lt;br /&gt;
|4||style=&amp;quot;background:#FFCC00&amp;quot;|5||||&lt;br /&gt;
|-&lt;br /&gt;
| ||^|| ||Удалили элемент 5.&lt;br /&gt;
|-&lt;br /&gt;
| || || ||used&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''2 Шаг:'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|1||2||3||&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#FFCC00&amp;quot;|4|| ||||&lt;br /&gt;
|-&lt;br /&gt;
|^|| || ||Удалили элемент 4. Так как он является первым в подмножестве, то мы не можем заменить его на другой.&lt;br /&gt;
|-&lt;br /&gt;
|5|| || ||used&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''3 Шаг:'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|1||2||3||style=&amp;quot;background:#FFCC00&amp;quot;|4||&lt;br /&gt;
|-&lt;br /&gt;
| || || ||^||Дополнили первое подмножество элементом 4&lt;br /&gt;
|-&lt;br /&gt;
|5|| || || ||used&lt;br /&gt;
|}  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''4 Шаг:''' &lt;br /&gt;
     &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|1||2||3||4||&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#FFCC00&amp;quot;|5|| || || ||Дописали лексикографически минимальный хвост&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||used&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;
* [http://rain.ifmo.ru/cat/view.php/vis/combinations/permutations-2000 Визуализатор перестановок]&lt;br /&gt;
* [http://cppalgo.blogspot.com/2011/02/episode-2.html Пример компактного кода для перестановок (С++)]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>5.18.154.236</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%9D%D0%9C_(%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_%D0%BB%D0%B5%D1%81%D0%B0_%D0%BA%D0%BE%D1%80%D0%BD%D0%B5%D0%B2%D1%8B%D1%85_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D0%B5%D0%B2)&amp;diff=51861</id>
		<title>СНМ (реализация с помощью леса корневых деревьев)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%9D%D0%9C_(%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_%D0%BB%D0%B5%D1%81%D0%B0_%D0%BA%D0%BE%D1%80%D0%BD%D0%B5%D0%B2%D1%8B%D1%85_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D0%B5%D0%B2)&amp;diff=51861"/>
				<updated>2016-01-24T17:29:54Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.154.236: /* Анализ реализации с ранговой эвристикой */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Данная реализация СНМ позволяет добиться наилучшей асимптотики при работе с этой структурой данных. А именно, обе операции (&amp;lt;tex&amp;gt;\mathrm{get}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{union}&amp;lt;/tex&amp;gt;) выполняются в среднем за практически константное время.&lt;br /&gt;
==Реализация==&lt;br /&gt;
Каждое множество хранится в виде дерева. Элементы множества хранятся в узлах дерева. У каждого множества есть его представитель {{---}} один из элементов этого множества, он хранится в корне дерева. В каждом узле, кроме корня, хранится ссылка на &amp;quot;родителя&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
При объединении двух множеств, корень одного дерева подвешивается к другому (операция ''&amp;lt;tex&amp;gt;\mathrm{union}&amp;lt;/tex&amp;gt;''). Таким образом, чтобы определить, в каком множестве находится элемент достаточно пройтись по ссылкам по дереву вверх до корня (операция ''&amp;lt;tex&amp;gt;\mathrm{get}&amp;lt;/tex&amp;gt;'').&lt;br /&gt;
&lt;br /&gt;
Без использования дополнительных &amp;quot;улучшений&amp;quot;, такое дерево может выродиться в линейный список, где &amp;lt;tex&amp;gt;\mathrm{get}&amp;lt;/tex&amp;gt; будет работать за линейное время, и никакого выигрыша по сравнению с [[СНМ(наивные_реализации)|наивными реализацими]] не будет. Выигрыш в скорости можно получить, используя две эвристики: '''объединение по рангу''' (union by rank) и '''сжатие пути''' (path compression).&lt;br /&gt;
&lt;br /&gt;
===Объединение по рангу===&lt;br /&gt;
Эта эвристика аналогична [[СНМ(списки_с_весовой_эвристикой)|весовой эвристике у связных списков]]. Идея в том, чтобы при объединении подвешивать дерево с меньшей глубиной к дереву с большей. &lt;br /&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;
===Сжатие пути===&lt;br /&gt;
Эта эвристика несколько модифицирует операцию ''&amp;lt;tex&amp;gt;\mathrm{get}&amp;lt;/tex&amp;gt;''. Операция &amp;lt;tex&amp;gt;\mathrm{get}&amp;lt;/tex&amp;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{get}&amp;lt;/tex&amp;gt;'' становится двухпроходной.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
Для реализации СНМ будем поддерживать следующие массивы: &amp;lt;tex&amp;gt;p[x]&amp;lt;/tex&amp;gt; {{---}} массив &amp;quot;родителей&amp;quot;, &amp;lt;tex&amp;gt;r[x]&amp;lt;/tex&amp;gt; {{---}} массив рангов.&lt;br /&gt;
===='''get'''====&lt;br /&gt;
 '''function''' '''get'''(x: '''int'''): '''int'''&lt;br /&gt;
   '''if''' p[x] != x&lt;br /&gt;
     p[x] = get(p[x])&lt;br /&gt;
   '''return''' p[x]&lt;br /&gt;
&lt;br /&gt;
===='''union'''====&lt;br /&gt;
 '''function''' '''union'''(x: '''int''', y: '''int'''):&lt;br /&gt;
   x = get(x)&lt;br /&gt;
   y = get(y)&lt;br /&gt;
   '''if''' x == y&lt;br /&gt;
     '''return'''&lt;br /&gt;
   '''if''' r[x] == r[y]&lt;br /&gt;
     r[x]++&lt;br /&gt;
   '''if''' r[x] &amp;lt; r[y]&lt;br /&gt;
     p[x] = y&lt;br /&gt;
   '''else'''&lt;br /&gt;
     p[y] = x&lt;br /&gt;
	 &lt;br /&gt;
Также возможна реализация функции &amp;lt;tex&amp;gt;\mathrm{get}&amp;lt;/tex&amp;gt; без использования &amp;lt;tex&amp;gt;\mathrm{O(\log n)}&amp;lt;/tex&amp;gt; дополнительнй памяти.&lt;br /&gt;
&lt;br /&gt;
===='''get'''====&lt;br /&gt;
 '''function''' '''get'''(x: '''int'''): '''int'''&lt;br /&gt;
  root = x&lt;br /&gt;
  '''while''' p[root] != root&lt;br /&gt;
    root = p[root]&lt;br /&gt;
  i = x&lt;br /&gt;
  '''while''' p[i] != i&lt;br /&gt;
    j = p[i]&lt;br /&gt;
    p[i] = root&lt;br /&gt;
    i = j&lt;br /&gt;
  '''return''' root&lt;br /&gt;
&lt;br /&gt;
==Асимптотика==&lt;br /&gt;
:''см. также [[Анализ_реализации_с_ранговой_эвристикой|Анализ реализации с ранговой эвристикой]]''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|-&lt;br /&gt;
!Операция !! Истинное время !! Амортизированное время&lt;br /&gt;
|- style = &amp;quot;text-align = center&amp;quot;&lt;br /&gt;
| ''&amp;lt;tex&amp;gt;\mathrm{get}&amp;lt;/tex&amp;gt;''                  || &amp;lt;tex&amp;gt;\mathrm{O(\log n)}&amp;lt;/tex&amp;gt;        ||  &amp;lt;tex&amp;gt;\mathrm{O(\mathrm{\alpha(m, n)})}&amp;lt;/tex&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| ''&amp;lt;tex&amp;gt;\mathrm{union}&amp;lt;/tex&amp;gt;''                || &amp;lt;tex&amp;gt;\mathrm{O(\log n)}&amp;lt;/tex&amp;gt;            ||  &amp;lt;tex&amp;gt;\mathrm{O(\mathrm{\alpha(m, 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; {{---}} полное количество элементов, &amp;lt;tex&amp;gt;\mathrm{\alpha(m, n)}&amp;lt;/tex&amp;gt; {{---}} функция, обратная к функции Аккермана (если &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt;\mathrm{get}&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;k&amp;lt;/tex&amp;gt;, то в нем содержится как минимум &amp;lt;tex&amp;gt;2^k&amp;lt;/tex&amp;gt; элементов. Из этого свойства следует, что глубина множества с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементами есть &amp;lt;tex&amp;gt;\mathrm{O(\log n)}&amp;lt;/tex&amp;gt;, а значит и время работы операции &amp;lt;tex&amp;gt;\mathrm{get}&amp;lt;/tex&amp;gt; является логарифмическим.&lt;br /&gt;
&lt;br /&gt;
Будем доказывать данное свойство по индукции. Для &amp;lt;tex&amp;gt;k = 0&amp;lt;/tex&amp;gt;, очевидно, в множестве содержится &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; вершина. Пусть для множеств ранга &amp;lt;tex&amp;gt;k - 1&amp;lt;/tex&amp;gt; свойство выполняется. Как следует из ранговой эвристики, множество ранга &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; может получиться только при подвешивании множества ранга &amp;lt;tex&amp;gt;k - 1&amp;lt;/tex&amp;gt; к множеству ранга &amp;lt;tex&amp;gt;k - 1&amp;lt;/tex&amp;gt;. Но тогда из предположения индукции в новом множестве действительно будет &amp;lt;tex&amp;gt;2^k&amp;lt;/tex&amp;gt; вершин, что и требовалось доказать.&lt;br /&gt;
&lt;br /&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;\mathrm{A(m, n)} = \begin{cases}&lt;br /&gt;
 2^n, &amp;amp; m = 1 \\&lt;br /&gt;
 2, &amp;amp; m &amp;gt; 1, n = 0 \\&lt;br /&gt;
 \mathrm{A(m - 1, A(m, n - 1))}, &amp;amp; m &amp;gt; 1, n &amp;gt; 0&lt;br /&gt;
\end{cases} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таблица значений функции Аккермана:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|-&lt;br /&gt;
!&amp;lt;tex&amp;gt;\mathbf{m \backslash n}&amp;lt;/tex&amp;gt; !! &amp;lt;tex&amp;gt;\mathbf{0}&amp;lt;/tex&amp;gt; !! &amp;lt;tex&amp;gt;\mathbf{1}&amp;lt;/tex&amp;gt; !! &amp;lt;tex&amp;gt;\mathbf{2}&amp;lt;/tex&amp;gt; !! &amp;lt;tex&amp;gt;\mathbf{3}&amp;lt;/tex&amp;gt; !! &amp;lt;tex&amp;gt;\mathbf{4}&amp;lt;/tex&amp;gt; !! &amp;lt;tex&amp;gt;\mathbf{5}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-style = &amp;quot;text-align = center&amp;quot;&lt;br /&gt;
! &amp;lt;tex&amp;gt;\mathbf{1}&amp;lt;/tex&amp;gt; &lt;br /&gt;
| &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; ||  &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;8&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;16&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;32&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;tex&amp;gt;\mathbf{2}&amp;lt;/tex&amp;gt; &lt;br /&gt;
| &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;16&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;65536&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;2^{2^{16}}&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;2^{2^{2^{16}}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;tex&amp;gt;\mathbf{3}&amp;lt;/tex&amp;gt; &lt;br /&gt;
| &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;16&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\underbrace{2^{2^{\cdot^{\cdot^{\cdot^2}}}}}_{17}&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\underbrace{2^{2^{\cdot^{\cdot^{\cdot^2}}}}}_{A(3, 2)}&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;tex&amp;gt;\mathbf{4}&amp;lt;/tex&amp;gt; &lt;br /&gt;
| &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\underbrace{2^{2^{\cdot^{\cdot^{\cdot^2}}}}}_{17}&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Функция, обратная функции Аккермана &amp;lt;tex&amp;gt;\mathrm{\alpha(m, n)}&amp;lt;/tex&amp;gt;, равна минимальному &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; такому, что &amp;lt;tex&amp;gt;\mathrm{A \left (i, \left [\dfrac{m}{n} \right ] \right )} \geqslant \log n&amp;lt;/tex&amp;gt;. Как видно из таблицы значений для функции Аккермана, обратная функция для любых значений, которые могут возникнуть при решении прикладных задач, не превышает 4, то есть можно считать, что операция &amp;lt;tex&amp;gt;\mathrm{get}&amp;lt;/tex&amp;gt; выполняется за константное время.&lt;br /&gt;
&lt;br /&gt;
===Анализ реализации с ранговой эвристикой===&lt;br /&gt;
&lt;br /&gt;
Проведем анализ реализации с ранговой эвристикой. Будем доказывать, что амортизационная стоимость &amp;lt;tex&amp;gt; \mathrm{get} = \mathrm{O(\log^{*}n)}  &amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''Итерированный логарифм''' (англ. ''Iterated logarithm'') &amp;lt;tex&amp;gt;\mathrm{\log^*n}&amp;lt;/tex&amp;gt; — минимальное число логарифмирований &amp;lt;tex&amp;gt;n&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{\log^*_2 16} = 3&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; \mathrm{union}  &amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt; операций  &amp;lt;tex&amp;gt; \mathrm{get} &amp;lt;/tex&amp;gt;. Можем считать, что число операций &amp;lt;tex&amp;gt; \mathrm{union}  &amp;lt;/tex&amp;gt; равно числу элементов множества, так как количество операций &amp;lt;tex&amp;gt;\mathrm{union}&amp;lt;/tex&amp;gt; не превосходит количество элементов множества &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;. Заметим, что &amp;lt;tex&amp;gt;m\geqslant n&amp;lt;/tex&amp;gt;, так как при каждом вызове операции &amp;lt;tex&amp;gt;\mathrm{union}&amp;lt;/tex&amp;gt; дважды вызывается операция &amp;lt;tex&amp;gt;\mathrm{get}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Не теряя общности, будем считать, что &amp;lt;tex&amp;gt; \mathrm{union} &amp;lt;/tex&amp;gt; принимает в качестве аргументов представителей,&lt;br /&gt;
то есть &amp;lt;tex&amp;gt; \mathrm{union(v_1,v_2)} &amp;lt;/tex&amp;gt; заменяем на  &amp;lt;tex&amp;gt; \mathrm{union(get(v_1),get(v_2))} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Оценим стоимость операции &amp;lt;tex&amp;gt; \mathrm{get(v)} &amp;lt;/tex&amp;gt;.  &lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt; \mathrm{R(v)} &amp;lt;/tex&amp;gt; — ранг вершины, &amp;lt;tex&amp;gt;\mathrm{P(v)}&amp;lt;/tex&amp;gt; — представитель множества, содержащего &amp;lt;tex&amp;gt;\mathrm{v}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&amp;lt;tex&amp;gt; \mathrm{L(v)} &amp;lt;/tex&amp;gt; — отец вершины,&lt;br /&gt;
&amp;lt;tex&amp;gt; \mathrm{K(v)} &amp;lt;/tex&amp;gt; — количество вершин в поддереве, корнем которого является &amp;lt;tex&amp;gt;\mathrm{v}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; \mathrm{R(P(v))} \geqslant \mathrm{R(v)} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\mathrm{v}&amp;lt;/tex&amp;gt; — представитель множества, то &amp;lt;tex&amp;gt;\mathrm{P(v)}=\mathrm{v}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; \mathrm{R(P(v))} = \mathrm{R(v)} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Иначе, из принципа работы функции &amp;lt;tex&amp;gt; \mathrm{union} &amp;lt;/tex&amp;gt; следует:&lt;br /&gt;
#&amp;lt;tex&amp;gt; \mathrm{R(L(v))}&amp;gt;\mathrm{R(v)} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Между  &amp;lt;tex&amp;gt; \mathrm{v} &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; \mathrm{P(v)} &amp;lt;/tex&amp;gt; существует путь вида: &amp;lt;tex&amp;gt; \mathrm{v} \rightarrow \mathrm{L(v)} \rightarrow \mathrm{L(L(v))} \rightarrow \dots \rightarrow \mathrm{P(v)} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Записав неравенство из первого пункта вдоль пути из второго пункта, получаем требуемое.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; \mathrm{R(v)} = i \Rightarrow {\mathrm{K(v)}} \geqslant  {2^i}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем по индукции: &lt;br /&gt;
&lt;br /&gt;
Для &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; равенство очевидно.&lt;br /&gt;
Ранг вершины станет равным &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; при объединении поддеревьев ранга &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt;, следовательно:&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{K(v)} \geqslant \mathrm{K(v_1)} + \mathrm{K(v_2)} \geqslant 2^{i-1}+2^{i-1} \geqslant 2^i &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Из последнего утверждения следует:&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; \mathrm{R(v)} \leqslant \log_2n &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Количество вершин ранга &amp;lt;tex&amp;gt; i \leqslant \dfrac{n}  {2^i} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&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;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Амортизационная стоимость &amp;lt;tex&amp;gt; \mathrm{get} = \mathrm{O(\log^{*}n)}  &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
Рассмотрим все вызовы функции &amp;lt;tex&amp;gt;\mathrm{get(u)}&amp;lt;/tex&amp;gt;. В процессе выполнения каждой операции двигаемся вверх по одному из деревьев, заканчивая поиск в его корне. Если вершина &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; не корень и не сын корня, то во время рекурсивных вызовов функции &amp;lt;tex&amp;gt;\mathrm{get(u)}&amp;lt;/tex&amp;gt; текущее значение &amp;lt;tex&amp;gt;\mathrm{R(L(u))}&amp;lt;/tex&amp;gt; возрастает.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; — количество вызовов операции &amp;lt;tex&amp;gt;\mathrm{get(u)}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; — количество вызовов операции &amp;lt;tex&amp;gt;\mathrm{union(v, u)}&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;m\geqslant n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Разделим все вершины на &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; типа:&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; — корень. Таких вызовов &amp;lt;tex&amp;gt;\mathrm{get(u)}&amp;lt;/tex&amp;gt; будет ровно &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
:2. &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; — сын корня. Таких вызовов &amp;lt;tex&amp;gt;\mathrm{get(u)}&amp;lt;/tex&amp;gt; будет не больше чем &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Оставшиеся вершины разделим на:&lt;br /&gt;
:3. Быстро растущие вызовы — такие что &amp;lt;tex&amp;gt;\mathrm{R(P(u))} \geqslant i^{\mathrm{R(u)}}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; — число из диапазона &amp;lt;tex dpi=&amp;quot;150&amp;quot;&amp;gt;e ^{\frac{1}{e}} &amp;lt; i &amp;lt; 2&amp;lt;/tex&amp;gt; &amp;lt;tex dpi=&amp;quot;150&amp;quot;&amp;gt;(e ^{\frac{1}{e}}\approx &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;1.44&amp;lt;/tex&amp;gt;&amp;lt;tex dpi=&amp;quot;150&amp;quot;&amp;gt;)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
:4. Медленно растущие вызовы — &amp;lt;tex&amp;gt;\mathrm{R(P(u))} &amp;lt; i^{\mathrm{R(u)}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для первых двух типов вершин одна операция &amp;lt;tex&amp;gt;\mathrm{get(u)}&amp;lt;/tex&amp;gt; работает за истинное время &amp;lt;tex&amp;gt;\mathrm{O(1)}&amp;lt;/tex&amp;gt;, поэтому их суммарное время работы не превышает &amp;lt;tex&amp;gt;2\cdot m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При каждом вложенном вызове функции &amp;lt;tex&amp;gt;\mathrm{get(u)}&amp;lt;/tex&amp;gt; для вершин третьего типа ранг по условию возрастает до &amp;lt;tex&amp;gt;i^{\mathrm{R(u)}}&amp;lt;/tex&amp;gt;. Ранг вершины может меняться в пределах от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;\log_2n&amp;lt;/tex&amp;gt;. Значит количество рекурсивных вызовов равняется количеству возведений в степень &amp;lt;tex&amp;gt;\mathrm{R(n)}&amp;lt;/tex&amp;gt; числа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;,&lt;br /&gt;
необходимых для достижения числа &amp;lt;tex&amp;gt;\log_2n&amp;lt;/tex&amp;gt;. Или что то же самое, количеству логарифмирований по основанию &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; числа &amp;lt;tex&amp;gt;\log_2n&amp;lt;/tex&amp;gt; для получения &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; и еще одному логарифмированию для получения &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;. Количество логарифмирований описывается функцией &amp;lt;tex dpi=&amp;quot;130&amp;quot;&amp;gt;\log^*_{i} \left (\log_2 n  \right )&amp;lt;/tex&amp;gt;. С учетом последнего логарифмирования формула примет вид &amp;lt;tex dpi=&amp;quot;130&amp;quot;&amp;gt;\log^*_{i}n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда время работы &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; быстро растущих вызовов равно &amp;lt;tex&amp;gt;\mathrm{O(m\cdot \log^* n)}&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;\dfrac{n}{2^k}&amp;lt;/tex&amp;gt;, то суммарное время работы медленно растущих вызовов равно&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex dpi=&amp;quot;150&amp;quot;&amp;gt;\sum_u \limits i^{\mathrm{R(u)}}=\sum_{k=0}^{\log n} \limits \sum_{\mathrm{{R(u)}=k}} \limits i^k \leqslant \sum_{k=0}^{\log n} \limits i^k \cdot \frac{n}{2^k} \leqslant n \cdot \sum_{k=0}^{\log n} \limits \dfrac{i^k}{2^k} = \mathrm{O(n)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
В итоге получаем, что суммарное время работы операции &amp;lt;tex&amp;gt;\mathrm{get(u)}&amp;lt;/tex&amp;gt; равняется &amp;lt;tex&amp;gt;T = \mathrm{O(m)} + \mathrm{O(m\cdot \log^* n)} +\mathrm{O(n)} = \mathrm{O(m\cdot \log^*n + n)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
С учетом того факта что &amp;lt;tex&amp;gt;m\geqslant n&amp;lt;/tex&amp;gt;, амортизированное время работы равно &amp;lt;tex&amp;gt;\mathrm{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;
* [http://habrahabr.ru/blogs/algorithm/104772/ Система непересекающихся множеств {{---}} описание этой реализации на habrahabr.ru]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/Функция_Аккермана  Функция Аккермана {{---}} Википедия]&lt;br /&gt;
* Томас Кормен, Чарльз Лейзерсон, Рональд Ривест, Клиффорд Штайн. Алгоритмы. Построение и анализ —  Вильямс, 2010. - стр 589. — ISBN 978-5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Структуры данных]]&lt;/div&gt;</summary>
		<author><name>5.18.154.236</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%9D%D0%9C_(%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_%D0%BB%D0%B5%D1%81%D0%B0_%D0%BA%D0%BE%D1%80%D0%BD%D0%B5%D0%B2%D1%8B%D1%85_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D0%B5%D0%B2)&amp;diff=51859</id>
		<title>СНМ (реализация с помощью леса корневых деревьев)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%9D%D0%9C_(%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_%D0%BB%D0%B5%D1%81%D0%B0_%D0%BA%D0%BE%D1%80%D0%BD%D0%B5%D0%B2%D1%8B%D1%85_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D0%B5%D0%B2)&amp;diff=51859"/>
				<updated>2016-01-24T17:07:13Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.154.236: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Данная реализация СНМ позволяет добиться наилучшей асимптотики при работе с этой структурой данных. А именно, обе операции (&amp;lt;tex&amp;gt;\mathrm{get}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{union}&amp;lt;/tex&amp;gt;) выполняются в среднем за практически константное время.&lt;br /&gt;
==Реализация==&lt;br /&gt;
Каждое множество хранится в виде дерева. Элементы множества хранятся в узлах дерева. У каждого множества есть его представитель {{---}} один из элементов этого множества, он хранится в корне дерева. В каждом узле, кроме корня, хранится ссылка на &amp;quot;родителя&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
При объединении двух множеств, корень одного дерева подвешивается к другому (операция ''&amp;lt;tex&amp;gt;\mathrm{union}&amp;lt;/tex&amp;gt;''). Таким образом, чтобы определить, в каком множестве находится элемент достаточно пройтись по ссылкам по дереву вверх до корня (операция ''&amp;lt;tex&amp;gt;\mathrm{get}&amp;lt;/tex&amp;gt;'').&lt;br /&gt;
&lt;br /&gt;
Без использования дополнительных &amp;quot;улучшений&amp;quot;, такое дерево может выродиться в линейный список, где &amp;lt;tex&amp;gt;\mathrm{get}&amp;lt;/tex&amp;gt; будет работать за линейное время, и никакого выигрыша по сравнению с [[СНМ(наивные_реализации)|наивными реализацими]] не будет. Выигрыш в скорости можно получить, используя две эвристики: '''объединение по рангу''' (union by rank) и '''сжатие пути''' (path compression).&lt;br /&gt;
&lt;br /&gt;
===Объединение по рангу===&lt;br /&gt;
Эта эвристика аналогична [[СНМ(списки_с_весовой_эвристикой)|весовой эвристике у связных списков]]. Идея в том, чтобы при объединении подвешивать дерево с меньшей глубиной к дереву с большей. &lt;br /&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;
===Сжатие пути===&lt;br /&gt;
Эта эвристика несколько модифицирует операцию ''&amp;lt;tex&amp;gt;\mathrm{get}&amp;lt;/tex&amp;gt;''. Операция &amp;lt;tex&amp;gt;\mathrm{get}&amp;lt;/tex&amp;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{get}&amp;lt;/tex&amp;gt;'' становится двухпроходной.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
Для реализации СНМ будем поддерживать следующие массивы: &amp;lt;tex&amp;gt;p[x]&amp;lt;/tex&amp;gt; {{---}} массив &amp;quot;родителей&amp;quot;, &amp;lt;tex&amp;gt;r[x]&amp;lt;/tex&amp;gt; {{---}} массив рангов.&lt;br /&gt;
===='''get'''====&lt;br /&gt;
 '''function''' '''get'''(x: '''int'''): '''int'''&lt;br /&gt;
   '''if''' p[x] != x&lt;br /&gt;
     p[x] = get(p[x])&lt;br /&gt;
   '''return''' p[x]&lt;br /&gt;
&lt;br /&gt;
===='''union'''====&lt;br /&gt;
 '''function''' '''union'''(x: '''int''', y: '''int'''):&lt;br /&gt;
   x = get(x)&lt;br /&gt;
   y = get(y)&lt;br /&gt;
   '''if''' x == y&lt;br /&gt;
     '''return'''&lt;br /&gt;
   '''if''' r[x] == r[y]&lt;br /&gt;
     r[x]++&lt;br /&gt;
   '''if''' r[x] &amp;lt; r[y]&lt;br /&gt;
     p[x] = y&lt;br /&gt;
   '''else'''&lt;br /&gt;
     p[y] = x&lt;br /&gt;
	 &lt;br /&gt;
Также возможна реализация функции &amp;lt;tex&amp;gt;\mathrm{get}&amp;lt;/tex&amp;gt; без использования &amp;lt;tex&amp;gt;\mathrm{O(\log n)}&amp;lt;/tex&amp;gt; дополнительнй памяти.&lt;br /&gt;
&lt;br /&gt;
===='''get'''====&lt;br /&gt;
 '''function''' '''get'''(x: '''int'''): '''int'''&lt;br /&gt;
  root = x&lt;br /&gt;
  '''while''' p[root] != root&lt;br /&gt;
    root = p[root]&lt;br /&gt;
  i = x&lt;br /&gt;
  '''while''' p[i] != i&lt;br /&gt;
    j = p[i]&lt;br /&gt;
    p[i] = root&lt;br /&gt;
    i = j&lt;br /&gt;
  '''return''' root&lt;br /&gt;
&lt;br /&gt;
==Асимптотика==&lt;br /&gt;
:''см. также [[Анализ_реализации_с_ранговой_эвристикой|Анализ реализации с ранговой эвристикой]]''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|-&lt;br /&gt;
!Операция !! Истинное время !! Амортизированное время&lt;br /&gt;
|- style = &amp;quot;text-align = center&amp;quot;&lt;br /&gt;
| ''&amp;lt;tex&amp;gt;\mathrm{get}&amp;lt;/tex&amp;gt;''                  || &amp;lt;tex&amp;gt;\mathrm{O(\log n)}&amp;lt;/tex&amp;gt;        ||  &amp;lt;tex&amp;gt;\mathrm{O(\mathrm{\alpha(m, n)})}&amp;lt;/tex&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| ''&amp;lt;tex&amp;gt;\mathrm{union}&amp;lt;/tex&amp;gt;''                || &amp;lt;tex&amp;gt;\mathrm{O(\log n)}&amp;lt;/tex&amp;gt;            ||  &amp;lt;tex&amp;gt;\mathrm{O(\mathrm{\alpha(m, 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; {{---}} полное количество элементов, &amp;lt;tex&amp;gt;\mathrm{\alpha(m, n)}&amp;lt;/tex&amp;gt; {{---}} функция, обратная к функции Аккермана (если &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt;\mathrm{get}&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;k&amp;lt;/tex&amp;gt;, то в нем содержится как минимум &amp;lt;tex&amp;gt;2^k&amp;lt;/tex&amp;gt; элементов. Из этого свойства следует, что глубина множества с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементами есть &amp;lt;tex&amp;gt;\mathrm{O(\log n)}&amp;lt;/tex&amp;gt;, а значит и время работы операции &amp;lt;tex&amp;gt;\mathrm{get}&amp;lt;/tex&amp;gt; является логарифмическим.&lt;br /&gt;
&lt;br /&gt;
Будем доказывать данное свойство по индукции. Для &amp;lt;tex&amp;gt;k = 0&amp;lt;/tex&amp;gt;, очевидно, в множестве содержится &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; вершина. Пусть для множеств ранга &amp;lt;tex&amp;gt;k - 1&amp;lt;/tex&amp;gt; свойство выполняется. Как следует из ранговой эвристики, множество ранга &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; может получиться только при подвешивании множества ранга &amp;lt;tex&amp;gt;k - 1&amp;lt;/tex&amp;gt; к множеству ранга &amp;lt;tex&amp;gt;k - 1&amp;lt;/tex&amp;gt;. Но тогда из предположения индукции в новом множестве действительно будет &amp;lt;tex&amp;gt;2^k&amp;lt;/tex&amp;gt; вершин, что и требовалось доказать.&lt;br /&gt;
&lt;br /&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;\mathrm{A(m, n)} = \begin{cases}&lt;br /&gt;
 2^n, &amp;amp; m = 1 \\&lt;br /&gt;
 2, &amp;amp; m &amp;gt; 1, n = 0 \\&lt;br /&gt;
 \mathrm{A(m - 1, A(m, n - 1))}, &amp;amp; m &amp;gt; 1, n &amp;gt; 0&lt;br /&gt;
\end{cases} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таблица значений функции Аккермана:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|-&lt;br /&gt;
!&amp;lt;tex&amp;gt;\mathbf{m \backslash n}&amp;lt;/tex&amp;gt; !! &amp;lt;tex&amp;gt;\mathbf{0}&amp;lt;/tex&amp;gt; !! &amp;lt;tex&amp;gt;\mathbf{1}&amp;lt;/tex&amp;gt; !! &amp;lt;tex&amp;gt;\mathbf{2}&amp;lt;/tex&amp;gt; !! &amp;lt;tex&amp;gt;\mathbf{3}&amp;lt;/tex&amp;gt; !! &amp;lt;tex&amp;gt;\mathbf{4}&amp;lt;/tex&amp;gt; !! &amp;lt;tex&amp;gt;\mathbf{5}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-style = &amp;quot;text-align = center&amp;quot;&lt;br /&gt;
! &amp;lt;tex&amp;gt;\mathbf{1}&amp;lt;/tex&amp;gt; &lt;br /&gt;
| &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; ||  &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;8&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;16&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;32&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;tex&amp;gt;\mathbf{2}&amp;lt;/tex&amp;gt; &lt;br /&gt;
| &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;16&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;65536&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;2^{2^{16}}&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;2^{2^{2^{16}}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;tex&amp;gt;\mathbf{3}&amp;lt;/tex&amp;gt; &lt;br /&gt;
| &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;16&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\underbrace{2^{2^{\cdot^{\cdot^{\cdot^2}}}}}_{17}&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\underbrace{2^{2^{\cdot^{\cdot^{\cdot^2}}}}}_{A(3, 2)}&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;tex&amp;gt;\mathbf{4}&amp;lt;/tex&amp;gt; &lt;br /&gt;
| &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\underbrace{2^{2^{\cdot^{\cdot^{\cdot^2}}}}}_{17}&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Функция, обратная функции Аккермана &amp;lt;tex&amp;gt;\mathrm{\alpha(m, n)}&amp;lt;/tex&amp;gt;, равна минимальному &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; такому, что &amp;lt;tex&amp;gt;\mathrm{A \left (i, \left [\dfrac{m}{n} \right ] \right )} \geqslant \log n&amp;lt;/tex&amp;gt;. Как видно из таблицы значений для функции Аккермана, обратная функция для любых значений, которые могут возникнуть при решении прикладных задач, не превышает 4, то есть можно считать, что операция &amp;lt;tex&amp;gt;\mathrm{get}&amp;lt;/tex&amp;gt; выполняется за константное время.&lt;br /&gt;
&lt;br /&gt;
===Анализ реализации с ранговой эвристикой===&lt;br /&gt;
&lt;br /&gt;
Проведем анализ реализации с ранговой эвристикой. Будем доказывать, что амортизационная стоимость &amp;lt;tex&amp;gt; \mathrm{get} = \mathrm{O(\log^{*}n)}  &amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''Итерированный логарифм''' (англ. ''Iterated logarithm'') &amp;lt;tex&amp;gt;\mathrm{\log^*n}&amp;lt;/tex&amp;gt; — минимальное число логарифмирований &amp;lt;tex&amp;gt;n&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{\log^*_2 16} = 3&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; \mathrm{union}  &amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt; операций  &amp;lt;tex&amp;gt; \mathrm{get} &amp;lt;/tex&amp;gt;. Можем считать, что число операций &amp;lt;tex&amp;gt; \mathrm{union}  &amp;lt;/tex&amp;gt; равно числу элементов множества, так как количество операций &amp;lt;tex&amp;gt;\mathrm{union}&amp;lt;/tex&amp;gt; не превосходит количество элементов множества &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;. Заметим, что &amp;lt;tex&amp;gt;m\geqslant n&amp;lt;/tex&amp;gt;, так как при каждом вызове операции &amp;lt;tex&amp;gt;\mathrm{union}&amp;lt;/tex&amp;gt; дважды вызывается операция &amp;lt;tex&amp;gt;\mathrm{get}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Не теряя общности, будем считать, что &amp;lt;tex&amp;gt; \mathrm{union} &amp;lt;/tex&amp;gt; принимает в качестве аргументов представителей,&lt;br /&gt;
то есть &amp;lt;tex&amp;gt; \mathrm{union(v_1,v_2)} &amp;lt;/tex&amp;gt; заменяем на  &amp;lt;tex&amp;gt; \mathrm{union(get(v_1),get(v_2))} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Оценим стоимость операции &amp;lt;tex&amp;gt; \mathrm{get(v)} &amp;lt;/tex&amp;gt;.  &lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt; \mathrm{R(v)} &amp;lt;/tex&amp;gt; — ранг вершины, &amp;lt;tex&amp;gt;\mathrm{P(v)}&amp;lt;/tex&amp;gt; — представитель множества, содержащего &amp;lt;tex&amp;gt;\mathrm{v}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&amp;lt;tex&amp;gt; \mathrm{L(v)} &amp;lt;/tex&amp;gt; — отец вершины,&lt;br /&gt;
&amp;lt;tex&amp;gt; \mathrm{K(v)} &amp;lt;/tex&amp;gt; — количество вершин в поддереве, корнем которого является &amp;lt;tex&amp;gt;\mathrm{v}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; \mathrm{R(P(v))} \geqslant \mathrm{R(v)} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\mathrm{v}&amp;lt;/tex&amp;gt; — представитель множества, то &amp;lt;tex&amp;gt;\mathrm{P(v)}=\mathrm{v}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; \mathrm{R(P(v))} = \mathrm{R(v)} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Иначе, из принципа работы функции &amp;lt;tex&amp;gt; \mathrm{union} &amp;lt;/tex&amp;gt; следует:&lt;br /&gt;
#&amp;lt;tex&amp;gt; \mathrm{R(L(v))}&amp;gt;\mathrm{R(v)} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Между  &amp;lt;tex&amp;gt; \mathrm{v} &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; \mathrm{P(v)} &amp;lt;/tex&amp;gt; существует путь вида: &amp;lt;tex&amp;gt; \mathrm{v} \rightarrow \mathrm{L(v)} \rightarrow \mathrm{L(L(v))} \rightarrow \dots \rightarrow \mathrm{P(v)} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Записав неравенство из первого пункта вдоль пути из второго пункта, получаем требуемое.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; \mathrm{R(v)} = i \Rightarrow {\mathrm{K(v)}} \geqslant  {2^i}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем по индукции: &lt;br /&gt;
&lt;br /&gt;
Для &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; равенство очевидно.&lt;br /&gt;
Ранг вершины станет равным &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; при объединении поддеревьев ранга &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt;, следовательно:&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{K(v)} \geqslant \mathrm{K(v_1)} + \mathrm{K(v_2)} \geqslant 2^{i-1}+2^{i-1} \geqslant 2^i &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Из последнего утверждения следует:&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; \mathrm{R(v)} \leqslant \log_2n &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Количество вершин ранга &amp;lt;tex&amp;gt; i \leqslant \dfrac{n}  {2^i} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&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;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Амортизационная стоимость &amp;lt;tex&amp;gt; \mathrm{get} = \mathrm{O(\log^{*}n)}  &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
Рассмотрим все вызовы функции &amp;lt;tex&amp;gt;\mathrm{get(u)}&amp;lt;/tex&amp;gt;. В процессе выполнения каждой операции двигаемся вверх по одному из деревьев, заканчивая поиск в его корне. Если вершина &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; не корень и не сын корня, то во время рекурсивных вызовов функции &amp;lt;tex&amp;gt;\mathrm{get(u)}&amp;lt;/tex&amp;gt; текущее значение &amp;lt;tex&amp;gt;\mathrm{R(L(u))}&amp;lt;/tex&amp;gt; возрастает.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; — количество вызовов операции &amp;lt;tex&amp;gt;\mathrm{get(u)}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; — количество вызовов операции &amp;lt;tex&amp;gt;\mathrm{union(v, u)}&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;m\geqslant n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Разделим все вершины на &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; типа:&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; — корень. Таких вызовов &amp;lt;tex&amp;gt;\mathrm{get(u)}&amp;lt;/tex&amp;gt; будет ровно &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
:2. &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; — сын корня. Таких вызовов &amp;lt;tex&amp;gt;\mathrm{get(u)}&amp;lt;/tex&amp;gt; будет не больше чем &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Оставшиеся вершины разделим на:&lt;br /&gt;
:3. Быстро растущие вызовы — такие что &amp;lt;tex&amp;gt;\mathrm{R(L(u))} \geqslant i^{\mathrm{R(u)}}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; — число из диапазона &amp;lt;tex dpi=&amp;quot;150&amp;quot;&amp;gt;e ^{\frac{1}{e}} &amp;lt; i &amp;lt; 2&amp;lt;/tex&amp;gt; &amp;lt;tex dpi=&amp;quot;150&amp;quot;&amp;gt;(e ^{\frac{1}{e}}\approx &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;1.44&amp;lt;/tex&amp;gt;&amp;lt;tex dpi=&amp;quot;150&amp;quot;&amp;gt;)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
:4. Медленно растущие вызовы — &amp;lt;tex&amp;gt;\mathrm{R(L(u))} &amp;lt; i^{\mathrm{R(u)}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для первых двух типов вершин одна операция &amp;lt;tex&amp;gt;\mathrm{get(u)}&amp;lt;/tex&amp;gt; работает за истинное время &amp;lt;tex&amp;gt;\mathrm{O(1)}&amp;lt;/tex&amp;gt;, поэтому их суммарное время работы не превышает &amp;lt;tex&amp;gt;2\cdot m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При каждом вложенном вызове функции &amp;lt;tex&amp;gt;\mathrm{get(u)}&amp;lt;/tex&amp;gt; для вершин третьего типа ранг по условию возрастает до &amp;lt;tex&amp;gt;i^{\mathrm{R(u)}}&amp;lt;/tex&amp;gt;. Ранг вершины может меняться в пределах от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;\log_2n&amp;lt;/tex&amp;gt;. Значит количество рекурсивных вызовов равняется количеству возведений в степень &amp;lt;tex&amp;gt;\mathrm{R(n)}&amp;lt;/tex&amp;gt; числа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;,&lt;br /&gt;
необходимых для достижения числа &amp;lt;tex&amp;gt;\log_2n&amp;lt;/tex&amp;gt;. Или что то же самое, количеству логарифмирований по основанию &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; числа &amp;lt;tex&amp;gt;\log_2n&amp;lt;/tex&amp;gt; для получения &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; и еще одному логарифмированию для получения &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;. Количество логарифмирований описывается функцией &amp;lt;tex dpi=&amp;quot;130&amp;quot;&amp;gt;\log^*_{i} \left (\log_2 n  \right )&amp;lt;/tex&amp;gt;. С учетом последнего логарифмирования формула примет вид &amp;lt;tex dpi=&amp;quot;130&amp;quot;&amp;gt;\log^*_{i}n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда время работы &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; быстро растущих вызовов равно &amp;lt;tex&amp;gt;\mathrm{O(m\cdot \log^* n)}&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;\dfrac{n}{2^k}&amp;lt;/tex&amp;gt;, то суммарное время работы медленно растущих вызовов равно&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex dpi=&amp;quot;150&amp;quot;&amp;gt;\sum_u \limits i^{\mathrm{R(u)}}=\sum_{k=0}^{\log n} \limits \sum_{\mathrm{{R(u)}=k}} \limits i^k \leqslant \sum_{k=0}^{\log n} \limits i^k \cdot \frac{n}{2^k} \leqslant n \cdot \sum_{k=0}^{\log n} \limits \dfrac{i^k}{2^k} = \mathrm{O(n)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
В итоге получаем, что суммарное время работы операции &amp;lt;tex&amp;gt;\mathrm{get(u)}&amp;lt;/tex&amp;gt; равняется &amp;lt;tex&amp;gt;T = \mathrm{O(m)} + \mathrm{O(m\cdot \log^* n)} +\mathrm{O(n)} = \mathrm{O(m\cdot \log^*n + n)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
С учетом того факта что &amp;lt;tex&amp;gt;m\geqslant n&amp;lt;/tex&amp;gt;, амортизированное время работы равно &amp;lt;tex&amp;gt;\mathrm{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;
* [http://habrahabr.ru/blogs/algorithm/104772/ Система непересекающихся множеств {{---}} описание этой реализации на habrahabr.ru]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/Функция_Аккермана  Функция Аккермана {{---}} Википедия]&lt;br /&gt;
* Томас Кормен, Чарльз Лейзерсон, Рональд Ривест, Клиффорд Штайн. Алгоритмы. Построение и анализ —  Вильямс, 2010. - стр 589. — ISBN 978-5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Структуры данных]]&lt;/div&gt;</summary>
		<author><name>5.18.154.236</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%86%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D1%83%D1%84%D1%84%D0%B8%D0%BA%D1%81%D0%BE%D0%B2_%D1%86%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8&amp;diff=51688</id>
		<title>Алгоритм цифровой сортировки суффиксов циклической строки</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%86%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D1%83%D1%84%D1%84%D0%B8%D0%BA%D1%81%D0%BE%D0%B2_%D1%86%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8&amp;diff=51688"/>
				<updated>2016-01-23T10:39:24Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.154.236: /* Описание алгоритма */  исправлена опечатка&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Задача&lt;br /&gt;
|definition = Дана циклическая строка &amp;lt;tex&amp;gt;s[0 .. n - 1]&amp;lt;/tex&amp;gt;. Суффиксом циклической строки &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; называется строка &amp;lt;tex&amp;gt;s[i .. n - 1] + s[0 .. i - 1], i &amp;lt; n &amp;lt;/tex&amp;gt; (будем называть такую строкую суффиксом под номером &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;). Требуется отсортировать все её суффиксы в порядке лексикографической сортировки.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Решение ==&lt;br /&gt;
Рассматриваемый алгоритм состоит из &amp;lt;tex&amp;gt;\lceil\log n\rceil + 1&amp;lt;/tex&amp;gt; итераций. На &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-той итерации (&amp;lt;tex&amp;gt;k=0..\lceil\log n\rceil &amp;lt;/tex&amp;gt;) сортируются циклические подстроки длины &amp;lt;tex&amp;gt;2^k&amp;lt;/tex&amp;gt;. На последней, &amp;lt;tex&amp;gt;\lceil\log n\rceil&amp;lt;/tex&amp;gt;-ой итерации, будут сортироваться подстроки длины &amp;lt;tex&amp;gt;2^{\lceil\log n\rceil} \geqslant n&amp;lt;/tex&amp;gt;, что эквивалентно сортировке циклических сдвигов.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации будем хранить массив перестановки &amp;lt;tex&amp;gt;p[0 .. n - 1]&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;p[i]&amp;lt;/tex&amp;gt; — номер суффикса, занимающего позицию &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в текущей перестановке. Также будем хранить массив классов эквивалентности &amp;lt;tex&amp;gt;c[0 .. n - 1]&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;c[i]&amp;lt;/tex&amp;gt; — класс эквивалентности, которому принадлежит префикс длины &amp;lt;tex&amp;gt;2^k&amp;lt;/tex&amp;gt; суффикса под номером &amp;lt;tex&amp;gt;p[i]&amp;lt;/tex&amp;gt;. При этом если префикс суффикса под номером &amp;lt;tex&amp;gt;p[i]&amp;lt;/tex&amp;gt; лексикографически меньше префикса суффикса под номером &amp;lt;tex&amp;gt;p[j]&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;c[i] &amp;lt; c[j]&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;
На нулевой итерации отсортируем циклические подстроки длины &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, т.е. первые символы строк, и разделим их на классы эквивалентности (одинаковые символы должны быть отнесены к одному классу эквивалентности). При помощи [[Сортировка подсчетом|сортировки подсчетом]] построим массив &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;, содержащий номера суффиксов, отсортированных в лексикографическом порядке. По этому массиву построим массив классов эквивалентности &amp;lt;tex&amp;gt;c&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;p&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt;, вычисленные на предыдущей итерации. Приведем алгоритм, выполняющий &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-ый проход за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;. Поскольку итераций всего &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;, такой алгоритм имеет асимптотику &amp;lt;tex&amp;gt;O(n \log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&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;O(1)&amp;lt;/tex&amp;gt;, используя информацию с предыдущей итерации — номера классов эквивалентности &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt;. Таким образом, для подстроки длины &amp;lt;tex&amp;gt;2^k&amp;lt;/tex&amp;gt;, начинающейся в позиции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, вся необходимая информация содержится в паре чисел &amp;lt;tex&amp;gt;\langle c[i], c[i + 2^{k-1}]\rangle &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Suff_array.png|350px|thumb|right|Циклическая подстрока длины &amp;lt;tex&amp;gt;2^k&amp;lt;/tex&amp;gt; и порядок ее частей с прерыдущей итерации.]]&lt;br /&gt;
&lt;br /&gt;
Отсортируем подстроки длины &amp;lt;tex&amp;gt;2^k&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;2^{k-1}&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; даёт упорядочение подстрок длины &amp;lt;tex&amp;gt;2^{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;
Осталось пересчитать номера классов эквивалентности &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt;, пройдя по новой перестановке &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; и сравнивая соседние элементы (как пары двух чисел).&lt;br /&gt;
&lt;br /&gt;
==Пример==&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
s = abacaba\$ \\&lt;br /&gt;
i' = i + 2^{k-1} \\&lt;br /&gt;
\\&lt;br /&gt;
\begin{tabular}{|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|}&lt;br /&gt;
\hline&lt;br /&gt;
\multicolumn{3}{|l|}{0 iteration} &amp;amp; \multicolumn{4}{l|}{1 iteration}              &amp;amp; \multicolumn{4}{l|}{2 iteration}                &amp;amp; \multicolumn{4}{l|}{3 iteration}                    \\ \hline&lt;br /&gt;
p       &amp;amp;         &amp;amp; c      &amp;amp; p &amp;amp;     &amp;amp; $\langle c[i], c[i']\rangle$ &amp;amp; c &amp;amp; p &amp;amp;       &amp;amp; $\langle c[i], c[i']\rangle$ &amp;amp; c &amp;amp; p &amp;amp;           &amp;amp; $\langle c[i], c[i']\rangle$ &amp;amp; c \\ \hline&lt;br /&gt;
7       &amp;amp; \$       &amp;amp; 1      &amp;amp; 7 &amp;amp; \$a &amp;amp; $\langle1, 2\rangle$ &amp;amp; 1 &amp;amp; 7 &amp;amp; \$aba &amp;amp; $\langle1, 5\rangle$ &amp;amp; 1 &amp;amp; 7 &amp;amp; \$abacaba &amp;amp; $\langle1, 8\rangle$ &amp;amp; 1 \\ \hline&lt;br /&gt;
0       &amp;amp; a       &amp;amp; 2      &amp;amp; 6 &amp;amp; a\$ &amp;amp; $\langle2, 1\rangle$ &amp;amp; 2 &amp;amp; 6 &amp;amp; a\$ab &amp;amp; $\langle2, 3\rangle$ &amp;amp; 2 &amp;amp; 6 &amp;amp; a\$abacab &amp;amp; $\langle2, 5\rangle$ &amp;amp; 2 \\ \hline&lt;br /&gt;
2       &amp;amp; a       &amp;amp; 2      &amp;amp; 0 &amp;amp; ab  &amp;amp; $\langle2, 3\rangle$ &amp;amp; 3 &amp;amp; 4 &amp;amp; aba\$ &amp;amp; $\langle3, 2\rangle$ &amp;amp; 3 &amp;amp; 4 &amp;amp; aba\$abac &amp;amp; $\langle3, 4\rangle$ &amp;amp; 3 \\ \hline&lt;br /&gt;
4       &amp;amp; a       &amp;amp; 2      &amp;amp; 4 &amp;amp; ab  &amp;amp; $\langle2, 3\rangle$ &amp;amp; 3 &amp;amp; 0 &amp;amp; abac  &amp;amp; $\langle3, 4\rangle$ &amp;amp; 4 &amp;amp; 0 &amp;amp; abacaba\$ &amp;amp; $\langle4, 3\rangle$ &amp;amp; 4 \\ \hline&lt;br /&gt;
6       &amp;amp; a       &amp;amp; 2      &amp;amp; 2 &amp;amp; ac  &amp;amp; $\langle2, 4\rangle$ &amp;amp; 4 &amp;amp; 2 &amp;amp; acab  &amp;amp; $\langle4, 3\rangle$ &amp;amp; 5 &amp;amp; 2 &amp;amp; acaba\$ab &amp;amp; $\langle5, 2\rangle$ &amp;amp; 5 \\ \hline&lt;br /&gt;
1       &amp;amp; b       &amp;amp; 3      &amp;amp; 1 &amp;amp; ba  &amp;amp; $\langle3, 1\rangle$ &amp;amp; 5 &amp;amp; 5 &amp;amp; ba\$a &amp;amp; $\langle5, 1\rangle$ &amp;amp; 6 &amp;amp; 5 &amp;amp; ba\$abaca &amp;amp; $\langle6, 7\rangle$ &amp;amp; 6 \\ \hline&lt;br /&gt;
5       &amp;amp; b       &amp;amp; 3      &amp;amp; 5 &amp;amp; ba  &amp;amp; $\langle3, 1\rangle$ &amp;amp; 5 &amp;amp; 1 &amp;amp; baca  &amp;amp; $\langle5, 6\rangle$ &amp;amp; 7 &amp;amp; 1 &amp;amp; bacaba\$a &amp;amp; $\langle7, 6\rangle$ &amp;amp; 7 \\ \hline&lt;br /&gt;
3       &amp;amp; c       &amp;amp; 4      &amp;amp; 3 &amp;amp; ca  &amp;amp; $\langle4, 1\rangle$ &amp;amp; 6 &amp;amp; 3 &amp;amp; caba  &amp;amp; $\langle6, 5\rangle$  &amp;amp; 8 &amp;amp; 3 &amp;amp; caba\$aba &amp;amp; $\langle8, 1\rangle$ &amp;amp; 8 \\ \hline&lt;br /&gt;
\end{tabular}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
    &amp;lt;font color=darkgreen&amp;gt;/* преобразует масив count, так что&lt;br /&gt;
       теперь он содержит позиции в массиве suffs с которых &lt;br /&gt;
       необходимо вставлять подстроки, начинающиеся с соответствующих символов */&amp;lt;/font&amp;gt;&lt;br /&gt;
    '''int[]''' calc_positions('''int[]''' count)&lt;br /&gt;
        count[0] = 0&lt;br /&gt;
        '''for''' i = 2 .. count.length - 1&lt;br /&gt;
            count[i] += count[i - 1]&lt;br /&gt;
        '''return''' count&lt;br /&gt;
       &lt;br /&gt;
    &amp;lt;font color=darkgreen&amp;gt;/* принимает строку, для которой требуется построить суффиксный массив&lt;br /&gt;
       возвращает суффиксный массив */&amp;lt;/font&amp;gt;&lt;br /&gt;
    '''int[]''' suff_array('''string''' str)&lt;br /&gt;
        s += '$'&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;font color=darkgreen&amp;gt;// нулевая итерация&amp;lt;/font&amp;gt;&lt;br /&gt;
        count = '''int'''[max(&amp;lt;tex&amp;gt;|\Sigma|&amp;lt;/tex&amp;gt;, str.length)]&lt;br /&gt;
        '''fill'''(count, 0)&lt;br /&gt;
        '''for''' ch '''in''' str&lt;br /&gt;
            count[ch]++&lt;br /&gt;
        count = '''calc_positions'''(count)&lt;br /&gt;
        &amp;lt;font color=darkgreen&amp;gt;// suffs будет хранить индексы начал отсортированных подстрок текущей длины&amp;lt;/font&amp;gt;&lt;br /&gt;
        suffs = '''int'''[str.length]&lt;br /&gt;
        '''for''' ch '''in''' str&lt;br /&gt;
            suffs[count[ch]++] = i&lt;br /&gt;
        classes = '''int'''[str.length]&lt;br /&gt;
        classesN = 0&lt;br /&gt;
        last_char = '$'&lt;br /&gt;
        '''for''' suf '''in''' suffs&lt;br /&gt;
            '''if''' s[suf] &amp;lt;tex&amp;gt; \neq &amp;lt;/tex&amp;gt; last_char&lt;br /&gt;
                last_char = s[suf[i]]&lt;br /&gt;
                classesN++&lt;br /&gt;
            classes[suf] = classesN&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;font color=darkgreen&amp;gt;// нулевая итерация завершена&lt;br /&gt;
        // сортируем подстроки длиной 2 * cur_len = 2^k&amp;lt;/font&amp;gt;&lt;br /&gt;
        cur_len = 1&lt;br /&gt;
        '''while''' cur_len &amp;lt;tex&amp;gt; \leqslant &amp;lt;/tex&amp;gt; str.length&lt;br /&gt;
            &amp;lt;font color=darkgreen&amp;gt;// сортируем по второй половине подстроки&amp;lt;/font&amp;gt;&lt;br /&gt;
            sorted_by2 = '''int'''[str.length]&lt;br /&gt;
            '''for''' i = 0 .. str.length - 1&lt;br /&gt;
                sorted_by2[i] = (suffs[i] + str.length - cur_len) '''mod''' str.length&lt;br /&gt;
            &amp;lt;font color=darkgreen&amp;gt;// сортируем по первой половине&lt;br /&gt;
            // сортировка устойчивая, значит получим целиком отсортированные подстроки&amp;lt;/font&amp;gt;&lt;br /&gt;
            '''fill'''(count, 0)&lt;br /&gt;
            '''for''' by2 '''in''' sorted_by2&lt;br /&gt;
                count[classes[by2]]++&lt;br /&gt;
            count = '''calc_positions'''(count)&lt;br /&gt;
            '''for''' i = 0 .. str.length - 1&lt;br /&gt;
                suffs[count[classes[sorted_by2[i]]]++] = sorted_by2[i]&lt;br /&gt;
            &lt;br /&gt;
            new_classes = '''int'''[str.length]&lt;br /&gt;
            classesN = 0&lt;br /&gt;
            '''for''' i = 0 .. str.length - 1&lt;br /&gt;
                mid1 = (suffs[i] + cur_len) '''mod''' str.length&lt;br /&gt;
                mid2 = (suffs[i - 1] + cur_len) '''mod''' str.length&lt;br /&gt;
                '''if''' classes[suffs[i]] &amp;lt;tex&amp;gt; \neq &amp;lt;/tex&amp;gt; classes[suffs[i-1]] '''or''' classes[mid1] &amp;lt;tex&amp;gt; \neq &amp;lt;/tex&amp;gt; classes[mid2]&lt;br /&gt;
                    classesN++&lt;br /&gt;
                new_classes[suffs[i]] = classesN&lt;br /&gt;
            classes = new_classes&lt;br /&gt;
            cur_len *= 2&lt;br /&gt;
        '''return''' suffs&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Суффиксный массив]]&lt;br /&gt;
* [[Построение суффиксного массива с помощью стандартных методов сортировки]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://e-maxx.ru/algo/suffix_array MAXimal :: algo :: Суффиксный массив]&lt;br /&gt;
* [http://www.geeksforgeeks.org/suffix-array-set-2-a-nlognlogn-algorithm Suffix Array | Set 2 (nLogn Algorithm)]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Суффиксный массив]]&lt;br /&gt;
[[Категория: Структуры данных]]&lt;/div&gt;</summary>
		<author><name>5.18.154.236</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D1%81%D1%82%D0%B5%D0%B9%D1%88%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%81%D0%B8%D0%BD%D1%82%D0%B5%D0%B7%D0%B0_%D1%81%D1%85%D0%B5%D0%BC_%D0%B8%D0%B7_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2&amp;diff=51338</id>
		<title>Простейшие методы синтеза схем из функциональных элементов</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D1%81%D1%82%D0%B5%D0%B9%D1%88%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%81%D0%B8%D0%BD%D1%82%D0%B5%D0%B7%D0%B0_%D1%81%D1%85%D0%B5%D0%BC_%D0%B8%D0%B7_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2&amp;diff=51338"/>
				<updated>2016-01-18T11:09:01Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.154.236: /* Метод синтеза схем К.Э.Шеннона */ Исправлена ссылка на Шеннона&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
&lt;br /&gt;
|definition= Синтезом [[Реализация булевой функции схемой из функциональных элементов|схемы из функциональных элементов]] называется процедура получения логической схемы, реализующей заданную логическую функцию.&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; f(x_{1}, ..., x_{n}) &amp;lt;/tex&amp;gt;, в случае когда базис &amp;lt;tex&amp;gt; B = \{\neg, \lor, \land\} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Метод синтеза, основанный на [[СДНФ|совершенной ДНФ]]==&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id = Lemma1&lt;br /&gt;
|about = 1&lt;br /&gt;
|statement =Любой конъюнкт в СДНФ можно представить не более, чем &amp;lt;tex&amp;gt; 2n-1 &amp;lt;/tex&amp;gt; элементами.&lt;br /&gt;
|proof =  [[Файл:Synschemes Lemma1.png|250px|thumb|right|Рис 1. Схема для &amp;lt;tex&amp;gt; \bar{x}_{1}\wedge x_{2}\wedge x_{3} \wedge \bar{x}_{4}&amp;lt;/tex&amp;gt;. Сложность построенной схемы &amp;lt;tex&amp;gt;size_{B}(f)=2+3=5\le 7&amp;lt;/tex&amp;gt;.]] &lt;br /&gt;
Построим данную схему следующим образом: если &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;-й множитель равен &amp;lt;tex&amp;gt; \bar{x}_{i} &amp;lt;/tex&amp;gt;, то присоединяем к выходу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; элемент отрицания и последовательно присоединяем к элементу конъюнкции, иначе просто присоединяем к &amp;quot;свободному&amp;quot; входу элемента конъюнкции.&lt;br /&gt;
&lt;br /&gt;
Очевидно, что сложность построенной схемы &amp;lt;tex&amp;gt; size_{B}(f)= n+n-1 = 2n-1 &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Поэтому &amp;lt;tex&amp;gt; size_{B}(f)\le 2n-1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведем пример для &amp;lt;tex&amp;gt; f=\bar{x}_{1}\wedge x_{2}\wedge x_{3} \wedge \bar{x}_{4}&amp;lt;/tex&amp;gt; (рис. 1).&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id = Th1 &lt;br /&gt;
|about = 1&lt;br /&gt;
|statement = Для любой функции &amp;lt;tex&amp;gt; f(x_{1}, ..., x_{n}) &amp;lt;/tex&amp;gt; имеет место неравенство &amp;lt;tex&amp;gt; size_{B}(f)\le n2^{n+1} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof = [[Файл:Synschemes Theorem1.png|250px|thumb|right|Рис. 2]]&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; f(x_{1},...,x_{n}) &amp;lt;/tex&amp;gt; {{---}} произвольная [[Определение булевой функции|булева функция]].&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt; f = 0 &amp;lt;/tex&amp;gt;, то схема строится в соответствии с представлением &amp;lt;tex&amp;gt; 0=x_{1}\wedge\overline{x}_{1} &amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt; size_{B}(0) \le 2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt; f \ne 0 &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; f &amp;lt;/tex&amp;gt; может быть задана [[ДНФ|дизъюнктивной нормальной формой]]&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt; f(x_{1},...,x_{n}) = K_{1} \vee K_{2} \vee ... \vee K_{s} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt; s \le 2^{n} &amp;lt;/tex&amp;gt; и каждая конъюнкция имеет вид &lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt; K_{j}=x_{1}\wedge\overline{x}_{2}\wedge{x}_{3}\wedge ... \wedge{x}_{i} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Схема &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt; f &amp;lt;/tex&amp;gt; состоит из конъюнкций &amp;lt;tex&amp;gt; K_{j} &amp;lt;/tex&amp;gt; (каждая из них в соответствии с  [[#Lemma1|леммой 1]] имеет сложность не более &amp;lt;tex&amp;gt; 2n-1 &amp;lt;/tex&amp;gt;) и цепочки из &amp;lt;tex&amp;gt; s-1 &amp;lt;/tex&amp;gt; элемента дизъюнкции с &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; свободными входами. Свободные входы этой цепочки присоединяются к выходам схем для конъюнкций &amp;lt;tex&amp;gt; K_{j} &amp;lt;/tex&amp;gt;.(рис. 2) Имеем&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt; size_{B}(f)\le s\cdot(2n-1)+s-1 &amp;lt; s\cdot(2n-1)+s = 2ns \le n2^{n+1} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для любой функции &amp;lt;tex&amp;gt; f(x_{1},...,x_{n}) &amp;lt;/tex&amp;gt; выполняется неравенство &lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt; size_{B}(f(x_{1},...,x_{n}))\le n2^{n+1} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому &amp;lt;tex&amp;gt; size_{B}(f)\le n2^{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;
|definition= &amp;lt;tex&amp;gt; f(n) \sim g(n) &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;\lim\limits_{n \to \infty}\frac{f(n)}{g(n)} = 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt; f(n) \lesssim g(n) &amp;lt;/tex&amp;gt; означает, что &amp;lt;tex&amp;gt;\varlimsup\limits_{n \to \infty}\frac{f(n)}{g(n)} \le 1&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; n &amp;lt;/tex&amp;gt; аргументов &amp;lt;tex&amp;gt; f : \lbrace0, 1\rbrace^n \rightarrow \lbrace0, 1\rbrace &amp;lt;/tex&amp;gt; и набор из &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; булевых функций &amp;lt;tex&amp;gt; g_1 \dotsc g_n &amp;lt;/tex&amp;gt;, таких что &amp;lt;tex&amp;gt; g_i :\lbrace0, 1\rbrace^{m_i} \rightarrow \lbrace0, 1\rbrace &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; i=1,\dotsc, n&amp;lt;/tex&amp;gt;. Тогда системой булевых функций называется функция &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; от всех аргументов функций &amp;lt;tex&amp;gt; g_i&amp;lt;/tex&amp;gt;, которая определяется как &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; S(x_{11},\dotsc,x_{1(m_1)},x_{21},\dotsc,x_{2(m_2)}&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;,\dotsc,x_{n1},\dotsc,x_{n(m_n)})&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;=f(g_1(x_{11},\dotsc,x_{1(m_1)}),g_2(x_{21},\dotsc,x_{2(m_2}),\dotsc,g_n(x_{n1},\dotsc,x_{n(m_n)}))&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; x^{\sigma} = \begin{cases} &lt;br /&gt;
    x, \sigma =1;\\&lt;br /&gt;
    \overline{x}, \sigma =0&lt;br /&gt;
\end{cases}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id = Lemma2&lt;br /&gt;
|about = 2&lt;br /&gt;
|statement = Пусть &amp;lt;tex&amp;gt; K_{n}(\lbrace x_{1}^{\sigma_{1}},\dotsc,x_{n}^{\sigma_{n}} \rbrace^{2^n}_{i=1}) &amp;lt;/tex&amp;gt; {{---}} система всех &amp;lt;tex&amp;gt; 2^{n} &amp;lt;/tex&amp;gt; конъюнкций &amp;lt;tex&amp;gt; x_{1}^{\sigma_{1}}\wedge\dotsc\wedge x_{n}^{\sigma_{n}}&amp;lt;/tex&amp;gt;, где каждому &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; соответствует свой набор &amp;lt;tex&amp;gt; \lbrace \sigma_{1},\dotsc,\sigma_{n} \rbrace &amp;lt;/tex&amp;gt;, тогда для &amp;lt;tex&amp;gt; K_{n} &amp;lt;/tex&amp;gt; имеет место соотношение &amp;lt;tex&amp;gt; size_{B}(K_{n}) \sim 2^n &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof = [[Файл:Synschemes Lemma2.png|250px|thumb|right|Рис. 3]]&lt;br /&gt;
Конъюнкции &amp;lt;tex&amp;gt; x_{1}^{\sigma_{1}}\wedge\dotsc\wedge x_{n}^{\sigma_{n}}&amp;lt;/tex&amp;gt; соответствуют функциям &amp;lt;tex&amp;gt; g &amp;lt;/tex&amp;gt; из определения функции,&amp;lt;tex&amp;gt; K_{n} &amp;lt;/tex&amp;gt; соответствует функции &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;, а конъюнкция функций &amp;lt;tex&amp;gt; g &amp;lt;/tex&amp;gt; соответствует функции &amp;lt;tex&amp;gt; f &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что на вход схемы подается определенный набор аргументов &amp;lt;tex&amp;gt; x_{1}^{\sigma_{1}},\dotsc,x_{n}^{\sigma_{n}} &amp;lt;/tex&amp;gt;, то есть на выходе схемы будет результат конъюнкции этих аргументов. &lt;br /&gt;
&lt;br /&gt;
Разделим цепочки конъюнкций на две части. Каждая конъюнкция &amp;lt;tex&amp;gt; x_{1}^{\sigma_{1}}\wedge\dotsc\wedge x_{n}^{\sigma_{n}} &amp;lt;/tex&amp;gt; может быть представлена в виде конъюнкции двух конъюнкций длины &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; n-k &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; x_{1}^{\sigma_{1}}\wedge\dotsc\wedge x_{n}^{\sigma_{n}} = (x_{1}^{\sigma_{1}}\wedge\dotsc\wedge x_{k}^{\sigma_{k}})(x_{k+1}^{\sigma_{k+1}}\wedge\dotsc\wedge x_{n}^{\sigma_{n}}) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому схема для &amp;lt;tex&amp;gt; K_{n} &amp;lt;/tex&amp;gt; может быть образована из схем для &amp;lt;tex&amp;gt; K_{k}(x_{1}^{\sigma_{1}},\dotsc,x_{k}^{\sigma_{k}}) &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; K_{n-k}(x_{k+1}^{\sigma_{k+1}},\dotsc,x_{n}^{\sigma_{n}}) &amp;lt;/tex&amp;gt; и системы из &amp;lt;tex&amp;gt; 2^n &amp;lt;/tex&amp;gt; элементов конъюнкции, осуществляющих вышеприведенную операцию, как показано в [[#Th1|теореме 1]] (рис. 3). Левая часть схемы считает конъюнкцию переменных &amp;lt;tex&amp;gt; x_{1}^{\sigma_{1}},\dotsc,x_{k}^{\sigma_{k}} &amp;lt;/tex&amp;gt;, а правая часть - переменных &amp;lt;tex&amp;gt; x_{k+1}^{\sigma_{k+1}},\dotsc,x_{n}^{\sigma_{n}}&amp;lt;/tex&amp;gt;. Следовательно,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt; size_{B}(K_{n}) \le size_{B}(K_{k}) + size_{B}(K_{n-k}) + 2^n &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как по [[#Th1|теореме 1]]  &amp;lt;tex&amp;gt; size_{B}(K_{k}) \le k2^{k+1} &amp;lt;/tex&amp;gt; , &amp;lt;tex&amp;gt; size_{B}(K_{n-k}) \le (n-k)2^{n-k+1} &amp;lt;/tex&amp;gt;,то &lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt; size_{B}(K_{n}) \le k2^{k+1} + (n-k)2^{n-k+1} + 2^n &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;tex&amp;gt; k=[\frac{n}{2}]&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt; k \le \frac{n}{2} &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; n-k \le \frac{n}{2}+1 &amp;lt;/tex&amp;gt; и &lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt; size_{B}(K_{n}) \le \frac{n}{2}2^{\frac{n}{2}+1} + (\frac{n}{2}+1)2^{\frac{n}{2}+2} + 2^n =2^n+O(n2^{\frac{n}{2}})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
С другой стороны, при &amp;lt;tex&amp;gt; n \ge 2 &amp;lt;/tex&amp;gt; каждая конъюнкция реализуется на выходе некоторого элемента, то есть при &amp;lt;tex&amp;gt; n \ge 2 &amp;lt;/tex&amp;gt; выполняется неравенство &amp;lt;tex&amp;gt; size_{B}(K_{n}) \ge 2^{n} &amp;lt;/tex&amp;gt;. Таким образом,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt; size_{B}(K_{n}) \sim 2^n &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id = Th2&lt;br /&gt;
|about = 2&lt;br /&gt;
|statement =Для любой функции &amp;lt;tex&amp;gt; f(x_{1}, ..., x_{n}) &amp;lt;/tex&amp;gt; имеет место соотношение &amp;lt;tex&amp;gt; size_{B}(f)\lesssim 2^{n+1} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof = &lt;br /&gt;
[[Файл:Synschemes_ NewTheorem2.png|400px|thumb|right|В верхней части схемы рис.2 все подсхемы, вычисляющие конъюнкции, заменили на &amp;lt;tex&amp;gt;K_n&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; f(x_{1},...,x_{n}) &amp;lt;/tex&amp;gt; {{---}} произвольная булева функция, &amp;lt;tex&amp;gt; f \ne 0 &amp;lt;/tex&amp;gt;. Заменим в схеме (рис. 2) верхнюю часть схемы, реализующую конъюнкции &amp;lt;tex&amp;gt; K_{1} \vee K_{2} \vee ... \vee K_{s} &amp;lt;/tex&amp;gt;, схемой, реализующей все конъюнкции из &amp;lt;tex&amp;gt; K_{n} &amp;lt;/tex&amp;gt;. Тогда для любой такой функции &amp;lt;tex&amp;gt; f(x_{1},...,x_{n}) &amp;lt;/tex&amp;gt; (не равной нулю) имеем&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt; size_{B}(f) \le size_{B}(K_{n})+s-1 \le size_{B}(K_{n})+2^{n}-1 \lesssim 2^{n+1} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt; size_{B}(f)\lesssim 2^{n+1}. &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Метод синтеза схем [http://en.wikipedia.org/wiki/Claude_Shannon К.Э.Шеннона]==&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id = Th3&lt;br /&gt;
|about = 3&lt;br /&gt;
|statement =Для любой функции &amp;lt;tex&amp;gt; f(x_{1}, ..., x_{n}) &amp;lt;/tex&amp;gt; имеет место соотношение &amp;lt;tex&amp;gt; size_{B}(f)\lesssim 12\frac {2^{n}}{n} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof = [[Файл:Synschemes-Theorem2.png|300px|thumb|right|Рис. 4]]&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; f(x_{1},...,x_{n}) &amp;lt;/tex&amp;gt; {{---}} произвольная булева функция. Рассмотрим разложение &amp;lt;tex&amp;gt; f &amp;lt;/tex&amp;gt; по переменным &amp;lt;tex&amp;gt; x_{1},...,x_{m} &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; 1 \le m \le n &amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(x_{1},...,x_{n})=\displaystyle\bigvee_{(\sigma_{1},\dotsc,\sigma_{m})}x_{1}^{\sigma_{1}}\wedge\dotsc\wedge x_{m}^{\sigma_{m}}\wedge f(\sigma_{1},\dotsc,\sigma_{m},x_{m+1},\dotsc,x_{n})  &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Схема для функции &amp;lt;tex&amp;gt; f &amp;lt;/tex&amp;gt; строится из трех подсхем: &amp;lt;tex&amp;gt; S_{1},S_{2},S_{3} &amp;lt;/tex&amp;gt;. (рис. 4)'''&lt;br /&gt;
&lt;br /&gt;
:1. Система &amp;lt;tex&amp;gt; K_{m} (x_{1}^{\sigma_{1}},\dotsc,x_{m}^{\sigma_{m}}) &amp;lt;/tex&amp;gt; содержит всевозможные конъюнкции &amp;lt;tex&amp;gt;x_{1}^{\sigma_{1}}\wedge\dotsc\wedge x_{m}^{\sigma_{m}}&amp;lt;/tex&amp;gt;. И схема  &amp;lt;tex&amp;gt; S_{1} &amp;lt;/tex&amp;gt; реализует все эти конъюнкции. В силу [[#Lemma2|леммы 2]] выполняется неравенство&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt; size_{B}(S_{1}) \le size_{B}(K_{m}) \lesssim 2^{m} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:2. Схема &amp;lt;tex&amp;gt; S_{2} &amp;lt;/tex&amp;gt; реализует систему &amp;lt;tex&amp;gt; F(x_{m+1}^{\sigma_{m+1}},...,x_{n}^{\sigma_{n}}) &amp;lt;/tex&amp;gt; всех булевых функций от всевозможных наборов переменных &amp;lt;tex&amp;gt; x_{m+1},...,x_{n} &amp;lt;/tex&amp;gt;. Другими словами, подсхема &amp;lt;tex&amp;gt; S_{2} &amp;lt;/tex&amp;gt; вычисляет все булевы функции, зависящие от последних &amp;lt;tex&amp;gt; n - m &amp;lt;/tex&amp;gt; переменных. В силу [[#Th1|теоремы 1]]&lt;br /&gt;
::&amp;lt;tex&amp;gt; size_{B}(S_{2}) \le (n-m)2^{n-m+1}2^{2^{n-m}} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:3. Схема &amp;lt;tex&amp;gt; S_{3} &amp;lt;/tex&amp;gt; производит &amp;quot;сборку&amp;quot; в соответствии с разложением функции &amp;lt;tex&amp;gt; f &amp;lt;/tex&amp;gt;: для каждого набора &amp;lt;tex&amp;gt; \widetilde{\sigma}=(\sigma_{1},\dotsc,\sigma_{m}) &amp;lt;/tex&amp;gt; реализуется конъюнкция&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt; x_{1}^{\sigma_{1}}\wedge\dotsc\wedge x_{m}^{\sigma_{m}}\wedge f(\widetilde{\sigma},x_{m+1},\dotsc, x_{n}) &amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt; 2^{m} &amp;lt;/tex&amp;gt; элементов конъюнкции) и образуется дизъюнкция таких конъюнкций (&amp;lt;tex&amp;gt; 2^{m}-1 &amp;lt;/tex&amp;gt; элементов дизъюнкции). &lt;br /&gt;
&lt;br /&gt;
Поэтому выполняется неравенство &amp;lt;tex&amp;gt; size_{B}(S_{3}) \le 2^{m} +2^{m} -1 &amp;lt;/tex&amp;gt;. Таким образом,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt; size_{B}(f) \le size_{B}(S_{1})+size_{B}(S_{2})+size_{B}(S_{3}) \lesssim 3 \cdot 2^{m} +(n-m)2^{n-m+1}2^{2^{n-m}} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;tex&amp;gt; k=n-m &amp;lt;/tex&amp;gt;. Тогда &lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt;  size_{B}(f) \lesssim 3 \cdot 2^{n-k} +k2^{k+1}2^{2^{k}} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что второе слагаемое &amp;quot;очень быстро&amp;quot; растет с ростом &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, а первое слагаемое убывает с ростом &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; медленней. Поэтому следует взять такое значение &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, при котором первое и второе слагаемые приблизительно равны, и потом немного уменьшить &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;. Тогда второе слагаемое &amp;quot;сильно&amp;quot; уменьшится, а первое &amp;quot;не очень сильно&amp;quot; возрастет. Возьмем, например, &amp;lt;tex&amp;gt; k=\log_{2}n &amp;lt;/tex&amp;gt;. Тогда &lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt; 3 \cdot 2^{n-k} = 3 \cdot \frac{2^{n}}{n} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt; k \cdot 2^{k+1} \cdot 2^{2^{k}}=\log_{2}n\cdot (2n)\cdot 2^{n}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
то есть получили &amp;quot;слишком много&amp;quot;. Возьмем &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на единицу меньше: &amp;lt;tex&amp;gt; k=\log_{2}n-1 &amp;lt;/tex&amp;gt;. Тогда&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt; 3 \cdot 2^{n-k} = 3 \cdot \frac{2^{n}}{n} \cdot 2 &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt; k \cdot 2^{k+1} \cdot 2^{2^{k}}=(\log_{2}n-1)\cdot n\cdot 2^{\frac{n}{2}}&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; k=[\log_{2}n-1] &amp;lt;/tex&amp;gt;. Тогда&lt;br /&gt;
&amp;lt;tex&amp;gt; n-k &amp;lt; n- \log_{2} + 2&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt; 3 \cdot 2^{n-k} &amp;lt; 12 \cdot \frac {2^{n}}{n} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt; k\cdot 2^{k+1}\cdot 2^{2^{k}} \le (\log_{2}-1)\cdot n\cdot 2^{\frac{n}{2}} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При этом выборе &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; окончательно имеем &lt;br /&gt;
&lt;br /&gt;
::&amp;lt;tex&amp;gt; size_{B}(n)\lesssim 12\frac {2^{n}}{n} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* Яблонский С.В. Введение в дискретную математику. — 4-е изд. — М.: Высшая школа, 2003. — 384 с. — ISBN 5-06-004681-8&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Схемы из функциональных элементов ]]&lt;/div&gt;</summary>
		<author><name>5.18.154.236</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%BE%D0%BC_%D0%96%D0%B5%D0%B3%D0%B0%D0%BB%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=51331</id>
		<title>Полином Жегалкина</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%BE%D0%BC_%D0%96%D0%B5%D0%B3%D0%B0%D0%BB%D0%BA%D0%B8%D0%BD%D0%B0&amp;diff=51331"/>
				<updated>2016-01-18T07:43:09Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.154.236: /* Преобразование Мёбиуса */  Так вроде понятней.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Полином Жегалкина''' (англ. ''Zhegalkin polynomial'') — полином с коэффициентами вида &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, где в качестве произведения берётся конъюнкция, а в качестве сложения исключающее или. Полином был предложен в 1927 году И. И. Жегалкиным в качестве средства для представления [[Определение булевой функции|функций булевой логики]]. Полином Жегалкина имеет следующий вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;P = a_{000...000} \oplus a_{100...0} x_1 \oplus a_{010...0}  x_2 \oplus ... \oplus a_{00...01}  x_n \oplus a_{110...0} x_1 x_2 \oplus ... \oplus a_{00...011} x_{n-1} x_n \oplus ... \oplus a_{11..1} x_1 x_2 ... x_n  &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;0&amp;lt;/tex&amp;gt;;&lt;br /&gt;
#Хотя бы одна функция, не сохраняющая &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
#Хотя бы одна нелинейная функция;&lt;br /&gt;
#Хотя бы одна немонотонная функция;&lt;br /&gt;
#Хотя бы одна несамодвойственная функция.&lt;br /&gt;
&lt;br /&gt;
Исходя из этого, система функций &amp;lt;tex&amp;gt;\bigl\langle \wedge, \oplus, 1 \bigr\rangle&amp;lt;/tex&amp;gt; является полной:&lt;br /&gt;
 &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width:8cm&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-align=&amp;quot;center&amp;quot; bgcolor=#EEEEFF&lt;br /&gt;
 !&amp;lt;tex&amp;gt;x_0&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;x_1&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;\dots&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;x_n&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;\land&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;\oplus&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
 !&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;\dots&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
 !&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;\dots&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;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;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
 !&amp;lt;tex&amp;gt;\vdots&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;\vdots&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;\vdots&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;\vdots&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;\vdots&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;\vdots&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;\vdots&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
 !&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;\dots&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;||&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;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
 !colspan=&amp;quot;4&amp;quot;|Сохраняет 0&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;||&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-align=&amp;quot;center&amp;quot; &lt;br /&gt;
 !colspan=&amp;quot;4&amp;quot;|Сохраняет 1&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;||&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;
|-align=&amp;quot;center&amp;quot; &lt;br /&gt;
 !colspan=&amp;quot;4&amp;quot;|Самодвойственная&lt;br /&gt;
|&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-align=&amp;quot;center&amp;quot; &lt;br /&gt;
 !colspan=&amp;quot;4&amp;quot;|Монотонная&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;||&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;
|-align=&amp;quot;center&amp;quot; &lt;br /&gt;
 !colspan=&amp;quot;4&amp;quot;|Линейная&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;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;
&lt;br /&gt;
На основе этой системы и строятся полиномы Жегалкина.&lt;br /&gt;
&lt;br /&gt;
== Существование и единственность представления (теорема Жегалкина) ==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=Жегалкина&lt;br /&gt;
|statement=&lt;br /&gt;
Каждая булева функция единственным образом представляется в виде полинома Жегалкина.&lt;br /&gt;
|proof=&lt;br /&gt;
Заметим, что различных булевых функций от &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменных &amp;lt;tex&amp;gt;2^{2^n}&amp;lt;/tex&amp;gt; штук. При этом конъюнкций вида &amp;lt;tex&amp;gt;x_{i_1} \ldots x_{i_k}&amp;lt;/tex&amp;gt; существует ровно &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt;, так как из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;  возможных сомножителей каждый или входит в конъюнкцию, или нет. В полиноме у каждой такой конъюнкции стоит &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, то есть существует &amp;lt;tex&amp;gt;2^{2^n}&amp;lt;/tex&amp;gt; различных полиномов Жегалкина от &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; переменных.&lt;br /&gt;
&lt;br /&gt;
Теперь достаточно лишь доказать, что различные полиномы реализуют различные функции. Предположим противное. Тогда приравняв два различных полинома и перенеся один из них в другую часть равенства, получим полином, тождественно равный нулю и имеющий ненулевые коэффициенты. Тогда рассмотрим слагаемое с единичным коэффициентом наименьшей длины, то есть с наименьшим числом переменных, входящих в него (любой один, если таких несколько). Подставив единицы на места этих переменных, и нули на места остальных, получим, что на этом наборе только одно это слагаемое принимает единичное значение, то есть нулевая функция на одном из наборов принимает значение 1. Противоречие. Значит, каждая булева функция реализуется полиномом Жегалкина единственным образом.&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;f(x_1,x_2,\dots,x_n)&amp;lt;/tex&amp;gt;  задана таблица истинности. Запишем сначала данную функцию в виде полинома Жегалкина с неопределёнными коэффициентами. Затем по очереди подставляем всевозможные наборы в порядке увеличения количества единиц и находим коэффициенты с учётом того, что &amp;lt;tex&amp;gt; a \oplus 1 = \bar{a}&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt; a \oplus 0 = a&amp;lt;/tex&amp;gt;. За каждую подстановку находим только один коэффициент.&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
Дана функция &amp;lt;tex&amp;gt;f(x_1,x_2,x_3,x_4)&amp;lt;/tex&amp;gt; и её таблица истинности:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width:8cm&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |- &lt;br /&gt;
 !class=&amp;quot;dark&amp;quot; style=&amp;quot;font-weight:normal&amp;quot;| &amp;lt;tex&amp;gt;x_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
 !class=&amp;quot;dark&amp;quot; style=&amp;quot;font-weight:normal&amp;quot;| &amp;lt;tex&amp;gt;x_2&amp;lt;/tex&amp;gt; &lt;br /&gt;
 !class=&amp;quot;dark&amp;quot; style=&amp;quot;font-weight:normal&amp;quot;| &amp;lt;tex&amp;gt;x_3&amp;lt;/tex&amp;gt; &lt;br /&gt;
 !class=&amp;quot;dark&amp;quot; style=&amp;quot;font-weight:normal&amp;quot;| &amp;lt;tex&amp;gt;x_4&amp;lt;/tex&amp;gt; &lt;br /&gt;
 !class=&amp;quot;dark&amp;quot; style=&amp;quot;font-weight:normal&amp;quot;| &amp;lt;tex&amp;gt;f(x_1,x_2,x_3,x_4)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ||0||0||0||0||0&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ||0||0||0||1||0&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ||0||0||1||0||0&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ||0||0||1||1||0&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ||0||1||0||0||0&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ||0||1||0||1||0&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ||0||1||1||0||1&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ||0||1||1||1||0&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ||1||0||0||0||1&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ||1||0||0||1||0&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ||1||0||1||0||0&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ||1||0||1||1||1&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ||1||1||0||0||1&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ||1||1||0||1||0&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ||1||1||1||0||1&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ||1||1||1||1||0&lt;br /&gt;
|}&lt;br /&gt;
Построим для неё полином Жегалкина:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(x_1,x_2,x_3,x_4) = a_{0000} \oplus a_{1000} x_1 \oplus a_{0100} x_2 \oplus a_{0010} x_3 \oplus a_{0001} x_4 \oplus a_{1100} x_1 x_2 \oplus a_{1010} x_1 x_3 \oplus a_{1001} x_1 x_4 \oplus a_{0110} x_2 x_3 \oplus a_{0101} x_2 x_4 \oplus a_{0011} x_3 x_4 \oplus a_{1110} x_1 x_2 x_3 \oplus a_{1101} x_1 x_2 x_4 \oplus a_{1011} x_1 x_3 x_4 \oplus a_{0111} x_2 x_3 x_4  \oplus a_{1111} x_1 x_2 x_3 x_4&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;f(0,0,0,0) = 0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;a_{0000} = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Далее подставляем все остальные наборы в порядке возрастания числа единиц, подставляя вновь полученные значения в следующие формулы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(1,0,0,0) = a_{0000} \oplus a_{1000} = 1 \Rightarrow a_{1000} = 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(0,1,0,0) = a_{0000} \oplus a_{0100} = 0 \Rightarrow a_{0100} = 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(0,0,1,0) = a_{0000} \oplus a_{0010} = 0 \Rightarrow a_{0010} = 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(0,0,0,1) = a_{0000} \oplus a_{0001} = 0 \Rightarrow a_{0001} = 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(1,1,0,0) = a_{0000} \oplus a_{1000} \oplus a_{0100} \oplus a_{1100} = 1 \Rightarrow a_{1100} = 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(1,0,1,0) = a_{0000} \oplus a_{1000} \oplus a_{0100} \oplus a_{1010} = 0 \Rightarrow a_{1010} = 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(1,0,0,1) = a_{0000} \oplus a_{1000} \oplus a_{0100} \oplus a_{1001} = 0 \Rightarrow a_{1001} = 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(0,1,1,0) = a_{0000} \oplus a_{0100} \oplus a_{0010} \oplus a_{0110} = 1 \Rightarrow a_{0110} = 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(0,1,0,1) = a_{0000} \oplus a_{0100} \oplus a_{0001} \oplus a_{0101} = 0 \Rightarrow a_{0101} = 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(0,0,1,1) = a_{0000} \oplus a_{0010} \oplus a_{0001} \oplus a_{0011} = 0 \Rightarrow a_{0011} = 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(1,1,1,0) = a_{0000} \oplus a_{1000} \oplus a_{0100} \oplus a_{0010} \oplus a_{1100} \oplus a_{1010} \oplus a_{0110} \oplus a_{1110} = 1 \Rightarrow a_{1110} = 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(1,1,0,1) = a_{0000} \oplus a_{1000} \oplus a_{0100} \oplus a_{0001} \oplus a_{1100} \oplus a_{1001} \oplus a_{0101} \oplus a_{1101} = 0 \Rightarrow a_{1101} = 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(1,0,1,1) = a_{0000} \oplus a_{1000} \oplus a_{0010} \oplus a_{0001} \oplus a_{1010} \oplus a_{1001} \oplus a_{0011} \oplus a_{1011} = 1 \Rightarrow a_{1011} = 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(0,1,1,1) = a_{0000} \oplus a_{0100} \oplus a_{0010} \oplus a_{0001} \oplus a_{0110} \oplus a_{0101} \oplus a_{0011} \oplus a_{0111} = 0 \Rightarrow a_{0111} = 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(1,1,1,1) = a_{0000} \oplus a_{1000} \oplus a_{0100} \oplus a_{0010} \oplus a_{0001} \oplus a_{1100} \oplus a_{1010} \oplus a_{1001} \oplus a_{0110} \oplus a_{0101} \oplus a_{0011} \oplus a_{1110} \oplus a_{1101} \oplus a_{1011} \oplus a_{0111} \oplus a_{1111} = 0 \Rightarrow a_{1111} = 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, полином Жегалкина выглядит так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(x_1,x_2,x_3,x_4) = x_1 \oplus x_1 x_3 \oplus x_1 x_4 \oplus x_2 x_3 \oplus x_2 x_3 x_4 \oplus x_1 x_2 x_3 x_4&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Преобразование [[Определение_булевой_функции#Дизъюнктивная нормальная форма (ДНФ)|дизъюнктивной нормальной формы]] ===&lt;br /&gt;
Этот способ основан на том, что &amp;lt;tex&amp;gt; X \oplus 1 = \bar{X} &amp;lt;/tex&amp;gt;. Если функция задана в виде ДНФ, то можно сначала убрать дизъюнкцию, используя правило Де-Моргана, а все отрицания заменить прибавлением единицы по модулю два, после чего раскрыть скобки по обычным правилам, при этом учитывая, что четное число одинаковых слагаемых равно нулю (так как &amp;lt;tex&amp;gt; X \oplus X = 0 &amp;lt;/tex&amp;gt;), а нечетное число одинаковых слагаемых равно одному такому слагаемому. Либо же можно заменить дизъюнкцию по следующему правилу:&lt;br /&gt;
&amp;lt;tex&amp;gt; A \lor B = AB \oplus A \oplus B &amp;lt;/tex&amp;gt; &amp;amp;nbsp; &amp;lt;tex&amp;gt; (1) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если функция задана в СДНФ, то так как при любых значениях входных переменных в единицу обращается не более одного члена выражения, то достаточно просто заменить все дизъюнкции исключающим ИЛИ.&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
Дана функция в ДНФ &amp;lt;tex&amp;gt; f(x_1,x_2,x_3,x_4) = (x_1 \land x_2 \land \neg x_3 \land x_4) \lor (\neg x_1 \land \neg x_4) \lor (x_1 \land x_2) \lor x_2 &amp;lt;/tex&amp;gt;, построим полином Жегалкина.&lt;br /&gt;
&lt;br /&gt;
Запишем функцию так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(x_1,x_2,x_3,x_4) = x_1 x_2 \neg x_3 x_4 + \neg x_1 \neg x_4 + x_1 x_2 + x_2&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сгруппируем слагаемые и воспользуемся преобразованием (1):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(x_1,x_2,x_3,x_4) = (x_1 x_2 \neg x_3  x_4 \oplus \neg x_1 \neg x_4 \oplus x_1 x_2 \neg x_3 x_4 \neg x_1 \neg x_4) + (x_1 x_2 \oplus x_2 \oplus \oplus  x_1 x_2 x_2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Воспользуемся свойствами конъюнкции &amp;lt;tex&amp;gt;A \land A = A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\neg A \land A = 0&amp;lt;/tex&amp;gt;, а также тем, что &amp;lt;tex&amp;gt;A \oplus A = 0&amp;lt;/tex&amp;gt;, и упростим выражение:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(x_1,x_2,x_3,x_4) = (x_1 x_2 \neg x_3 x_4 \oplus \neg x_1 \neg x_4) + x_2&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ещё раз воспользуемся преобразованием (1):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(x_1,x_2,x_3,x_4) = x_1 x_2 \neg x_3 x_4 \oplus \neg x_1 \neg x_4 \oplus x_2 \oplus (x_1 x_2 \neg x_3 x_4 \oplus \neg x_1 \neg x_4) x_2&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Раскроем скобку по алгебраическим правилам:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(x_1,x_2,x_3,x_4) = x_1 x_2 \neg x_3 x_4 \oplus \neg x_1 \neg x_4 \oplus x_2 \oplus x_1 x_2 x_2 \neg x_3 x_4 \oplus \neg x_1 x_2 \neg x_4&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Снова воспользуемся свойствами конъюнкции и исключающего ИЛИ:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(x_1,x_2,x_3,x_4) = \neg x_1 \neg x_4 \oplus x_2 \oplus \neg x_1 x_2 \neg x_4&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заменим отрицание на прибавление &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(x_1,x_2,x_3,x_4) = (x_1 \oplus 1) (x_4 \oplus 1) \oplus x_2 \oplus (x_1 \oplus 1) x_2 (x_4 \oplus 1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Раскроем скобки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(x_1,x_2,x_3,x_4) = x_1 x_4 \oplus x_1 \oplus x_4 \oplus 1 \oplus x_2 \oplus x_1 x_2 x_4 \oplus x_1 x_2 \oplus x_2 x_4 \oplus x_2&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выкинем парные слагаемые и получим окончательную формулу:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(x_1,x_2,x_3,x_4) = x_1 x_2 x_4 \oplus x_1 x_2 \oplus x_1 x_4 \oplus x_2 x_4 \oplus x_1 \oplus x_4 \oplus 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Метод треугольника === &amp;lt;!-- Да, копипаста с википедии, и что? Метод же прост и удобен --&amp;gt;&lt;br /&gt;
Метод треугольника позволяет преобразовать таблицу истинности в полином Жегалкина путём построения вспомогательной треугольной таблицы в соответствии со следующими правилами:&lt;br /&gt;
# Строится полная таблица истинности, в которой строки идут в порядке возрастания двоичных кодов от &amp;lt;tex&amp;gt;000\dots00&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;111\dots11&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Строится вспомогательная треугольная таблица, в которой первый столбец совпадает со столбцом значений функции в таблице истинности.&lt;br /&gt;
# Ячейка в каждом последующем столбце получается путём сложения по модулю 2 двух ячеек предыдущего столбца — стоящей в той же строке и строкой ниже.&lt;br /&gt;
# Столбцы вспомогательной таблицы нумеруются двоичными кодами в том же порядке, что и строки таблицы истинности.&lt;br /&gt;
# Каждому двоичному коду ставится в соответствие один из членов полинома Жегалкина в зависимости от позиций кода, в которых стоят единицы. Например, ячейке &amp;lt;tex&amp;gt;111&amp;lt;/tex&amp;gt; соответствует член &amp;lt;tex&amp;gt;ABC&amp;lt;/tex&amp;gt;, ячейке &amp;lt;tex&amp;gt;101&amp;lt;/tex&amp;gt; — член &amp;lt;tex&amp;gt;AC&amp;lt;/tex&amp;gt;, ячейке &amp;lt;tex&amp;gt;010&amp;lt;/tex&amp;gt; — член &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt;, ячейке &amp;lt;tex&amp;gt;000&amp;lt;/tex&amp;gt; — член &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; и т.д.&lt;br /&gt;
# Если в верхней строке какого-либо столбца стоит единица, то соответствующий член присутствует в полиноме Жегалкина.&lt;br /&gt;
&lt;br /&gt;
Фактически, этот метод является модификацией метода построения по таблице истинности, описанного выше. По сравнению с ним он удобнее тем, что расчёты занимают мало места и в них сложнее ошибиться, но метод треугольника требует бо́льшего количества операций.&lt;br /&gt;
&lt;br /&gt;
Пример преобразования таблицы истинности в полином Жегалкина для функции трёх переменных &amp;lt;tex&amp;gt;P(A,B,C)&amp;lt;/tex&amp;gt; показан на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Преобразование таблицы истинности в полином Жегалкина методом треугольника.gif]]&lt;br /&gt;
&lt;br /&gt;
Чтобы получить формулу, по которой рассчитывается какой-либо коэффициент, нужно из клетки, в которой он записан, пройтись всеми возможными путями влево, до столбца &amp;lt;tex&amp;gt;''P''&amp;lt;/tex&amp;gt; таблицы истинности, делая ходы влево и влево-вниз, записать значения в конечных ячейках и сложить их все между собой по модулю 2.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в первом столбце сверху записан коэффициент &amp;lt;tex&amp;gt; a_0 = P(0,0,0) &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
во втором — &amp;lt;tex&amp;gt; a_1 = P(0,0,0) \oplus P(0,0,1) &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
в третьем — &amp;lt;tex&amp;gt; a_2 = P(0,0,0) \oplus P(0,0,1) \oplus P(0,0,1) \oplus P(0,1,0) = P(0,0,0) \oplus P(0,1,0) &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
в четвёртом —&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; a_3 = P(0,0,0) \oplus P(0,0,1) \oplus P(0,0,1) \oplus P(0,0,1)  \oplus P(0,1,0) \oplus P(0,1,0) \oplus P(0,1,0) \oplus P(0,1,1) = P(0,0,0) \oplus P(0,1,0) \oplus P(0,1,0) \oplus P(0,1,1), &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и так далее, то есть при построении вспомогательной таблицы коэффициенты полинома просчитываются автоматически.&lt;br /&gt;
&lt;br /&gt;
=== Преобразование Мёбиуса ===&lt;br /&gt;
Пусть задана [[Определение булевой функции|булева функция]] &amp;lt;tex&amp;gt;f: B^n \rightarrow B, \;\; B=\{ 0; 1 \}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Любая булева функция представима в виде полинома Жегалкина, притом единственным образом.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; i = (i_1, i_2, .. i_n), \;\; i_k \in \{0 ; 1\}&amp;lt;/tex&amp;gt;, и введем обозначение &amp;lt;tex&amp;gt; x ^{i_k} \sim \left\{\begin{matrix} x, \;\; i_k=1&lt;br /&gt;
\\ 1, \;\; i_k=0&lt;br /&gt;
\end{matrix}\right. &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда полином Жегалкина можно записать как:&lt;br /&gt;
&amp;lt;tex&amp;gt; f(x) = \bigoplus\limits_i \alpha_i \cdot x_1^{i_1} \cdot x_2^{i_2} \cdot&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;\dots&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;\cdot x_n^{i_n}&amp;lt;/tex&amp;gt;, где   &amp;lt;tex&amp;gt;\alpha_i \in  \{ 0; 1 \}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Множество коэффициентов &amp;lt;tex&amp;gt;\{\alpha _i\}&amp;lt;/tex&amp;gt; можно рассматривать как функцию &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt;, заданной на множестве индексов &amp;lt;tex&amp;gt; i = (i_1, i_2, \dots i_n)&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;\alpha: i \mapsto \alpha_i&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Очевидно, функцию &amp;lt;tex&amp;gt; f &amp;lt;/tex&amp;gt; можно записать и следующим образом: &amp;lt;tex&amp;gt; f(x) = \bigoplus \limits_i \alpha_i \cdot [x_1 , \; &amp;lt;/tex&amp;gt; если &amp;lt;tex&amp;gt; \;\; i_1] \cdot [x_2 , \; &amp;lt;/tex&amp;gt; если &amp;lt;tex&amp;gt; \;\; i_2] \cdot&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;\dots&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;\cdot [x_n , \; &amp;lt;/tex&amp;gt; если &amp;lt;tex&amp;gt; \;\; i_n]&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; \; i_k]&amp;lt;/tex&amp;gt; означает, что элелемент &amp;lt;tex&amp;gt; x_k &amp;lt;/tex&amp;gt; присутствует в соответствующем члене полинома только если &amp;lt;tex&amp;gt; i_k = 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда если для какого-то &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;i \succ x&amp;lt;/tex&amp;gt;* ,то в слагаемом будет существовать хотя бы один множитель, равный нулю, и такое слагаемое на сумму не повлияет.&lt;br /&gt;
Отсюда ясно, что &amp;lt;tex&amp;gt; f(x) = \bigoplus \limits_{i \preceq x} \alpha_i &amp;lt;/tex&amp;gt;&amp;amp;nbsp; &amp;lt;tex&amp;gt; (2) &amp;lt;/tex&amp;gt;&lt;br /&gt;
Найдем отображение &amp;lt;tex&amp;gt; f \mapsto \alpha&amp;lt;/tex&amp;gt; (То есть такое, которое по заданной функции вычисляет значения всех коэффициентов).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;*&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;i \succ x&amp;lt;/tex&amp;gt; обозначает, что &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; &amp;quot;меньше&amp;quot; &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; как последовательность бит&lt;br /&gt;
&lt;br /&gt;
{{Теорема &lt;br /&gt;
|statement=Пусть задана функция &amp;lt;tex&amp;gt; f &amp;lt;/tex&amp;gt;. Тогда функцию &amp;lt;tex&amp;gt; \alpha_x &amp;lt;/tex&amp;gt; можно найти по формуле: &amp;lt;tex&amp;gt;\alpha_x = \bigoplus \limits_{j\preceq  x} f(j)&amp;lt;/tex&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; &amp;lt;tex&amp;gt; (3) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
||proof=Докажем при помощи индукции по количеству единиц в векторе &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; ( иначе говоря, по сумме &amp;lt;tex&amp;gt;x_1+x_2+&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;\dots&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;+x_n&amp;lt;/tex&amp;gt; ) и для удобства обозначим это количество единиц(сумму) &amp;lt;tex&amp;gt; wt(x) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''1)''' База: если &amp;lt;tex&amp;gt; x = 0 &amp;lt;/tex&amp;gt;, то, очевидно &amp;lt;tex&amp;gt; f(0) = \alpha_0 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2)''' Пускай теорема справедлива для всех сумм &amp;lt;tex&amp;gt;wt(x) &amp;lt; k&amp;lt;/tex&amp;gt;. Покажем, что в таком случае она верна и для &amp;lt;tex&amp;gt;wt(x) = k&amp;lt;/tex&amp;gt;. По &amp;lt;tex&amp;gt; (2) &amp;lt;/tex&amp;gt;, а далее по предположению индукции видим: &amp;lt;tex&amp;gt; f(x) = \bigoplus \limits_{i \preceq x} \alpha_i = \left [ \bigoplus \limits_{i \prec x} \bigoplus \limits_{j\preceq  i} f(j) \right ] \oplus \alpha_x&amp;lt;/tex&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сумму &amp;lt;tex&amp;gt; \left [ \bigoplus \limits_{i \prec x} \bigoplus \limits_{j\preceq  i} f(j) \right ]  &amp;lt;/tex&amp;gt;. Каждый элемент &amp;lt;tex&amp;gt; f(j) &amp;lt;/tex&amp;gt; содержится в ней, только если &amp;lt;tex&amp;gt; j \prec x &amp;lt;/tex&amp;gt;, и для фиксированных &amp;lt;tex&amp;gt; j&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; элемент &amp;lt;tex&amp;gt; f(j)&amp;lt;/tex&amp;gt; встречается ровно столько раз, сколько существует &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; , таких, что &amp;lt;tex&amp;gt; j \prec i \prec x&amp;lt;/tex&amp;gt;. Несложно увидеть, что таких &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; существует ровно &amp;lt;tex&amp;gt; 2^{wt(x)-wt(j)}-1 &amp;lt;/tex&amp;gt;, то есть нечетное количество раз. Тогда &amp;lt;tex&amp;gt; \left [ \bigoplus \limits_{i \prec x} \bigoplus \limits_{j\preceq  i} f(j) \right ] =  \bigoplus \limits_{j\prec  x} f(j) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Но тогда &amp;lt;tex&amp;gt; f(x) = \left [ \bigoplus \limits_{j\prec  x} f(j) \right ] \oplus \alpha_x \Leftrightarrow f(x) \oplus \bigoplus \limits_{j\prec  x} f(j) = \alpha_x \Leftrightarrow \alpha_x = \bigoplus \limits_{j\preceq  x} f(j)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
То есть при &amp;lt;tex&amp;gt;wt(x) = k&amp;lt;/tex&amp;gt; формула также выполняется, значит при любых &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;  выполняется &amp;lt;tex&amp;gt;\alpha_x = \bigoplus \limits_{j\preceq  x} f(j)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
Отображение &amp;lt;tex&amp;gt; f \rightarrow \alpha&amp;lt;/tex&amp;gt; также называется преобразованием Мёбиуса.&lt;br /&gt;
&lt;br /&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;f&amp;lt;/tex&amp;gt;. То есть преобразование Мёбиуса обратно самому себе, иными словами, является инволюцией.&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.stat-mat.com/?p=330 Cтатистика | Математика НГУ]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/Полином_Жегалкина Википедия {{---}} Полином Жегалкина]&lt;br /&gt;
* [http://dvo.sut.ru/libr/himath/w163rabk/index.htm Е.Л Рабкин,  Ю.Б. Фарфоровская, дискретная математика]&lt;br /&gt;
* Логачёв О.А, Сальников А.А., Ященко В.В. Булевы фунции в теории кодирования и криптологии — МЦНМО, 2004. - 470с. — ISBN 5-94057-117-4.&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Булевы функции]]&lt;/div&gt;</summary>
		<author><name>5.18.154.236</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B5_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9._%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9F%D0%BE%D1%81%D1%82%D0%B0_%D0%BE_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9&amp;diff=51330</id>
		<title>Полные системы функций. Теорема Поста о полной системе функций</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B5_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9._%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9F%D0%BE%D1%81%D1%82%D0%B0_%D0%BE_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9&amp;diff=51330"/>
				<updated>2016-01-18T06:01:18Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.154.236: Исправлена опечатка&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Полные системы функций ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Если любая [[Определение булевой функции|булева функция]], являющаяся [[Суперпозиции|суперпозицией]] функций некоторого множества, принадлежит этому множеству, то такое множество называют '''замкнутым''' (англ. ''closed set'').}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Замыканием''' (англ. ''сlosure'') множества функций называется такое подмножество всех булевых функций, что любую из этих функций можно выразить через функции исходного множества.}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1&lt;br /&gt;
|definition=&lt;br /&gt;
Множество булевых функций называется '''полной системой''' (англ. ''complete set''), если замыкание этого множества совпадает с множеством всех функций.}} &lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Полная система функций называется '''безызбыточной''' (англ. ''irredundant functions''), если она перестает быть полной при исключении из неё любого элемента.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Американский математик Эмиль Пост сформулировал необходимое и достаточное условие полноты системы булевых функций. Для этого он ввел в рассмотрение следующие замкнутые классы булевых функций:&lt;br /&gt;
* Функции, сохраняющие константу &amp;lt;Tex&amp;gt;T_0&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;S&amp;lt;/Tex&amp;gt;&lt;br /&gt;
* Монотонные функции &amp;lt;Tex&amp;gt;M&amp;lt;/Tex&amp;gt;&lt;br /&gt;
* Линейные функции &amp;lt;Tex&amp;gt;L&amp;lt;/Tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Замкнутые классы булевых функций ==&lt;br /&gt;
Класс функций сохраняющих ноль &amp;lt;tex&amp;gt;T_0&amp;lt;/tex&amp;gt;. &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Говорят, что функция '''сохраняет ноль''', если &amp;lt;tex&amp;gt;f(0, 0, \dots, 0) = 0&amp;lt;/tex&amp;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;. &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Говорят, что функция '''сохраняет один''', если &amp;lt;tex&amp;gt;f(1, 1, \dots, 1) = 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Класс самодвойственных функций &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Говорят, что функция '''самодвойственна''' (англ. ''self-dual''), если &amp;lt;tex&amp;gt;f(\overline{x_1},\dots,\overline{x_n})=\overline{f(x_1,\dots,x_n)}&amp;lt;/tex&amp;gt;. Иными словами, функция называется самодвойственной, если на противоположных наборах она принимает противоположные значения.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Класс монотонных функций &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Говорят, что функция '''монотонна''' (англ. ''monotonic function'') , если &amp;lt;tex&amp;gt;\forall i (a_i \leqslant b_i) \Rightarrow f(a_1,\dots,a_n)\leqslant f(b_1,\dots,b_n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Класс линейных функций &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Говорят, что функция '''линейна''' (англ. ''linear function''), если существуют такие &amp;lt;tex&amp;gt;a_0, a_1, a_2, \dots, a_n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;a_i \in \{0, 1\}, \forall i=\overline{1,n}&amp;lt;/tex&amp;gt;, что для любых &amp;lt;tex&amp;gt;x_1, x_2, \dots, x_n&amp;lt;/tex&amp;gt; имеет место равенство:&lt;br /&gt;
:&amp;lt;tex&amp;gt;f(x_1, x_2, \dots, x_n) = a_0\oplus a_1\cdot x_1\oplus a_2\cdot x_2 \oplus\dots\oplus a_n\cdot x_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;~2^{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;
Теорема|statement=&lt;br /&gt;
Набор булевых функций K является полным тогда и только тогда, когда он не содержится полностью ни в одном из классов &amp;lt;tex&amp;gt; S,M,L,T_0,T_1 &amp;lt;/tex&amp;gt;, иными словами, когда в нем имеется хотя бы одна функция, не сохраняющая ноль, хотя бы одна функция, не сохраняющая один, хотя бы одна несамодвойственная функция, хотя бы одна немонотонная функция и хотя бы одна нелинейная функция.&lt;br /&gt;
&lt;br /&gt;
|proof=&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;f_0&amp;lt;/tex&amp;gt;. (&amp;lt;tex&amp;gt;f_0(0) = 1&amp;lt;/tex&amp;gt;) &amp;lt;tex&amp;gt;f_0(1)&amp;lt;/tex&amp;gt; может принимать два значения:&lt;br /&gt;
## &amp;lt;tex&amp;gt;f_0(1) = 1&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;f_0(x, x, x, \ldots, x) = 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
## &amp;lt;tex&amp;gt;f_0(1) = 0&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;f_0(x, x, x, \dots, x) = \neg x&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Рассмотрим функцию, не сохраняющую один {{---}} &amp;lt;tex&amp;gt;f_1&amp;lt;/tex&amp;gt;. (&amp;lt;tex&amp;gt;f_1(1) = 0&amp;lt;/tex&amp;gt;) &amp;lt;tex&amp;gt;f_1(0)&amp;lt;/tex&amp;gt; может принимать два значения:&lt;br /&gt;
## &amp;lt;tex&amp;gt;f_1(0) = 0&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;f_1(x, x, x, \ldots, x) = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
## &amp;lt;tex&amp;gt;f_1(0) = 1&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;f_1(x, x, x, \ldots, x) = \lnot x&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
''Таким образом, возможны четыре варианта:''&lt;br /&gt;
&lt;br /&gt;
* Мы получили функцию &amp;lt;tex&amp;gt; \neg &amp;lt;/tex&amp;gt;. &lt;br /&gt;
Используем несамодвойственную функцию &amp;lt;tex&amp;gt;f_s&amp;lt;/tex&amp;gt;. По определению, найдется такой вектор &amp;lt;tex&amp;gt;x_0&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;f_s(x_0) = f_s(\lnot x_0)&amp;lt;/tex&amp;gt;. Где &amp;lt;tex&amp;gt;x_0 = (x_{01}, x_{02}, ..., x_{0k})&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt;f_s(x^{x_{01}}, x^{x_{02}}, \ldots, x^{x_{0k}})&amp;lt;/tex&amp;gt;, где либо &amp;lt;tex&amp;gt;x^{x_{0i}} = x&amp;lt;/tex&amp;gt;, при &amp;lt;tex&amp;gt;x_{0i} = 1&amp;lt;/tex&amp;gt;. Либо &amp;lt;tex&amp;gt;x^{x_{0i}} = \lnot x&amp;lt;/tex&amp;gt;, при &amp;lt;tex&amp;gt;x_{0i}  = 0 &amp;lt;/tex&amp;gt;. &lt;br /&gt;
Нетрудно заметить, что &amp;lt;tex&amp;gt;f_s(0) = f_s(1) \Rightarrow f_s = \operatorname {const}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Таким образом мы получили одну из констант.&lt;br /&gt;
&lt;br /&gt;
*Мы получили &amp;lt;tex&amp;gt; \neg &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;\lnot 0 = 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*Мы получили &amp;lt;tex&amp;gt; \neg &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;\lnot 1 = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*Мы получили &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;f_m&amp;lt;/tex&amp;gt;. Существуют такие &amp;lt;tex&amp;gt;x_1, x_2, \ldots, x_n&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;f_m(x_1, x_2,  \ldots, x_{i-1},  0  , x_{i+1},  \ldots, x_n) = 1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;f_m(x_1, x_2,  \ldots, x_{i-1},  1  , x_{i+1},  \ldots, x_n) = 0&amp;lt;/tex&amp;gt;, зафиксируем все &amp;lt;tex&amp;gt;x_1, x_2,  \ldots, x_n&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;f_m(x_1, x_2,  \ldots, x_{i-1}, x, x_{i+1},  \ldots, x_n)= \lnot x&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
''В итоге имеем три функции:'' &amp;lt;tex&amp;gt; \neg &amp;lt;/tex&amp;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;f_l&amp;lt;/tex&amp;gt;. Среди нелинейных членов &amp;lt;tex&amp;gt;f_l&amp;lt;/tex&amp;gt; (ее представления в виде [[Полином Жегалкина|полинома Жегалкина]]), выберем тот, в котором минимальное количество элементов. Все аргументы кроме двух в этом члене приравняем единице, оставшиеся два назовем &amp;lt;tex&amp;gt;x_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x_2&amp;lt;/tex&amp;gt;. Все элементы, не входящие в данный член, примем равными нулю. &lt;br /&gt;
Тогда эта функция будет представима в виде &amp;lt;tex&amp;gt;g_l = x_1 \land x_2 [ \oplus x_1] [\oplus x_2][ \oplus ~1]&amp;lt;/tex&amp;gt;, где в квадратных скобках указаны члены, которые могут и не присутствовать (остальные слагаемые будут равны нулю, поскольку в них есть как минимум один аргумент, не входящий в выбранный член, так как в выбранном члене минимальное число элементов).&lt;br /&gt;
&lt;br /&gt;
''Рассмотрим несколько вариантов:''&lt;br /&gt;
&lt;br /&gt;
# Присутствует член &amp;lt;tex&amp;gt;\oplus ~1&amp;lt;/tex&amp;gt;. Возьмем отрицание от &amp;lt;tex&amp;gt;g_l&amp;lt;/tex&amp;gt; и член &amp;lt;tex&amp;gt;\oplus ~1&amp;lt;/tex&amp;gt; исчезнет.&lt;br /&gt;
# Присутствуют три члена, без &amp;lt;tex&amp;gt;\oplus ~1&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;g_l= x_1 \land x_2 \oplus x_1 \oplus x_2&amp;lt;/tex&amp;gt;. Составив таблицу истинности для этой функции нетрудно заметить, что она эквивалентна функции &amp;lt;tex&amp;gt; \vee &amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Присутствуют два члена, без &amp;lt;tex&amp;gt;\oplus ~1&amp;lt;/tex&amp;gt;. Построив две таблицы истинности для двух различных вариантов, заметим, что в обоих случаях функция истинна только в одной точке, следовательно, СДНФ функции &amp;lt;tex&amp;gt;g_l&amp;lt;/tex&amp;gt; будет состоять только из одного члена. Если это так, то не составляет труда выразить &amp;lt;tex&amp;gt; \wedge &amp;lt;/tex&amp;gt; через &amp;lt;tex&amp;gt; \neg &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;g_l&amp;lt;/tex&amp;gt;. Например, если функция &amp;lt;tex&amp;gt;g_l(x_1, x_2, ..., x_n)&amp;lt;/tex&amp;gt; принимает истинное значение, когда аргументы c номерами &amp;lt;tex&amp;gt;i_1, i_2, ..., i_m&amp;lt;/tex&amp;gt; ложны, а все остальные истины, то функцию &amp;lt;tex&amp;gt; \wedge &amp;lt;/tex&amp;gt; можно выразить как &amp;lt;tex&amp;gt;g_l([\lnot]x_1, [\lnot]x_2, ..., [\lnot]x_n)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\lnot&amp;lt;/tex&amp;gt; ставится перед аргументами с номерами &amp;lt;tex&amp;gt;i_1, i_2, ..., i_m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Присутствует один член. Выразим &amp;lt;tex&amp;gt; \wedge &amp;lt;/tex&amp;gt; через &amp;lt;tex&amp;gt; \neg &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;g_l&amp;lt;/tex&amp;gt; аналогично пункту 3.&lt;br /&gt;
&lt;br /&gt;
В итоге получим функцию&amp;lt;tex&amp;gt; \neg &amp;lt;/tex&amp;gt;, а также либо функцию &amp;lt;tex&amp;gt; \wedge &amp;lt;/tex&amp;gt;, либо функцию &amp;lt;tex&amp;gt; \vee &amp;lt;/tex&amp;gt;. Поскольку функцию &amp;lt;tex&amp;gt; \wedge &amp;lt;/tex&amp;gt; можно выразить через &amp;lt;tex&amp;gt; \vee &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; \neg &amp;lt;/tex&amp;gt;, а функцию &amp;lt;tex&amp;gt; \vee &amp;lt;/tex&amp;gt; через &amp;lt;tex&amp;gt; \wedge &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; \neg &amp;lt;/tex&amp;gt;, то мы получили базис &amp;lt;tex&amp;gt; \wedge &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; \vee &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; \neg &amp;lt;/tex&amp;gt;. Любую булеву функцию, не равную тождественному нулю, можно представить в форме [[СДНФ]], то есть выразить в данном базисе. Если же функция равна тождественному нулю, то ее можно представить в виде &amp;lt;tex&amp;gt;x \land \lnot x&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Значит, полученные функции образуют полную систему, поскольку с их помощью можно выразить любую булеву функцию. Из этого следует, что K {{---}} полная система функций, что и требовалось доказать.''&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Примеры ==&lt;br /&gt;
Согласно критерию Поста система булевых функций полна тогда и только тогда, когда она не содержится целиком ни в одном из классов &amp;lt;tex&amp;gt;T_0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;T_1&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;L&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В частности, если функция не входит ни в один из классов Поста, она сама по себе формирует полную систему. В качестве примера можно назвать [[Определение_булевой_функции#.D0.91.D0.B8.D0.BD.D0.B0.D1.80.D0.BD.D1.8B.D0.B5_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B8|штрих Шеффера]] или [[Определение_булевой_функции#.D0.91.D0.B8.D0.BD.D0.B0.D1.80.D0.BD.D1.8B.D0.B5_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B8|стрелку Пирса]].&lt;br /&gt;
&lt;br /&gt;
Широко известны такие полные системы булевых функций:&lt;br /&gt;
* &amp;lt;tex&amp;gt;\left\{\land,\lor,\neg\right\}&amp;lt;/tex&amp;gt; (конъюнкция, дизъюнкция, отрицание);&lt;br /&gt;
* &amp;lt;tex&amp;gt;\left\{\land,\oplus,1\right\}&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;\left\{\oplus,1\right\}&amp;lt;/tex&amp;gt; можно назвать базисом класса линейных функций.&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D1%82%D0%B5%D1%80%D0%B8%D0%B9_%D0%9F%D0%BE%D1%81%D1%82%D0%B0 Википедия — Критерий Поста]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BC%D0%BA%D0%BD%D1%83%D1%82%D1%8B%D0%B5_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D1%8B_%D0%B1%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9 Википедия — Замкнутые классы булевых функций]&lt;br /&gt;
* Образовательный сайт [http://mini-soft.ru/nstu/diskr/7_.php MiniSoft]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Post%27s_lattice Post's lattice]&lt;br /&gt;
* [http://www.mielt.ru/dir/cat14/subj266/file299/view1397.html Лекции по дискретной математике]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Булевы функции]]&lt;/div&gt;</summary>
		<author><name>5.18.154.236</name></author>	</entry>

	</feed>