<?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=Nikitaevg</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=Nikitaevg"/>
		<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/Nikitaevg"/>
		<updated>2026-06-11T14:21:41Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%82%D0%BE%D1%85%D0%B0%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D1%83%D1%81%D0%BA&amp;diff=69487</id>
		<title>Стохастический градиентный спуск</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%82%D0%BE%D1%85%D0%B0%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D1%83%D1%81%D0%BA&amp;diff=69487"/>
				<updated>2019-01-28T12:30:29Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Стохастический градиентный спуск''' (англ. ''stochastic gradient descent'') $-$ оптимизационный алгоритм, отличающийся от обычного [https://ru.wikipedia.org/wiki/%D0%93%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D1%83%D1%81%D0%BA градиентного спуска] тем, что градиент оптимизируемой функции считается на каждом шаге не как сумма градиентов от каждого элемента выборки, а как градиент от одного, случайно выбранного элемента.&lt;br /&gt;
&lt;br /&gt;
== Обычный градиентный спуск ==&lt;br /&gt;
Для начала вспомним, как работает обычный градиентный спуск. Пусть объекты задаются $n$ числовыми признаками $f_j : X \to R, j = 1 ... n$ и пространство признаковых описаний в таком случае $X = R^n$. Пусть $Y$ $-$ конечное множество меток классов и задана обучающая выборка пар «объект-ответ» &amp;lt;tex&amp;gt;\{(x_1,y_1),\dots,(x_l,y_l)\}.&amp;lt;/tex&amp;gt; Пусть семейство алгоритмов $a(x, {\bf w})$ имеет параметр вектор весов $\bf w$. И пускай мы выбрали какую-нибудь функцию потерь. Для $i$-го объекта выборки для алгоритма с весами ${\bf w}$ обозначим ее &amp;lt;tex&amp;gt; \mathscr{L}_i({\bf w}) &amp;lt;/tex&amp;gt;. Необходимо минимизировать эмпирический риск, т.е. &amp;lt;tex&amp;gt;Q(w) = \sum\limits_{i=1}^l \mathscr{L}_i(w) \,\to\, \min\limits_{\bf w}&amp;lt;/tex&amp;gt;. Если функция потерь принадлежит классу $C_1(X)$, то можно применить метод градиентного спуска. Выберем ${\bf w}^{(0)}$ $-$ начальное приближение. Тогда каждый следующий вектор параметров будет вычисляться как ${\bf w}^{(t+1)}={\bf w}^{(t)} - h\sum\limits_{i=1}^{l}\nabla \mathscr{L}_i({\bf w}^{(t)})$, где $h$ - градиентный шаг, смысл которого заключается в том, насколько сильно менять вектор весов в направлении градиента. Остановка алгоритма будет определяться сходимостью $Q$ или $\bf w$.&lt;br /&gt;
&lt;br /&gt;
== Стохастический градиентный спуск ==&lt;br /&gt;
Проблема предыдущего алгоритма заключается в том, что чтобы определить новое приближение вектора весов необходимо вычислить градиент от каждого элемента выборки, что может сильно замедлять алгоритм. Идея ускорения алгоритма заключается в использовании только одного элемента, либо некоторой подвыборки для подсчета нового приближения весов. То есть теперь новое приближение будет вычисляться как ${\bf w}^{(t+1)}={\bf w}^{(t)} $-$ h\nabla \mathscr{L}_i({\bf w}^{(t)})$, где $i$ $-$ случайно выбранный индекс. Так как теперь направление изменения $\bf w$ будет определяться за $O(1)$, подсчет $Q$ на каждом шаге будет слишком дорогостоящим. Для того, чтобы ускорить оценку $Q$, будем использовать приближенную рекуррентную формулу. Можно выбрать одну из следующих формул:&lt;br /&gt;
* среднее арифметическое: $\overline{Q}_m = \dfrac{1}{m}\varepsilon_m + \dfrac{1}{m}\varepsilon_{m - 1} + \dfrac{1}{m}\varepsilon_{m - 2} + \dots = \dfrac{1}{m}\varepsilon_m + (1 - \dfrac{1}{m})\overline{Q}_{m-1}$&lt;br /&gt;
* экспоненциальное скользящее среднее: $\overline{Q}_m = \lambda\varepsilon_m + (1 - \lambda)\varepsilon_{m - 1} + (1 - \lambda)^2\varepsilon_{m - 2} + \dots = \lambda\varepsilon_m + (1-\lambda)\overline{Q}_{m - 1},$ где $\lambda$ $-$ темп забывания предыстории ряда.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
 '''def''' SGD(X, h, $\lambda$)''':''' &amp;lt;font color=green&amp;gt; # где X $-$ выборка, h $-$ градиентный шаг, а $\lambda$ $-$ темп забывания &amp;lt;/font&amp;gt;&lt;br /&gt;
    ${\bf w} =$ initialize_weights() &amp;lt;font color=green&amp;gt; # инициализировать веса &amp;lt;/font&amp;gt;&lt;br /&gt;
    $\overline{Q} = \frac{1}{l} \sum_{i=1}^{l}\mathscr{L}_i({\bf w})$ &amp;lt;font color=green&amp;gt;# инициализировать оценку функционала &amp;lt;/font&amp;gt;&lt;br /&gt;
    '''while''' $Q$ not converges '''or''' ${\bf w}$ not converges''':'''&lt;br /&gt;
        $i =$ rand() % $l$ &amp;lt;font color=green&amp;gt; # случайно выбрать элемент, по которому будет считаться градиент &amp;lt;/font&amp;gt;&lt;br /&gt;
        $\varepsilon = \mathscr{L}_i({\bf w})$ &amp;lt;font color=green&amp;gt; # вычислить потерю &amp;lt;/font&amp;gt;&lt;br /&gt;
        ${\bf w} = {\bf w} - h \nabla \mathscr{L}_i({\bf w})$ &amp;lt;font color=green&amp;gt;# обновить вектор весов в направлении градиента&amp;lt;/font&amp;gt;&lt;br /&gt;
        $\overline{Q} = \lambda\varepsilon + (1 - \lambda)\overline{Q}$ &amp;lt;font color=green&amp;gt;# оценить функционал&amp;lt;/font&amp;gt;&lt;br /&gt;
    '''return''' w&lt;br /&gt;
&lt;br /&gt;
== Эвристики ==&lt;br /&gt;
Существует несколько способов инициализировать веса:&lt;br /&gt;
* ${\bf w} = {\bf 0}$&lt;br /&gt;
* $w_j = random(-\dfrac{1}{2n}, \dfrac{1}{2n})$. Стоит брать небольшие случайные веса, так как если выбрать их слишком большими, в некоторых случаях (к примеру в случае нейрона с [[Нейронные_сети,_перцептрон|функцией активациии]] равной арктангенсу) большие начальные значения веса могут привести в область с малыми по модулю производными, в связи с чем из такой области будет трудно выбраться.&lt;br /&gt;
* $w_j = \dfrac{\langle y, f_j \rangle}{\langle f_j, f_j \rangle}$, где $f_j = (f_j(x_i))_{i=1}^l$. Оценка оптимальная в случае, если функция потерь квадратична и признаки нескоррелированы, то есть $\langle f_j, f_k \rangle = 0, j \neq k$&lt;br /&gt;
Так же можно запустить спуск несколько раз с разными начальными приближениями и выбрать лучшее решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При выборе случайного элемента можно использовать следующие эвристики:&lt;br /&gt;
* брать объекты из разных классов;&lt;br /&gt;
* брать объекты, на которых ошибка больше, то есть чем меньше отступ (в метрических классификаторах расстояние от разделяющей поверхности до объекта) i-го объекта $M_i$, тем больше вероятность взять этот объект;&lt;br /&gt;
* брать объекты, на которых уверенность меньше, то есть чем меньше $|M_i|$, тем больше вероятность взять этот объект;&lt;br /&gt;
* не брать объекты, на которых уже высокая уверенность ($M_i &amp;gt; \mu_+$) либо не брать объекты-выбросы ($M_i&amp;lt;\mu_i$);&lt;br /&gt;
&lt;br /&gt;
Выбирать величину градиентного шага можно следующими способами:&lt;br /&gt;
* $h_t = \dfrac{1}{t}$;&lt;br /&gt;
* метод скорейшего градиентного спуска: $\mathscr{L}_i({\bf w} - h\nabla \mathscr{L}_i({\bf w})) \rightarrow \min\limits_h$;&lt;br /&gt;
* при квадратичной функции потерь можно использовать $h = ||x_i||^2$;&lt;br /&gt;
* иногда можно выполнять пробные шаги, а именно увеличивать $h$ для выбивания процесса из локальных минимумов;&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B5%D0%B2%D0%B5%D0%BD%D0%B1%D0%B5%D1%80%D0%B3%D0%B0_%E2%80%94_%D0%9C%D0%B0%D1%80%D0%BA%D0%B2%D0%B0%D1%80%D0%B4%D1%82%D0%B0 метод Левенберга-Марквардта];&lt;br /&gt;
&lt;br /&gt;
== Регуляризация ==&lt;br /&gt;
Основным способом уменьшить переобучение является [[Регулярищация|регуляризация]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;, т.е. сокращение весов. Будем штрафовать за увеличение нормы вектора весов, для этого перепишем функцию потерь $\tilde{\mathscr{L}}_i({\bf w}) = \mathscr{L}_i({\bf w}) + \dfrac{\tau}{2}||w||^2 = \mathscr{L}_i({\bf w}) + \dfrac{\tau}{2} \sum\limits_{j=1}^nw_j^2 \rightarrow \min\limits_w$, где $\tau$ $-$ коэффициент регуляризации.&lt;br /&gt;
&lt;br /&gt;
Тогда градиент будет следующим: $\nabla \tilde{\mathscr{L}}_i({\bf w}) = \nabla \mathscr{L}_i({\bf w}) + \tau {\bf w}$, а градиентный шаг будет выглядеть так: ${\bf w} = {\bf w}(1 - h\tau) - h\nabla \mathscr{L}_i({\bf w})$.&lt;br /&gt;
&lt;br /&gt;
== Достоинства и недостатки ==&lt;br /&gt;
'''Достониства:'''&lt;br /&gt;
* легко реализуется;&lt;br /&gt;
* функция потерь и семейство алгоритмов могут быть любыми (если функция потерь не дифференцируема, ее можно аппроксимировать дифференцируемой);&lt;br /&gt;
* легко добавить регуляризацию;&lt;br /&gt;
* возможно потоковое обучение;&lt;br /&gt;
* подходит для задач с большими данными, иногда можно получить решение даже не обработав всю выборку;&lt;br /&gt;
'''Недостатки'''&lt;br /&gt;
* нет универсального набора эвристик, их нужно выбирать для конкретной задачи отдельно;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пример кода scikit-learn == &lt;br /&gt;
Классификатор [https://scikit-learn.org/stable/modules/sgd.html sklearn.linear_model.'''SGDClassifier'''] имеет несколько параметров, например: &lt;br /&gt;
&lt;br /&gt;
'''loss''' $-$ функция потерь. По умолчанию используется &amp;quot;hinge&amp;quot;, дающая алгоритм линейного SVM;&lt;br /&gt;
&lt;br /&gt;
'''penalty''' $-$ метод регуляризации. По умолчанию &amp;quot;l2&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
'''alpha''' $-$ $\tau$, коэффициент регуляризации;&lt;br /&gt;
&lt;br /&gt;
'''learning_rate''' $-$ алгоритм изменения градиентного шага;&lt;br /&gt;
&lt;br /&gt;
'''eta0''' $-$ начальный градиентный шаг;&lt;br /&gt;
&lt;br /&gt;
'''shuffle''' перемешивать тренировочную выборку после каждой итерации;&lt;br /&gt;
&lt;br /&gt;
* Импортируем нужные библиотеки:&lt;br /&gt;
 '''from''' sklearn.linear_model '''import''' SGDClassifier&lt;br /&gt;
 '''from''' sklearn '''import''' datasets&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
* Выберем тренировочное и тестовое множества:&lt;br /&gt;
 iris = datasets.'''load_iris()'''&lt;br /&gt;
 &lt;br /&gt;
 X = iris.data&lt;br /&gt;
 y = iris.target&lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size='''0.3''')&lt;br /&gt;
&lt;br /&gt;
* Обучение:&lt;br /&gt;
 clf = SGDClassifier(shuffle = True)&lt;br /&gt;
 model = clf.'''fit'''(X_train, y_train)&lt;br /&gt;
&lt;br /&gt;
* Предсказание:&lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 model.'''score'''(X_test, y_test)&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
#[http://www.machinelearning.ru/wiki/images/5/53/Voron-ML-Lin-SG.pdf Метод стохастического градиента] $-$ презентация Воронцова&lt;br /&gt;
#[https://www.youtube.com/watch?v=4BKQ3GZR32w&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=4 Метод стохастического градиента] $-$ запись лекции Воронцова&lt;br /&gt;
#[https://en.wikipedia.org/wiki/Logistic_regression Logistic regression] $-$ Wikipedia&lt;br /&gt;
#[https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDClassifier.html#sklearn.linear_model.SGDClassifier.decision_function sklearn.linear_model.SGDClassifier] $-$ описание алгоритма на scikit-learn.org&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%82%D0%BE%D1%85%D0%B0%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D1%83%D1%81%D0%BA&amp;diff=69486</id>
		<title>Стохастический градиентный спуск</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%82%D0%BE%D1%85%D0%B0%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D1%83%D1%81%D0%BA&amp;diff=69486"/>
				<updated>2019-01-28T12:14:27Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Стохастический градиентный спуск''' (англ. ''stochastic gradient descent'') $-$ оптимизационный алгоритм, отличающийся от обычного [https://ru.wikipedia.org/wiki/%D0%93%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D1%83%D1%81%D0%BA градиентного спуска] тем, что градиент оптимизируемой функции считается на каждом шаге не как сумма градиентов от каждого элемента выборки, а как градиент от одного, случайно выбранного элемента.&lt;br /&gt;
&lt;br /&gt;
== Обычный градиентный спуск ==&lt;br /&gt;
Для начала вспомним, как работает обычный градиентный спуск. Пусть объекты задаются $n$ числовыми признаками $f_j : X \to R, j = 1 ... n$ и пространство признаковых описаний в таком случае $X = R^n$. Пусть $Y$ $-$ конечное множество меток классов и задана обучающая выборка пар «объект-ответ» &amp;lt;tex&amp;gt;\{(x_1,y_1),\dots,(x_l,y_l)\}.&amp;lt;/tex&amp;gt; Пусть семейство алгоритмов $a(x, {\bf w})$ имеет параметр вектор весов $\bf w$. И пускай мы выбрали какую-нибудь функцию потерь. Для $i$-го объекта выборки для алгоритма с весами ${\bf w}$ обозначим ее &amp;lt;tex&amp;gt; \mathscr{L}_i({\bf w}) &amp;lt;/tex&amp;gt;. Необходимо минимизировать эмпирический риск, т.е. &amp;lt;tex&amp;gt;Q(w) = \sum\limits_{i=1}^l \mathscr{L}_i(w) \,\to\, \min\limits_{\bf w}&amp;lt;/tex&amp;gt;. Если функция потерь принадлежит классу $C_1(X)$, то можно применить метод градиентного спуска. Выберем ${\bf w}^{(0)}$ $-$ начальное приближение. Тогда каждый следующий вектор параметров будет вычисляться как ${\bf w}^{(t+1)}={\bf w}^{(t)} - h\sum\limits_{i=1}^{l}\nabla \mathscr{L}_i({\bf w}^{(t)})$, где $h$ - градиентный шаг, смысл которого заключается в том, насколько сильно менять вектор весов в направлении градиента. Остановка алгоритма будет определяться сходимостью $Q$ или $\bf w$.&lt;br /&gt;
&lt;br /&gt;
== Стохастический градиентный спуск ==&lt;br /&gt;
Проблема предыдущего алгоритма заключается в том, что чтобы определить новое приближение вектора весов необходимо вычислить градиент от каждого элемента выборки, что может сильно замедлять алгоритм. Идея ускорения алгоритма заключается в использовании только одного элемента, либо некоторой подвыборки для подсчета нового приближения весов. То есть теперь новое приближение будет вычисляться как ${\bf w}^{(t+1)}={\bf w}^{(t)} $-$ h\nabla \mathscr{L}_i({\bf w}^{(t)})$, где $i$ $-$ случайно выбранный индекс. Так как теперь направление изменения $\bf w$ будет определяться за $O(1)$, подсчет $Q$ на каждом шаге будет слишком дорогостоящим. Для того, чтобы ускорить оценку $Q$, будем использовать приближенную рекуррентную формулу. Можно выбрать одну из следующих формул:&lt;br /&gt;
* среднее арифметическое: $\overline{Q}_m = \dfrac{1}{m}\varepsilon_m + \dfrac{1}{m}\varepsilon_{m - 1} + \dfrac{1}{m}\varepsilon_{m - 2} + \dots = \dfrac{1}{m}\varepsilon_m + (1 - \dfrac{1}{m})\overline{Q}_{m-1}$&lt;br /&gt;
* экспоненциальное скользящее среднее: $\overline{Q}_m = \lambda\varepsilon_m + (1 - \lambda)\varepsilon_{m - 1} + (1 - \lambda)^2\varepsilon_{m - 2} + \dots = \lambda\varepsilon_m + (1-\lambda)\overline{Q}_{m - 1},$ где $\lambda$ $-$ темп забывания предыстории ряда.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
 '''def''' SGD(X, h, $\lambda$)''':''' &amp;lt;font color=green&amp;gt; # где X $-$ выборка, h $-$ градиентный шаг, а $\lambda$ $-$ темп забывания &amp;lt;/font&amp;gt;&lt;br /&gt;
    ${\bf w} =$ initialize_weights() &amp;lt;font color=green&amp;gt; # инициализировать веса &amp;lt;/font&amp;gt;&lt;br /&gt;
    $\overline{Q} = \frac{1}{l} \sum_{i=1}^{l}\mathscr{L}_i({\bf w})$ &amp;lt;font color=green&amp;gt;# инициализировать оценку функционала &amp;lt;/font&amp;gt;&lt;br /&gt;
    '''while''' $Q$ not converges '''or''' ${\bf w}$ not converges''':'''&lt;br /&gt;
        $i =$ rand() % $l$ &amp;lt;font color=green&amp;gt; # случайно выбрать элемент, по которому будет считаться градиент &amp;lt;/font&amp;gt;&lt;br /&gt;
        $\varepsilon = \mathscr{L}_i({\bf w})$ &amp;lt;font color=green&amp;gt; # вычислить потерю &amp;lt;/font&amp;gt;&lt;br /&gt;
        ${\bf w} = {\bf w} - h \nabla \mathscr{L}_i({\bf w})$ &amp;lt;font color=green&amp;gt;# обновить вектор весов в направлении градиента&amp;lt;/font&amp;gt;&lt;br /&gt;
        $\overline{Q} = \lambda\varepsilon + (1 - \lambda)\overline{Q}$ &amp;lt;font color=green&amp;gt;# оценить функционал&amp;lt;/font&amp;gt;&lt;br /&gt;
    '''return''' w&lt;br /&gt;
&lt;br /&gt;
== Эвристики ==&lt;br /&gt;
Существует несколько способов инициализировать веса:&lt;br /&gt;
* ${\bf w} = {\bf 0}$&lt;br /&gt;
* $w_j = random(-\dfrac{1}{2n}, \dfrac{1}{2n})$. Стоит брать небольшие случайные веса, так как если выбрать их слишком большими, в некоторых случаях (к примеру в случае нейрона с [[Нейронные_сети,_перцептрон|функцией активациии]] равной арктангенсу) большие начальные значения веса могут привести в область с малыми по модулю производными, в связи с чем из такой области будет трудно выбраться.&lt;br /&gt;
* $w_j = \dfrac{\langle y, f_j \rangle}{\langle f_j, f_j \rangle}$, где $f_j = (f_j(x_i))_{i=1}^l$. Оценка оптимальная в случае, если функция потерь квадратична и признаки нескоррелированы, то есть $\langle f_j, f_k \rangle = 0, j \neq k$&lt;br /&gt;
Так же можно запустить спуск несколько раз с разными начальными приближениями и выбрать лучшее решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При выборе случайного элемента можно использовать следующие эвристики:&lt;br /&gt;
* брать объекты из разных классов &lt;br /&gt;
* брать объекты, на которых ошибка больше, то есть чем меньше отступ i-го объекта $M_i$, тем больше вероятность взять этот объект&lt;br /&gt;
* брать объекты, на которых уверенность меньше, то есть чем меньше $|M_i|$, тем больше вероятность взять этот объект&lt;br /&gt;
* не брать объекты, на которых уже высокая уверенность ($M_i &amp;gt; \mu_+$) либо не брать объекты-выбросы ($M_i&amp;lt;\mu_i$)&lt;br /&gt;
&lt;br /&gt;
Выбирать величину градиентного шага можно следующими способами:&lt;br /&gt;
* $h_t = \dfrac{1}{t}$&lt;br /&gt;
* метод скорейшего градиентного спуска: $\mathscr{L}_i({\bf w} - h\nabla \mathscr{L}_i({\bf w})) \rightarrow \min\limits_h$&lt;br /&gt;
* при квадратичной функции потерь можно использовать $h = ||x_i||^2$&lt;br /&gt;
* иногда можно выполнять пробные шаги, а именно увеличивать $h$ для выбивания процесса из локальных минимумов&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B5%D0%B2%D0%B5%D0%BD%D0%B1%D0%B5%D1%80%D0%B3%D0%B0_%E2%80%94_%D0%9C%D0%B0%D1%80%D0%BA%D0%B2%D0%B0%D1%80%D0%B4%D1%82%D0%B0 метод Левенберга-Марквардта]&lt;br /&gt;
&lt;br /&gt;
== Регуляризация ==&lt;br /&gt;
Основным способом уменьшить переобучение является [[Регулярищация|регуляризация]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;, т.е. сокращение весов. Будем штрафовать за увеличение нормы вектора весов, для этого перепишем функцию потерь $\tilde{\mathscr{L}}_i({\bf w}) = \mathscr{L}_i({\bf w}) + \dfrac{\tau}{2}||w||^2 = \mathscr{L}_i({\bf w}) + \dfrac{\tau}{2} \sum\limits_{j=1}^nw_j^2 \rightarrow \min\limits_w$, где $\tau$ $-$ коэффициент регуляризации.&lt;br /&gt;
&lt;br /&gt;
Тогда градиент будет следующим: $\nabla \tilde{\mathscr{L}}_i({\bf w}) = \nabla \mathscr{L}_i({\bf w}) + \tau {\bf w}$, а градиентный шаг будет выглядеть так: ${\bf w} = {\bf w}(1 - h\tau) - h\nabla \mathscr{L}_i({\bf w})$.&lt;br /&gt;
&lt;br /&gt;
== Достоинства и недостатки ==&lt;br /&gt;
'''Достониства:'''&lt;br /&gt;
* легко реализуется&lt;br /&gt;
* функция потерь и семейство алгоритмов могут быть любыми (если функция потерь не дифференцируема, ее можно аппроксимировать дифференцируемой)&lt;br /&gt;
* легко добавить регуляризацию&lt;br /&gt;
* возможно потоковое обучение&lt;br /&gt;
* подходит для задач с большими данными, иногда можно получить решение даже не обработав всю выборку&lt;br /&gt;
'''Недостатки'''&lt;br /&gt;
* нет универсального набора эвристик, их нужно выбирать для конкретной задачи отдельно&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пример кода scikit-learn == &lt;br /&gt;
Классификатор [https://scikit-learn.org/stable/modules/sgd.html sklearn.linear_model.'''SGDClassifier'''] имеет несколько параметров, например: &lt;br /&gt;
&lt;br /&gt;
'''loss''' $-$ функция потерь. По умолчанию используется &amp;quot;hinge&amp;quot;, дающая алгоритм линейного SVM&lt;br /&gt;
&lt;br /&gt;
'''penalty''' $-$ метод регуляризации. По умолчанию &amp;quot;l2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''alpha''' $-$ $\tau$, коэффициент регуляризации&lt;br /&gt;
&lt;br /&gt;
'''learning_rate''' $-$ алгоритм изменения градиентного шага&lt;br /&gt;
&lt;br /&gt;
'''eta0''' $-$ начальный градиентный шаг&lt;br /&gt;
&lt;br /&gt;
'''shuffle''' перемешивать тренировочную выборку после каждой итерации&lt;br /&gt;
&lt;br /&gt;
* Импортируем нужные библиотеки&lt;br /&gt;
 '''from''' sklearn.linear_model '''import''' SGDClassifier&lt;br /&gt;
 '''from''' sklearn '''import''' datasets&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
* Выберем тренировочное и тестовое множества&lt;br /&gt;
 iris = datasets.'''load_iris()'''&lt;br /&gt;
 &lt;br /&gt;
 X = iris.data&lt;br /&gt;
 y = iris.target&lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size='''0.3''')&lt;br /&gt;
&lt;br /&gt;
* Обучение&lt;br /&gt;
 clf = SGDClassifier(shuffle = True)&lt;br /&gt;
 model = clf.'''fit'''(X_train, y_train)&lt;br /&gt;
&lt;br /&gt;
* Предсказание&lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 model.'''score'''(X_test, y_test)&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
#[http://www.machinelearning.ru/wiki/images/5/53/Voron-ML-Lin-SG.pdf Метод стохастического градиента] $-$ презентация Воронцова&lt;br /&gt;
#[https://www.youtube.com/watch?v=4BKQ3GZR32w&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=4 Метод стохастического градиента] $-$ запись лекции Воронцова&lt;br /&gt;
#[https://en.wikipedia.org/wiki/Logistic_regression Logistic regression] $-$ Wikipedia&lt;br /&gt;
#[https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDClassifier.html#sklearn.linear_model.SGDClassifier.decision_function sklearn.linear_model.SGDClassifier] $-$ описание алгоритма на scikit-learn.org&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%82%D0%BE%D1%85%D0%B0%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D1%83%D1%81%D0%BA&amp;diff=69457</id>
		<title>Стохастический градиентный спуск</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%82%D0%BE%D1%85%D0%B0%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D1%83%D1%81%D0%BA&amp;diff=69457"/>
				<updated>2019-01-27T13:24:43Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Стохастический градиентный спуск''' - оптимизационный алгоритм, отличающийся от обычного [https://ru.wikipedia.org/wiki/%D0%93%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D1%83%D1%81%D0%BA градиентного спуска] тем, что градиент оптимизируемой функции считается на каждом шаге не как сумма градиентов от каждого элемента выборки, а как градиент от одного, случайно выбранного элемента.&lt;br /&gt;
&lt;br /&gt;
== Обычный градиентный спуск ==&lt;br /&gt;
Для начала вспомним, как работает обычный градиентный спуск. Пусть объекты задаются $n$ числовыми признаками $f_j : X \to R, j = 1 ... n$ и пространство признаковых описаний в таком случае $X = R^n$. Пусть $Y$ $-$ конечное множество меток классов и задана обучающая выборка пар «объект-ответ» &amp;lt;tex&amp;gt;\{(x_1,y_1),\dots,(x_l,y_l)\}.&amp;lt;/tex&amp;gt; Пусть семейство алгоритмов $a(x, {\bf w})$ имеет параметр вектор весов $\bf w$. И пускай мы выбрали какую-нибудь функцию потерь. Для $i$-го объекта выборки для алгоритма с весами ${\bf w}$ обозначим ее &amp;lt;tex&amp;gt; \mathscr{L}_i({\bf w}) &amp;lt;/tex&amp;gt;. Необходимо минимизировать эмпирический риск, т.е. &amp;lt;tex&amp;gt;Q(w) = \sum\limits_{i=1}^l \mathscr{L}_i(w) \,\to\, \min\limits_{\bf w}&amp;lt;/tex&amp;gt;. Если функция потерь принадлежит классу $C_1(X)$, то можно применить метод градиентного спуска. Выберем ${\bf w}^{(0)}$ - начальное приближение. Тогда каждый следующий вектор параметров будет вычисляться как ${\bf w}^{(t+1)}={\bf w}^{(t)} - h\sum\limits_{i=1}^{l}\nabla \mathscr{L}_i({\bf w}^{(t)})$, где $h$ - градиентный шаг, смысл которого заключается в том, насколько сильно менять вектор весов в направлении градиента. Остановка алгоритма будет определяться сходимостью $Q$ или $\bf w$.&lt;br /&gt;
&lt;br /&gt;
== Стохастический градиентный спуск ==&lt;br /&gt;
Проблема предыдущего алгоритма заключается в том, что чтобы определить новое приближение вектора весов необходимо вычислить градиент от каждого элемента выборки, что может сильно замедлять алгоритм. Идея ускорения алгоритма заключается в использовании только одного элемента, либо некоторой подвыборки для подсчета нового приближения весов. То есть теперь новое приближение будет вычисляться как ${\bf w}^{(t+1)}={\bf w}^{(t)} - h\nabla \mathscr{L}_i({\bf w}^{(t)})$, где $i$ - случайно выбранный индекс. Так как теперь направление изменения $\bf w$ будет определяться за $O(1)$, подсчет $Q$ на каждом шаге будет слишком дорогостоящим. Для того, чтобы ускорить оценку $Q$, будем использовать приближенную рекуррентную формулу. Можно выбрать одну из следующих формул:&lt;br /&gt;
* Среднее арифметическое: $\overline{Q}_m = \dfrac{1}{m}\varepsilon_m + \dfrac{1}{m}\varepsilon_{m - 1} + \dfrac{1}{m}\varepsilon_{m - 2} + \dots = \dfrac{1}{m}\varepsilon_m + (1 - \dfrac{1}{m})\overline{Q}_{m-1}$&lt;br /&gt;
* Экспоненциальное скользящее среднее: $\overline{Q}_m = \lambda\varepsilon_m + (1 - \lambda)\varepsilon_{m - 1} + (1 - \lambda)^2\varepsilon_{m - 2} + \dots = \lambda\varepsilon_m + (1-\lambda)\overline{Q}_{m - 1},$ где $\lambda$ - темп забывания предыстории ряда.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
 '''def''' SG(x, h, l)''':'''&lt;br /&gt;
    ${\bf w} =$ initialize_weights() # инициализировать веса&lt;br /&gt;
    $\overline{Q} = \frac{1}{l} \sum_{i=1}^{l}\mathscr{L}_i({\bf w})$ # инициализировать оценку функционала&lt;br /&gt;
    '''while''' $Q$ not converges '''or''' ${\bf w}$ not converges''':'''&lt;br /&gt;
        $i =$ rand() % $l$ # случайно выбрать элемент, по которому будет считаться градиент&lt;br /&gt;
        $\varepsilon = \mathscr{L}_i({\bf w})$ # вычислить потерю&lt;br /&gt;
        ${\bf w} = {\bf w} - h \nabla \mathscr{L}_i({\bf w})$ # обновить вектор весов в направлении градиента&lt;br /&gt;
        $\overline{Q} = \lambda\varepsilon + (1 - \lambda)\overline{Q}$ # оценить функционал&lt;br /&gt;
&lt;br /&gt;
== Эвристики ==&lt;br /&gt;
Существует несколько способов инициализировать веса:&lt;br /&gt;
* ${\bf w} = {\bf 0}$&lt;br /&gt;
* $w_j = random(-\dfrac{1}{2n}, \dfrac{1}{2n})$. Стоит брать небольшие случайные веса, так как если выбрать их слишком большими, в некоторых случаях (к примеру в случае нейрона с функцией активациии равной арктангенсу) большие начальные значения веса могут привести в область с малыми по модулю производными, в связи с чем из такой области будет трудно выбраться.&lt;br /&gt;
* $w_j = \dfrac{\langle y, f_j \rangle}{\langle f_j, f_j \rangle}$, где $f_j = (f_j(x_i))_{i=1}^l$. Оценка оптимальная в случае, если функция потерь квадратична и признаки нескоррелированы, то есть $\langle f_j, f_k \rangle = 0, j \neq k$&lt;br /&gt;
Так же можно запустить спуск несколько раз с разными начальными приближениями и выбрать лучшее решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При выборе случайного элемента можно использовать следующие эвристики:&lt;br /&gt;
* брать объекты из разных классов &lt;br /&gt;
* брать объекты, на которых ошибка больше, то есть чем меньше отступ $M_i$, тем больше вероятность взять объект&lt;br /&gt;
* брать объекты, на которых уверенность меньше, то есть чем меньше $|M_i|$, тем больше вероятность взять объект&lt;br /&gt;
* не брать объекты, на которых уже высокая уверенность ($M_i &amp;gt; \mu_+$) либо не брать объекты-выбросы ($M_i&amp;lt;\mu_i$)&lt;br /&gt;
&lt;br /&gt;
Выбирать величину градиентного шага можно следующими способами:&lt;br /&gt;
* $h_t = \dfrac{1}{t}$&lt;br /&gt;
* метод скорейшего градиентного спуска: $\mathscr{L}_i({\bf w} - h\nabla \mathscr{L}_i({\bf w})) \rightarrow \min\limits_h$.&lt;br /&gt;
* При квадратичной функции потерь можно использовать $h = ||x_i||^2$&lt;br /&gt;
* Иногда можно выполнять пробные шаги, а именно увеличивать h для выбивания процесса из локальных минимумов&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B5%D0%B2%D0%B5%D0%BD%D0%B1%D0%B5%D1%80%D0%B3%D0%B0_%E2%80%94_%D0%9C%D0%B0%D1%80%D0%BA%D0%B2%D0%B0%D1%80%D0%B4%D1%82%D0%B0 Метод Левенберга-Марквардта]&lt;br /&gt;
&lt;br /&gt;
== Регуляризация ==&lt;br /&gt;
Основным способом уменьшить переобучение является регуляризация, т.е. сокращение весов. Будем штрафовать за увеличение нормы вектора весов, для этого перепишем функцию потерь $\tilde{\mathscr{L}}_i({\bf w}) = \mathscr{L}_i({\bf w}) + \dfrac{\tau}{2}||w||^2 = \mathscr{L}_i({\bf w}) + \dfrac{\tau}{2} \sum\limits_{j=1}^nw_j^2 \rightarrow \min\limits_w$, где $\tau$ - коэффициент регуляризации.&lt;br /&gt;
&lt;br /&gt;
Тогда градиент будет следующим: $\nabla \tilde{\mathscr{L}}_i({\bf w}) = \nabla \mathscr{L}_i({\bf w}) + \tau {\bf w}$, а градиентный шаг будет выглядеть так: ${\bf w} = {\bf w}(1 - h\tau) - h\nabla \mathscr{L}_i({\bf w})$.&lt;br /&gt;
&lt;br /&gt;
== Достоинства и недостатки ==&lt;br /&gt;
'''Достониства:'''&lt;br /&gt;
* Легко реализуется&lt;br /&gt;
* Функция потерь и семейство алгоритмов могут быть любыми (если функция потерь не дифференцируема, ее можно аппроксимировать дифференцируемой)&lt;br /&gt;
* Легко добавить регуляризацию&lt;br /&gt;
* Возможно потоковое обучение&lt;br /&gt;
* Подходит для задач с большими данными, иногда можно получить решение даже не обработав всю выборку&lt;br /&gt;
'''Недостатки'''&lt;br /&gt;
* Нет универсального набора эвристик, их нужно выбирать для конкретной задачи отдельно&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пример кода scikit-learn == &lt;br /&gt;
Классификатор [https://scikit-learn.org/stable/modules/sgd.html sklearn.linear_model.'''SGDClassifier'''] имеет несколько параметров, например: &lt;br /&gt;
&lt;br /&gt;
'''loss''' - функция потерь. По умолчанию используется &amp;quot;hinge&amp;quot;, дающая алгоритм линейного SVM&lt;br /&gt;
&lt;br /&gt;
'''penalty''' - метод регуляризации. По умолчанию &amp;quot;l2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''alpha''' - $\tau$, коэффициент регуляризации&lt;br /&gt;
&lt;br /&gt;
'''learning_rate''' - алгоритм изменения градиентного шага&lt;br /&gt;
&lt;br /&gt;
'''eta0''' - начальный градиентный шаг&lt;br /&gt;
&lt;br /&gt;
'''shuffle''' перемешивать тренировочную выборку после каждой итерации&lt;br /&gt;
&lt;br /&gt;
* Импортируем нужные библиотеки&lt;br /&gt;
 '''from''' sklearn.linear_model '''import''' SGDClassifier&lt;br /&gt;
 '''from''' sklearn '''import''' datasets&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
* Выберем тренировочное и тестовое множества&lt;br /&gt;
 iris = datasets.'''load_iris()'''&lt;br /&gt;
 &lt;br /&gt;
 X = iris.data&lt;br /&gt;
 y = iris.target&lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size='''0.3''')&lt;br /&gt;
&lt;br /&gt;
* Обучение&lt;br /&gt;
 clf = SGDClassifier(shuffle = True)&lt;br /&gt;
 model = clf.'''fit'''(X_train, y_train)&lt;br /&gt;
&lt;br /&gt;
* Предсказание&lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 model.'''score'''(X_test, y_test)&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
#[http://www.machinelearning.ru/wiki/images/5/53/Voron-ML-Lin-SG.pdf Метод стохастического градиента] $-$ презентация Воронцова&lt;br /&gt;
#[https://www.youtube.com/watch?v=4BKQ3GZR32w&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=4 Метод стохастического градиента] $-$ запись лекции Воронцова&lt;br /&gt;
#[https://en.wikipedia.org/wiki/Logistic_regression Logistic regression] $-$ Wikipedia&lt;br /&gt;
#[https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDClassifier.html#sklearn.linear_model.SGDClassifier.decision_function sklearn.linear_model.SGDClassifier] $-$ описание алгоритма на scikit-learn.org&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%82%D0%BE%D1%85%D0%B0%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D1%83%D1%81%D0%BA&amp;diff=69455</id>
		<title>Стохастический градиентный спуск</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%82%D0%BE%D1%85%D0%B0%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D1%83%D1%81%D0%BA&amp;diff=69455"/>
				<updated>2019-01-27T12:56:31Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: Init&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Стохастический градиентный спуск''' - оптимизационный алгоритм, отличающийся от обычного [https://ru.wikipedia.org/wiki/%D0%93%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D1%83%D1%81%D0%BA градиентного спуска] тем, что градиент оптимизируемой функции считается на каждом шаге не как сумма градиентов от каждого элемента выборки, а как градиент одного, случайно выбранного элемента.&lt;br /&gt;
&lt;br /&gt;
== Обычный градиентный спуск ==&lt;br /&gt;
Для начала вспомним, как работает обычный градиентный спуск. Пусть объекты задаются $n$ числовыми признаками $f_j : X \to R, j = 1 ... n$ и пространство признаковых описаний в таком случае $X = R^n$. Пусть $Y$ $-$ конечное множество меток классов и задана обучающая выборка пар «объект-ответ» &amp;lt;tex&amp;gt;\{(x_1,y_1),\dots,(x_l,y_l)\}.&amp;lt;/tex&amp;gt; Пусть семейство алгоритмов $a(x, {\bf w})$ зависит от вектора параметров $\bf w$. И пускай мы выбрали какую-нибудь функцию потерь, для $i$-го объекта выборки для алгоритма с весами ${\bf w}$ обозначим ее &amp;lt;tex&amp;gt; \mathscr{L}_i({\bf w}) &amp;lt;/tex&amp;gt;. Необходимо минимизировать эмпирический риск, т.е. &amp;lt;tex&amp;gt;Q(w) = \sum\limits_{i=1}^l \mathscr{L}_i(w) \,\to\, \min\limits_{\bf w}&amp;lt;/tex&amp;gt;. Если функция потерь принадлежит классу $C_1(X)$, то можно применить метод градиентного спуска. Выберем ${\bf w}^{(0)}$ - начальное приближение. Тогда каждый следующий вектор параметров будет вычисляться как ${\bf w}^{(t+1)}={\bf w}^{(t)} - h\sum\limits_{i=1}^{l}\nabla \mathscr{L}_i({\bf w}^{(t)})$, где $h$ - градиентный шаг, смысл которого заключается в том, насколько сильно менять вектор весов в направлении градиента. Остановка алгоритм будет определятся сходимостью $Q$ или $\bf w$.&lt;br /&gt;
&lt;br /&gt;
== Стохастический градиентный спуск ==&lt;br /&gt;
Проблема предыдущего алгоритма заключается в том, что чтобы определить новое приближение вектора весов необходимо вычислить градиент от каждого элемента выборки, что может сильно замедлять алгоритм. Идея ускорения алгоритма заключается в использовании только одного элемента, либо некоторой подвыборки для подсчета нового приближения весов. То есть теперь новое приближение будет вычисляться как ${\bf w}^{(t+1)}={\bf w}^{(t)} - h\nabla \mathscr{L}_i({\bf w}^{(t)})$, где $i$ - случайно выбранный индекс. Так как теперь направление изменения $\bf w$ будет определяться за $O(1)$, подсчет $Q$ на каждом шаге будет слишком дорогостоящим. Для того, чтобы этого не делать, будем использовать приближенную рекуррентную формулу. Тогда оценка $Q$ на $m$-ом шаге может выполняться следующими способами:&lt;br /&gt;
* Среднее арифметическое: $\overline{Q}_m = \dfrac{1}{m}\varepsilon_m + \dfrac{1}{m}\varepsilon_{m - 1} + \dfrac{1}{m}\varepsilon_{m - 2} + \dots = \dfrac{1}{m}\varepsilon_m + (1 - \dfrac{1}{m})\overline{Q}_{m-1}$&lt;br /&gt;
* Экспоненциальное скользящее среднее: $\overline{Q}_m = \lambda\varepsilon_m + (1 - \lambda)\varepsilon_{m - 1} + (1 - \lambda)^2\varepsilon_{m - 2} + \dots = \lambda\varepsilon_m + (1-\lambda)\overline{Q}_{m - 1},$ где $\lambda$ - темп забывания предыстории ряда.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
 '''def''' SG(x, h, l)''':'''&lt;br /&gt;
    ${\bf w} =$ initialize_weights() # инициализировать веса&lt;br /&gt;
    $\overline{Q} = \frac{1}{l} \sum_{i=1}^{l}\mathscr{L}_i({\bf w})$ # инициализировать оценку функционала&lt;br /&gt;
    '''while''' $Q$ not converges '''or''' ${\bf w}$ not converges''':'''&lt;br /&gt;
        $i =$ rand() % $l$ # случайно выбрать элемент, по которому будет считаться градиент&lt;br /&gt;
        $\varepsilon = \mathscr{L}_i({\bf w})$ # вычислить потерю&lt;br /&gt;
        ${\bf w} = {\bf w} - h \nabla \mathscr{L}_i({\bf w})$ # обновить вектор весов в направлении градиента&lt;br /&gt;
        $\overline{Q} = \lambda\varepsilon + (1 - \lambda)\overline{Q}$ # оценить функционал&lt;br /&gt;
&lt;br /&gt;
== Эвристики ==&lt;br /&gt;
Есть несколько способов инициализировать веса:&lt;br /&gt;
* ${\bf w} = {\bf 0}$&lt;br /&gt;
* $w_j = random(-\dfrac{1}{2n}, \dfrac{1}{2n})$. Стоит брать небольшие случайные веса, так как если выбрать их слишком большими, в некоторых случаях (к примеру в случае нейрона с функцией активациии равной арктангенсу) большие начальные значения веса могут привести в область с малыми по модулю производными, в связи с чем из такой области будет трудно выбраться.&lt;br /&gt;
* $w_j = \dfrac{\langle y, f_j \rangle}{\langle f_j, f_j \rangle}$, где $f_j = (f_j(x_i))_{i=1}^l$. Оценка оптимальная в случае, если функция потерь квадратична и признаки нескоррелированы, то есть $\langle f_j, f_k \rangle = 0, j \neq k$&lt;br /&gt;
Так же можно запустить спуск несколько раз и выбрать лучшее решение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При выборе случайного элемента можно использовать следующие эвристики:&lt;br /&gt;
* брать объекты из разных классов &lt;br /&gt;
* брать объекты, на которых ошибка больше, то есть чем меньше отступ $M_i$, тем больше вероятность взять объект&lt;br /&gt;
* брать объекты, на которых уверенность меньше, то есть чем меньше $|M_i|$, тем больше вероятность взять объект&lt;br /&gt;
* не брать объекты, на которых уже высокая уверенность ($M_i &amp;gt; \mu_+$) либо не брать объекты-выбросы ($M_i&amp;lt;\mu_i$)&lt;br /&gt;
&lt;br /&gt;
Выбирать величину градиентного шага можно следующими способами:&lt;br /&gt;
* $h_t = \dfrac{1}{t}$&lt;br /&gt;
* метод скорейшего градиентного спуска: $\mathscr{L}_i({\bf w} - h\nabla \mathscr{L}_i({\bf w})) \rightarrow \min\limits_h$.&lt;br /&gt;
* При квадратичной функции потерь можно использовать $h = ||x_i||^2$&lt;br /&gt;
* Иногда можно выполнять пробные шаги с помощью увеличения h для выбивания процесса из локальных минимумов&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B5%D0%B2%D0%B5%D0%BD%D0%B1%D0%B5%D1%80%D0%B3%D0%B0_%E2%80%94_%D0%9C%D0%B0%D1%80%D0%BA%D0%B2%D0%B0%D1%80%D0%B4%D1%82%D0%B0 Метод Левенберга-Марквардта]&lt;br /&gt;
&lt;br /&gt;
== Регуляризация ==&lt;br /&gt;
Основным способом уменьшить переобучение является регуляризация, т.е. сокращение весов. Будем штрафовать за увеличение нормы вектора весов, для этого перепишем функцию потерь $\tilde{\mathscr{L}}_i({\bf w}) = \mathscr{L}_i({\bf w}) + \dfrac{\tau}{2}||w||^2 = \mathscr{L}_i({\bf w}) + \dfrac{\tau}{2} \sum\limits_{j=1}^nw_j^2 \rightarrow \min\limits_w$, где $\tau$ - коэффициент регуляризации.&lt;br /&gt;
&lt;br /&gt;
Тогда градиент будет следующим: $\nabla \tilde{\mathscr{L}}_i({\bf w}) = \nabla \mathscr{L}_i({\bf w}) + \tau {\bf w}$, а градиентный шаг будет выглядеть так: ${\bf w} = {\bf w}(1 - h\tau) - h\nabla \mathscr{L}_i({\bf w})$.&lt;br /&gt;
&lt;br /&gt;
== Достоинства и недостатки ==&lt;br /&gt;
'''Достониства:'''&lt;br /&gt;
* Легко реализуется&lt;br /&gt;
* Функция потерь и семейство алгоритмов могут быть любыми (если функция потерь не дифференцируема, ее можно аппроксимировать дифференцируемой)&lt;br /&gt;
* Легко добавить регуляризацию&lt;br /&gt;
* Возможно потоковое обучение&lt;br /&gt;
* Подходит для задач с большими данными, иногда можно получить решение даже не обработав всю выборку&lt;br /&gt;
'''Недостатки'''&lt;br /&gt;
* Нет универсального набора эвристик, их нужно выбирать для конкретной задачи отдельно&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пример кода scikit-learn == &lt;br /&gt;
Классификатор [https://scikit-learn.org/stable/modules/sgd.html sklearn.linear_model.'''SGDClassifier'''] имеет несколько параметров, например: &lt;br /&gt;
&lt;br /&gt;
'''loss''' - функция потерь. По умолчанию используется &amp;quot;hinge&amp;quot;, дающая алгоритм линейного SVM&lt;br /&gt;
&lt;br /&gt;
'''penalty''' - метод регуляризации. По умолчанию &amp;quot;l2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''alpha''' - $\tau$, коэффициент регуляризации&lt;br /&gt;
&lt;br /&gt;
'''learning_rate''' - алгоритм изменения градиентного шага&lt;br /&gt;
&lt;br /&gt;
'''eta0''' - начальный градиентный шаг&lt;br /&gt;
&lt;br /&gt;
'''shuffle''' перемешивать тренировочную выборку после каждой итерации&lt;br /&gt;
&lt;br /&gt;
* Импортируем нужные библиотеки&lt;br /&gt;
 '''from''' sklearn.linear_model '''import''' SGDClassifier&lt;br /&gt;
 '''from''' sklearn '''import''' datasets&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
* Выберем тренировочное и тестовое множества&lt;br /&gt;
 iris = datasets.'''load_iris()'''&lt;br /&gt;
 &lt;br /&gt;
 X = iris.data&lt;br /&gt;
 y = iris.target&lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size='''0.3''')&lt;br /&gt;
&lt;br /&gt;
* Обучение&lt;br /&gt;
 clf = SGDClassifier(shuffle = True)&lt;br /&gt;
 model = clf.'''fit'''(X_train, y_train)&lt;br /&gt;
&lt;br /&gt;
* Предсказание&lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 model.'''score'''(X_test, y_test)&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%BE_%D0%B4%D0%B5%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%BC_%D0%B1%D0%B0%D1%80%D1%8C%D0%B5%D1%80%D0%B5&amp;diff=58702</id>
		<title>Теорема о декомпозиционном барьере</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%BE_%D0%B4%D0%B5%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%BC_%D0%B1%D0%B0%D1%80%D1%8C%D0%B5%D1%80%D0%B5&amp;diff=58702"/>
				<updated>2017-01-04T18:55:37Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
о декомпозиционном барьере&lt;br /&gt;
|statement=&lt;br /&gt;
Существуют положительные вещественные числа &amp;lt;tex&amp;gt;c_{1}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;c_{2}&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;c_{1}V \leqslant E \leqslant c_{2}V^2&amp;lt;/tex&amp;gt;, существует [[Определение сети, потока|сеть]] &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; ребрами, такая что для любого максимального потока &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;\Omega (E)&amp;lt;/tex&amp;gt; слагаемых (т.е. путей или циклов), причем каждый из путей (циклов) в декомпозиции должен иметь длину &amp;lt;tex&amp;gt;\Omega (V)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:DecompositionBarierExample.png|300px|thumb|right|Пример для &amp;lt;tex&amp;gt;V = 16&amp;lt;/tex&amp;gt;, в который надо добавить нужное количество ребер]]&lt;br /&gt;
&amp;lt;div&amp;gt;Возьмем &amp;lt;tex&amp;gt;c_{1} = \dfrac{11}{10}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;c_{2} = \dfrac{1}{9}&amp;lt;/tex&amp;gt;. Константа &amp;lt;tex&amp;gt;c_1&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;\Omega(E)&amp;lt;/tex&amp;gt; ребер, а константа &amp;lt;tex&amp;gt;c_2&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&amp;lt;/tex&amp;gt; равны &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, остальных — &amp;lt;tex&amp;gt;+\infty&amp;lt;/tex&amp;gt; (или просто достаточно большое число, например, &amp;lt;tex&amp;gt;V^2&amp;lt;/tex&amp;gt;).&amp;lt;/div&amp;gt;&lt;br /&gt;
Теперь докажем саму теорему:&lt;br /&gt;
* Максимальный поток по модулю равен потоку через разрез, который разделяет &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; (т.е. пересекает все ребра с пропускной способностью &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;). Поток по каждому пути в декомпозиции не превышает 1, а значит, этих путей не меньше, чем ребер между &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;\Omega (E)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* По построению сети, любой путь из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; содержит хотя бы &amp;lt;tex&amp;gt;(\dfrac{V}{3} + 3)&amp;lt;/tex&amp;gt; ребер, что является &amp;lt;tex&amp;gt;\Omega (V)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Следствие:''' Алгоритмы, которые могут выписать декомпозицию потока вместе с поиском самого потока ([[Схема алгоритма Диница| Алгоритм Диница]], [[Алгоритм Эдмондса-Карпа]], [[Алгоритм Форда-Фалкерсона, реализация с помощью поиска в глубину| Алгоритм Форда-Фалкерсона]] и подобные) не могут работать быстрее чем за &amp;lt;tex&amp;gt;O(VE)&amp;lt;/tex&amp;gt;, так как декомпозиция может быть сама по себе большой.&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Алгоритм Форда-Фалкерсона, реализация с помощью поиска в глубину| Алгоритм Форда-Фалкерсона]]&lt;br /&gt;
*[[Алгоритм Эдмондса-Карпа]]&lt;br /&gt;
*[[Схема алгоритма Диница| Алгоритм Диница]]&lt;br /&gt;
*[[Алгоритм поиска блокирующего потока в ациклической сети]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
[https://youtu.be/PMqO0UCezqo?t=1h39m57s Андрей Станкевич: Лекториум, дополнительные главы алгоритмов, лекция 11]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Задача о максимальном потоке ]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</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_%D0%AD%D0%B4%D0%BC%D0%BE%D0%BD%D0%B4%D1%81%D0%B0-%D0%9A%D0%B0%D1%80%D0%BF%D0%B0&amp;diff=58697</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_%D0%AD%D0%B4%D0%BC%D0%BE%D0%BD%D0%B4%D1%81%D0%B0-%D0%9A%D0%B0%D1%80%D0%BF%D0%B0&amp;diff=58697"/>
				<updated>2017-01-04T18:36:33Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: переименовал Алоритм Эдмондса-Карпа в Алгоритм Эдмондса-Карпа: Опечатка&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Алгоритм ==&lt;br /&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;
# В остаточной сети находим кратчайший путь из источника в сток. Если такого пути нет, останавливаемся.&lt;br /&gt;
# Пускаем через найденный путь (он называется '''увеличивающим путём''' или '''увеличивающей цепью''') максимально возможный поток:&lt;br /&gt;
## На найденном пути в остаточной сети ищем ребро с минимальной пропускной способностью &amp;lt;tex&amp;gt;\mathrm{c_{min}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
## Для каждого ребра на найденном пути увеличиваем поток на &amp;lt;tex&amp;gt;\mathrm{c_{min}}&amp;lt;/tex&amp;gt;, а в противоположном ему — уменьшаем на &amp;lt;tex&amp;gt;\mathrm{c_{min}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
## Модифицируем остаточную сеть. Для всех рёбер на найденном пути, а также для противоположных им рёбер, вычисляем новую пропускную способность. Если она стала ненулевой, добавляем ребро к остаточной сети, а если обнулилась, стираем его.&lt;br /&gt;
# Возвращаемся на шаг 2.&lt;br /&gt;
&lt;br /&gt;
===Сложность===&lt;br /&gt;
Сложность алгоритма Эдмондса-Карпа равна &amp;lt;tex&amp;gt;O(VE^2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
&lt;br /&gt;
 '''function''' EdmondsKarp(G, s, t):&lt;br /&gt;
     '''for''' (для) каждого ребра &amp;lt;tex&amp;gt;(u,v) \in E[G]&amp;lt;/tex&amp;gt;&lt;br /&gt;
         &amp;lt;tex&amp;gt;f[u,v] \leftarrow 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
         &amp;lt;tex&amp;gt;f[v,u] \leftarrow 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''while''' существует ''кратчайший'' путь &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; в остаточной сети &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt;&lt;br /&gt;
         &amp;lt;tex&amp;gt;c_f(p) \leftarrow min\{c_f(u,v) : (u,v) \in p\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''for''' &amp;lt;tex&amp;gt;(u,v) \in p&amp;lt;/tex&amp;gt;&lt;br /&gt;
             &amp;lt;tex&amp;gt;f[u,v] \leftarrow f[u,v] + c_f(p)&amp;lt;/tex&amp;gt;&lt;br /&gt;
             &amp;lt;tex&amp;gt;f[v,u] \leftarrow -f[u,v]&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Корректность алгоритма Эдмондса-Карпа ==&lt;br /&gt;
&lt;br /&gt;
На каждой итерации цикла &amp;lt;tex&amp;gt;\mathrm {while}&amp;lt;/tex&amp;gt; поток в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; увеличивается вдоль одного из кратчайших путей в &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; из истока &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в сток &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. Этот процесс повторяется до тех пор пока существует кратчайший &amp;lt;tex&amp;gt;s \leadsto t&amp;lt;/tex&amp;gt; путь в &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt;. Если в &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; не существует кратчайшего пути из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, значит, не существует никакого вообще никакого &amp;lt;tex&amp;gt;s \leadsto t&amp;lt;/tex&amp;gt; пути в &amp;lt;tex&amp;gt;G_f&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;
{{Лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|statement=&lt;br /&gt;
Если в сети &amp;lt;tex&amp;gt;G(V,E)&amp;lt;/tex&amp;gt; с истоком &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и стоком &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; увеличение потока производится вдоль кратчайших &amp;lt;tex&amp;gt;s \leadsto t&amp;lt;/tex&amp;gt; путей в &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt;, то для всех вершин &amp;lt;tex&amp;gt;v \in V\backslash\{s,t\}&amp;lt;/tex&amp;gt; длина кратчайшего пути &amp;lt;tex&amp;gt;\delta_f(s, v)&amp;lt;/tex&amp;gt; в остаточной сети &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; не убывает после каждого увеличения потока.&lt;br /&gt;
|proof=&lt;br /&gt;
Предположим противное, пусть существует вершина &amp;lt;tex&amp;gt;v \in V \backslash\{s,t\}&amp;lt;/tex&amp;gt;, что после какого-то увеличения потока длина кратчайшего пути из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; уменьшилась. Обозначим потоки до и после увеличения соответственно за &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;f'&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; {{---}} вершина, расстояние &amp;lt;tex&amp;gt;\delta'_f(s,v)&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; до которой минимально и уменьшилось с увеличением потока. Имеем &amp;lt;tex&amp;gt;\delta'_f(s,v) &amp;lt; \delta_f(s,v)&amp;lt;/tex&amp;gt;. Рассмотрим путь &amp;lt;tex&amp;gt;p = s \leadsto u \rightarrow v&amp;lt;/tex&amp;gt;, являющийся кратчайшим от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'_f&amp;lt;/tex&amp;gt;. Тогда верно, что &amp;lt;tex&amp;gt;\delta'_f(s, u) = \delta'_f(s,v) - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По выбору &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и из предыдущего утверждения получаем, что &amp;lt;tex&amp;gt;\delta'_f (s, u) \geqslant\delta_f(s,u)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим &amp;lt;tex&amp;gt;(u, v) \in E_f&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;\delta_f(s,v) \leqslant \delta_f(s, u) + 1 \leqslant \delta'_f(s,u) + 1 = \delta'_f(s, v)&amp;lt;/tex&amp;gt;. Это противоречит &amp;lt;tex&amp;gt;\delta'_f(s,v) &amp;lt; \delta_f(s,v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;(u,v) \notin E_f&amp;lt;/tex&amp;gt;, но известно, что &amp;lt;tex&amp;gt;(u,v) \in E_f'&amp;lt;/tex&amp;gt;. Появление ребра &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; после увеличения потока означает увеличение потока по обратному ребру &amp;lt;tex&amp;gt;(v, u)&amp;lt;/tex&amp;gt;. Увеличение потока производится вдоль кратчайшего пути, поэтому кратчайший путь из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; вдоль которого происходило увеличения выглядит как &amp;lt;tex&amp;gt;s \leadsto v \rightarrow u&amp;lt;/tex&amp;gt;, из чего получаем &amp;lt;tex&amp;gt;\delta_f(s, v) = \delta_f(s, u) - 1 \leqslant \delta'_f(s, u) - 1 = \delta'(s, v) - 2&amp;lt;/tex&amp;gt;. Данное утверждение противоречит &amp;lt;tex&amp;gt;\delta'_f(s,v) &amp;lt; \delta_f(s,v)&amp;lt;/tex&amp;gt;. Итак мы пришли к противоречию с существованием вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, кратчайшее расстояние до которой уменьшилось с увеличением потока.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Опираясь на предшествующую лемму, докажем следующую теорему, которая ограничивает сверху число итераций цикла &amp;lt;tex&amp;gt;\mathrm {while}&amp;lt;/tex&amp;gt;  в алгоритме Эдмондса-Карпа.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Пусть для некоторой сети &amp;lt;tex&amp;gt;G(V,E)&amp;lt;/tex&amp;gt; с источником &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и стоком &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; выполняется алгоритм Эдмондса-Карпа, тогда общее число итераций цикла &amp;lt;tex&amp;gt;\mathrm {while}&amp;lt;/tex&amp;gt;  составляет &amp;lt;tex&amp;gt;O(V E)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим множество ребер &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; остаточной сети &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt;, принадлежащих увеличивающему пути &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;, таких что &amp;lt;tex&amp;gt;c_f(p) = c_f(u,v)&amp;lt;/tex&amp;gt;. Назовем данные ребра критическими. Покажем, что каждое из &amp;lt;tex&amp;gt;|E|&amp;lt;/tex&amp;gt; ребер может становиться критическим не более, чем &amp;lt;tex&amp;gt;|V| - 1&amp;lt;/tex&amp;gt; раз. Заметим, что после увеличения потока вдоль пути &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; все критические ребра исчезают из остаточной сети, кроме того по определению остаточной пропускной способности пути хотя бы одно ребро увеличивающего пути {{---}} критическое.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две вершины &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; принадлежащие &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, соединенные некоторым ребром из &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt;. Увеличение производится вдоль кратчайших путей, поэтому если ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; становиться критическим в первый раз, верно, что &amp;lt;tex&amp;gt;\delta_f(s,v) = \delta_f(s,u) + 1&amp;lt;/tex&amp;gt;. После увеличения потока ребро &amp;lt;tex&amp;gt;(u, v)&amp;lt;/tex&amp;gt; исчезает из сети. Оно не появится в другом увеличивающем пути до тех, пор пока не будет уменьшен по обратному ребру &amp;lt;tex&amp;gt;(v, u)&amp;lt;/tex&amp;gt;. Это может произойти только в том случае, если ребро &amp;lt;tex&amp;gt;(v, u)&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;, то поскольку увеличение производиться вдоль кратчайших путей, верно: &amp;lt;tex&amp;gt;\delta'_f(s,u) = \delta'_f(s, v) + 1&amp;lt;/tex&amp;gt;. Согласно [[#lemma1|лемме]] &amp;lt;tex&amp;gt;\delta_f(s,v) \leqslant \delta'_f(s,v)&amp;lt;/tex&amp;gt;, откуда &amp;lt;tex&amp;gt;\delta'_f(s,u) = \delta'(s,v) + 1 \geqslant \delta_f(s,v) + 1 = \delta_f(s,u) + 2&amp;lt;/tex&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;s&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; увеличивается минимум на &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;. Расстояние &amp;lt;tex&amp;gt;\delta(s,u)&amp;lt;/tex&amp;gt; в начальный момент времени больше либо равно &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;. Среди промежуточных вершин на кратчайшем пути &amp;lt;tex&amp;gt;s \leadsto u&amp;lt;/tex&amp;gt; не могут находиться &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. Следовательно к тому моменту, когда вершина &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; станет недостижимой из источника расстояние до нее не превысит &amp;lt;tex&amp;gt;|V| - 2&amp;lt;/tex&amp;gt;. Получаем, что ребро &amp;lt;tex&amp;gt;(u, v)&amp;lt;/tex&amp;gt; могло стать критическим не более &amp;lt;tex&amp;gt;\dfrac{(|V| -2)}{2} = \dfrac{|V|}{2} - 1&amp;lt;/tex&amp;gt; раз. Поскольку в графе не более &amp;lt;tex&amp;gt;O(E)&amp;lt;/tex&amp;gt; пар вершин, между которыми могут существовать ребра в остаточной сети, то общее количество критических ребер в ходе выполнения алгоритма Эдмондса-Карпа равно &amp;lt;tex&amp;gt;O(V E)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Так как каждый увеличивающий путь содержит по крайней мере одно критическое ребро, следовательно число кратчайших путей составляет &amp;lt;tex&amp;gt;O(V E)&amp;lt;/tex&amp;gt;. На каждой итерации цикла &amp;lt;tex&amp;gt;\mathrm {while}&amp;lt;/tex&amp;gt;  рассматривается ровно один увеличивающий путь, а поскольку в случае отсутствия такого пути выполнение цикла прерывается, то число итераций цикла &amp;lt;tex&amp;gt;\mathrm {while}&amp;lt;/tex&amp;gt;  также составляет &amp;lt;tex&amp;gt;O(V E)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Если увеличивающий путь находить поиском в ширину, то каждую итерацию цикла &amp;lt;tex&amp;gt;\mathrm {while}&amp;lt;/tex&amp;gt;  можно выполнить за время &amp;lt;tex&amp;gt;O(E)&amp;lt;/tex&amp;gt;. Инициализация в процедуре '''Edmonds_Karp''' производится за &amp;lt;tex&amp;gt;O(E)&amp;lt;/tex&amp;gt;, следовательно время работы алгоритма алгоритма Эдмондса-Карпа составляет &amp;lt;tex&amp;gt;O(V E^2)&amp;lt;/tex&amp;gt;. Заметим также, что сущетсвует сеть  &amp;quot;грибок&amp;quot;&amp;lt;ref&amp;gt;[https://www.topcoder.com/community/data-science/data-science-tutorials/maximum-flow-augmenting-path-algorithms-comparison/#! Cтатья на TopCoder.com  ]&amp;lt;/ref&amp;gt; на которой нижняя граница времени работы алгоритмы Эдмондса-Карпа также составляет &amp;lt;tex&amp;gt;\Omega(V E^2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* ''Кормен, Томас Х., Лейзерсон, Чарльз И., Ривест, Рональд Л., Штайн Клиффорд'' '''Алгоритмы: построение и анализ''', 2-е издание. Пер. с англ. — М.:Издательский дом &amp;quot;Вильямс&amp;quot;, 2010. — 1296 с.: ил. — Парал. тит. англ. — ISBN 978-5-8459-0857-5 (рус.)&lt;br /&gt;
*[https://ru.wikipedia.org/wiki/Алгоритм_Эдмондса_—_Карпа Википедия: Алоритм Эдмондса-Карпа]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Edmonds–Karp_algorithm Википедия: Алоритм Эдмондса-Карпа (англ.)]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Задача о максимальном потоке]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%AD%D0%B4%D0%BC%D0%BE%D0%BD%D0%B4%D1%81%D0%B0-%D0%9A%D0%B0%D1%80%D0%BF%D0%B0&amp;diff=58698</id>
		<title>Алоритм Эдмондса-Карпа</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%AD%D0%B4%D0%BC%D0%BE%D0%BD%D0%B4%D1%81%D0%B0-%D0%9A%D0%B0%D1%80%D0%BF%D0%B0&amp;diff=58698"/>
				<updated>2017-01-04T18:36:33Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: переименовал Алоритм Эдмондса-Карпа в Алгоритм Эдмондса-Карпа: Опечатка&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#перенаправление [[Алгоритм Эдмондса-Карпа]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D1%8B_%D0%9A%D0%B0%D1%80%D0%B7%D0%B0%D0%BD%D0%BE%D0%B2%D0%B0_%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%B5_%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B8%D0%BD%D0%B8%D1%86%D0%B0_%D0%B2_%D1%81%D0%B5%D1%82%D0%B8_%D1%81_%D1%86%D0%B5%D0%BB%D0%BE%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8_%D0%BF%D1%80%D0%BE%D0%BF%D1%83%D1%81%D0%BA%D0%BD%D1%8B%D0%BC%D0%B8_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BD%D0%BE%D1%81%D1%82%D1%8F%D0%BC%D0%B8&amp;diff=58654</id>
		<title>Теоремы Карзанова о числе итераций алгоритма Диница в сети с целочисленными пропускными способностями</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D1%8B_%D0%9A%D0%B0%D1%80%D0%B7%D0%B0%D0%BD%D0%BE%D0%B2%D0%B0_%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%B5_%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B8%D0%BD%D0%B8%D1%86%D0%B0_%D0%B2_%D1%81%D0%B5%D1%82%D0%B8_%D1%81_%D1%86%D0%B5%D0%BB%D0%BE%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8_%D0%BF%D1%80%D0%BE%D0%BF%D1%83%D1%81%D0%BA%D0%BD%D1%8B%D0%BC%D0%B8_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BD%D0%BE%D1%81%D1%82%D1%8F%D0%BC%D0%B8&amp;diff=58654"/>
				<updated>2017-01-04T17:29:35Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: /* Обозначения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Обозначения==&lt;br /&gt;
Введём следующие обозначения:&lt;br /&gt;
* &amp;lt;tex&amp;gt;N = (V,E,s,t,c)&amp;lt;/tex&amp;gt; {{---}} [[Определение сети, потока|сеть]] с целочисленными пропускными способностями,&lt;br /&gt;
* обозначим &amp;lt;tex&amp;gt;C =  \max\limits_{uv \in E} c_{uv}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; как максимальный поток,&lt;br /&gt;
*&amp;lt;tex&amp;gt;c^{+}(v) = \sum\limits_{uv \in E} c_{uv}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;c^{-}(v) = \sum\limits_{vu \in E} c_{vu}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;p(v) = \min(c^{+}(v), c^{-}(v))&amp;lt;/tex&amp;gt; {{---}} потенциал вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;P = \sum\limits_{v \in V, v \neq s,t}p(v)&amp;lt;/tex&amp;gt; {{---}} общий потенциал,&lt;br /&gt;
*&amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; {{---}} [[Дополняющая сеть, дополняющий путь|остаточная сеть]].&lt;br /&gt;
&lt;br /&gt;
==Теоремы==&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about = 1&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; {{---}} расстояние между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&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;l \leqslant \dfrac{P}{F} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; {{---}} расстояние между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;V_i&amp;lt;/tex&amp;gt; {{---}} набор вершин, удаленных от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(i \leqslant l)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;tex&amp;gt;V_i&amp;lt;/tex&amp;gt; {{---}} разъединяющее множество узлов: при его удалении исчезают все пути из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Следуя закону [[Определение сети, потока|сохранения потока]], если &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; обозначить как любой допустимый поток, то &amp;lt;tex&amp;gt;|f|&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;P_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;|f| \leqslant P_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 \leqslant P_i&amp;lt;/tex&amp;gt;, таким образом получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(l - 1)F \leqslant \displaystyle \sum_{i = 1}^{l - 1} P_i \leqslant P&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about = 2&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt; {{---}} сеть, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; {{---}} допустимый поток в этой сети. Тогда общий потенциал в остаточной сети &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; равен общему потенциалу &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
По [[Теорема_о_декомпозиции | теореме о декомпозиции]] поток можно разбить на множество простых путей из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и циклов. Рассмотрим каждый путь (цикл) и убедимся, что, пуская по нему поток &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt;, потенциал вершины не изменится. Действительно, рассмотрим вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, поток &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt; в нее течет по ребру &amp;lt;tex&amp;gt;uv&amp;lt;/tex&amp;gt;, а из нее по ребру &amp;lt;tex&amp;gt;vw&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;c_{f_i}&amp;lt;/tex&amp;gt; {{---}} функция пропускных способностей в остаточной сети после пропускания потока по &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ому пути (циклу).  Рассмотрим &amp;lt;tex&amp;gt;c^+_{f_1}(v) = c_{f_1}(uv) + c_{f_1}(wv)&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;c_{f_1}(uv) = c(uv) - f_i&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;c_{f_1}(wv) = c(wv) + f_i&amp;lt;/tex&amp;gt;, сложив эти два значения, получим, что &amp;lt;tex&amp;gt;c^+(v)&amp;lt;/tex&amp;gt; остается неизменной. Применив такое же рассуждение для &amp;lt;tex&amp;gt;c^-(v)&amp;lt;/tex&amp;gt;, получим, что потенциал каждой вершины остается неизменным.&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=th1. &lt;br /&gt;
|about=Первая теорема Карзанова&lt;br /&gt;
|statement=Число итераций [[Схема алгоритма Диница|алгоритма Диница]] в сети &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; — исток, &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; — сток) с целочисленными пропускными способностями — &amp;lt;tex&amp;gt;O(\sqrt{P})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; {{---}} максимальный поток в сети &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Теорема верна для &amp;lt;tex&amp;gt;F \leqslant \sqrt{P}&amp;lt;/tex&amp;gt;, так как после каждой фазы поток увеличивается хотя бы на &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;F &amp;gt; \sqrt{P}&amp;lt;/tex&amp;gt;, рассмотрим последнюю фазу, на момент начала выполнения которой поток в сети был меньше, чем &amp;lt;tex&amp;gt;F - \sqrt{P}&amp;lt;/tex&amp;gt;. После этого потребуется не больше &amp;lt;tex&amp;gt;\sqrt{P}&amp;lt;/tex&amp;gt; фаз, чтобы найти максимальный поток. На предыдущей фазе поток (&amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;) в &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; был не больше &amp;lt;tex&amp;gt;F-\sqrt{P}&amp;lt;/tex&amp;gt;, таким образом &amp;lt;tex&amp;gt;F-|f| \geqslant \sqrt{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; {{---}} сеть с максимальным потоком &amp;lt;tex&amp;gt;F-|f|&amp;lt;/tex&amp;gt; и потенциалом &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; (по Лемме(2)). Поэтому можно воспользоваться Леммой(1), чтобы оценить расстояние между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt;, и получить оценку длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; слоистой сети:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;l \leqslant \dfrac{P}{F-|f|} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как каждая фаза увеличивает длину слоистой сети минимум на один, то осуществляется не больше &amp;lt;tex&amp;gt;\sqrt{P}&amp;lt;/tex&amp;gt; фаз. Таким образом происходит не более &amp;lt;tex&amp;gt;2\sqrt{P}&amp;lt;/tex&amp;gt; фаз.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about = 3&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть в сети &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; нет [[Основные определения теории графов#def1|параллельных ребер]]. Пусть &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; {{---}} максимальный поток в &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Тогда расстояние &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; таково: &amp;lt;tex&amp;gt;l \leqslant |V|\sqrt{\dfrac{2C}{F}} - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt;V_i&amp;lt;/tex&amp;gt; как набор вершин на расстоянии &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Множества &amp;lt;tex&amp;gt;X = \bigcup\limits_{i = 0}^k V_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y = V - X&amp;lt;/tex&amp;gt; определяют разрез &amp;lt;tex&amp;gt;(X, Y)&amp;lt;/tex&amp;gt;. Пропускная способность этого разреза не больше &amp;lt;tex&amp;gt;2C|V_k||V_{k + 1}|&amp;lt;/tex&amp;gt;, так как все ребра между &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y&amp;lt;/tex&amp;gt; также являются ребрами между &amp;lt;tex&amp;gt;V_k&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;V_{k+1}&amp;lt;/tex&amp;gt; и не более чем двумя параллельными ребрами, исходящими из какой-то вершины в остаточной сети. По теореме о максимальном потоке/минимальном разрезе, &amp;lt;tex&amp;gt;F \leqslant 2C|V_k||V_{k+1}|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Таким образом &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; ограничен наименьшим из &amp;lt;tex&amp;gt;|V_k||V_{k+1}|&amp;lt;/tex&amp;gt;. Но эта величина максимальна, когда &amp;lt;tex&amp;gt;|V_i| = \dfrac{|V|}{(l+1)}&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;0 \leqslant i \leqslant n&amp;lt;/tex&amp;gt;, таким образом &amp;lt;tex&amp;gt;F \leqslant 2C\dfrac{|V|^2 }{ (l+1)^2}&amp;lt;/tex&amp;gt;, из чего следует необходимое неравенство.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=th2&lt;br /&gt;
|about=Вторая теорема Карзанова&lt;br /&gt;
|statement=Число итераций алгоритма Диница с целочисленными пропускными способностями {{---}} &amp;lt;tex&amp;gt;O(C^{\frac{1}{3}}|V|^{\frac{2}{3}})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;F \leqslant C^{\frac{1}{3}}|V|^{\frac{2}{3}}&amp;lt;/tex&amp;gt;, то теорема очевидна. &lt;br /&gt;
Положим, что &amp;lt;tex&amp;gt;F &amp;gt; C^{\frac{1}{3}}|V|^{\frac{2}{3}}&amp;lt;/tex&amp;gt;, и рассмотрим последнюю фазу, в которой поток &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; не превышает &amp;lt;tex&amp;gt;F - C^{\frac{1}{3}}|V|^{\frac{2}{3}}&amp;lt;/tex&amp;gt;. В этот момент осталось не более &amp;lt;tex&amp;gt;C^{\frac{1}{3}}|V|^{\frac{2}{3}} + 1&amp;lt;/tex&amp;gt; фаз, и &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; {{---}} сеть с максимальным потоком &amp;lt;tex&amp;gt;F - |f| \geqslant C^{\frac{1}{3}}|V|^{\frac{2}{3}}&amp;lt;/tex&amp;gt;. Мы можем применить Лемму(3), чтобы оценить длину &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; слоистой сети, и, соответственно, количество выполненных фаз:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;l \leqslant |V|{(\dfrac{2C}{F-|f|})}^{\frac{1}{2}} - 1 \leqslant 2^{\frac{1}{2}}C^{\frac{1}{3}}|V|^{\frac{2}{3}} - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, прошло &amp;lt;tex&amp;gt;O(C^{\frac{1}{3}}|V|^{\frac{2}{3}})&amp;lt;/tex&amp;gt; фаз, и &amp;lt;tex&amp;gt;O(C^{\frac{1}{3}}|V|^{\frac{2}{3}})&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;
* [http://www.springerlink.com/content/w0q006u3631gg124/fulltext.pdf On the efficiency of Maximum-Flow Algorithms on Networks with Small Integer Capacities. David Fernandez-Baca and Charles U.Martel]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sEwp5ZAJJps&amp;amp;feature=youtu.be&amp;amp;t=26m41s Андрей Станкевич: Лекториум, дополнительные главы алгоритмов, лекция 12]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория:Задача о максимальном потоке]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D1%8B_%D0%9A%D0%B0%D1%80%D0%B7%D0%B0%D0%BD%D0%BE%D0%B2%D0%B0_%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%B5_%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B8%D0%BD%D0%B8%D1%86%D0%B0_%D0%B2_%D1%81%D0%B5%D1%82%D0%B8_%D1%81_%D1%86%D0%B5%D0%BB%D0%BE%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8_%D0%BF%D1%80%D0%BE%D0%BF%D1%83%D1%81%D0%BA%D0%BD%D1%8B%D0%BC%D0%B8_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BD%D0%BE%D1%81%D1%82%D1%8F%D0%BC%D0%B8&amp;diff=58653</id>
		<title>Теоремы Карзанова о числе итераций алгоритма Диница в сети с целочисленными пропускными способностями</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D1%8B_%D0%9A%D0%B0%D1%80%D0%B7%D0%B0%D0%BD%D0%BE%D0%B2%D0%B0_%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%B5_%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B8%D0%BD%D0%B8%D1%86%D0%B0_%D0%B2_%D1%81%D0%B5%D1%82%D0%B8_%D1%81_%D1%86%D0%B5%D0%BB%D0%BE%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8_%D0%BF%D1%80%D0%BE%D0%BF%D1%83%D1%81%D0%BA%D0%BD%D1%8B%D0%BC%D0%B8_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BD%D0%BE%D1%81%D1%82%D1%8F%D0%BC%D0%B8&amp;diff=58653"/>
				<updated>2017-01-04T17:26:57Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: /* Теоремы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Обозначения==&lt;br /&gt;
Введём следующие обозначения:&lt;br /&gt;
* &amp;lt;tex&amp;gt;N = (V,E,s,t,c)&amp;lt;/tex&amp;gt; {{---}} [[Определение сети, потока|сеть]] с целочисленными пропускными способностями,&lt;br /&gt;
* обозначим &amp;lt;tex&amp;gt;C =  \max\limits_{uv \in E} c_{uv}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; как максимальный поток,&lt;br /&gt;
*&amp;lt;tex&amp;gt;c^{+}(v) = \sum\limits_{uv \in E} c_{uv}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;c^{-}(v) = \sum\limits_{vu \in E} c_{vu}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;p(v) = \min\big\{c^{+}(v), c^{-}(v)\big\}&amp;lt;/tex&amp;gt; {{---}} потенциал вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;P = \sum\limits_{v \in V, v \neq s,t}p(v)&amp;lt;/tex&amp;gt; {{---}} общий потенциал,&lt;br /&gt;
*&amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; {{---}} [[Дополняющая сеть, дополняющий путь|остаточная сеть]].&lt;br /&gt;
&lt;br /&gt;
==Теоремы==&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about = 1&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; {{---}} расстояние между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&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;l \leqslant \dfrac{P}{F} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; {{---}} расстояние между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;V_i&amp;lt;/tex&amp;gt; {{---}} набор вершин, удаленных от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(i \leqslant l)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;tex&amp;gt;V_i&amp;lt;/tex&amp;gt; {{---}} разъединяющее множество узлов: при его удалении исчезают все пути из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Следуя закону [[Определение сети, потока|сохранения потока]], если &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; обозначить как любой допустимый поток, то &amp;lt;tex&amp;gt;|f|&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;P_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;|f| \leqslant P_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 \leqslant P_i&amp;lt;/tex&amp;gt;, таким образом получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(l - 1)F \leqslant \displaystyle \sum_{i = 1}^{l - 1} P_i \leqslant P&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about = 2&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt; {{---}} сеть, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; {{---}} допустимый поток в этой сети. Тогда общий потенциал в остаточной сети &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; равен общему потенциалу &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
По [[Теорема_о_декомпозиции | теореме о декомпозиции]] поток можно разбить на множество простых путей из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и циклов. Рассмотрим каждый путь (цикл) и убедимся, что, пуская по нему поток &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt;, потенциал вершины не изменится. Действительно, рассмотрим вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, поток &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt; в нее течет по ребру &amp;lt;tex&amp;gt;uv&amp;lt;/tex&amp;gt;, а из нее по ребру &amp;lt;tex&amp;gt;vw&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;c_{f_i}&amp;lt;/tex&amp;gt; {{---}} функция пропускных способностей в остаточной сети после пропускания потока по &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ому пути (циклу).  Рассмотрим &amp;lt;tex&amp;gt;c^+_{f_1}(v) = c_{f_1}(uv) + c_{f_1}(wv)&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;c_{f_1}(uv) = c(uv) - f_i&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;c_{f_1}(wv) = c(wv) + f_i&amp;lt;/tex&amp;gt;, сложив эти два значения, получим, что &amp;lt;tex&amp;gt;c^+(v)&amp;lt;/tex&amp;gt; остается неизменной. Применив такое же рассуждение для &amp;lt;tex&amp;gt;c^-(v)&amp;lt;/tex&amp;gt;, получим, что потенциал каждой вершины остается неизменным.&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=th1. &lt;br /&gt;
|about=Первая теорема Карзанова&lt;br /&gt;
|statement=Число итераций [[Схема алгоритма Диница|алгоритма Диница]] в сети &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; — исток, &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; — сток) с целочисленными пропускными способностями — &amp;lt;tex&amp;gt;O(\sqrt{P})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; {{---}} максимальный поток в сети &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Теорема верна для &amp;lt;tex&amp;gt;F \leqslant \sqrt{P}&amp;lt;/tex&amp;gt;, так как после каждой фазы поток увеличивается хотя бы на &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;F &amp;gt; \sqrt{P}&amp;lt;/tex&amp;gt;, рассмотрим последнюю фазу, на момент начала выполнения которой поток в сети был меньше, чем &amp;lt;tex&amp;gt;F - \sqrt{P}&amp;lt;/tex&amp;gt;. После этого потребуется не больше &amp;lt;tex&amp;gt;\sqrt{P}&amp;lt;/tex&amp;gt; фаз, чтобы найти максимальный поток. На предыдущей фазе поток (&amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;) в &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; был не больше &amp;lt;tex&amp;gt;F-\sqrt{P}&amp;lt;/tex&amp;gt;, таким образом &amp;lt;tex&amp;gt;F-|f| \geqslant \sqrt{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; {{---}} сеть с максимальным потоком &amp;lt;tex&amp;gt;F-|f|&amp;lt;/tex&amp;gt; и потенциалом &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; (по Лемме(2)). Поэтому можно воспользоваться Леммой(1), чтобы оценить расстояние между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt;, и получить оценку длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; слоистой сети:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;l \leqslant \dfrac{P}{F-|f|} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как каждая фаза увеличивает длину слоистой сети минимум на один, то осуществляется не больше &amp;lt;tex&amp;gt;\sqrt{P}&amp;lt;/tex&amp;gt; фаз. Таким образом происходит не более &amp;lt;tex&amp;gt;2\sqrt{P}&amp;lt;/tex&amp;gt; фаз.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about = 3&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть в сети &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; нет [[Основные определения теории графов#def1|параллельных ребер]]. Пусть &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; {{---}} максимальный поток в &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Тогда расстояние &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; таково: &amp;lt;tex&amp;gt;l \leqslant |V|\sqrt{\dfrac{2C}{F}} - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt;V_i&amp;lt;/tex&amp;gt; как набор вершин на расстоянии &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Множества &amp;lt;tex&amp;gt;X = \bigcup\limits_{i = 0}^k V_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y = V - X&amp;lt;/tex&amp;gt; определяют разрез &amp;lt;tex&amp;gt;(X, Y)&amp;lt;/tex&amp;gt;. Пропускная способность этого разреза не больше &amp;lt;tex&amp;gt;2C|V_k||V_{k + 1}|&amp;lt;/tex&amp;gt;, так как все ребра между &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y&amp;lt;/tex&amp;gt; также являются ребрами между &amp;lt;tex&amp;gt;V_k&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;V_{k+1}&amp;lt;/tex&amp;gt; и не более чем двумя параллельными ребрами, исходящими из какой-то вершины в остаточной сети. По теореме о максимальном потоке/минимальном разрезе, &amp;lt;tex&amp;gt;F \leqslant 2C|V_k||V_{k+1}|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Таким образом &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; ограничен наименьшим из &amp;lt;tex&amp;gt;|V_k||V_{k+1}|&amp;lt;/tex&amp;gt;. Но эта величина максимальна, когда &amp;lt;tex&amp;gt;|V_i| = \dfrac{|V|}{(l+1)}&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;0 \leqslant i \leqslant n&amp;lt;/tex&amp;gt;, таким образом &amp;lt;tex&amp;gt;F \leqslant 2C\dfrac{|V|^2 }{ (l+1)^2}&amp;lt;/tex&amp;gt;, из чего следует необходимое неравенство.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=th2&lt;br /&gt;
|about=Вторая теорема Карзанова&lt;br /&gt;
|statement=Число итераций алгоритма Диница с целочисленными пропускными способностями {{---}} &amp;lt;tex&amp;gt;O(C^{\frac{1}{3}}|V|^{\frac{2}{3}})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;F \leqslant C^{\frac{1}{3}}|V|^{\frac{2}{3}}&amp;lt;/tex&amp;gt;, то теорема очевидна. &lt;br /&gt;
Положим, что &amp;lt;tex&amp;gt;F &amp;gt; C^{\frac{1}{3}}|V|^{\frac{2}{3}}&amp;lt;/tex&amp;gt;, и рассмотрим последнюю фазу, в которой поток &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; не превышает &amp;lt;tex&amp;gt;F - C^{\frac{1}{3}}|V|^{\frac{2}{3}}&amp;lt;/tex&amp;gt;. В этот момент осталось не более &amp;lt;tex&amp;gt;C^{\frac{1}{3}}|V|^{\frac{2}{3}} + 1&amp;lt;/tex&amp;gt; фаз, и &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; {{---}} сеть с максимальным потоком &amp;lt;tex&amp;gt;F - |f| \geqslant C^{\frac{1}{3}}|V|^{\frac{2}{3}}&amp;lt;/tex&amp;gt;. Мы можем применить Лемму(3), чтобы оценить длину &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; слоистой сети, и, соответственно, количество выполненных фаз:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;l \leqslant |V|{(\dfrac{2C}{F-|f|})}^{\frac{1}{2}} - 1 \leqslant 2^{\frac{1}{2}}C^{\frac{1}{3}}|V|^{\frac{2}{3}} - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, прошло &amp;lt;tex&amp;gt;O(C^{\frac{1}{3}}|V|^{\frac{2}{3}})&amp;lt;/tex&amp;gt; фаз, и &amp;lt;tex&amp;gt;O(C^{\frac{1}{3}}|V|^{\frac{2}{3}})&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;
* [http://www.springerlink.com/content/w0q006u3631gg124/fulltext.pdf On the efficiency of Maximum-Flow Algorithms on Networks with Small Integer Capacities. David Fernandez-Baca and Charles U.Martel]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sEwp5ZAJJps&amp;amp;feature=youtu.be&amp;amp;t=26m41s Андрей Станкевич: Лекториум, дополнительные главы алгоритмов, лекция 12]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория:Задача о максимальном потоке]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D1%8B_%D0%9A%D0%B0%D1%80%D0%B7%D0%B0%D0%BD%D0%BE%D0%B2%D0%B0_%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%B5_%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B8%D0%BD%D0%B8%D1%86%D0%B0_%D0%B2_%D1%81%D0%B5%D1%82%D0%B8_%D1%81_%D1%86%D0%B5%D0%BB%D0%BE%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8_%D0%BF%D1%80%D0%BE%D0%BF%D1%83%D1%81%D0%BA%D0%BD%D1%8B%D0%BC%D0%B8_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BD%D0%BE%D1%81%D1%82%D1%8F%D0%BC%D0%B8&amp;diff=58647</id>
		<title>Теоремы Карзанова о числе итераций алгоритма Диница в сети с целочисленными пропускными способностями</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D1%8B_%D0%9A%D0%B0%D1%80%D0%B7%D0%B0%D0%BD%D0%BE%D0%B2%D0%B0_%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%B5_%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B8%D0%BD%D0%B8%D1%86%D0%B0_%D0%B2_%D1%81%D0%B5%D1%82%D0%B8_%D1%81_%D1%86%D0%B5%D0%BB%D0%BE%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8_%D0%BF%D1%80%D0%BE%D0%BF%D1%83%D1%81%D0%BA%D0%BD%D1%8B%D0%BC%D0%B8_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BD%D0%BE%D1%81%D1%82%D1%8F%D0%BC%D0%B8&amp;diff=58647"/>
				<updated>2017-01-04T17:16:25Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: /* Обозначения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Обозначения==&lt;br /&gt;
Введём следующие обозначения:&lt;br /&gt;
* &amp;lt;tex&amp;gt;N = (V,E,s,t,c)&amp;lt;/tex&amp;gt; {{---}} [[Определение сети, потока|сеть]] с целочисленными пропускными способностями,&lt;br /&gt;
* обозначим &amp;lt;tex&amp;gt;C =  \max\limits_{uv \in E} c_{uv}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; как максимальный поток,&lt;br /&gt;
*&amp;lt;tex&amp;gt;c^{+}(v) = \sum\limits_{uv \in E} c_{uv}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;c^{-}(v) = \sum\limits_{vu \in E} c_{vu}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;p(v) = \min\big\{c^{+}(v), c^{-}(v)\big\}&amp;lt;/tex&amp;gt; {{---}} потенциал вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;P = \sum\limits_{v \in V, v \neq s,t}p(v)&amp;lt;/tex&amp;gt; {{---}} общий потенциал,&lt;br /&gt;
*&amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; {{---}} [[Дополняющая сеть, дополняющий путь|остаточная сеть]].&lt;br /&gt;
&lt;br /&gt;
==Теоремы==&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about = 1&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; {{---}} расстояние между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&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;l \leqslant \dfrac{P}{F} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; {{---}} расстояние между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;V_i&amp;lt;/tex&amp;gt; {{---}} набор вершин, удаленных от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(i \leqslant l)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;tex&amp;gt;V_i&amp;lt;/tex&amp;gt; {{---}} разъединяющее множество узлов: при его удалении исчезают все пути из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Следуя закону [[Определение сети, потока|сохранения потока]], если &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; обозначить как любой допустимый поток, то &amp;lt;tex&amp;gt;|f|&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;P_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;|f| \leqslant P_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 \leqslant P_i&amp;lt;/tex&amp;gt;, таким образом получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(l - 1)F \leqslant \displaystyle \sum_{i = 1}^{l - 1} P_i \leqslant P&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about = 2&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt; {{---}} сеть, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; {{---}} допустимый поток в этой сети. Тогда общий потенциал в остаточной сети &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; равен общему потенциалу &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
По [[Теорема_о_декомпозиции | теореме о декомпозиции]] поток можно разбить на множество простых путей из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и циклов. Рассмотрим каждый путь (цикл) и убедимся, что, пуская по нему поток &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt;, потенциал вершины не изменится. Действительно, рассмотрим вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, поток &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt; в нее течет по ребру &amp;lt;tex&amp;gt;uv&amp;lt;/tex&amp;gt;, а из нее по ребру &amp;lt;tex&amp;gt;vw&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;c_{f_i}&amp;lt;/tex&amp;gt; {{---}} функция пропускных способностей в остаточной сети после пропускания потока по &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ому пути (циклу).  Рассмотрим &amp;lt;tex&amp;gt;c^+_{f_1}(v) = c_{f_1}(uv) + c_{f_1}(wv)&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;c_{f_1}(uv) = c(uv) - f_i&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;c_{f_1}(wv) = c(wv) + f_i&amp;lt;/tex&amp;gt;, сложив эти два значения, получим, что &amp;lt;tex&amp;gt;c^+(v)&amp;lt;/tex&amp;gt; остается неизменной. Применив такое же рассуждение для &amp;lt;tex&amp;gt;c^-(v)&amp;lt;/tex&amp;gt;, получим, что потенциал каждой вершины остается неизменным.&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=th1. &lt;br /&gt;
|about=Первая теорема Карзанова&lt;br /&gt;
|statement=Число итераций [[Схема алгоритма Диница|алгоритма Диница]] в сети &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; — исток, &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; — сток) с целочисленными пропускными способностями — &amp;lt;tex&amp;gt;O(\sqrt{P})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; {{---}} максимальный поток в сети &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Теорема верна для &amp;lt;tex&amp;gt;F \leqslant \sqrt{P}&amp;lt;/tex&amp;gt;, так как после каждой фазы поток увеличивается хотя бы на &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;F &amp;gt; \sqrt{P}&amp;lt;/tex&amp;gt;, рассмотрим последнюю фазу, на момент начала выполнения которой поток в сети был меньше, чем &amp;lt;tex&amp;gt;F - \sqrt{P}&amp;lt;/tex&amp;gt;. После этого потребуется не больше &amp;lt;tex&amp;gt;\sqrt{P}&amp;lt;/tex&amp;gt; фаз, чтобы найти максимальный поток. На предыдущей фазе поток (&amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;) в &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; был не больше &amp;lt;tex&amp;gt;F-\sqrt{P}&amp;lt;/tex&amp;gt;, таким образом &amp;lt;tex&amp;gt;F-|f| \geqslant \sqrt{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; {{---}} сеть с максимальным потоком &amp;lt;tex&amp;gt;F-|f|&amp;lt;/tex&amp;gt; и потенциалом &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; (по Лемме(2)). Поэтому можно воспользоваться Леммой(1), чтобы оценить расстояние между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt;, и получить оценку длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; слоистой сети:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;l \leqslant \dfrac{P}{F-|f|} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как каждая фаза увеличивает длину слоистой сети минимум на один, то осуществляется не больше &amp;lt;tex&amp;gt;\sqrt{P}&amp;lt;/tex&amp;gt; фаз. Таким образом происходит не более &amp;lt;tex&amp;gt;2\sqrt{P}&amp;lt;/tex&amp;gt; фаз.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about = 3&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть в сети &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; нет [[Основные определения теории графов#def1|параллельных ребер]]. Пусть &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; {{---}} максимальный поток в &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Тогда расстояние &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; таково: &amp;lt;tex&amp;gt;l \leqslant |V|\sqrt{\dfrac{2C}{F}} - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt;V_i&amp;lt;/tex&amp;gt; как набор вершин на расстоянии &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Множества &amp;lt;tex&amp;gt;X = \bigcup_{i = 0}^k V_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y = V - X&amp;lt;/tex&amp;gt; определяют разрез &amp;lt;tex&amp;gt;(X, Y)&amp;lt;/tex&amp;gt;. Пропускная способность этого разреза не больше &amp;lt;tex&amp;gt;2C|V_k||V_{k + 1}|&amp;lt;/tex&amp;gt;, так как все ребра между &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y&amp;lt;/tex&amp;gt; также являются ребрами между &amp;lt;tex&amp;gt;V_k&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;V_{k+1}&amp;lt;/tex&amp;gt; и не более чем двумя параллельными ребрами, исходящими из какой-то вершины в остаточной сети. По теореме о максимальном потоке/минимальном разрезе, &amp;lt;tex&amp;gt;F \leqslant 2C|V_k||V_{k+1}|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Таким образом &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; ограничен наименьшим из &amp;lt;tex&amp;gt;|V_k||V_{k+1}|&amp;lt;/tex&amp;gt;. Но эта величина максимальна, когда &amp;lt;tex&amp;gt;|V_i| = \dfrac{|V|}{(l+1)}&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;0 \leqslant i \leqslant n&amp;lt;/tex&amp;gt;, таким образом &amp;lt;tex&amp;gt;F \leqslant 2C\dfrac{|V|^2 }{ (l+1)^2}&amp;lt;/tex&amp;gt;. Выражая &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt;, получаем нужное.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=th2&lt;br /&gt;
|about=Вторая теорема Карзанова&lt;br /&gt;
|statement=Число итераций алгоритма Диница с целочисленными пропускными способностями {{---}} &amp;lt;tex&amp;gt;O(C^{\frac{1}{3}}|V|^{\frac{2}{3}})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;F \leqslant C^{\frac{1}{3}}|V|^{\frac{2}{3}}&amp;lt;/tex&amp;gt;, то теорема очевидна. &lt;br /&gt;
Положим, что &amp;lt;tex&amp;gt;F &amp;gt; C^{\frac{1}{3}}|V|^{\frac{2}{3}}&amp;lt;/tex&amp;gt;, и рассмотрим последнюю фазу, в которой поток &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; не превышает &amp;lt;tex&amp;gt;F - C^{\frac{1}{3}}|V|^{\frac{2}{3}}&amp;lt;/tex&amp;gt;. В этот момент осталось не более &amp;lt;tex&amp;gt;C^{\frac{1}{3}}|V|^{\frac{2}{3}} + 1&amp;lt;/tex&amp;gt; фаз, и &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; {{---}} сеть с максимальным потоком &amp;lt;tex&amp;gt;F - |f| \geqslant C^{\frac{1}{3}}|V|^{\frac{2}{3}}&amp;lt;/tex&amp;gt;. Мы можем применить Лемму(3), чтобы оценить длину &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; слоистой сети, и, соответственно, количество выполненных фаз:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;l \leqslant |V|{(\dfrac{2C}{F-|f|})}^{\frac{1}{2}} - 1 \leqslant 2^{\frac{1}{2}}C^{\frac{1}{3}}|V|^{\frac{2}{3}} - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, прошло &amp;lt;tex&amp;gt;O(C^{\frac{1}{3}}|V|^{\frac{2}{3}})&amp;lt;/tex&amp;gt; фаз, и &amp;lt;tex&amp;gt;O(C^{\frac{1}{3}}|V|^{\frac{2}{3}})&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;
* [http://www.springerlink.com/content/w0q006u3631gg124/fulltext.pdf On the efficiency of Maximum-Flow Algorithms on Networks with Small Integer Capacities. David Fernandez-Baca and Charles U.Martel]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sEwp5ZAJJps&amp;amp;feature=youtu.be&amp;amp;t=26m41s Андрей Станкевич: Лекториум, дополнительные главы алгоритмов, лекция 12]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория:Задача о максимальном потоке]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9C%D0%B5%D0%BD%D0%B3%D0%B5%D1%80%D0%B0&amp;diff=58646</id>
		<title>Теорема Менгера</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9C%D0%B5%D0%BD%D0%B3%D0%B5%D1%80%D0%B0&amp;diff=58646"/>
				<updated>2017-01-04T17:13:51Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;-связность'' и  ''вершинно непересекающиеся пути''.&lt;br /&gt;
&lt;br /&gt;
==Подготовка к доказательству==&lt;br /&gt;
Для доказательства мы будем пользоваться развитой раннее [[Определение сети, потока|теорией потоков]]. Кроме базовых определений нам потребуется понятие [[Дополняющая сеть, дополняющий путь| остаточной сети]] (иначе {{---}} дополнительной сети), а также [[Теорема_Форда-Фалкерсона|теорема Форда-Фалкерсона]].&lt;br /&gt;
&lt;br /&gt;
Кроме того, потребуется лемма о целочисленности потока, которую сейчас и докажем:&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=о целочисленности потока&lt;br /&gt;
|statement=&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Если пропускные способности всех ребер целочисленные (сеть целочислена), то существует максимальный поток, целочисленный на каждом ребре.&lt;br /&gt;
|proof=&lt;br /&gt;
:Для доказательства достаточно рассмотреть [[Алгоритм Форда-Фалкерсона, реализация с помощью поиска в глубину|алгоритм Форда-Фалкерсона]] для поиска максимального потока. Алгоритм делает примерно следующее (подробней {{---}} читай в соответствующей статье):&lt;br /&gt;
&lt;br /&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;
|statement=Если в сети, где все пропускные способности ребер равны &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, существует целочисленный поток величиной &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; то существует и &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; реберно непересекающихся путей.&lt;br /&gt;
|proof=&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&amp;lt;/tex&amp;gt; лежащий только на ребрах с потоком равным &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. В самом деле, если бы такого маршрута не существовало, то можно было бы выделить множество вершин до которых такие маршруты из вершины &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; существуют, не включающее &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, и по нему построить разрез. Поток через такой разрез, очевидно равен нулю, видим противоречие (т.к. &amp;lt;tex&amp;gt;f(U,V)=|f|&amp;lt;/tex&amp;gt;, смотри [[Разрез, лемма о потоке через разрез|первую лемму]]).&lt;br /&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; лежащий только на ребрах где поток равен &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Удалив все ребра находящиеся в этом маршруте и оставив все остальное неизменным, придем к целочисленному потоку величиной &amp;lt;tex&amp;gt;L-1&amp;lt;/tex&amp;gt;. Ясно, что можно повторить тоже самое еще &amp;lt;tex&amp;gt;L-1&amp;lt;/tex&amp;gt; раз, и, таким образом мы выделим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; реберно непересекающихся маршрутов.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Теорема==&lt;br /&gt;
Теперь сама теорема будет тривиальным следствием. В начале сформулируем и докажем реберную версию для случая ориентированного графа.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=Менгера о реберной двойственности в ориентированном графе&lt;br /&gt;
|statement=Между вершинами &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; существует &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; реберно непересекающихся путей тогда и только тогда, когда после удаления любых &amp;lt;tex&amp;gt;(L-1)&amp;lt;/tex&amp;gt; ребер существует путь из &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
:&amp;lt;tex&amp;gt;\Leftarrow&amp;lt;/tex&amp;gt;  Как и прежде, пусть &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; {{---}} источник, а &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; {{---}} сток. &lt;br /&gt;
:Назначим каждому ребру пропускную способность &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Тогда существует максимальный поток, целочисленный на каждом ребре (по лемме). &lt;br /&gt;
:По теореме Форда-Фалкерсона для такого потока существует разрез с пропускной способностью равной потоку. Удалим в этом разрезе &amp;lt;tex&amp;gt;L-1&amp;lt;/tex&amp;gt; ребер, и тогда, раз &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; находятся в разных частях разреза и, существует путь из &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, то в разрезе останется хотя бы еще одно ребро. Это значит, что пропускная способность разреза и вместе с ним величина потока не меньше &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. А так как поток целочисленный, то это и означает, что найдется &amp;lt;tex&amp;gt; L&amp;lt;/tex&amp;gt; реберно непересекающихся путей.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt;  Существует &amp;lt;tex&amp;gt; L&amp;lt;/tex&amp;gt; реберно непересекающихся путей, а значит, удалив любые &amp;lt;tex&amp;gt;L-1&amp;lt;/tex&amp;gt; ребер хотя бы один путь останется не тронутым (принцип Дирихле). Это и означает, что существует путь из &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=Менгера о вершинной двойственности в ориентированном графе&lt;br /&gt;
|statement=Между вершинами &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; существует &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; вершинно непересекающихся путей тогда и только тогда, когда после удаления любых &amp;lt;tex&amp;gt;(L-1)&amp;lt;/tex&amp;gt; вершин существует путь из &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
:Разобьем каждую вершину на две таким образом:&lt;br /&gt;
&lt;br /&gt;
:[[Файл:Menger-vertex.JPG]]&lt;br /&gt;
&lt;br /&gt;
:''(все входящие ребра заходят в левую вершину, исходящие выходят из правой. между двумя новыми вершинами добавляем ребро)''&lt;br /&gt;
&lt;br /&gt;
:Теперь задача практически сведена к первой теореме.&lt;br /&gt;
:Необходимо лишь отметить, что если в старом графе пути вершинно пересекаются, то в новом графе пути необходимо реберно пересекаются и наоборот.&lt;br /&gt;
:Кроме того, предложение &amp;quot;удалить в исходном графе любые &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; вершин&amp;quot; можно заменять на &amp;quot;в новом графе можно удалить любые &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; ребер&amp;quot; (достаточно выбирать вершины на концах этих ребер). Можно заменять и обратно, если учесть, что можно удалять ребра между парой вершин, которые раньше были одним целым.&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&lt;br /&gt;
Теоремы для неориентированного графа формулируются идентично, а их доказательства сводятся к своим ориентированным двойникам путем замены каждого ребра на две дуги:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Menger_undirected.JPG‎]]&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Теорема Менгера, альтернативное доказательство]]&lt;br /&gt;
* [[wikipedia:Menger's theorem | Wikipedia {{---}} Menger's theorem ]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* Ловас Л., Пламмер М. {{---}} '''Прикладные задачи теории графов. Теория паросочетаний в математике, физике, химии''' (глава 2.4 стр. 117) {{---}} 1998. {{---}} 656 с. {{---}} ISBN 5-03-002517-0 &lt;br /&gt;
* Харари Ф. '''Теория графов.''' глава 5 — М.: Мир, 1973. (Изд. 3, М.: КомКнига, 2006. — 296 с.)&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория:Связность в графах]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D1%8B_%D0%9A%D0%B0%D1%80%D0%B7%D0%B0%D0%BD%D0%BE%D0%B2%D0%B0_%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%B5_%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B8%D0%BD%D0%B8%D1%86%D0%B0_%D0%B2_%D1%81%D0%B5%D1%82%D0%B8_%D1%81_%D1%86%D0%B5%D0%BB%D0%BE%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8_%D0%BF%D1%80%D0%BE%D0%BF%D1%83%D1%81%D0%BA%D0%BD%D1%8B%D0%BC%D0%B8_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BD%D0%BE%D1%81%D1%82%D1%8F%D0%BC%D0%B8&amp;diff=58604</id>
		<title>Теоремы Карзанова о числе итераций алгоритма Диница в сети с целочисленными пропускными способностями</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D1%8B_%D0%9A%D0%B0%D1%80%D0%B7%D0%B0%D0%BD%D0%BE%D0%B2%D0%B0_%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%B5_%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B8%D0%BD%D0%B8%D1%86%D0%B0_%D0%B2_%D1%81%D0%B5%D1%82%D0%B8_%D1%81_%D1%86%D0%B5%D0%BB%D0%BE%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8_%D0%BF%D1%80%D0%BE%D0%BF%D1%83%D1%81%D0%BA%D0%BD%D1%8B%D0%BC%D0%B8_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BD%D0%BE%D1%81%D1%82%D1%8F%D0%BC%D0%B8&amp;diff=58604"/>
				<updated>2017-01-03T17:55:14Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Обозначения==&lt;br /&gt;
* Пусть &amp;lt;tex&amp;gt;N = (V,E,s,t,c)&amp;lt;/tex&amp;gt; {{---}} [[Определение сети, потока|сеть]] с целочисленными пропускными способностями.&lt;br /&gt;
* Обозначим &amp;lt;tex&amp;gt;C =  \max\limits_{uv \in E} c_{uv}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; как максимальный поток.&lt;br /&gt;
*&amp;lt;tex&amp;gt;c^{+}(v) = \sum\limits_{uv \in E} c_{uv}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;c^{-}(v) = \sum\limits_{vu \in E} c_{vu}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;p(v) = min\big\{c^{+}(v), c^{-}(v)\big\}&amp;lt;/tex&amp;gt; {{---}} потенциал вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;P = \sum\limits_{v \in V, v \neq s,t}p(v)&amp;lt;/tex&amp;gt; {{---}} общий потенциал.&lt;br /&gt;
*&amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; {{---}} [[Дополняющая сеть, дополняющий путь|остаточная сеть]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Теоремы==&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about = 1&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; {{---}} расстояние между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&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;l \leqslant \dfrac{P}{F} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; {{---}} расстояние между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;V_i&amp;lt;/tex&amp;gt; {{---}} набор вершин, удаленных от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(i \leqslant l)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;tex&amp;gt;V_i&amp;lt;/tex&amp;gt; {{---}} разъединяющее множество узлов: при его удалении исчезают все пути из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Следуя закону [[Определение сети, потока|сохранения потока]], если &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; обозначить как любой допустимый поток, то &amp;lt;tex&amp;gt;|f|&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;P_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;|f| \leqslant P_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 \leqslant P_i&amp;lt;/tex&amp;gt;, таким образом получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(l - 1)F \leqslant \displaystyle \sum_{i = 1}^{l - 1} P_i \leqslant P&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about = 2&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt; {{---}} сеть, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; {{---}} допустимый поток в этой сети. Тогда общий потенциал в остаточной сети &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; равен общему потенциалу &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
По [[Теорема_о_декомпозиции | теореме о декомпозиции]] поток можно разбить на множество простых путей из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и циклов. Рассмотрим каждый путь (цикл) и убедимся, что, пуская по нему поток &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt;, потенциал вершины не изменится. Действительно, рассмотрим вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, поток &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt; в нее течет по ребру &amp;lt;tex&amp;gt;uv&amp;lt;/tex&amp;gt;, а из нее по ребру &amp;lt;tex&amp;gt;vw&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;c_{f_i}&amp;lt;/tex&amp;gt; {{---}} функция пропускных способностей в остаточной сети после пропускания потока по &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ому пути (циклу).  Рассмотрим &amp;lt;tex&amp;gt;c^+_{f_1}(v) = c_{f_1}(uv) + c_{f_1}(wv)&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;c_{f_1}(uv) = c(uv) - f_i&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;c_{f_1}(wv) = c(wv) + f_i&amp;lt;/tex&amp;gt;, сложив эти два значения, получим, что &amp;lt;tex&amp;gt;c^+(v)&amp;lt;/tex&amp;gt; остается неизменной. Применив такое же рассуждение для &amp;lt;tex&amp;gt;c^-(v)&amp;lt;/tex&amp;gt;, получим, что потенциал каждой вершины остается неизменным.&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=th1. &lt;br /&gt;
|about=Первая теорема Карзанова&lt;br /&gt;
|statement=Число итераций [[Схема алгоритма Диница|алгоритма Диница]] в сети &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; — исток, &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; — сток) с целочисленными пропускными способностями — &amp;lt;tex&amp;gt;O(\sqrt{P})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; {{---}} максимальный поток в сети &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Теорема верна для &amp;lt;tex&amp;gt;F \leqslant \sqrt{P}&amp;lt;/tex&amp;gt;, так как после каждой фазы поток увеличивается хотя бы на &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;F &amp;gt; \sqrt{P}&amp;lt;/tex&amp;gt;, рассмотрим последнюю фазу, на момент начала выполнения которой поток в сети был меньше, чем &amp;lt;tex&amp;gt;F - \sqrt{P}&amp;lt;/tex&amp;gt;. После этого потребуется не больше &amp;lt;tex&amp;gt;\sqrt{P}&amp;lt;/tex&amp;gt; фаз, чтобы найти максимальный поток. На предыдущей фазе поток (&amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;) в &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; был не больше &amp;lt;tex&amp;gt;F-\sqrt{P}&amp;lt;/tex&amp;gt;, таким образом &amp;lt;tex&amp;gt;F-|f| \geqslant \sqrt{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; {{---}} сеть с максимальным потоком &amp;lt;tex&amp;gt;F-|f|&amp;lt;/tex&amp;gt; и потенциалом &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; (по Лемме(2)). Поэтому можно воспользоваться Леммой(1), чтобы оценить расстояние между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt;, и получить оценку длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; слоистой сети:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;l \leqslant \dfrac{P}{F-|f|} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как каждая фаза увеличивает длину слоистой сети минимум на один, то осуществляется не больше &amp;lt;tex&amp;gt;\sqrt{P}&amp;lt;/tex&amp;gt; фаз. Таким образом происходит не более &amp;lt;tex&amp;gt;2\sqrt{P}&amp;lt;/tex&amp;gt; фаз.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about = 3&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть в сети &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; нет [[Основные определения теории графов#def1|параллельных ребер]]. Пусть &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; {{---}} максимальный поток в &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Тогда расстояние &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; таково: &amp;lt;tex&amp;gt;l \leqslant |V|\sqrt{\dfrac{2C}{F}} - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt;V_i&amp;lt;/tex&amp;gt; как набор вершин на расстоянии &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Множества &amp;lt;tex&amp;gt;X = \bigcup_{i = 0}^k V_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y = V - X&amp;lt;/tex&amp;gt; определяют разрез &amp;lt;tex&amp;gt;(X, Y)&amp;lt;/tex&amp;gt;. Пропускная способность этого разреза не больше &amp;lt;tex&amp;gt;2C|V_k||V_{k + 1}|&amp;lt;/tex&amp;gt;, так как все ребра между &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y&amp;lt;/tex&amp;gt; также являются ребрами между &amp;lt;tex&amp;gt;V_k&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;V_{k+1}&amp;lt;/tex&amp;gt; и не более чем двумя параллельными ребрами, исходящими из какой-то вершины в остаточной сети. По теореме о максимальном потоке/минимальном разрезе, &amp;lt;tex&amp;gt;F \leqslant 2C|V_k||V_{k+1}|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Таким образом &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; ограничен наименьшим из &amp;lt;tex&amp;gt;|V_k||V_{k+1}|&amp;lt;/tex&amp;gt;. Но эта величина максимальна, когда &amp;lt;tex&amp;gt;|V_i| = \dfrac{|V|}{(l+1)}&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;0 \leqslant i \leqslant n&amp;lt;/tex&amp;gt;, таким образом &amp;lt;tex&amp;gt;F \leqslant 2C\dfrac{|V|^2 }{ (l+1)^2}&amp;lt;/tex&amp;gt;. Выражая &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt;, получаем нужное.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=th2&lt;br /&gt;
|about=Вторая теорема Карзанова&lt;br /&gt;
|statement=Число итераций алгоритма Диница с целочисленными пропускными способностями {{---}} &amp;lt;tex&amp;gt;O(C^{\frac{1}{3}}|V|^{\frac{2}{3}})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;F \leqslant C^{\frac{1}{3}}|V|^{\frac{2}{3}}&amp;lt;/tex&amp;gt;, то теорема очевидна. &lt;br /&gt;
Положим, что &amp;lt;tex&amp;gt;F &amp;gt; C^{\frac{1}{3}}|V|^{\frac{2}{3}}&amp;lt;/tex&amp;gt;, и рассмотрим последнюю фазу, в которой поток &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; не превышает &amp;lt;tex&amp;gt;F - C^{\frac{1}{3}}|V|^{\frac{2}{3}}&amp;lt;/tex&amp;gt;. В этот момент осталось не более &amp;lt;tex&amp;gt;C^{\frac{1}{3}}|V|^{\frac{2}{3}} + 1&amp;lt;/tex&amp;gt; фаз, и &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; {{---}} сеть с максимальным потоком &amp;lt;tex&amp;gt;F - |f| \geqslant C^{\frac{1}{3}}|V|^{\frac{2}{3}}&amp;lt;/tex&amp;gt;. Мы можем применить Лемму(3), чтобы оценить длину &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; слоистой сети, и, соответственно, количество выполненных фаз:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;l \leqslant |V|{(\dfrac{2C}{F-|f|})}^{\frac{1}{2}} - 1 \leqslant 2^{\frac{1}{2}}C^{\frac{1}{3}}|V|^{\frac{2}{3}} - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, прошло &amp;lt;tex&amp;gt;O(C^{\frac{1}{3}}|V|^{\frac{2}{3}})&amp;lt;/tex&amp;gt; фаз, и &amp;lt;tex&amp;gt;O(C^{\frac{1}{3}}|V|^{\frac{2}{3}})&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;
* [http://www.springerlink.com/content/w0q006u3631gg124/fulltext.pdf On the efficiency of Maximum-Flow Algorithms on Networks with Small Integer Capacities. David Fernandez-Baca and Charles U.Martel]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sEwp5ZAJJps&amp;amp;feature=youtu.be&amp;amp;t=26m41s Андрей Станкевич: Лекториум, дополнительные главы алгоритмов, лекция 12]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория:Задача о максимальном потоке]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9C%D0%B5%D0%BD%D0%B3%D0%B5%D1%80%D0%B0&amp;diff=58593</id>
		<title>Теорема Менгера</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9C%D0%B5%D0%BD%D0%B3%D0%B5%D1%80%D0%B0&amp;diff=58593"/>
				<updated>2017-01-03T14:32:26Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Теорема Менгера представляет собой группу теорем, связывающих такие понятия на графах как ''k-связность'' и ''количество непересекающихся путей'' относительно двух выделенных вершин. Возникают различные варианты очень похожих друг на друга по формулировке теорем в зависимости от того, рассматриваем ли мы ситуацию в ''ориентированном'' или ''неориентированном'' графе, и подразумеваем ли ''реберную k-связность'' и ''реберно непересекающиеся пути'' или же ''вершинную k-связность'' и  ''вершинно непересекающиеся пути''.&lt;br /&gt;
&lt;br /&gt;
==Подготовка к доказательству==&lt;br /&gt;
Для доказательства мы будем пользоваться развитой раннее [[Определение сети, потока|теорией потоков]]. Кроме базовых определений нам потребуется понятие [[Дополняющая сеть, дополняющий путь| остаточной сети]] (иначе {{---}} дополнительной сети), а также [[Теорема_Форда-Фалкерсона|теорема Форда-Фалкерсона]].&lt;br /&gt;
&lt;br /&gt;
Кроме того, потребуется лемма о целочисленности потока, которую сейчас и докажем:&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=о целочисленности потока&lt;br /&gt;
|statement=&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Если пропускные способности всех ребер целочисленные (сеть целочислена), то существует максимальный поток, целочисленный на каждом ребре.&lt;br /&gt;
|proof=&lt;br /&gt;
:Для доказательства достаточно рассмотреть [[Алгоритм Форда-Фалкерсона, реализация с помощью поиска в глубину|алгоритм Форда-Фалкерсона]] для поиска максимального потока. Алгоритм делает примерно следующее (подробней {{---}} читай в соответствующей статье):&lt;br /&gt;
&lt;br /&gt;
:''1.'' В начале берем какой-нибудь поток за начальный (например, нулевой).&lt;br /&gt;
&lt;br /&gt;
:''2.'' В остаточной сети этого потока находим какой-нибудь путь из источника к стоку и увеличиваем поток на пропускную способность этого пути.&lt;br /&gt;
&lt;br /&gt;
:''3.'' Повторяем пункт ''2'' до тех пор, пока находится хоть какой-то путь в остаточной сети.&lt;br /&gt;
&lt;br /&gt;
:То, что получится в конце, будет максимальным потоком. В случае целочисленной сети достаточно в качестве начального приближения взять нулевой поток, и не трудно видеть, что на каждой итерации (в том числе и последней) этот поток будет оставаться целочисленным, что и докажет требуемое.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
И, наконец, сделаем немного более осознаным в общем-то и так интуитивно понятное утверждение:&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Если в сети, где все пропускные способности ребер равны 1, существует целочисленный поток величиной &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; то существует и &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; реберно непересекающихся путей.&lt;br /&gt;
|proof=&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&amp;lt;/tex&amp;gt; лежащий только на ребрах с потоком равным 1. В самом деле, если бы такого маршрута не существовало, то можно было бы выделить множество вершин до которых такие маршруты из вершины &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; существуют, не включающее &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, и по нему построить разрез. Поток через такой разрез, очевидно равен нулю, видим противоречие (т.к. &amp;lt;tex&amp;gt;f(U,V)=|f|&amp;lt;/tex&amp;gt;, смотри [[Разрез, лемма о потоке через разрез|первую лемму]]).&lt;br /&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; лежащий только на ребрах где поток равен 1. Удалив все ребра находящиеся в этом маршруте и оставив все остальное неизменным, придем к целочисленному потоку величиной &amp;lt;tex&amp;gt;L-1&amp;lt;/tex&amp;gt;. Ясно, что можно повторить тоже самое еще &amp;lt;tex&amp;gt;L-1&amp;lt;/tex&amp;gt; раз, и, таким образом мы выделим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; реберно непересекающихся маршрутов.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Теорема==&lt;br /&gt;
Теперь сама теорема будет тривиальным следствием. В начале сформулируем и докажем реберную версию для случая ориентированного графа.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=Менгера о реберной двойственности в ориентированном графе&lt;br /&gt;
|statement=Между вершинами &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; существует &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; реберно непересекающихся путей тогда и только тогда, когда после удаления любых &amp;lt;tex&amp;gt;(L-1)&amp;lt;/tex&amp;gt; ребер существует путь из &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
:&amp;lt;tex&amp;gt;\Leftarrow&amp;lt;/tex&amp;gt;&lt;br /&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;
:Назначим каждому ребру пропускную способность 1. Тогда существует максимальный поток, целочисленный на каждом ребре (по лемме). &lt;br /&gt;
:По теореме Форда-Фалкерсона для такого потока существует разрез с пропускной способностью равной потоку. Удалим в этом разрезе &amp;lt;tex&amp;gt;L-1&amp;lt;/tex&amp;gt; ребер, и тогда, раз &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; находятся в разных частях разреза и, существует путь из &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, то в разрезе останется хотя бы еще одно ребро. Это значит, что пропускная способность разреза и вместе с ним величина потока не меньше &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. А так как поток целочисленный, то это и означает, что найдется &amp;lt;tex&amp;gt; L&amp;lt;/tex&amp;gt; реберно непересекающихся путей.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt;&lt;br /&gt;
: существует &amp;lt;tex&amp;gt; L&amp;lt;/tex&amp;gt; реберно непересекающихся путей, а значит, удалив любые &amp;lt;tex&amp;gt;L-1&amp;lt;/tex&amp;gt; ребер хотя бы один путь останется не тронутым (принцип Дирихле). Это и означает, что существует путь из &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=Менгера о вершинной двойственности в ориентированном графе&lt;br /&gt;
|statement=Между вершинами &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; существует &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; вершинно непересекающихся путей тогда и только тогда, когда после удаления любых &amp;lt;tex&amp;gt;(L-1)&amp;lt;/tex&amp;gt; вершин существует путь из &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
:Разобьем каждую вершину на две таким образом:&lt;br /&gt;
&lt;br /&gt;
:[[Файл:Menger-vertex.JPG]]&lt;br /&gt;
&lt;br /&gt;
:''(все входящие ребра заходят в левую вершину, исходящие выходят из правой. между двумя новыми вершинами добавляем ребро)''&lt;br /&gt;
&lt;br /&gt;
:Теперь задача практически сведена к первой теореме.&lt;br /&gt;
:Необходимо лишь отметить, что если в старом графе пути вершинно пересекаются, то в новом графе пути необходимо реберно пересекаются и наоборот.&lt;br /&gt;
:Кроме того, предложение &amp;quot;удалить в исходном графе любые &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; вершин&amp;quot; можно заменять на &amp;quot;в новом графе можно удалить любые &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; ребер&amp;quot; (достаточно выбирать вершины на концах этих ребер). Можно заменять и обратно, если учесть, что можно удалять ребра между парой вершин, которые раньше были одним целым.&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&lt;br /&gt;
Теоремы для неориентированного графа формулируются идентично, а их доказательства сводятся к своим ориентированным двойникам путем замены каждого ребра на две дуги:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Menger_undirected.JPG‎]]&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Теорема Менгера, альтернативное доказательство]]&lt;br /&gt;
* [[wikipedia:Menger's theorem | Wikipedia {{---}} Menger's theorem ]]&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Ловас Л., Пламмер М. {{---}} '''Прикладные задачи теории графов. Теория паросочетаний в математике, физике, химии''' (глава 2.4 стр. 117) {{---}} 1998. {{---}} 656 с. {{---}} ISBN 5-03-002517-0 &lt;br /&gt;
* Харари Ф. '''Теория графов.''' глава 5 — М.: Мир, 1973. (Изд. 3, М.: КомКнига, 2006. — 296 с.)&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория:Связность в графах]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%BF%D0%BB%D0%B0%D0%BD%D0%B0%D1%80%D0%BD%D0%BE%D1%81%D1%82%D1%8C_K5_%D0%B8_K3,3&amp;diff=58590</id>
		<title>Непланарность K5 и K3,3</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%BF%D0%BB%D0%B0%D0%BD%D0%B0%D1%80%D0%BD%D0%BE%D1%81%D1%82%D1%8C_K5_%D0%B8_K3,3&amp;diff=58590"/>
				<updated>2017-01-03T14:19:27Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
Непланарность &amp;lt;tex&amp;gt;K_5&amp;lt;/tex&amp;gt;&lt;br /&gt;
|statement=&lt;br /&gt;
Граф &amp;lt;tex&amp;gt;K_5&amp;lt;/tex&amp;gt; [[Укладка графа на плоскости|непланарен]].&lt;br /&gt;
|proof=&lt;br /&gt;
Граф &amp;lt;tex&amp;gt;K_5&amp;lt;/tex&amp;gt; имеет &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt; вершин и &amp;lt;tex&amp;gt;10&amp;lt;/tex&amp;gt; ребер. Если он планарен, то по [[Формула Эйлера#EulerFormulaCons|следствию из формулы Эйлера]] получаем &amp;lt;tex&amp;gt;10 \leqslant 3 \cdot 5 - 6 = 9&amp;lt;/tex&amp;gt;. Что невозможно.&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
Непланарность &amp;lt;tex&amp;gt;K_{3,3}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|statement=&lt;br /&gt;
Граф &amp;lt;tex&amp;gt;K_{3,3}&amp;lt;/tex&amp;gt; непланарен.&lt;br /&gt;
|proof=&lt;br /&gt;
Граф &amp;lt;tex&amp;gt;K_{3,3}&amp;lt;/tex&amp;gt; содержит &amp;lt;tex&amp;gt;V = 6&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;E = 9&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; [[Укладка графа на плоскости|граней]]. &amp;lt;br /&amp;gt;&lt;br /&gt;
Пусть граф &amp;lt;tex&amp;gt;K_{3,3}&amp;lt;/tex&amp;gt; планарен. Тогда по [[Формула Эйлера|формуле Эйлера]] &amp;lt;tex&amp;gt;F = E - V + 2 = 9 - 6 + 2 = 5&amp;lt;/tex&amp;gt;. Пусть, двигаясь вдоль &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й грани мы пройдем &amp;lt;tex&amp;gt;l_i&amp;lt;/tex&amp;gt; ребер. Очевидно, что &amp;lt;tex&amp;gt;\sum_{i=1}^{F}l_i = 2E&amp;lt;/tex&amp;gt;. Поскольку граф двудольный, все его циклы имеют четную длину. Значит &amp;lt;tex&amp;gt;l_i \geqslant 4&amp;lt;/tex&amp;gt;. Получаем &amp;lt;tex&amp;gt;4F \leqslant 2E&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;2F \leqslant E&amp;lt;/tex&amp;gt;. То есть &amp;lt;tex&amp;gt;2\cdot5 = 10 \leqslant 9&amp;lt;/tex&amp;gt;, что невозможно.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
* [[wikipedia:ru:Планарный граф | Википедия {{---}} Планарный граф]]&lt;br /&gt;
* [[wikipedia:ru:Домики и колодцы | Википедия {{---}} Домики и колодцы]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* Асанов М. О., Баранский В. А., Расин В. В. {{---}} '''Дискретная математика: Графы, матроиды, алгоритмы: Учебное пособие. 2-е изд., испр. и доп.''' стр. 134 {{---}} СПб.: Издательство &amp;quot;Лань&amp;quot;, 2010. {{---}} 368 с.: ил. {{---}} (Учебники для вузов. Специальная литература). ISBN 978-5-8114-1068-2&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Укладки графов ]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%BF%D0%BB%D0%B0%D0%BD%D0%B0%D1%80%D0%BD%D0%BE%D1%81%D1%82%D1%8C_K5_%D0%B8_K3,3&amp;diff=58589</id>
		<title>Непланарность K5 и K3,3</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%BF%D0%BB%D0%B0%D0%BD%D0%B0%D1%80%D0%BD%D0%BE%D1%81%D1%82%D1%8C_K5_%D0%B8_K3,3&amp;diff=58589"/>
				<updated>2017-01-03T14:14:10Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
Непланарность &amp;lt;tex&amp;gt;K_5&amp;lt;/tex&amp;gt;&lt;br /&gt;
|statement=&lt;br /&gt;
Граф &amp;lt;tex&amp;gt;K_5&amp;lt;/tex&amp;gt; [[Укладка графа на плоскости|непланарен]].&lt;br /&gt;
|proof=&lt;br /&gt;
Граф &amp;lt;tex&amp;gt;K_5&amp;lt;/tex&amp;gt; имеет &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt; вершин и &amp;lt;tex&amp;gt;10&amp;lt;/tex&amp;gt; ребер. Если он планарен, то по [[Формула Эйлера#EulerFormulaCons|следствию из формулы Эйлера]] получаем &amp;lt;tex&amp;gt;10 \leqslant 3 \cdot 5 - 6 = 9&amp;lt;/tex&amp;gt;. Что невозможно.&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
Непланарность &amp;lt;tex&amp;gt;K_{3,3}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|statement=&lt;br /&gt;
Граф &amp;lt;tex&amp;gt;K_{3,3}&amp;lt;/tex&amp;gt; непланарен.&lt;br /&gt;
|proof=&lt;br /&gt;
Граф &amp;lt;tex&amp;gt;K_{3,3}&amp;lt;/tex&amp;gt; содержит &amp;lt;tex&amp;gt;V = 6&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;E = 9&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; [[Укладка графа на плоскости|граней]]. &amp;lt;br /&amp;gt;&lt;br /&gt;
Пусть граф &amp;lt;tex&amp;gt;K_{3,3}&amp;lt;/tex&amp;gt; планарен. Тогда по [[Формула Эйлера|формуле Эйлера]] &amp;lt;tex&amp;gt;F = E - V + 2 = 9 - 6 + 2 = 5&amp;lt;/tex&amp;gt;. Пусть, двигаясь вдоль &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й грани мы пройдем &amp;lt;tex&amp;gt;l_i&amp;lt;/tex&amp;gt; ребер. Очевидно, что &amp;lt;tex&amp;gt;\sum_{i=1}^{F}l_i = 2E&amp;lt;/tex&amp;gt;. Поскольку граф двудольный, все его циклы имеют четную длину. Значит &amp;lt;tex&amp;gt;l_i \geqslant 4&amp;lt;/tex&amp;gt;. Получаем &amp;lt;tex&amp;gt;4F \leqslant 2E&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;2F \leqslant E&amp;lt;/tex&amp;gt;. То есть &amp;lt;tex&amp;gt;2\cdot5 = 10 \leqslant 9&amp;lt;/tex&amp;gt;, что невозможно.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
* [[wikipedia:ru:Планарный граф | Википедия {{---}} Планарный граф]]&lt;br /&gt;
* [[wikipedia:ru:Домики и колодцы | Википедия {{---}} Домики и колодцы]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* Асанов М. О., Баранский В. А., Расин В. В. {{---}} Дискретная математика: Графы, матроиды, алгоритмы: Учебное пособие. 2-е изд., испр. и доп. {{---}} СПб.: Издательство &amp;quot;Лань&amp;quot;, 2010. {{---}} C. 134 {{---}} (Учебники для вузов. Специальная литература). ISBN 978-5-8114-1068-2&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Укладки графов ]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%BF%D0%BB%D0%B0%D0%BD%D0%B0%D1%80%D0%BD%D0%BE%D1%81%D1%82%D1%8C_K5_%D0%B8_K3,3&amp;diff=58588</id>
		<title>Непланарность K5 и K3,3</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%BF%D0%BB%D0%B0%D0%BD%D0%B0%D1%80%D0%BD%D0%BE%D1%81%D1%82%D1%8C_K5_%D0%B8_K3,3&amp;diff=58588"/>
				<updated>2017-01-03T13:57:45Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
Непланарность &amp;lt;tex&amp;gt;K_5&amp;lt;/tex&amp;gt;&lt;br /&gt;
|statement=&lt;br /&gt;
Граф &amp;lt;tex&amp;gt;K_5&amp;lt;/tex&amp;gt; [[Укладка графа на плоскости|непланарен]].&lt;br /&gt;
|proof=&lt;br /&gt;
Граф &amp;lt;tex&amp;gt;K_5&amp;lt;/tex&amp;gt; имеет &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt; вершин и &amp;lt;tex&amp;gt;10&amp;lt;/tex&amp;gt; ребер. Если он планарен, то по [[Формула Эйлера#EulerFormulaCons|следствию из формулы Эйлера]] получаем &amp;lt;tex&amp;gt;10 \leqslant 3 \cdot 5 - 6 = 9&amp;lt;/tex&amp;gt;. Что невозможно.&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
Непланарность &amp;lt;tex&amp;gt;K_{3,3}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|statement=&lt;br /&gt;
Граф &amp;lt;tex&amp;gt;K_{3,3}&amp;lt;/tex&amp;gt; непланарен.&lt;br /&gt;
|proof=&lt;br /&gt;
Граф &amp;lt;tex&amp;gt;K_{3,3}&amp;lt;/tex&amp;gt; содержит &amp;lt;tex&amp;gt;V = 6&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;E = 9&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; [[Укладка графа на плоскости|граней]]. &amp;lt;br /&amp;gt;&lt;br /&gt;
Пусть граф &amp;lt;tex&amp;gt;K_{3,3}&amp;lt;/tex&amp;gt; планарен. Тогда по [[Формула Эйлера|формуле Эйлера]] &amp;lt;tex&amp;gt;F = E - V + 2 = 9 - 6 + 2 = 5&amp;lt;/tex&amp;gt;. Пусть, двигаясь вдоль &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й грани мы пройдем &amp;lt;tex&amp;gt;l_i&amp;lt;/tex&amp;gt; ребер. Очевидно, что &amp;lt;tex&amp;gt;\sum_{i=1}^{F}l_i = 2E&amp;lt;/tex&amp;gt;. Поскольку граф двудольный, все его циклы имеют четную длину. Значит &amp;lt;tex&amp;gt;l_i \geqslant 4&amp;lt;/tex&amp;gt;. Получаем &amp;lt;tex&amp;gt;4F \leqslant 2E&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;2F \leqslant E&amp;lt;/tex&amp;gt;. То есть &amp;lt;tex&amp;gt;2\cdot5 = 10 \leqslant 9&amp;lt;/tex&amp;gt;, что невозможно.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* Асанов М. О., Баранский В. А., Расин В. В. {{---}} Дискретная математика: Графы, матроиды, алгоритмы: Учебное пособие. 2-е изд., испр. и доп. {{---}} СПб.: Издательство &amp;quot;Лань&amp;quot;, 2010. {{---}} C. 134 {{---}} (Учебники для вузов. Специальная литература). ISBN 978-5-8114-1068-2&lt;br /&gt;
* [[wikipedia:ru:Планарный граф | Википедия {{---}} Планарный граф]]&lt;br /&gt;
* [[wikipedia:ru:Домики и колодцы | Википедия {{---}} Домики и колодцы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Укладки графов ]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D1%8B_%D0%9A%D0%B0%D1%80%D0%B7%D0%B0%D0%BD%D0%BE%D0%B2%D0%B0_%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%B5_%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B8%D0%BD%D0%B8%D1%86%D0%B0_%D0%B2_%D1%81%D0%B5%D1%82%D0%B8_%D1%81_%D1%86%D0%B5%D0%BB%D0%BE%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8_%D0%BF%D1%80%D0%BE%D0%BF%D1%83%D1%81%D0%BA%D0%BD%D1%8B%D0%BC%D0%B8_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BD%D0%BE%D1%81%D1%82%D1%8F%D0%BC%D0%B8&amp;diff=58555</id>
		<title>Теоремы Карзанова о числе итераций алгоритма Диница в сети с целочисленными пропускными способностями</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D1%8B_%D0%9A%D0%B0%D1%80%D0%B7%D0%B0%D0%BD%D0%BE%D0%B2%D0%B0_%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%B5_%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B8%D0%BD%D0%B8%D1%86%D0%B0_%D0%B2_%D1%81%D0%B5%D1%82%D0%B8_%D1%81_%D1%86%D0%B5%D0%BB%D0%BE%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8_%D0%BF%D1%80%D0%BE%D0%BF%D1%83%D1%81%D0%BA%D0%BD%D1%8B%D0%BC%D0%B8_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BD%D0%BE%D1%81%D1%82%D1%8F%D0%BC%D0%B8&amp;diff=58555"/>
				<updated>2017-01-02T18:27:43Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: Доказательство второй леммы&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Определения==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;N = (V,E,s,t,c)&amp;lt;/tex&amp;gt; {{---}} [[Определение сети, потока|сеть]] с целочисленными пропускными способностями.&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt;C =  \max\limits_{uv \in E} c_{uv}&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;c^{+}(v) = \sum\limits_{uv \in E} c_{uv}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;c^{-}(v) = \sum\limits_{vu \in E} c_{vu}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p(v) = min\big\{c^{+}(v), c^{-}(v)\big\}&amp;lt;/tex&amp;gt; {{---}} потенциал вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда общий потенциал выражается формулой:&lt;br /&gt;
&amp;lt;tex&amp;gt;P = \sum\limits_{v \in V, v \neq s,t}p(v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Дополняющая сеть, дополняющий путь|Остаточную сеть]] обозначим &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Обозначим длину [[Схема алгоритма Диница|слоистой сети]] &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; {{---}} как длину кратчайшего &amp;lt;tex&amp;gt;s-t&amp;lt;/tex&amp;gt; пути в &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Теоремы==&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about = 1&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; {{---}} расстояние между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&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;l \leqslant \frac{P}{F} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; {{---}} расстояние между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;V_i&amp;lt;/tex&amp;gt; {{---}} набор вершин, удаленных от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(i \leqslant l)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;tex&amp;gt;V_i&amp;lt;/tex&amp;gt; {{---}} разъединяющее множество узлов: при его удалении исчезают все пути из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Следуя закону [[Определение сети, потока|сохранения потока]], если &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; обозначить как любой допустимый поток, то &amp;lt;tex&amp;gt;|f|&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;P_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;|f| \leqslant P_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 \leqslant P_i&amp;lt;/tex&amp;gt;, таким образом получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(l - 1)F \leqslant \displaystyle \sum_{i = 1}^{l - 1} P_i \leqslant P&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и лемма доказана.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about = 2&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt; {{---}} сеть, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; {{---}} допустимый поток в этой сети. Тогда общий потенциал в остаточной сети &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; равен общему потенциалу &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
По [[Теорема_о_декомпозиции | теореме о декомпозиции]] поток можно разбить на множество простых путей из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и циклов. Рассмотрим каждый путь (цикл) и убедимся, что, пуская по нему поток &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt;, потенциал вершины не изменится. Действительно, рассмотрим вершину v, поток &amp;lt;tex&amp;gt;f_i&amp;lt;/tex&amp;gt; в нее течет по ребру &amp;lt;tex&amp;gt;uv&amp;lt;/tex&amp;gt;, а из нее по ребру &amp;lt;tex&amp;gt;vw&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;c_{f_i}&amp;lt;/tex&amp;gt; {{---}} функция пропускных способностей в остаточной сети после пропускания потока по &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ому пути (циклу).  Рассмотрим &amp;lt;tex&amp;gt;c^+_{f_1}(v) = c_{f_1}(uv) + c_{f_1}(wv)&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;c_{f_1}(uv) = c(uv) - f_i&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;c_{f_1}(wv) = c(wv) + f_i&amp;lt;/tex&amp;gt;, сложив эти два значения, получим, что &amp;lt;tex&amp;gt;c^+(v)&amp;lt;/tex&amp;gt; остается неизменной. Применив такое же рассуждение для &amp;lt;tex&amp;gt;c^-(v)&amp;lt;/tex&amp;gt;, получим, что потенциал каждой вершины остается неизменным.&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=th1. &lt;br /&gt;
|about=Первая теорема Карзанова&lt;br /&gt;
|statement=Число итераций [[Схема алгоритма Диница|алгоритма Диница]] в сети &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; — исток, &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; — сток) с целочисленными пропускными способностями — &amp;lt;tex&amp;gt;O(\sqrt{P})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; {{---}} максимальный поток в сети &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Теорема верна для &amp;lt;tex&amp;gt;F \leqslant \sqrt{P}&amp;lt;/tex&amp;gt;, так как после каждой фазы поток увеличивается хотя бы на 1. Если &amp;lt;tex&amp;gt;F &amp;gt; \sqrt{P}&amp;lt;/tex&amp;gt;, рассмотрим последнюю фазу, на момент начала выполнения которой поток в сети был меньше, чем &amp;lt;tex&amp;gt;F - \sqrt{P}&amp;lt;/tex&amp;gt;. После этого потребуется не больше &amp;lt;tex&amp;gt;\sqrt{P}&amp;lt;/tex&amp;gt; фаз, чтобы найти максимальный поток. На предыдущей фазе поток (&amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;) в &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; был не больше &amp;lt;tex&amp;gt;F-\sqrt{P}&amp;lt;/tex&amp;gt;, таким образом &amp;lt;tex&amp;gt;F-|f| \geqslant \sqrt{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; {{---}} сеть с максимальным потоком &amp;lt;tex&amp;gt;F-|f|&amp;lt;/tex&amp;gt; и потенциалом &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; (по Лемме(2)). Поэтому можно воспользоваться Леммой(1), чтобы оценить расстояние между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt;, и получить оценку длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; слоистой сети:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;l \leqslant \frac{P}{F-|f|} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как каждая фаза увеличивает длину слоистой сети минимум на один, то осуществляется не больше &amp;lt;tex&amp;gt;\sqrt{P}&amp;lt;/tex&amp;gt; фаз. Таким образом происходит не более &amp;lt;tex&amp;gt;2\sqrt{P}&amp;lt;/tex&amp;gt; фаз.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about = 3&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть в сети &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; нет [[Основные определения теории графов#def1|параллельных ребер]]. Пусть &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; {{---}} максимальный поток в &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Тогда расстояние &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; таково: &amp;lt;tex&amp;gt;l \leqslant |V|\sqrt{\frac{2C}{F}} - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt;V_i&amp;lt;/tex&amp;gt; как набор вершин на расстоянии &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Множества &amp;lt;tex&amp;gt;X = \bigcup_{i = 0}^k V_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y = V - X&amp;lt;/tex&amp;gt; определяют разрез &amp;lt;tex&amp;gt;(X, Y)&amp;lt;/tex&amp;gt;. Пропускная способность этого разреза не больше &amp;lt;tex&amp;gt;2C|V_k||V_{k + 1}|&amp;lt;/tex&amp;gt;, так как все ребра между &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y&amp;lt;/tex&amp;gt; также являются ребрами между &amp;lt;tex&amp;gt;V_k&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;V_{k+1}&amp;lt;/tex&amp;gt; и не более чем двумя параллельными ребрами, исходящими из какой-то вершины в остаточной сети. По теореме о максимальном потоке/минимальном разрезе, &amp;lt;tex&amp;gt;F \leqslant 2C|V_k||V_{k+1}|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Таким образом &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; ограничен наименьшим из &amp;lt;tex&amp;gt;|V_k||V_{k+1}|&amp;lt;/tex&amp;gt;. Но эта величина максимальна, когда &amp;lt;tex&amp;gt;|V_i| = |V|/(l+1)&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;0 \leqslant i \leqslant n&amp;lt;/tex&amp;gt;, таким образом &amp;lt;tex&amp;gt;F \leqslant 2C|V|^2 / (l+1)^2&amp;lt;/tex&amp;gt;. Выражая &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt;, получаем нужное.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=th2&lt;br /&gt;
|about=Вторая теорема Карзанова&lt;br /&gt;
|statement=Число итераций алгоритма Диница с целочисленными пропускными способностями {{---}} &amp;lt;tex&amp;gt;O(C^{1/3}|V|^{2/3})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;F \leqslant C^{1/3}|V|^{2/3}&amp;lt;/tex&amp;gt;, то теорема очевидна. &lt;br /&gt;
Положим, что &amp;lt;tex&amp;gt;F &amp;gt; C^{1/3}|V|^{2/3}&amp;lt;/tex&amp;gt;, и рассотрим последнюю фазу, в которой поток &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; не превышает &amp;lt;tex&amp;gt;F - C^{1/3}|V|^{2/3}&amp;lt;/tex&amp;gt;. В этот момент осталось не более &amp;lt;tex&amp;gt;C^{1/3}|V|^{2/3} + 1&amp;lt;/tex&amp;gt; фаз, и &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; {{---}} сеть с максимальным потоком &amp;lt;tex&amp;gt;F - |f| \ge C^{1/3}|V|^{2/3}&amp;lt;/tex&amp;gt;. Мы можем применить Лемму(3), чтобы оценить длину &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; слоистой сети, и, соответственно, количество выполненных фаз:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;l \leqslant |V|{(\frac{2C}{F-|f|})}^{1/2} - 1 \leqslant 2^{1/2}C^{1/3}|V|^{2/3} - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, прошло &amp;lt;tex&amp;gt;O(C^{1/3}|V|^{2/3})&amp;lt;/tex&amp;gt; фаз, и &amp;lt;tex&amp;gt;O(C^{1/3}|V|^{2/3})&amp;lt;/tex&amp;gt; фаз осталось. Теорема доказана.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* [http://www.springerlink.com/content/w0q006u3631gg124/fulltext.pdf On the efficiency of Maximum-Flow Algorithms on Networks with Small Integer Capacities. David Fernandez-Baca and Charles U.Martel]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sEwp5ZAJJps&amp;amp;feature=youtu.be&amp;amp;t=26m41s Андрей Станкевич: Лекториум, дополнительные главы алгоритмов, лекция 12]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория:Задача о максимальном потоке]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D1%8B_%D0%9A%D0%B0%D1%80%D0%B7%D0%B0%D0%BD%D0%BE%D0%B2%D0%B0_%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%B5_%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B8%D0%BD%D0%B8%D1%86%D0%B0_%D0%B2_%D1%81%D0%B5%D1%82%D0%B8_%D1%81_%D1%86%D0%B5%D0%BB%D0%BE%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8_%D0%BF%D1%80%D0%BE%D0%BF%D1%83%D1%81%D0%BA%D0%BD%D1%8B%D0%BC%D0%B8_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BD%D0%BE%D1%81%D1%82%D1%8F%D0%BC%D0%B8&amp;diff=58446</id>
		<title>Теоремы Карзанова о числе итераций алгоритма Диница в сети с целочисленными пропускными способностями</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D1%8B_%D0%9A%D0%B0%D1%80%D0%B7%D0%B0%D0%BD%D0%BE%D0%B2%D0%B0_%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%B5_%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B8%D0%BD%D0%B8%D1%86%D0%B0_%D0%B2_%D1%81%D0%B5%D1%82%D0%B8_%D1%81_%D1%86%D0%B5%D0%BB%D0%BE%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8_%D0%BF%D1%80%D0%BE%D0%BF%D1%83%D1%81%D0%BA%D0%BD%D1%8B%D0%BC%D0%B8_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BD%D0%BE%D1%81%D1%82%D1%8F%D0%BC%D0%B8&amp;diff=58446"/>
				<updated>2016-12-31T08:00:11Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Определения==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;N = (V,E,s,t,c)&amp;lt;/tex&amp;gt; {{---}} [[Определение сети, потока|сеть]] с целочисленными пропускными способностями.&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt;C =  \max\limits_{uv \in E} c_{uv}&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;c^{+}(v) = \sum\limits_{uv \in E} c_{uv}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;c^{-}(v) = \sum\limits_{vu \in E} c_{vu}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p(v) = min\big\{c^{+}(v), c^{-}(v)\big\}&amp;lt;/tex&amp;gt; {{---}} потенциал вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда общий потенциал выражается формулой:&lt;br /&gt;
&amp;lt;tex&amp;gt;P = \sum\limits_{v \in V, v \neq s,t}p(v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Дополняющая сеть, дополняющий путь|Остаточную сеть]] обозначим &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Обозначим длину [[Схема алгоритма Диница|слоистой сети]] &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; {{---}} как длину кратчайшего &amp;lt;tex&amp;gt;s-t&amp;lt;/tex&amp;gt; пути в &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Теоремы==&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about = 1&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; {{---}} расстояние между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&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;l \leqslant \frac{P}{F} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; {{---}} расстояние между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;V_i&amp;lt;/tex&amp;gt; {{---}} набор вершин, удаленных от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(i \leqslant l)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;tex&amp;gt;V_i&amp;lt;/tex&amp;gt; {{---}} разъединяющее множество узлов: при его удалении исчезают все пути из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Следуя закону [[Определение сети, потока|сохранения потока]], если &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; обозначить как любой допустимый поток, то &amp;lt;tex&amp;gt;|f|&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;P_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;|f| \leqslant P_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 \leqslant P_i&amp;lt;/tex&amp;gt;, таким образом получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(l - 1)F \leqslant \displaystyle \sum_{i = 1}^{l - 1} P_i \leqslant P&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и лемма доказана.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about = 2&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt; {{---}} сеть, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; {{---}} допустимый поток в этой сети. Тогда общий потенциал в остаточной сети &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; равен общему потенциалу &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;c_f&amp;lt;/tex&amp;gt; {{---}} функция пропускных способностей в &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;p_f(v), in_f(v), out_f(v)&amp;lt;/tex&amp;gt; {{---}} потенциал, множество входящих ребер и множество выходящих ребер вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Достаточно доказать, что &amp;lt;tex&amp;gt;p_f(v) = p(v)&amp;lt;/tex&amp;gt;. Ребру &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;in(v)&amp;lt;/tex&amp;gt; соответствуют ребро &amp;lt;tex&amp;gt;e_1&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;in_f(v)&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt;c(e) - f(e)&amp;lt;/tex&amp;gt;, и ребро &amp;lt;tex&amp;gt;e_2&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;out(v)&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt;f(e)&amp;lt;/tex&amp;gt;. Аналогично, ребру &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;out(v)&amp;lt;/tex&amp;gt; соответствуют ребра из &amp;lt;tex&amp;gt;out_f(v)&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt;c(v) - f (v)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;in_f(v)&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt;f(e)&amp;lt;/tex&amp;gt;. Используя закон сохранения потока, нетрудно проверить, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle\sum_{e\in in_f(v)} c_f(e) = \sum_{e\in in(v)}c(e)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle\sum_{e\in out_f(v)} c_f(e) = \sum_{e\in out(v)}c(e)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
что и требовалось доказать.&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=th1. &lt;br /&gt;
|about=Первая теорема Карзанова&lt;br /&gt;
|statement=Число итераций [[Схема алгоритма Диница|алгоритма Диница]] в сети &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; — исток, &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; — сток) с целочисленными пропускными способностями — &amp;lt;tex&amp;gt;O(\sqrt{P})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; {{---}} максимальный поток в сети &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Теорема верна для &amp;lt;tex&amp;gt;F \leqslant \sqrt{P}&amp;lt;/tex&amp;gt;, так как после каждой фазы поток увеличивается хотя бы на 1. Если &amp;lt;tex&amp;gt;F &amp;gt; \sqrt{P}&amp;lt;/tex&amp;gt;, рассмотрим последнюю фазу, на момент начала выполнения которой поток в сети был меньше, чем &amp;lt;tex&amp;gt;F - \sqrt{P}&amp;lt;/tex&amp;gt;. После этого потребуется не больше &amp;lt;tex&amp;gt;\sqrt{P}&amp;lt;/tex&amp;gt; фаз, чтобы найти максимальный поток. На предыдущей фазе поток (&amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;) в &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; был не больше &amp;lt;tex&amp;gt;F-\sqrt{P}&amp;lt;/tex&amp;gt;, таким образом &amp;lt;tex&amp;gt;F-|f| \geqslant \sqrt{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; {{---}} сеть с максимальным потоком &amp;lt;tex&amp;gt;F-|f|&amp;lt;/tex&amp;gt; и потенциалом &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; (по Лемме(2)). Поэтому можно воспользоваться Леммой(1), чтобы оценить расстояние между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt;, и получить оценку длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; слоистой сети:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;l \leqslant \frac{P}{F-|f|} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как каждая фаза увеличивает длину слоистой сети минимум на один, то осуществляется не больше &amp;lt;tex&amp;gt;\sqrt{P}&amp;lt;/tex&amp;gt; фаз. Таким образом происходит не более &amp;lt;tex&amp;gt;2\sqrt{P}&amp;lt;/tex&amp;gt; фаз.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about = 3&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть в сети &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; нет [[Основные определения теории графов#def1|параллельных ребер]]. Пусть &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; {{---}} максимальный поток в &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Тогда расстояние &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; таково: &amp;lt;tex&amp;gt;l \leqslant |V|\sqrt{\frac{2C}{F}} - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt;V_i&amp;lt;/tex&amp;gt; как набор вершин на расстоянии &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Множества &amp;lt;tex&amp;gt;X = \bigcup_{i = 0}^k V_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y = V - X&amp;lt;/tex&amp;gt; определяют разрез &amp;lt;tex&amp;gt;(X, Y)&amp;lt;/tex&amp;gt;. Пропускная способность этого разреза не больше &amp;lt;tex&amp;gt;2C|V_k||V_{k + 1}|&amp;lt;/tex&amp;gt;, так как все ребра между &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y&amp;lt;/tex&amp;gt; также являются ребрами между &amp;lt;tex&amp;gt;V_k&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;V_{k+1}&amp;lt;/tex&amp;gt; и не более чем двумя параллельными ребрами, исходящими из какой-то вершины в остаточной сети. По теореме о максимальном потоке/минимальном разрезе, &amp;lt;tex&amp;gt;F \leqslant 2C|V_k||V_{k+1}|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Таким образом &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; ограничен наименьшим из &amp;lt;tex&amp;gt;|V_k||V_{k+1}|&amp;lt;/tex&amp;gt;. Но эта величина максимальна, когда &amp;lt;tex&amp;gt;|V_i| = |V|/(l+1)&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;0 \leqslant i \leqslant n&amp;lt;/tex&amp;gt;, таким образом &amp;lt;tex&amp;gt;F \leqslant 2C|V|^2 / (l+1)^2&amp;lt;/tex&amp;gt;. Выражая &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt;, получаем нужное.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=th2&lt;br /&gt;
|about=Вторая теорема Карзанова&lt;br /&gt;
|statement=Число итераций алгоритма Диница с целочисленными пропускными способностями {{---}} &amp;lt;tex&amp;gt;O(C^{1/3}|V|^{2/3})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;F \leqslant C^{1/3}|V|^{2/3}&amp;lt;/tex&amp;gt;, то теорема очевидна. &lt;br /&gt;
Положим, что &amp;lt;tex&amp;gt;F &amp;gt; C^{1/3}|V|^{2/3}&amp;lt;/tex&amp;gt;, и рассотрим последнюю фазу, в которой поток &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; не превышает &amp;lt;tex&amp;gt;F - C^{1/3}|V|^{2/3}&amp;lt;/tex&amp;gt;. В этот момент осталось не более &amp;lt;tex&amp;gt;C^{1/3}|V|^{2/3} + 1&amp;lt;/tex&amp;gt; фаз, и &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; {{---}} сеть с максимальным потоком &amp;lt;tex&amp;gt;F - |f| \ge C^{1/3}|V|^{2/3}&amp;lt;/tex&amp;gt;. Мы можем применить Лемму(3), чтобы оценить длину &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; слоистой сети, и, соответственно, количество выполненных фаз:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;l \leqslant |V|{(\frac{2C}{F-|f|})}^{1/2} - 1 \leqslant 2^{1/2}C^{1/3}|V|^{2/3} - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, прошло &amp;lt;tex&amp;gt;O(C^{1/3}|V|^{2/3})&amp;lt;/tex&amp;gt; фаз, и &amp;lt;tex&amp;gt;O(C^{1/3}|V|^{2/3})&amp;lt;/tex&amp;gt; фаз осталось. Теорема доказана.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* [http://www.springerlink.com/content/w0q006u3631gg124/fulltext.pdf On the efficiency of Maximum-Flow Algorithms on Networks with Small Integer Capacities. David Fernandez-Baca and Charles U.Martel]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sEwp5ZAJJps&amp;amp;feature=youtu.be&amp;amp;t=26m41s Андрей Станкевич: Лекториум, дополнительные главы алгоритмов, лекция 12]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория:Задача о максимальном потоке]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D1%8B_%D0%9A%D0%B0%D1%80%D0%B7%D0%B0%D0%BD%D0%BE%D0%B2%D0%B0_%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%B5_%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B8%D0%BD%D0%B8%D1%86%D0%B0_%D0%B2_%D1%81%D0%B5%D1%82%D0%B8_%D1%81_%D1%86%D0%B5%D0%BB%D0%BE%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8_%D0%BF%D1%80%D0%BE%D0%BF%D1%83%D1%81%D0%BA%D0%BD%D1%8B%D0%BC%D0%B8_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BD%D0%BE%D1%81%D1%82%D1%8F%D0%BC%D0%B8&amp;diff=58367</id>
		<title>Теоремы Карзанова о числе итераций алгоритма Диница в сети с целочисленными пропускными способностями</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D1%8B_%D0%9A%D0%B0%D1%80%D0%B7%D0%B0%D0%BD%D0%BE%D0%B2%D0%B0_%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%B5_%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B8%D0%BD%D0%B8%D1%86%D0%B0_%D0%B2_%D1%81%D0%B5%D1%82%D0%B8_%D1%81_%D1%86%D0%B5%D0%BB%D0%BE%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8_%D0%BF%D1%80%D0%BE%D0%BF%D1%83%D1%81%D0%BA%D0%BD%D1%8B%D0%BC%D0%B8_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BD%D0%BE%D1%81%D1%82%D1%8F%D0%BC%D0%B8&amp;diff=58367"/>
				<updated>2016-12-28T08:09:49Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: /* Теоремы */  Опечатка в доказательстве&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Определения==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;N = (V,E,s,t,c)&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;F&amp;lt;/tex&amp;gt;, как максимальная пропускная способность ребра и максимальный поток соответственно.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;c^{+}(v) = \sum\limits_{uv \in E} c_{uv}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;c^{-}(v) = \sum\limits_{vu \in E} c_{vu}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p(v) = min\big\{c^{+}(v), c^{-}(v)\big\}&amp;lt;/tex&amp;gt; - потенциал вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда общий потенциал выражается формулой:&lt;br /&gt;
&amp;lt;tex&amp;gt;P = \sum\limits_{v \in V, v \neq s,t}p(v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Дополняющая сеть, дополняющий путь|Остаточную сеть]] обозначим &amp;lt;tex&amp;gt;N(f)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Обозначим длину [[Схема алгоритма Диница|слоистой сети]] &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; - как длину кратчайшего &amp;lt;tex&amp;gt;s-t&amp;lt;/tex&amp;gt; пути в &amp;lt;tex&amp;gt;N(f)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Теоремы==&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about = 1&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; - расстояние между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; в сети с текущим потоком, равным 0, и максимальным потоком, равным &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;l \leq \frac{P}{F} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; - расстояние между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;V_i&amp;lt;/tex&amp;gt; - набор вершин, удаленных от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(i \leq l)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;tex&amp;gt;V_i&amp;lt;/tex&amp;gt; - разъединяющее множество узлов: при его удалении исчезают все пути из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Следуя закону [[Определение сети, потока|сохранения потока]], если &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; обозначить как любой допустимый поток, то &amp;lt;tex&amp;gt;|f|&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;P_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;|f| \leq P_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 \leq P_i&amp;lt;/tex&amp;gt;, таким образом получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(l - 1)F \leq \displaystyle \sum_{i = 1}^{l - 1} P_i \leq P&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и лемма доказана.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about = 2&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt; - сеть, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; - допустимый поток в этой сети. Тогда общий потенциал в остаточной сети &amp;lt;tex&amp;gt;N(f)&amp;lt;/tex&amp;gt; равен общему потенциалу &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;c_f&amp;lt;/tex&amp;gt; - функция пропускных способностей в &amp;lt;tex&amp;gt;N(f)&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;p_f(v), in_f(v), out_f(v)&amp;lt;/tex&amp;gt; - потенциал, множество входящих ребер и множество выходящих ребер вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;N(f)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Достаточно доказать, что &amp;lt;tex&amp;gt;p_f(v) = p(v)&amp;lt;/tex&amp;gt;. Ребру &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;in(v)&amp;lt;/tex&amp;gt; соответствуют ребро &amp;lt;tex&amp;gt;e_1&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;in_f(v)&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt;c(e) - f(e)&amp;lt;/tex&amp;gt;, и ребро &amp;lt;tex&amp;gt;e_2&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;out(v)&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt;f(e)&amp;lt;/tex&amp;gt;. Аналогично, ребру &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;out(v)&amp;lt;/tex&amp;gt; соответствуют ребра из &amp;lt;tex&amp;gt;out_f(v)&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt;c(v) - f (v)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;in_f(v)&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt;f(e)&amp;lt;/tex&amp;gt;. Используя закон сохранения потока, нетрудно проверить, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle\sum_{e\in in_f(v)} c_f(e) = \sum_{e\in in(v)}c(e)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle\sum_{e\in out_f(v)} c_f(e) = \sum_{e\in out(v)}c(e)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
что и требовалось доказать.&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=th1. &lt;br /&gt;
|about=Первая теорема Карзанова&lt;br /&gt;
|statement=Число итераций [[Схема алгоритма Диница|алгоритма Диница]] в сети &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; — исток, &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; — сток) с целочисленными пропускными способностями — &amp;lt;tex&amp;gt;O(\sqrt{P})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; - максимальный поток в сети &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Теорема верна для &amp;lt;tex&amp;gt;F \leq \sqrt{P}&amp;lt;/tex&amp;gt;, так как после каждой фазы поток увеличивается хотя бы на 1. Если &amp;lt;tex&amp;gt;F &amp;gt; \sqrt{P}&amp;lt;/tex&amp;gt;, рассмотрим последнюю фазу, на момент начала выполнения которой поток в сети был меньше, чем &amp;lt;tex&amp;gt;F - \sqrt{P}&amp;lt;/tex&amp;gt;. После этого потребуется не больше &amp;lt;tex&amp;gt;\sqrt{P}&amp;lt;/tex&amp;gt; фаз, чтобы найти максимальный поток. На предыдущей фазе поток (&amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;) в &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; был не больше &amp;lt;tex&amp;gt;F-\sqrt{P}&amp;lt;/tex&amp;gt;, таким образом &amp;lt;tex&amp;gt;F-|f| \geqslant \sqrt{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;N(f)&amp;lt;/tex&amp;gt; - сеть с максимальным потоком &amp;lt;tex&amp;gt;F-|f|&amp;lt;/tex&amp;gt; и потенциалом &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; (по Лемме(2)). Поэтому можно воспользоваться Леммой(1), чтобы оценить расстояние между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;N(f)&amp;lt;/tex&amp;gt;, и получить оценку длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; слоистой сети:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;l \leq \frac{P}{F-|f|} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как каждая фаза увеличивает длину слоистой сети минимум на один, то осуществляется не больше &amp;lt;tex&amp;gt;\sqrt{P}&amp;lt;/tex&amp;gt; фаз. Таким образом происходит не более &amp;lt;tex&amp;gt;2\sqrt{P}&amp;lt;/tex&amp;gt; фаз.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about = 3&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть в сети &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; нет [[Основные определения теории графов#def1|параллельных ребер]]. &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; - поток в &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; - максимальный поток в &amp;lt;tex&amp;gt;N(f)&amp;lt;/tex&amp;gt;. Тогда расстояние &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;N(f)&amp;lt;/tex&amp;gt; таково: &amp;lt;tex&amp;gt;l \leq |V|\sqrt{\frac{2C}{F}} - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt;V_i&amp;lt;/tex&amp;gt; как набор вершин на расстоянии &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Множества &amp;lt;tex&amp;gt;X = \bigcup_{i = 0}^k V_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y = V - X&amp;lt;/tex&amp;gt; определяют разрез &amp;lt;tex&amp;gt;(X, Y)&amp;lt;/tex&amp;gt;. Пропускная способность этого разреза не больше &amp;lt;tex&amp;gt;2C|V_k||V_{k + 1}|&amp;lt;/tex&amp;gt;, так как все ребра между &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y&amp;lt;/tex&amp;gt; также являются ребрами между &amp;lt;tex&amp;gt;V_k&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;V_{k+1}&amp;lt;/tex&amp;gt; и не более чем двумя параллельными ребрами, исходящими из какой-то вершины в остаточной сети. По теореме о максимальном потоке/минимальном разрезе, &amp;lt;tex&amp;gt;F \leq 2C|V_k||V_{k+1}|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Таким образом &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; ограничен наименьшим из &amp;lt;tex&amp;gt;|V_k||V_{k+1}|&amp;lt;/tex&amp;gt;. Но эта величина максимальна, когда &amp;lt;tex&amp;gt;|V_i| = |V|/(l+1)&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;0 \leq i \leq n&amp;lt;/tex&amp;gt;, таким образом &amp;lt;tex&amp;gt;F \leq 2C|V|^2 / (l+1)^2&amp;lt;/tex&amp;gt;. Выражая &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt;, получаем нужное.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=th2&lt;br /&gt;
|about=Вторая теорема Карзанова&lt;br /&gt;
|statement=Число итераций алгоритма Диница с целочисленными пропускными способностями - &amp;lt;tex&amp;gt;O(C^{1/3}|V|^{2/3})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;F \leq C^{1/3}|V|^{2/3}&amp;lt;/tex&amp;gt;, то теорема очевидна. &lt;br /&gt;
Положим, что &amp;lt;tex&amp;gt;F &amp;gt; C^{1/3}|V|^{2/3}&amp;lt;/tex&amp;gt;, и рассотрим последнюю фазу, в которой поток &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; не превышает &amp;lt;tex&amp;gt;F - C^{1/3}|V|^{2/3}&amp;lt;/tex&amp;gt;. В этот момент осталось не более &amp;lt;tex&amp;gt;C^{1/3}|V|^{2/3} + 1&amp;lt;/tex&amp;gt; фаз, и &amp;lt;tex&amp;gt;N(f)&amp;lt;/tex&amp;gt; - сеть с максимальным потоком &amp;lt;tex&amp;gt;F - |f| \ge C^{1/3}|V|^{2/3}&amp;lt;/tex&amp;gt;. Мы можем применить Лемму(2), чтобы оценить длину &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; слоистой сети, и, соответственно, количество выполненных фаз:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;l \leq |V|{(\frac{2C}{F-|f|})}^{1/2} - 1 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\leq 2^{1/2}C^{1/3}|V|^{2/3} - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, прошло &amp;lt;tex&amp;gt;O(C^{1/3}|V|^{2/3})&amp;lt;/tex&amp;gt; фаз, и &amp;lt;tex&amp;gt;O(C^{1/3}|V|^{2/3})&amp;lt;/tex&amp;gt; фаз осталось. Теорема доказана.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* [http://www.springerlink.com/content/w0q006u3631gg124/fulltext.pdf On the efficiency of Maximum-Flow Algorithms on Networks with Small Integer Capacities. David Fernandez-Baca and Charles U.Martel]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория:Задача о максимальном потоке]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D1%8B_%D0%9A%D0%B0%D1%80%D0%B7%D0%B0%D0%BD%D0%BE%D0%B2%D0%B0_%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%B5_%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B8%D0%BD%D0%B8%D1%86%D0%B0_%D0%B2_%D1%81%D0%B5%D1%82%D0%B8_%D1%81_%D1%86%D0%B5%D0%BB%D0%BE%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8_%D0%BF%D1%80%D0%BE%D0%BF%D1%83%D1%81%D0%BA%D0%BD%D1%8B%D0%BC%D0%B8_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BD%D0%BE%D1%81%D1%82%D1%8F%D0%BC%D0%B8&amp;diff=58263</id>
		<title>Теоремы Карзанова о числе итераций алгоритма Диница в сети с целочисленными пропускными способностями</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D1%8B_%D0%9A%D0%B0%D1%80%D0%B7%D0%B0%D0%BD%D0%BE%D0%B2%D0%B0_%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%B5_%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B8%D0%BD%D0%B8%D1%86%D0%B0_%D0%B2_%D1%81%D0%B5%D1%82%D0%B8_%D1%81_%D1%86%D0%B5%D0%BB%D0%BE%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8_%D0%BF%D1%80%D0%BE%D0%BF%D1%83%D1%81%D0%BA%D0%BD%D1%8B%D0%BC%D0%B8_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BD%D0%BE%D1%81%D1%82%D1%8F%D0%BC%D0%B8&amp;diff=58263"/>
				<updated>2016-12-25T10:39:00Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: /* Теоремы */ Опечатка в доказательстве&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Определения==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;N = (V,E,s,t,c)&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;F&amp;lt;/tex&amp;gt;, как максимальная пропускная способность ребра и максимальный поток соответственно.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;c^{+}(v) = \sum\limits_{uv \in E} c_{uv}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;c^{-}(v) = \sum\limits_{vu \in E} c_{vu}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p(v) = min\big\{c^{+}(v), c^{-}(v)\big\}&amp;lt;/tex&amp;gt; - потенциал вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда общий потенциал выражается формулой:&lt;br /&gt;
&amp;lt;tex&amp;gt;P = \sum\limits_{v \in V, v \neq s,t}p(v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Дополняющая сеть, дополняющий путь|Остаточную сеть]] обозначим &amp;lt;tex&amp;gt;N(f)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Обозначим длину [[Схема алгоритма Диница|слоистой сети]] &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; - как длину кратчайшего &amp;lt;tex&amp;gt;s-t&amp;lt;/tex&amp;gt; пути в &amp;lt;tex&amp;gt;N(f)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Теоремы==&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about = 1&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; - расстояние между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; в сети с текущим потоком, равным 0, и максимальным потоком, равным &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;l \leq \frac{P}{F} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; - расстояние между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;V_i&amp;lt;/tex&amp;gt; - набор вершин, удаленных от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(i \leq l)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;tex&amp;gt;V_i&amp;lt;/tex&amp;gt; - разъединяющее множество узлов: при его удалении исчезают все пути из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Следуя закону [[Определение сети, потока|сохранения потока]], если &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; обозначить как любой допустимый поток, то &amp;lt;tex&amp;gt;|f|&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;P_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;|f| \leq P_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 \leq P_i&amp;lt;/tex&amp;gt;, таким образом получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(l - 1)F \leq \displaystyle \sum_{i = 1}^{l - 1} P_i \leq P&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и лемма доказана.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about = 2&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt; - сеть, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; - допустимый поток в этой сети. Тогда общий потенциал в остаточной сети &amp;lt;tex&amp;gt;N(f)&amp;lt;/tex&amp;gt; равен общему потенциалу &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;c_f&amp;lt;/tex&amp;gt; - функция пропускных способностей в &amp;lt;tex&amp;gt;N(f)&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;p_f(v), in_f(v), out_f(v)&amp;lt;/tex&amp;gt; - потенциал, множество входящих ребер и множество выходящих ребер вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;N(f)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Достаточно доказать, что &amp;lt;tex&amp;gt;p_f(v) = p(v)&amp;lt;/tex&amp;gt;. Ребру &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;in(v)&amp;lt;/tex&amp;gt; соответствуют ребро &amp;lt;tex&amp;gt;e_1&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;in_f(v)&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt;c(e) - f(e)&amp;lt;/tex&amp;gt;, и ребро &amp;lt;tex&amp;gt;e_2&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;out(v)&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt;f(e)&amp;lt;/tex&amp;gt;. Аналогично, ребру &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;out(v)&amp;lt;/tex&amp;gt; соответствуют ребра из &amp;lt;tex&amp;gt;out_f(v)&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt;c(v) - f (v)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;in_f(v)&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt;f(e)&amp;lt;/tex&amp;gt;. Используя закон сохранения потока, нетрудно проверить, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle\sum_{e\in in_f(v)} c_f(e) = \sum_{e\in in(v)}c(e)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle\sum_{e\in out_f(v)} c_f(e) = \sum_{e\in out(v)}c(e)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
что и требовалось доказать.&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=th1. &lt;br /&gt;
|about=Первая теорема Карзанова&lt;br /&gt;
|statement=Число итераций [[Схема алгоритма Диница|алгоритма Диница]] в сети &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; — исток, &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; — сток) с целочисленными пропускными способностями — &amp;lt;tex&amp;gt;O(\sqrt{P})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; - максимальный поток в сети &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Теорема верна для &amp;lt;tex&amp;gt;F \leq \sqrt{P}&amp;lt;/tex&amp;gt;, так как после каждой фазы поток увеличивается хотя бы на 1. Если &amp;lt;tex&amp;gt;F &amp;gt; \sqrt{P}&amp;lt;/tex&amp;gt;, рассмотрим последнюю фазу, на момент начала выполнения которой поток в сети был меньше, чем &amp;lt;tex&amp;gt;F - \sqrt{P}&amp;lt;/tex&amp;gt;. После этого потребуется не больше &amp;lt;tex&amp;gt;\sqrt{P}&amp;lt;/tex&amp;gt; фаз, чтобы найти максимальный поток. На предыдущей фазе поток (&amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;) в &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; был не больше &amp;lt;tex&amp;gt;F-\sqrt{P}&amp;lt;/tex&amp;gt;, таким образом &amp;lt;tex&amp;gt;F-|f| \geqslant \sqrt{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;N(f)&amp;lt;/tex&amp;gt; - сеть с максимальным потоком &amp;lt;tex&amp;gt;F-|f|&amp;lt;/tex&amp;gt; и потенциалом &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; (по Лемме(2)). Поэтому можно воспользоваться Леммой(1), чтобы оценить расстояние между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;N(f)&amp;lt;/tex&amp;gt;, и получить оценку длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; слоистой сети:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;l \leq \frac{P}{F-|f|} + 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как каждая фаза увеличивает длину слоистой сети минимум на один, то осуществляется не больше &amp;lt;tex&amp;gt;\sqrt{P}&amp;lt;/tex&amp;gt; фаз. Таким образом происходит не более &amp;lt;tex&amp;gt;2\sqrt{P}&amp;lt;/tex&amp;gt; фаз.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about = 3&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть в сети &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; нет [[Основные определения теории графов#def1|параллельных ребер]]. &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; - поток в &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; - максимальный поток в &amp;lt;tex&amp;gt;N(f)&amp;lt;/tex&amp;gt;. Тогда расстояние &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; между &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;N(f)&amp;lt;/tex&amp;gt; таково: &amp;lt;tex&amp;gt;l \leq |V|\sqrt{\frac{2C}{F}} - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt;V_i&amp;lt;/tex&amp;gt; как набор вершин на расстоянии &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Множества &amp;lt;tex&amp;gt;X = \bigcup_{i = 0}^k V_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y = V - X&amp;lt;/tex&amp;gt; определяют разрез &amp;lt;tex&amp;gt;(X, Y)&amp;lt;/tex&amp;gt;. Пропускная способность этого разреза не больше &amp;lt;tex&amp;gt;2C|V_k||V_{k + 1}|&amp;lt;/tex&amp;gt;, так как все ребра между &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y&amp;lt;/tex&amp;gt; также являются ребрами между &amp;lt;tex&amp;gt;V_k&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;V_{k+1}&amp;lt;/tex&amp;gt; и не более чем двумя параллельными ребрами, исходящими из какой-то вершины в остаточной сети. По теореме о максимальном потоке/минимальном разрезе, &amp;lt;tex&amp;gt;F \leq 2C|V_k||V_{k+1}|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Таким образом &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; ограничен наименьшим из &amp;lt;tex&amp;gt;|V_k||V_{k+1}|&amp;lt;/tex&amp;gt;. Но эта величина максимальна, когда &amp;lt;tex&amp;gt;|V_i| = |V|/(l+1)&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;0 \leq i \leq n&amp;lt;/tex&amp;gt;, таким образом &amp;lt;tex&amp;gt;F \leq 2C|V|^2(l+1)^2&amp;lt;/tex&amp;gt;. Выражая &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt;, получаем нужное.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=th2&lt;br /&gt;
|about=Вторая теорема Карзанова&lt;br /&gt;
|statement=Число итераций алгоритма Диница с целочисленными пропускными способностями - &amp;lt;tex&amp;gt;O(C^{1/3}|V|^{2/3})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;F \leq C^{1/3}|V|^{2/3}&amp;lt;/tex&amp;gt;, то теорема очевидна. &lt;br /&gt;
Положим, что &amp;lt;tex&amp;gt;F &amp;gt; C^{1/3}|V|^{2/3}&amp;lt;/tex&amp;gt;, и рассотрим последнюю фазу, в которой поток &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; не превышает &amp;lt;tex&amp;gt;F - C^{1/3}|V|^{2/3}&amp;lt;/tex&amp;gt;. В этот момент осталось не более &amp;lt;tex&amp;gt;C^{1/3}|V|^{2/3} + 1&amp;lt;/tex&amp;gt; фаз, и &amp;lt;tex&amp;gt;N(f)&amp;lt;/tex&amp;gt; - сеть с максимальным потоком &amp;lt;tex&amp;gt;F - |f| \ge C^{1/3}|V|^{2/3}&amp;lt;/tex&amp;gt;. Мы можем применить Лемму(2), чтобы оценить длину &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; слоистой сети, и, соответственно, количество выполненных фаз:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;l \leq |V|{(\frac{2C}{F-|f|})}^{1/2} - 1 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\leq 2^{1/2}C^{1/3}|V|^{2/3} - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, прошло &amp;lt;tex&amp;gt;O(C^{1/3}|V|^{2/3})&amp;lt;/tex&amp;gt; фаз, и &amp;lt;tex&amp;gt;O(C^{1/3}|V|^{2/3})&amp;lt;/tex&amp;gt; фаз осталось. Теорема доказана.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* [http://www.springerlink.com/content/w0q006u3631gg124/fulltext.pdf On the efficiency of Maximum-Flow Algorithms on Networks with Small Integer Capacities. David Fernandez-Baca and Charles U.Martel]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория:Задача о максимальном потоке]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2&amp;diff=51534</id>
		<title>Динамический массив</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2&amp;diff=51534"/>
				<updated>2016-01-21T09:10:10Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: /* Стоимость операции del() */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
| definition =&lt;br /&gt;
'''Массив''' {{---}} набор однотипных переменных, доступ к которым осуществляется по индексу. '''Динамический массив''' может изменять свой размер в зависимости от количества элементов в нём.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Операции ==&lt;br /&gt;
Определим операции, которые мы будем применять к динамическому массиву:&amp;lt;br&amp;gt;&lt;br /&gt;
=== get(i) ===&lt;br /&gt;
:Возвращает значение &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой ячейки массива. Время выполнения {{---}} &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
=== set(i,x) ===&lt;br /&gt;
:В &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ую ячейку массива записывается элемент &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;. Время выполнения {{---}} &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
=== add(x) ===&lt;br /&gt;
:Добавление в массив элемента &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;. Время выполнения {{---}} &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;; в худшем случае, при котором необходимо перенести все элементы из текущего массива в вдвое больший массив {{---}} &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} размер массива).&lt;br /&gt;
=== del() ===&lt;br /&gt;
:Удаляет последний элемент массива. В случае, если количество элементов в массиве в &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; раз меньше его длины, то происходит сжатие в &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; раз. (&amp;lt;tex&amp;gt;C,B&amp;lt;/tex&amp;gt; {{---}} константы, зависящие от реализации). Время выполнения операции в худшем случае {{---}} &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== size() ===&lt;br /&gt;
:Возвращает количество элементов массива. Время выполнения {{---}} &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Амортизационная стоимость каждой операции ==&lt;br /&gt;
Пусть наш массив расширяется в &amp;lt;tex&amp;gt;2&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;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
=== Метод предоплаты ===&lt;br /&gt;
==== Стоимость операции add(x) ====&lt;br /&gt;
[[Файл:Безымянный1.png|400px|thumb|right|Иллюстрация]]&lt;br /&gt;
Пусть у нас единицей стоимости операции является одна монетка. Тогда при каждой операции '''add(x)''', при которой нам не требуется копирование, мы будем использовать три монетки. Из них одна пойдёт на стоимость самой этой операции, а две будут в резерве (пусть, если мы добавили &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ый элемент, мы будем класть по одной монетке к элементам с номерами &amp;lt;tex dpi=150&amp;gt;i&amp;lt;/tex&amp;gt; и &amp;lt;tex dpi=150&amp;gt;i-\frac{n}{2}&amp;lt;/tex&amp;gt;). В итоге, к тому моменту, как массив будет заполнен, рядом с каждым элементом будет лежать по одной монетке, которую мы и можем использовать на его копирование в новый массив. Таким образом, амортизационная стоимость каждой операции '''add(x)''' {{---}} &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;, и среднее время её работы {{---}} &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
==== Стоимость операции del() ====&lt;br /&gt;
При каждой операции будем использовать две монетки. Одну из них потратим на само удаление элемента, другую на элемент, стоящий на позиции &amp;lt;tex&amp;gt;i \bmod \dfrac{n}{4}&amp;lt;/tex&amp;gt;. Тогда даже в самом худшем случае (только что расширились, а потом &amp;lt;tex&amp;gt;\dfrac{n}{4}&amp;lt;/tex&amp;gt; удалили) у каждого элемента из первых &amp;lt;tex&amp;gt;\dfrac{n}{4}&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;
&amp;lt;tex dpi=150&amp;gt;\Phi(c, s) = \begin{cases}&lt;br /&gt;
 2s-c, &amp;amp; \text{if } s\geqslant\frac{1}{2}c \\&lt;br /&gt;
 \frac{1}{2}c-s, &amp;amp; \text{if } s&amp;lt;\frac{1}{2}c&lt;br /&gt;
\end{cases}&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;s&amp;lt;/tex&amp;gt; {{---}} число элементов массива.&lt;br /&gt;
&lt;br /&gt;
==== Стоимость операции '''add(x)''' ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex dpi=150&amp;gt;\frac{s}{c} = 1&amp;lt;/tex&amp;gt;, массив расширяется: &amp;lt;tex dpi=150&amp;gt; a_i = t_i + \Phi(2c, s + 1) - \Phi(c, s) = (s + 1) + (2(s+1)-2c)-(2s-c) = 3 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex dpi=150&amp;gt;1&amp;gt;\frac{s}{c}\geqslant\frac{1}{2}&amp;lt;/tex&amp;gt;, массив не расширяется: &amp;lt;tex dpi=150&amp;gt;a_i=t_i+\Phi(c,s+1)-\Phi(c,s)=1+(2(s+1)-c)-(2s-c)=3&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex dpi=150&amp;gt;\frac{s}{c}&amp;lt;\frac{1}{2}, \frac{s+1}{c}\geqslant\frac{1}{2}&amp;lt;/tex&amp;gt;, массив не расширяется:&lt;br /&gt;
&amp;lt;tex dpi=150&amp;gt;a_i = t_i + \Phi(c, s+1)-\Phi(c, s)= 1 +(2(s+1)-c)-(\frac{1}{2}c - s)= 3+s-\frac{3}{2}c= 3 + \frac{s}{c}c-\frac{3}{2}c &amp;lt;3+\frac{3}{2}c-\frac{3}{2}c=3&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex dpi=150&amp;gt;\frac{s}{c}&amp;lt;\frac{1}{2}, \frac{s+1}{c}&amp;lt;\frac{1}{2}&amp;lt;/tex&amp;gt;, массив не расширяется: &amp;lt;tex dpi=150&amp;gt;a_i = t_i + \Phi(c, s + 1) - \Phi(c, s) = 1 + (\frac{1}{2}c - (s + 1)) - (\frac{1}{2}c - s) = 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В итоге, средняя стоимость операции {{---}} &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;, а среднее время работы {{---}} &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Стоимость операции del() ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex dpi=150&amp;gt;\frac{s}{c}=\frac{1}{4}&amp;lt;/tex&amp;gt;, массив сужается: &amp;lt;tex dpi=150&amp;gt;a_i = t_i + \Phi(\frac{c}{2}, s - 1) - \Phi(c, s) = s + (\frac{1}{2}\cdot\frac{1}{2}c-(s-1)) - (\frac{1}{2}c-s) = 1-\frac{1}{4}c+s=1&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex dpi=150&amp;gt;\frac{1}{4}&amp;lt;\frac{s}{c}&amp;lt;\frac{1}{2}&amp;lt;/tex&amp;gt;, массив не сужается: &amp;lt;tex dpi=150&amp;gt;a_i = t_i + \Phi(c, s - 1) - \Phi(c, s) = 1 + (\frac{1}{2}c-(s-1))-(\frac{1}{2}c-s)= 2&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex dpi=150&amp;gt;\frac{s}{c}\geqslant\frac{1}{2}, \frac{s-1}{c}&amp;lt;\frac{1}{2}\Rightarrow s=\frac{1}{2}c&amp;lt;/tex&amp;gt;, массив не сужается: &amp;lt;tex dpi=150&amp;gt;a_i = t_i + \Phi(c, s - 1) - \Phi(c, s) =1 +(\frac{1}{2}c-(s-1))-(2s-c)=2+\frac{3}{2}c-3s = 2&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex dpi=150&amp;gt;\frac{s}{c}&amp;gt;\frac{1}{2}&amp;lt;/tex&amp;gt;, массив не сужается: &amp;lt;tex dpi=150&amp;gt;a_i = t_i + \Phi(c, s - 1) - \Phi(c, s) = 1 + (2(s-1)-c)-(2s-c)=0&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;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Динамические массивы в современных языках программирования==&lt;br /&gt;
Динамические массивы широко применяются во многих языках программирования. Рассмотрим, как эта структура данных реализуется в С++ и Java. &lt;br /&gt;
===С++ {{---}} vector===&lt;br /&gt;
В С++ динамический массив используется в структуре vector, она описана в STL(&amp;lt;vector&amp;gt;). Стратегия расширения проста: при попытке записи в массив нового элемента в момент полного заполнения памяти происходит увеличение размера в &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; раза при компиляции GNU C++ и в &amp;lt;tex&amp;gt;1.5&amp;lt;/tex&amp;gt; раза при компиляции Microsoft Visual C++. При удалении элементов уменьшение размера массива никогда не происходит. При инициализации vector по-умолчанию начальный размер равен &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
===Java {{---}} ArrayList===&lt;br /&gt;
В Java структура ArrayList основана на динамическом массиве. При превышении максимального на данный момент размера происходит увеличение в &amp;lt;tex&amp;gt;1.5&amp;lt;/tex&amp;gt; раза. Причем начальный размер равен &amp;lt;tex&amp;gt;10&amp;lt;/tex&amp;gt;. Как и в vector, в ArrayList не предусмотрено изменение размера при удалении элементов. Для принудительного изменения размера следует использовать метод trimToSize().&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [[wikipedia:Dynamic_array | Wikipedia {{---}} Dynamic array]]&lt;br /&gt;
* [[wikipedia:ru:Динамический_массив | Wikipedia {{---}} Динамический массив]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Амортизационный анализ]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2&amp;diff=51533</id>
		<title>Динамический массив</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2&amp;diff=51533"/>
				<updated>2016-01-21T09:06:39Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: /* Стоимость операции del() */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
| definition =&lt;br /&gt;
'''Массив''' {{---}} набор однотипных переменных, доступ к которым осуществляется по индексу. '''Динамический массив''' может изменять свой размер в зависимости от количества элементов в нём.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Операции ==&lt;br /&gt;
Определим операции, которые мы будем применять к динамическому массиву:&amp;lt;br&amp;gt;&lt;br /&gt;
=== get(i) ===&lt;br /&gt;
:Возвращает значение &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой ячейки массива. Время выполнения {{---}} &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
=== set(i,x) ===&lt;br /&gt;
:В &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ую ячейку массива записывается элемент &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;. Время выполнения {{---}} &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
=== add(x) ===&lt;br /&gt;
:Добавление в массив элемента &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;. Время выполнения {{---}} &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;; в худшем случае, при котором необходимо перенести все элементы из текущего массива в вдвое больший массив {{---}} &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} размер массива).&lt;br /&gt;
=== del() ===&lt;br /&gt;
:Удаляет последний элемент массива. В случае, если количество элементов в массиве в &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; раз меньше его длины, то происходит сжатие в &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; раз. (&amp;lt;tex&amp;gt;C,B&amp;lt;/tex&amp;gt; {{---}} константы, зависящие от реализации). Время выполнения операции в худшем случае {{---}} &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== size() ===&lt;br /&gt;
:Возвращает количество элементов массива. Время выполнения {{---}} &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Амортизационная стоимость каждой операции ==&lt;br /&gt;
Пусть наш массив расширяется в &amp;lt;tex&amp;gt;2&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;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
=== Метод предоплаты ===&lt;br /&gt;
==== Стоимость операции add(x) ====&lt;br /&gt;
[[Файл:Безымянный1.png|400px|thumb|right|Иллюстрация]]&lt;br /&gt;
Пусть у нас единицей стоимости операции является одна монетка. Тогда при каждой операции '''add(x)''', при которой нам не требуется копирование, мы будем использовать три монетки. Из них одна пойдёт на стоимость самой этой операции, а две будут в резерве (пусть, если мы добавили &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ый элемент, мы будем класть по одной монетке к элементам с номерами &amp;lt;tex dpi=150&amp;gt;i&amp;lt;/tex&amp;gt; и &amp;lt;tex dpi=150&amp;gt;i-\frac{n}{2}&amp;lt;/tex&amp;gt;). В итоге, к тому моменту, как массив будет заполнен, рядом с каждым элементом будет лежать по одной монетке, которую мы и можем использовать на его копирование в новый массив. Таким образом, амортизационная стоимость каждой операции '''add(x)''' {{---}} &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;, и среднее время её работы {{---}} &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
==== Стоимость операции del() ====&lt;br /&gt;
При каждой операции будем использовать две монетки. Одну из них потратим на само удаление элемента, другую на элемент, стоящий на позиции &amp;lt;tex&amp;gt;i \bmod \dfrac{n}{4}&amp;lt;/tex&amp;gt;. Тогда даже в самом худшем случае (только что расширились, а потом &amp;lt;tex&amp;gt;\dfrac{n}{4}&amp;lt;/tex&amp;gt; удалили) у каждого элемента из первых &amp;lt;tex&amp;gt;\dfrac{n}{4}&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;
&amp;lt;tex dpi=150&amp;gt;\Phi(c, s) = \begin{cases}&lt;br /&gt;
 2s-c, &amp;amp; \text{if } s\geqslant\frac{1}{2}c \\&lt;br /&gt;
 \frac{1}{2}c-s, &amp;amp; \text{if } s&amp;lt;\frac{1}{2}c&lt;br /&gt;
\end{cases}&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;s&amp;lt;/tex&amp;gt; {{---}} число элементов массива.&lt;br /&gt;
&lt;br /&gt;
==== Стоимость операции '''add(x)''' ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex dpi=150&amp;gt;\frac{s}{c} = 1&amp;lt;/tex&amp;gt;, массив расширяется: &amp;lt;tex dpi=150&amp;gt; a_i = t_i + \Phi(2c, s + 1) - \Phi(c, s) = (s + 1) + (2(s+1)-2c)-(2s-c) = 3 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex dpi=150&amp;gt;1&amp;gt;\frac{s}{c}\geqslant\frac{1}{2}&amp;lt;/tex&amp;gt;, массив не расширяется: &amp;lt;tex dpi=150&amp;gt;a_i=t_i+\Phi(c,s+1)-\Phi(c,s)=1+(2(s+1)-c)-(2s-c)=3&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex dpi=150&amp;gt;\frac{s}{c}&amp;lt;\frac{1}{2}, \frac{s+1}{c}\geqslant\frac{1}{2}&amp;lt;/tex&amp;gt;, массив не расширяется:&lt;br /&gt;
&amp;lt;tex dpi=150&amp;gt;a_i = t_i + \Phi(c, s+1)-\Phi(c, s)= 1 +(2(s+1)-c)-(\frac{1}{2}c - s)= 3+s-\frac{3}{2}c= 3 + \frac{s}{c}c-\frac{3}{2}c &amp;lt;3+\frac{3}{2}c-\frac{3}{2}c=3&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex dpi=150&amp;gt;\frac{s}{c}&amp;lt;\frac{1}{2}, \frac{s+1}{c}&amp;lt;\frac{1}{2}&amp;lt;/tex&amp;gt;, массив не расширяется: &amp;lt;tex dpi=150&amp;gt;a_i = t_i + \Phi(c, s + 1) - \Phi(c, s) = 1 + (\frac{1}{2}c - (s + 1)) - (\frac{1}{2}c - s) = 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В итоге, средняя стоимость операции {{---}} &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;, а среднее время работы {{---}} &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Стоимость операции del() ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex dpi=150&amp;gt;\frac{s}{c}=\frac{1}{4}&amp;lt;/tex&amp;gt;, массив сужается: &amp;lt;tex dpi=150&amp;gt;a_i = t_i + \Phi(\frac{c}{2}, s - 1) - \Phi(c, s) = s + (\frac{1}{2}\cdot\frac{1}{2}c-(s-1)) - (\frac{1}{2}c-s) = 1-\frac{1}{4}c+s=1&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex dpi=150&amp;gt;\frac{1}{4}&amp;lt;\frac{s}{c}&amp;lt;\frac{1}{2}&amp;lt;/tex&amp;gt;, массив не сужается: &amp;lt;tex dpi=150&amp;gt;a_i = t_i + \Phi(c, s - 1) - \Phi(c, s) = 1 + (\frac{1}{2}c-(s-1))-(\frac{1}{2}c-s)= 2&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex dpi=150&amp;gt;\frac{s}{c}\geqslant\frac{1}{2}, \frac{s-1}{c}&amp;lt;\frac{1}{2}\Rightarrow s=\frac{1}{2}c&amp;lt;/tex&amp;gt;, массив не сужается: &amp;lt;tex dpi=150&amp;gt;a_i = t_i + \Phi(c, s - 1) - \Phi(c, s) =1 +(\frac{1}{2}c-(s-1))-(2s-c)=2+\frac{3}{2}c-3s = 2&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex dpi=150&amp;gt;\frac{s}{c}&amp;gt;\frac{1}{2}&amp;lt;/tex&amp;gt;, массив не сужается: &amp;lt;tex dpi=150&amp;gt;a_i = t_i + \Phi(c, s - 1) - \Phi(c, s) = 1 + (2(s-1)-c)-(2s-c)=3&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;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Динамические массивы в современных языках программирования==&lt;br /&gt;
Динамические массивы широко применяются во многих языках программирования. Рассмотрим, как эта структура данных реализуется в С++ и Java. &lt;br /&gt;
===С++ {{---}} vector===&lt;br /&gt;
В С++ динамический массив используется в структуре vector, она описана в STL(&amp;lt;vector&amp;gt;). Стратегия расширения проста: при попытке записи в массив нового элемента в момент полного заполнения памяти происходит увеличение размера в &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; раза при компиляции GNU C++ и в &amp;lt;tex&amp;gt;1.5&amp;lt;/tex&amp;gt; раза при компиляции Microsoft Visual C++. При удалении элементов уменьшение размера массива никогда не происходит. При инициализации vector по-умолчанию начальный размер равен &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
===Java {{---}} ArrayList===&lt;br /&gt;
В Java структура ArrayList основана на динамическом массиве. При превышении максимального на данный момент размера происходит увеличение в &amp;lt;tex&amp;gt;1.5&amp;lt;/tex&amp;gt; раза. Причем начальный размер равен &amp;lt;tex&amp;gt;10&amp;lt;/tex&amp;gt;. Как и в vector, в ArrayList не предусмотрено изменение размера при удалении элементов. Для принудительного изменения размера следует использовать метод trimToSize().&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [[wikipedia:Dynamic_array | Wikipedia {{---}} Dynamic array]]&lt;br /&gt;
* [[wikipedia:ru:Динамический_массив | Wikipedia {{---}} Динамический массив]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Амортизационный анализ]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2&amp;diff=51532</id>
		<title>Динамический массив</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2&amp;diff=51532"/>
				<updated>2016-01-21T09:02:08Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: /* Стоимость операции del() */  неправильно была описана.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
| definition =&lt;br /&gt;
'''Массив''' {{---}} набор однотипных переменных, доступ к которым осуществляется по индексу. '''Динамический массив''' может изменять свой размер в зависимости от количества элементов в нём.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Операции ==&lt;br /&gt;
Определим операции, которые мы будем применять к динамическому массиву:&amp;lt;br&amp;gt;&lt;br /&gt;
=== get(i) ===&lt;br /&gt;
:Возвращает значение &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой ячейки массива. Время выполнения {{---}} &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
=== set(i,x) ===&lt;br /&gt;
:В &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ую ячейку массива записывается элемент &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;. Время выполнения {{---}} &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
=== add(x) ===&lt;br /&gt;
:Добавление в массив элемента &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;. Время выполнения {{---}} &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;; в худшем случае, при котором необходимо перенести все элементы из текущего массива в вдвое больший массив {{---}} &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} размер массива).&lt;br /&gt;
=== del() ===&lt;br /&gt;
:Удаляет последний элемент массива. В случае, если количество элементов в массиве в &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; раз меньше его длины, то происходит сжатие в &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; раз. (&amp;lt;tex&amp;gt;C,B&amp;lt;/tex&amp;gt; {{---}} константы, зависящие от реализации). Время выполнения операции в худшем случае {{---}} &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== size() ===&lt;br /&gt;
:Возвращает количество элементов массива. Время выполнения {{---}} &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Амортизационная стоимость каждой операции ==&lt;br /&gt;
Пусть наш массив расширяется в &amp;lt;tex&amp;gt;2&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;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
=== Метод предоплаты ===&lt;br /&gt;
==== Стоимость операции add(x) ====&lt;br /&gt;
[[Файл:Безымянный1.png|400px|thumb|right|Иллюстрация]]&lt;br /&gt;
Пусть у нас единицей стоимости операции является одна монетка. Тогда при каждой операции '''add(x)''', при которой нам не требуется копирование, мы будем использовать три монетки. Из них одна пойдёт на стоимость самой этой операции, а две будут в резерве (пусть, если мы добавили &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ый элемент, мы будем класть по одной монетке к элементам с номерами &amp;lt;tex dpi=150&amp;gt;i&amp;lt;/tex&amp;gt; и &amp;lt;tex dpi=150&amp;gt;i-\frac{n}{2}&amp;lt;/tex&amp;gt;). В итоге, к тому моменту, как массив будет заполнен, рядом с каждым элементом будет лежать по одной монетке, которую мы и можем использовать на его копирование в новый массив. Таким образом, амортизационная стоимость каждой операции '''add(x)''' {{---}} &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;, и среднее время её работы {{---}} &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
==== Стоимость операции del() ====&lt;br /&gt;
При каждой операции будем использовать две монетки. Одну из них потратим на само удаление элемента, другую на элемент, стоящий на позиции &amp;lt;tex dpi=150&amp;gt;i \bmod \dfrac{n}{4}&amp;lt;/tex&amp;gt;. Тогда даже в самом худшем случае (только что расширились, а потом &amp;lt;tex&amp;gt;\dfrac{n}{4}&amp;lt;/tex&amp;gt; удалили) у каждого элемента из первых &amp;lt;tex&amp;gt;\dfrac{n}{4}&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;
&amp;lt;tex dpi=150&amp;gt;\Phi(c, s) = \begin{cases}&lt;br /&gt;
 2s-c, &amp;amp; \text{if } s\geqslant\frac{1}{2}c \\&lt;br /&gt;
 \frac{1}{2}c-s, &amp;amp; \text{if } s&amp;lt;\frac{1}{2}c&lt;br /&gt;
\end{cases}&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;s&amp;lt;/tex&amp;gt; {{---}} число элементов массива.&lt;br /&gt;
&lt;br /&gt;
==== Стоимость операции '''add(x)''' ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex dpi=150&amp;gt;\frac{s}{c} = 1&amp;lt;/tex&amp;gt;, массив расширяется: &amp;lt;tex dpi=150&amp;gt; a_i = t_i + \Phi(2c, s + 1) - \Phi(c, s) = (s + 1) + (2(s+1)-2c)-(2s-c) = 3 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex dpi=150&amp;gt;1&amp;gt;\frac{s}{c}\geqslant\frac{1}{2}&amp;lt;/tex&amp;gt;, массив не расширяется: &amp;lt;tex dpi=150&amp;gt;a_i=t_i+\Phi(c,s+1)-\Phi(c,s)=1+(2(s+1)-c)-(2s-c)=3&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex dpi=150&amp;gt;\frac{s}{c}&amp;lt;\frac{1}{2}, \frac{s+1}{c}\geqslant\frac{1}{2}&amp;lt;/tex&amp;gt;, массив не расширяется:&lt;br /&gt;
&amp;lt;tex dpi=150&amp;gt;a_i = t_i + \Phi(c, s+1)-\Phi(c, s)= 1 +(2(s+1)-c)-(\frac{1}{2}c - s)= 3+s-\frac{3}{2}c= 3 + \frac{s}{c}c-\frac{3}{2}c &amp;lt;3+\frac{3}{2}c-\frac{3}{2}c=3&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex dpi=150&amp;gt;\frac{s}{c}&amp;lt;\frac{1}{2}, \frac{s+1}{c}&amp;lt;\frac{1}{2}&amp;lt;/tex&amp;gt;, массив не расширяется: &amp;lt;tex dpi=150&amp;gt;a_i = t_i + \Phi(c, s + 1) - \Phi(c, s) = 1 + (\frac{1}{2}c - (s + 1)) - (\frac{1}{2}c - s) = 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В итоге, средняя стоимость операции {{---}} &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;, а среднее время работы {{---}} &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Стоимость операции del() ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex dpi=150&amp;gt;\frac{s}{c}=\frac{1}{4}&amp;lt;/tex&amp;gt;, массив сужается: &amp;lt;tex dpi=150&amp;gt;a_i = t_i + \Phi(\frac{c}{2}, s - 1) - \Phi(c, s) = s + (\frac{1}{2}\cdot\frac{1}{2}c-(s-1)) - (\frac{1}{2}c-s) = 1-\frac{1}{4}c+s=1&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex dpi=150&amp;gt;\frac{1}{4}&amp;lt;\frac{s}{c}&amp;lt;\frac{1}{2}&amp;lt;/tex&amp;gt;, массив не сужается: &amp;lt;tex dpi=150&amp;gt;a_i = t_i + \Phi(c, s - 1) - \Phi(c, s) = 1 + (\frac{1}{2}c-(s-1))-(\frac{1}{2}c-s)= 2&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex dpi=150&amp;gt;\frac{s}{c}\geqslant\frac{1}{2}, \frac{s-1}{c}&amp;lt;\frac{1}{2}\Rightarrow s=\frac{1}{2}c&amp;lt;/tex&amp;gt;, массив не сужается: &amp;lt;tex dpi=150&amp;gt;a_i = t_i + \Phi(c, s - 1) - \Phi(c, s) =1 +(\frac{1}{2}c-(s-1))-(2s-c)=2+\frac{3}{2}c-3s = 2&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex dpi=150&amp;gt;\frac{s}{c}&amp;gt;\frac{1}{2}&amp;lt;/tex&amp;gt;, массив не сужается: &amp;lt;tex dpi=150&amp;gt;a_i = t_i + \Phi(c, s - 1) - \Phi(c, s) = 1 + (2(s-1)-c)-(2s-c)=3&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;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Динамические массивы в современных языках программирования==&lt;br /&gt;
Динамические массивы широко применяются во многих языках программирования. Рассмотрим, как эта структура данных реализуется в С++ и Java. &lt;br /&gt;
===С++ {{---}} vector===&lt;br /&gt;
В С++ динамический массив используется в структуре vector, она описана в STL(&amp;lt;vector&amp;gt;). Стратегия расширения проста: при попытке записи в массив нового элемента в момент полного заполнения памяти происходит увеличение размера в &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; раза при компиляции GNU C++ и в &amp;lt;tex&amp;gt;1.5&amp;lt;/tex&amp;gt; раза при компиляции Microsoft Visual C++. При удалении элементов уменьшение размера массива никогда не происходит. При инициализации vector по-умолчанию начальный размер равен &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
===Java {{---}} ArrayList===&lt;br /&gt;
В Java структура ArrayList основана на динамическом массиве. При превышении максимального на данный момент размера происходит увеличение в &amp;lt;tex&amp;gt;1.5&amp;lt;/tex&amp;gt; раза. Причем начальный размер равен &amp;lt;tex&amp;gt;10&amp;lt;/tex&amp;gt;. Как и в vector, в ArrayList не предусмотрено изменение размера при удалении элементов. Для принудительного изменения размера следует использовать метод trimToSize().&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [[wikipedia:Dynamic_array | Wikipedia {{---}} Dynamic array]]&lt;br /&gt;
* [[wikipedia:ru:Динамический_массив | Wikipedia {{---}} Динамический массив]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Амортизационный анализ]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5_%D0%A5%D1%8D%D0%BC%D0%BC%D0%B8%D0%BD%D0%B3%D0%B0&amp;diff=51525</id>
		<title>Расстояние Хэмминга</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5_%D0%A5%D1%8D%D0%BC%D0%BC%D0%B8%D0%BD%D0%B3%D0%B0&amp;diff=51525"/>
				<updated>2016-01-20T07:42:18Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Расстояние Хэмминга''' (англ. ''Hamming distance'') {{---}} число позиций, в которых различаются соответствующие символы двух строк одинаковой длины. }}&lt;br /&gt;
В более общем случае расстояние Хэмминга применяется для строк одинаковой длины любых k-ичных алфавитов и служит [[Метрическое пространство#def1 | метрикой]] различия (функцией, определяющей расстояние в метрическом пространстве) объектов одинаковой размерности.&lt;br /&gt;
&lt;br /&gt;
==Пример== &lt;br /&gt;
*d(10&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;1&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;01, 10&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;1&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;01)=2&lt;br /&gt;
*d(15&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;38&amp;lt;/font&amp;gt;1&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;24&amp;lt;/font&amp;gt;, 15&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;23&amp;lt;/font&amp;gt;1&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;56&amp;lt;/font&amp;gt;)=4&lt;br /&gt;
*d(h&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;i&amp;lt;/font&amp;gt;ll, h&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;o&amp;lt;/font&amp;gt;ll)=1&lt;br /&gt;
&lt;br /&gt;
==Свойства==&lt;br /&gt;
''Расстояние Хэмминга'' обладает свойствами метрики, так как удовлетворяет ее [[Метрическое пространство#def1 | определению]].&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;tex&amp;gt;~d(x, y) = 0 \iff x = y&amp;lt;/tex&amp;gt; ''(Если расстояние от &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; равно нулю, то &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; совпадают (&amp;lt;tex&amp;gt;x = y&amp;lt;/tex&amp;gt;))''&lt;br /&gt;
#&amp;lt;tex&amp;gt;~d(x,y)=d(y,x)&amp;lt;/tex&amp;gt; ''(Объект &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; удален от объекта &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; так же, как объект &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; удален от объекта &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;)''&lt;br /&gt;
#&amp;lt;tex&amp;gt;~d(x,y) \leqslant  d(x,z) + d(z,y)&amp;lt;/tex&amp;gt; ''(Расстояние от &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; всегда меньше или равно расстоянию от &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; через точку &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt;. Это свойство обычно называют неравенством треугольника за его естественную геометрическую аналогию: сумма двух сторон треугольника всегда больше третьей стороны.)''&lt;br /&gt;
&lt;br /&gt;
== Доказательство неравенства треугольника ==&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;~d(x,y) \leqslant  d(x,z) + d(z,y)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
Пусть слова &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; отличаются в некоторых позициях. Тогда какое бы слово &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt; мы ни взяли, оно будет отличаться в каждой из этих позиций по крайне мере от одного из слов &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;. Следовательно, суммируя в правой части &amp;lt;tex&amp;gt;d(x, z)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d(z, y)&amp;lt;/tex&amp;gt;, мы обязательно учтем все позиции, в которых различались слова &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;. Т.е. получается, что &amp;lt;tex&amp;gt;~d(x,y) \leqslant  d(x,z) + d(z,y)&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;
*[http://ru.wikipedia.org/wiki/Расстояние_Хэмминга Расстояние Хэмминга — Википедия]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Hamming_distance Hamming distance - Wikipedia]&lt;br /&gt;
*[http://inf.1september.ru/article.php?ID=200701701 Математические основы информатики]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы сжатия]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</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_%D0%A5%D1%83-%D0%A2%D0%B0%D0%BA%D0%BA%D0%B5%D1%80%D0%B0&amp;diff=51524</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_%D0%A5%D1%83-%D0%A2%D0%B0%D0%BA%D0%BA%D0%B5%D1%80%D0%B0&amp;diff=51524"/>
				<updated>2016-01-20T07:39:19Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''''Алгоритм Ху-Таккера''''' (англ. ''Hu-Tucker Algorithm'') {{---}} алгоритм построения оптимального алфавитного дерева.&lt;br /&gt;
&lt;br /&gt;
''Алфавитное дерево'' {{---}} дерево в котором при просмотре листьев слева направо символы идут в алфавитном порядке, и код последующего лексикографически больше предыдущего.&lt;br /&gt;
==Определение==&lt;br /&gt;
&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;A=\{a_{1},a_{2},...,a_{n}\}&amp;lt;/tex&amp;gt; — алфавит из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; различных символов, &amp;lt;tex&amp;gt;W=\{w_{1},w_{2},...,w_{n}\}&amp;lt;/tex&amp;gt;  — соответствующий ему набор весов. Тогда алгоритм выбора набора бинарных кодов &amp;lt;tex&amp;gt;C=\{c_{1},c_{2},...,c_{n}\}&amp;lt;/tex&amp;gt;, такой, что:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;c_{i}&amp;lt;/tex&amp;gt; не является префиксом для &amp;lt;tex&amp;gt;c_{j}&amp;lt;/tex&amp;gt;, при &amp;lt;tex&amp;gt;i \ne j&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*для всех &amp;lt;tex&amp;gt;a_{i}&amp;lt;a_{j}&amp;lt;/tex&amp;gt;, выполнено &amp;lt;tex&amp;gt;c_{i}&amp;lt;c_{j}&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;\sum\limits_{i \in [1, n]} w_{i}\cdot |c_{i}|&amp;lt;/tex&amp;gt; минимальна  (&amp;lt;tex&amp;gt;|c_{i}|&amp;lt;/tex&amp;gt; — длина кода &amp;lt;tex&amp;gt;c_{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;
* Начало.&lt;br /&gt;
* '''Шаг 0.''' ''Введем следующие понятия''. &lt;br /&gt;
**Две вершины называются совместимой парой, если они соседние или если между ними нет вершин алфавита. &lt;br /&gt;
**Две вершины называются минимальной парой, когда их суммарный вес наименьший из всех. При равенстве весов выбирается пара с самой левой вершиной, из всех таких та, у которой правый узел расположен левее. &lt;br /&gt;
**Минимальной совместимой парой называется наименьшая пара из всех совместимых.&lt;br /&gt;
* '''Шаг 1.''' Изначально мы имеем только алфавит (и соответствующие веса), отсортированный лексикографически.&lt;br /&gt;
* '''Шаг 2.''' ''Комбинирование''. По данной последовательности из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершин строим последовательность из &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; вершины, комбинируя минимальную совместимую пару и заменяя ее левую вершину вершиной с весом &amp;lt;tex&amp;gt; w = w_{l} + w_{r} &amp;lt;/tex&amp;gt; и удаляя правую. Эта процедура повторяется до тех пор, пока не останется одна вершина.&lt;br /&gt;
* '''Шаг 3.''' ''Определение уровней''. Находим номер уровня &amp;lt;tex&amp;gt;l_{i}&amp;lt;/tex&amp;gt; каждого листа относительно корня.&lt;br /&gt;
* '''Шаг 4.''' ''Перестройка''. После того, как номера уровней &amp;lt;tex&amp;gt;l_{1}, l_{2}, ..., l_{n}&amp;lt;/tex&amp;gt; всех листьев определены, просматриваем последовательность слева направо и находим самый левый номер максимального уровня, скажем, &amp;lt;tex&amp;gt;l_{i}=q&amp;lt;/tex&amp;gt;. Тогда и &amp;lt;tex&amp;gt;l_{i+1}=q&amp;lt;/tex&amp;gt; (в последовательности &amp;lt;tex&amp;gt;l_{1}, l_{2}, ..., l_{n}&amp;lt;/tex&amp;gt; максимальные номера уровней всегда располагаются рядом). Создаем вершину уровня &amp;lt;tex&amp;gt;q-1&amp;lt;/tex&amp;gt; вместо вершин уровня  &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt;. Другими словами, последовательность уровней &amp;lt;tex&amp;gt;l_{1}, l_{2}, ..., l_{q}, l_{q}, ..., l_{n}&amp;lt;/tex&amp;gt; заменяется на &amp;lt;tex&amp;gt;l_{1}, l_{2}, ..., l_{q}-1, ..., l_{n}&amp;lt;/tex&amp;gt;. Повторяем этот процесс до тех пор пока не останется одна вершина с уровнем &amp;lt;tex&amp;gt;0&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;
* '''Шаг 0.''' [[Стек]] пуст.&lt;br /&gt;
* '''Шаг 1.''' Если значение двух верхних элементов различно или в стеке всего один элемент перейти к шагу &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, иначе к шагу &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* '''Шаг 2.''' Поместить следующий элемент &amp;lt;tex&amp;gt;l_{i}&amp;lt;/tex&amp;gt; на вершину стека. Перейти к шагу &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* '''Шаг 3.''' Удалить &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; верхних элемента стека, поместить в стек элемент со значением меньшим на единицу, чем удаленные. Если значение нового элемента равно нулю {{---}} остановиться, иначе перейти к шагу &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Конец.&lt;br /&gt;
&lt;br /&gt;
==Пример==&lt;br /&gt;
Для примера возьмем алфавит &amp;lt;tex&amp;gt;A= \{a,b,c,d,e,f,t,g,h,i,j\} &amp;lt;/tex&amp;gt;, а набор весов &amp;lt;tex&amp;gt;W= \{8,6,2,3,4,7,11,9,8,1,3\} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выполним второй шаг алгоритма.&lt;br /&gt;
&lt;br /&gt;
Объединим сначала &amp;lt;tex&amp;gt;w_{i}=1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;w_{j}=3&amp;lt;/tex&amp;gt;, получим вершину с весом &amp;lt;tex&amp;gt;w_{ij}=4&amp;lt;/tex&amp;gt;, затем &amp;lt;tex&amp;gt;w_{c}=2&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;w_{d}=3&amp;lt;/tex&amp;gt; на вершину веса &amp;lt;tex&amp;gt;w_{cd}=5&amp;lt;/tex&amp;gt;, и т.д. пока не останется одна вершина.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Hu-Taker_eps1.gif‎|300px]]&lt;br /&gt;
&lt;br /&gt;
Выполним третий шаг.&lt;br /&gt;
Определим уровни для каждого листа &amp;lt;tex&amp;gt;L= \{3,3,5,5,4,3,3,3,3,4,4\} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Hu-Taker Layer2.png|300px]]&lt;br /&gt;
&lt;br /&gt;
Выполним четвертый шаг, воспользовавшись стековым алгоритмом, и получим необходимое дерево.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Hu-Taker_eps3.gif|300px]][[Файл:Hu Takker eps3.png ‎|300px]]&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;
&lt;br /&gt;
Далее последовательностью-впадиной будем называть последовательность вида &amp;lt;tex&amp;gt;w_{1} &amp;gt; ... &amp;gt; w_{t} &amp;lt; ... &amp;lt; w_{n}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для обоснования воспользуемся несколькими леммами.&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|about=1&lt;br /&gt;
|statement=&lt;br /&gt;
Если последовательность весов монотонно не убывает или монотонно убывает, то стоимости деревьев Хаффмана и Ху-Таккера совпадают. Более того, существует дерево Хаффмана, удовлетворяющее требованию алфавитности (см. упражнения к разделу 2.3.4-5 вт.1 книги Д. Кнута Искусство программирования для ЭВМ).&lt;br /&gt;
}}&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma2&lt;br /&gt;
|about=2&lt;br /&gt;
|statement=&lt;br /&gt;
Если последовательность весов является впадиной, то стоимости деревьев Хаффмана и Ху-Таккера равны. Более того, существует дерево Хаффмана, удовлетворяющее требованию алфавитности (см. книгу Т.Ч.Ху и М.Т.Шинг Комбинаторные алгоритмы {{---}} леммы 7 и 8 в разделе 5.8).&lt;br /&gt;
}}&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma3&lt;br /&gt;
|about=3&lt;br /&gt;
|statement=&lt;br /&gt;
Если последовательность весов является впадиной, то новые вершины, создаваемые в фазе &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; алгоритма Ху-Таккера, образуют очередь с монотонно возрастающими весами. Потомки каждой из этих новых вершин могут быть соединены в алфавитное бинарное дерево, удовлетворяющее условию: если &amp;lt;tex&amp;gt;w_{i} \leqslant w_{j}&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;l_{j} \leqslant l_{i}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}} &lt;br /&gt;
Заметим, что в последовательности-впадине две наименьших вершины всегда совместимы. Поэтому в алгоритме Хаффмана будут комбинироваться те же пары, что и в фазе &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; алгоритма Ху-Таккера. Для удобства введем две вершины алфавита &amp;lt;tex&amp;gt;w_{L}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;w_{R}&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;\infty&amp;lt;/tex&amp;gt;, расположенных соответственно в начале и в конце последовательности. Тогда последовательность весов &amp;lt;tex&amp;gt;w_{1} &amp;lt; w_{2} &amp;lt; ... &amp;lt; w_{t} &amp;gt; w_{t+1} &amp;gt; ... &amp;gt; w_{n}&amp;lt;/tex&amp;gt; можно рассматривать как последовательность состоящую из двух впадин: &amp;lt;tex&amp;gt;w_{L} &amp;gt; w_{1} &amp;lt; w_{2} &amp;lt; ... &amp;lt; w_{t} &amp;gt; w_{t+1} &amp;gt; ... &amp;gt; w_{n} &amp;lt; w_{R}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вершину &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; назовем горой между двумя впадинами.&lt;br /&gt;
&lt;br /&gt;
Из [[#lemma3|леммы 3]] следует, что можно образовать две отдельных [[Очередь | очереди]] {{---}} одну для каждой впадины. Из-за горы вершины из разных впадин не совместимы  между собой. Когда наименьшие новые вершины(полученные в результате слияния) во впадинах станут достаточно большими, гора будет наконец скомбинирована. С этого момента все новые вершины станут совместимыми. Получается слияние двух очередей. По существу, фаза &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; в алгоритме Ху-Таккера подобна слиянию нескольких очередей, а произвольную последовательность весов можно рассматривать как соединение нескольких впадин.&lt;br /&gt;
&lt;br /&gt;
Чтобы понять, почему последовательность уровней может быть соединена в алфавитное дерево на третьем шаге алгоритма, достаточно рассмотреть два случая: &lt;br /&gt;
*Комбинируются две вершины из одной впадины. &lt;br /&gt;
*Комбинируются две вершины &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; из разных впадин. Пусть при этом между &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; расположены новые вершины &amp;lt;tex&amp;gt;b,c,d&amp;lt;/tex&amp;gt; {{---}} каждая из них имеет двух сыновей, скажем, &amp;lt;tex&amp;gt;b1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b2&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;c1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;c2&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;d1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d2&amp;lt;/tex&amp;gt; {{---}} когда комбинируются &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;, мы в действительности создаем общего отца для &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b1&amp;lt;/tex&amp;gt;. После этого общего отца получают &amp;lt;tex&amp;gt;b2&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;c1&amp;lt;/tex&amp;gt;, затем &amp;lt;tex&amp;gt;c2&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d1&amp;lt;/tex&amp;gt;. Наконец, общего отца получают &amp;lt;tex&amp;gt;d2&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;
== Корректность алгоритма Ху-Таккера ==&lt;br /&gt;
&lt;br /&gt;
Как пишет Д. Кнут короткого доказательства алгоритма не известно, и вероятно оно никогда не будет найдено. Для доказательства своего алгоритма Ху и Таккеру потребовалось &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; теоремы и &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; леммы (См. книгу Т.Ч.Ху и М.Т.Шинг Комбинаторные алгоритмы {{---}} стр.172).&lt;br /&gt;
&lt;br /&gt;
== Сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для реализации данного алгоритма потребуется &amp;lt;tex&amp;gt;O(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;(w_{l},w_{r})&amp;lt;/tex&amp;gt; является л.м.с.п, когда выполнены следующие условия &amp;lt;tex&amp;gt;w_{r}&amp;lt;w_{i}&amp;lt;/tex&amp;gt; для всех вершин &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совместимых с &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;w_{l} \leqslant w_{j}&amp;lt;/tex&amp;gt; для всех вершин &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; совместимых с &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt;. Также докажем следующую лемму:&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|about=1&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; {{---}} любая вершина в последовательности, состоящей из вершин алфавита и вершин, образованных в результате комбинации, &amp;lt;tex&amp;gt;w_{i}&amp;lt;/tex&amp;gt; {{---}} вес наименьшей вершины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, совместимой с &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;. Если в результате комбинирования некоторой л.м.с.п. какая-нибудь новая вершина &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; становится совместимой с &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;w_{i}&amp;lt;w_{d}&amp;lt;/tex&amp;gt;. В частности, в последовательности вершин будет оставаться л.м.с.п., пока комбинируются другие л.м.с.п. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Из этой леммы следует, что дерево, получаемое комбинированием л.м.с.п., не зависит от того, в каком порядке они комбинируются. &lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим произвольную вершину &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и предположим, что вес наименьшей вершины, совместимой с &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, равен &amp;lt;tex&amp;gt;w_{i}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть комбинируется л.м.с.п. &amp;lt;tex&amp;gt;(b, c)&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&amp;lt;/tex&amp;gt; нет вершин алфавита и хотя бы одна из &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt; должна быть вершиной алфавита, иначе при слиянии &amp;lt;tex&amp;gt;(b, c)&amp;lt;/tex&amp;gt; не появилось бы новых вершин (кроме &amp;lt;tex&amp;gt;bc&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;w_{i}&amp;lt;/tex&amp;gt; может находиться в любой стороне от &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;. Если вершина &amp;lt;tex&amp;gt;w_{i}&amp;lt;/tex&amp;gt; лежит справа от &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, то она не вершина алфавита. Пусть &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; {{---}} вершина, которая становится совместимой с &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; после слияния &amp;lt;tex&amp;gt;(b, c)&amp;lt;/tex&amp;gt; (она может быть как алфавитной так и слитой). Тогда &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; должна быть совместима с &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt; в исходной последовательности и в силу локальной минимальности пары &amp;lt;tex&amp;gt;(b, c)&amp;lt;/tex&amp;gt; имеем &amp;lt;tex&amp;gt;w_{b} \leqslant w_{d}&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Но &amp;lt;tex&amp;gt;w_{i}&amp;lt;w_{b}&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;w_{i}&amp;lt;/tex&amp;gt; является наименьшим совместимым с &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; весом. Поэтому &amp;lt;tex&amp;gt;w_{i} \leqslant w_{b} \leqslant w_{d}&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Мы доказали, что вес наименьшей вершины, совместимой с любой вершиной, не может уменьшиться. Отсюда следует, что любая л.м.с.п. &amp;lt;tex&amp;gt;(x, y)&amp;lt;/tex&amp;gt; останется л.м.с.п. после слияния другой л.м.с.п., потому что &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; останется наименьшей вершиной, совместимой с &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;, и наоборот.&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теперь согласно этой лемме нам не придется искать минимально совместимую пару, что весьма долго. Достаточно лишь находить л.м.с.п., при этом не важно, в каком порядке комбинировать л.м.с.п. По этому нам необходимо иметь массив размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, из которого мы будем удалять л.м.с.п и создавать новую вершину. На нем легко будет осуществлять поиск л.м.с.п. А так же необходим массив размера &amp;lt;tex&amp;gt;2n&amp;lt;/tex&amp;gt; для реализации следующего шага, хранящий дерево. Второй шаг легко осуществить проходом по дереву, имея сохраненное дерево. Третий шаг, реализованный стековым алгоритмом, работает за &amp;lt;tex&amp;gt;2n&amp;lt;/tex&amp;gt; времени и требует &amp;lt;tex&amp;gt;4n&amp;lt;/tex&amp;gt; памяти &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; на стек, &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; на хранения уровней вершин и &amp;lt;tex&amp;gt;2n&amp;lt;/tex&amp;gt; на хранение итогового дерева. Итак, общая оценка как раз получается &amp;lt;tex&amp;gt;O(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;
== Смотри также ==&lt;br /&gt;
* [[Алгоритм Хаффмана]]&lt;br /&gt;
* [[Избыточное кодирование, код Хэмминга]]&lt;br /&gt;
* [[Стек]]&lt;br /&gt;
* [[Очередь]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* ''Т.Ч.Ху, М.Т.Шинг'' Комбинаторные алгоритмы. — стр. 166. — ISBN 5-85746-761-6 &lt;br /&gt;
* ''Дональд Кнут'' Искусство программирования, том 3. Сортировка и поиск — 2-е изд. — М.: «Вильямс», 2007. — 824 с. — ISBN 5-8459-0082-4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы сжатия ]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BF%D0%B5%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%8B_%D0%9A%D0%9D%D0%A4&amp;diff=51523</id>
		<title>Специальные формы КНФ</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BF%D0%B5%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%8B_%D0%9A%D0%9D%D0%A4&amp;diff=51523"/>
				<updated>2016-01-20T07:13:59Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Рассмотрим две формы, с помощью которых можно представить формулы, заданные в [[Определение булевой функции#Представление булевых функций|конъюнктивной нормальной форме]], то есть имеющей вид конъюнкции выражений в скобках, каждое из которых представляет собой дизъюнкцию одного или нескольких литералов. Эти две формы интересны тем, что для них существует алгоритм, который может за полиномиальное время проверить, существует ли набор аргументов, на которых данная функция будет принимать значение &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, в то время, как для обычной функции, не представленной данной формой, эта задача является [[Примеры NP-полных языков. Теорема Кука|NP-полной]]. &lt;br /&gt;
&lt;br /&gt;
== КНФ в форме Крома ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Конъюнктивная нормальная форма (КНФ) в форме Крома (2-КНФ)''' (англ. ''2-CNF'') {{---}} это конъюнкция выражений в скобках, каждое из которых представляет собой дизъюнкцию нескольких литералов, количество которых не превышает двух.}}&lt;br /&gt;
&lt;br /&gt;
'''Пример :'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(x_1\vee\overline x_2)  \wedge (\overline x_1 \vee x_3 ) \wedge (\overline x_3 \vee x_2 ) \wedge (\overline x_1 \vee \overline x_2) \wedge...  &amp;lt;/tex&amp;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;
&lt;br /&gt;
*Функцию &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; можно задать в форме Крома &amp;lt;tex&amp;gt; \iff &amp;lt;/tex&amp;gt; выполнено следующее следствие: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; F(x_1, ..., x_n)=F(y_1, ..., y_n)=F(z_1, ..., z_n)=1 \Rightarrow&amp;lt;/tex&amp;gt;  &amp;lt;tex&amp;gt;F(\langle x_1, y_1, z_1 \rangle, \langle x_2, y_2, z_2 \rangle, ..., \langle x_n, y_n, z_n \rangle)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= КНФ в форме Хорна =&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Конъюнктивная нормальная форма (КНФ)в форме Хорна''' (англ. ''Horn clause'')  {{---}} это конъюнкция выражений в скобках, каждое из которых представляет собой дизъюнкцию литералов, в которой присутствует не более одного литерала без отрицания.}}&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; (\overline x_1 \vee \overline x_2 \vee ... \vee \overline x_n ) \wedge (x_1  \vee \overline x_2  \vee ... \vee \overline x_n)\wedge ...&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждая скобка представляет собой Дизъюнкт Хорна&amp;lt;ref&amp;gt;[https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D0%B7%D1%8A%D1%8E%D0%BD%D0%BA%D1%82_%D0%A5%D0%BE%D1%80%D0%BD%D0%B0 {{---}} Дизъюнкт Хорна]&amp;lt;/ref&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;F&amp;lt;/tex&amp;gt; можно задать в форме Хорна &amp;lt;tex&amp;gt;  \iff &amp;lt;/tex&amp;gt; выполнено следующее следствие:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; F(x_1, ..., x_n)=F(y_1, ..., y_n)=1  \Rightarrow  F(x_1 \wedge y_1, x_2  \wedge  y_2, ..., x_n \wedge y_n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== См.также ==&lt;br /&gt;
* [[СКНФ]]&lt;br /&gt;
* [[2SAT]]&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Horn_clause| Wikipedia {{---}} Horn clause]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/2-satisfiability| Wikipedia {{---}} 2-satisfiability]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Булевы функции ]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BF%D0%B5%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%8B_%D0%9A%D0%9D%D0%A4&amp;diff=51522</id>
		<title>Специальные формы КНФ</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BF%D0%B5%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%8B_%D0%9A%D0%9D%D0%A4&amp;diff=51522"/>
				<updated>2016-01-20T07:10:08Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Рассмотрим две формы, с помощью которых можно представить формулы, заданные в [[Определение булевой функции#Представление булевых функций|конъюнктивной нормальной форме]], то есть имеющей вид конъюнкции выражений в скобках, каждое из которых представляет собой дизъюнкцию одного или нескольких литералов. Эти две формы интересны тем, что для них существует алгоритм, который может за полиномиальное время проверить, существует ли набор аргументов, на которых данная функция будет принимать значение &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, в то время, как для обычной функции, не представленной данной формой, эта задача является [[Примеры NP-полных языков. Теорема Кука|NP-полной]]. &lt;br /&gt;
&lt;br /&gt;
== КНФ в форме Крома ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Конъюнктивная нормальная форма (КНФ) в форме Крома (2-КНФ)''' (англ. ''2-SAT'') {{---}} это конъюнкция выражений в скобках, каждое из которых представляет собой дизъюнкцию нескольких литералов, количество которых не превышает двух.}}&lt;br /&gt;
&lt;br /&gt;
'''Пример :'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(x_1\vee\overline x_2)  \wedge (\overline x_1 \vee x_3 ) \wedge (\overline x_3 \vee x_2 ) \wedge (\overline x_1 \vee \overline x_2) \wedge...  &amp;lt;/tex&amp;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;
&lt;br /&gt;
*Функцию &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; можно задать в форме Крома &amp;lt;tex&amp;gt; \iff &amp;lt;/tex&amp;gt; выполнено следующее следствие: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; F(x_1, ..., x_n)=F(y_1, ..., y_n)=F(z_1, ..., z_n)=1 \Rightarrow&amp;lt;/tex&amp;gt;  &amp;lt;tex&amp;gt;F(\langle x_1, y_1, z_1 \rangle, \langle x_2, y_2, z_2 \rangle, ..., \langle x_n, y_n, z_n \rangle)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= КНФ в форме Хорна =&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Конъюнктивная нормальная форма (КНФ)в форме Хорна''' (англ. ''Horn clause'')  {{---}} это конъюнкция выражений в скобках, каждое из которых представляет собой дизъюнкцию литералов, в которой присутствует не более одного литерала без отрицания.}}&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; (\overline x_1 \vee \overline x_2 \vee ... \vee \overline x_n ) \wedge (x_1  \vee \overline x_2  \vee ... \vee \overline x_n)\wedge ...&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждая скобка представляет собой Дизъюнкт Хорна&amp;lt;ref&amp;gt;[https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D0%B7%D1%8A%D1%8E%D0%BD%D0%BA%D1%82_%D0%A5%D0%BE%D1%80%D0%BD%D0%B0 {{---}} Дизъюнкт Хорна]&amp;lt;/ref&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;F&amp;lt;/tex&amp;gt; можно задать в форме Хорна &amp;lt;tex&amp;gt;  \iff &amp;lt;/tex&amp;gt; выполнено следующее следствие:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; F(x_1, ..., x_n)=F(y_1, ..., y_n)=1  \Rightarrow  F(x_1 \wedge y_1, x_2  \wedge  y_2, ..., x_n \wedge y_n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== См.также ==&lt;br /&gt;
* [[СКНФ]]&lt;br /&gt;
* [[2SAT]]&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Horn_clause| Wikipedia {{---}} Horn clause]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/2-satisfiability| Wikipedia {{---}} 2-satisfiability]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Булевы функции ]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A7%D0%B8%D1%81%D0%BB%D0%B0_%D0%AD%D0%B9%D0%BB%D0%B5%D1%80%D0%B0_I_%D0%B8_II_%D1%80%D0%BE%D0%B4%D0%B0&amp;diff=51520</id>
		<title>Числа Эйлера I и II рода</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A7%D0%B8%D1%81%D0%BB%D0%B0_%D0%AD%D0%B9%D0%BB%D0%B5%D1%80%D0%B0_I_%D0%B8_II_%D1%80%D0%BE%D0%B4%D0%B0&amp;diff=51520"/>
				<updated>2016-01-19T20:18:29Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Числа Эйлера I рода==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; — соседние элементы некоторой перестановки порядка &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; причем &amp;lt;tex&amp;gt;a &amp;lt; b&amp;lt;/tex&amp;gt;. Тогда пара &amp;lt;tex&amp;gt;(a, b)&amp;lt;/tex&amp;gt; называется '''подъемом''' (англ. ''ascent'') данной перестановки.&lt;br /&gt;
}}&lt;br /&gt;
'''''Числа Эйлера I рода''''' (англ. ''Eulerian numbers'') — количество [[Комбинаторные объекты|перестановок]] чисел от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; таких, что в каждой из них существует ровно &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; подъемов. Числа Эйлера I рода обозначают как &amp;lt;tex dpi=190&amp;gt;\langle{n\atop m}\rangle &amp;lt;/tex&amp;gt; или же &amp;lt;tex&amp;gt;A(n, m)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вывод рекуррентной формулы===&lt;br /&gt;
Пусть у нас есть некая перестановка &amp;lt;tex&amp;gt; \pi = \pi_1, \pi_2\ldots \pi_{n-1} &amp;lt;/tex&amp;gt;. Тогда операцией вставки элемента с номером &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; в какую-либо из позиций мы получим &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; перестановок вида &amp;lt;tex&amp;gt;\theta = \theta_1, \theta_2\ldots \theta_p, n, \theta_q\ldots \theta_{n-1}&amp;lt;/tex&amp;gt;. Далее рассмотрим два случая:&lt;br /&gt;
&lt;br /&gt;
# Количество подъемов в перестановке &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt; равно количеству подъемов в &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;. Этого можно добиться, вставляя элемент &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; на самое первое место в &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt; (всего &amp;lt;tex dpi=190&amp;gt;\langle{n\atop m}\rangle &amp;lt;/tex&amp;gt; возможностей) или перед последним последним элементом каждого подъема (еще &amp;lt;tex&amp;gt;m \times &amp;lt;/tex&amp;gt;&amp;lt;tex dpi=190&amp;gt; \langle{n\atop m}\rangle &amp;lt;/tex&amp;gt; раз).&lt;br /&gt;
# Количество подъемов в новой перестановке на один больше предыдущего количества. Этого эффекта добиваемся вставкой элемента &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; во все места, не подходящие по критерию первого пункта. Таких вставок, как не трудно догадаться, можно совершить &amp;lt;tex&amp;gt;(n - m)&amp;lt;/tex&amp;gt;&amp;lt;tex dpi=190&amp;gt;\langle{n\atop m}\rangle&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда рекуррентная формула имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex dpi=190&amp;gt;\left\langle{n\atop m}\right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; = (m + 1)&amp;lt;/tex&amp;gt; &amp;lt;tex dpi=190&amp;gt;\left\langle{n - 1\atop m}\right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; + (n - m)&amp;lt;/tex&amp;gt; &amp;lt;tex dpi=180&amp;gt;\left\langle{n - 1\atop m - 1}\right\rangle&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примем также следующее начальное значение:&lt;br /&gt;
:&amp;lt;tex dpi=190&amp;gt;\left\langle{0\atop m}\right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; = [m = 0]&amp;lt;/tex&amp;gt;&amp;lt;ref&amp;gt;http://ru.wikipedia.org/wiki/%D0%9D%D0%BE%D1%82%D0%B0%D1%86%D0%B8%D1%8F_%D0%90%D0%B9%D0%B2%D0%B5%D1%80%D1%81%D0%BE%D0%BD%D0%B0 нотация Айверсона&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Пример===&lt;br /&gt;
Рассмотрим все перестановки порядка &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;, в которых есть ровно &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; подъема (в квадратных скобках один или больше подъемов подряд):&lt;br /&gt;
:&amp;lt;tex dpi=190&amp;gt; \left\langle{4\atop 2}\right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; = 11:&lt;br /&gt;
[124]3,&lt;br /&gt;
[13][24],&lt;br /&gt;
[134]2,&lt;br /&gt;
[14][23],&lt;br /&gt;
2[134],&lt;br /&gt;
[23][14],&lt;br /&gt;
[23][41],&lt;br /&gt;
[24][13],&lt;br /&gt;
3[124],&lt;br /&gt;
[34][12],&lt;br /&gt;
4[123],&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Согласно алгоритму вывода рекуррентной формулы мы можем добавить &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; в следующие позиции всех перестановок порядка &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; с двумя подъемами, не увеличив количество подъемов:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex dpi=190&amp;gt;&lt;br /&gt;
\left\langle{3\atop 2}\right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; = 1:&lt;br /&gt;
[123] \Rightarrow  (4)[123], [1(4)][23], [12(4)]3&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее рассмотрим все перестановки порядка &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; с одним подъемом, причем операцией вставки &amp;lt;tex&amp;gt;4&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 dpi=190&amp;gt; \left\langle{3\atop 1}\right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; = 4:&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;[13]2 \Rightarrow  [13(4)]2, [13][2(4)];&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;2[13] \Rightarrow [2(4)][13], 2[13(4)];&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;[23]1 \Rightarrow [23(4)]1, [23][1(4)];&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;3[12] \Rightarrow [3(4)][12], 3[12(4)];&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом мы убеждаемся в верности формулы:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex dpi=190&amp;gt; \left\langle{4\atop 2}\right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; = (2 + 1)&amp;lt;/tex&amp;gt; &amp;lt;tex dpi=190&amp;gt;\left\langle{3\atop 2}\right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; + (4 - 2)&amp;lt;/tex&amp;gt; &amp;lt;tex dpi=190&amp;gt;\left\langle{3\atop 1}\right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;  = 11;&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Треугольник чисел Эйлера I рода===&lt;br /&gt;
На значениях &amp;lt;tex&amp;gt;n = m&amp;lt;/tex&amp;gt; чисел Эйлера I рода можно построить массив &amp;lt;tex&amp;gt;n \times m&amp;lt;/tex&amp;gt;, нижнедиагональная часть которого названа треугольником чисел Эйлера I рода.&lt;br /&gt;
&lt;br /&gt;
::{| class=&amp;quot;number_triangle&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; |&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''m = 0'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''1'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''2'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''3'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''4'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''5'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''6'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''7'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''8'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''9'''''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''n = 0'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''1'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''2'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''3'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''4'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''4'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''11'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''11'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''5'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''26'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''66'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''26'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''6'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''57'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''302'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''302'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''57'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''7'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''120'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1191'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''2416'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1191'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''120'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''8'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''247'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''4293'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''15619'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''15619'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''4293'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''247'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''9'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''502'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''14608'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''88234'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''156190'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''88234'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''14608'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''502'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Явные формулы===&lt;br /&gt;
:&amp;lt;tex dpi=190&amp;gt;\left\langle{n\atop m}\right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; = \sum\limits_{j=1}^{m+1} (-1)^{m-j+1} {n+1\choose m-j+1}j^{n}&amp;lt;/tex&amp;gt;&lt;br /&gt;
:&amp;lt;tex  dpi=190&amp;gt;\left\langle{n\atop m}\right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; = \sum\limits_{j=0}^{m}(-1)^j {n+1\choose j} (m+1-j)^n&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Связь чисел Эйлера I рода с сечениями гиперкубов===&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Число &amp;lt;tex&amp;gt;\dfrac{1}{n!}&amp;lt;/tex&amp;gt; &amp;lt;tex dpi=190&amp;gt;\left\langle{n\atop m}\right\rangle&amp;lt;/tex&amp;gt; выражает объем части &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;-мерного единичного гиперкуба, ограниченного гиперплоскостями &amp;lt;tex&amp;gt;x_1+x_2+\dots+x_n=m&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x_1+x_2+\dots+x_n=m-1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Для доказательства этого факта нам потребуется следующая теорема: &lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=Об объемах сечений &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;-мерных гиперкубов полупространствами&lt;br /&gt;
|statement=&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;w \in \mathbb{R}&amp;lt;/tex&amp;gt; — вектор с ненулевыми компонентами (&amp;lt;tex&amp;gt;w = {w_1, w_2 \ldots w_n}&amp;lt;/tex&amp;gt;), а &amp;lt;tex&amp;gt;z \in \mathbb{R}_+&amp;lt;/tex&amp;gt;. Тогда верно следующее равенство:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{Vol}_{n}(G^n_{w,z} \cap I^{n}) = \dfrac{1}{n! \prod\limits_{i=1}^{n}w_i} \sum\limits_{K \subseteq [n]} (-1)^{|K|}(z-w \cdot 1_K)^n_+&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;G_{w, z}^{n} := \{x \in \mathbb{R}^{n} : (w \cdot x) \leqslant z \}&amp;lt;/tex&amp;gt; — полупространство;&lt;br /&gt;
*&amp;lt;tex&amp;gt;I^n := [0,1]^n&amp;lt;/tex&amp;gt;;&lt;br /&gt;
*&amp;lt;tex&amp;gt;[n] := \{1,2\ldots n\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
*&amp;lt;tex&amp;gt;1_K&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; — подмножество &amp;lt;tex&amp;gt;\{1,2\ldots n\}&amp;lt;/tex&amp;gt;, {{---}} вектор, где значения координат с номерами, входящими в &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;, равны &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, а остальные {{---}} нули; &lt;br /&gt;
*Для &amp;lt;tex&amp;gt;r \in \mathbb{R}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;n \in \mathbb{N}&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;r^n_+ := (\max{\{r, 0\}})^n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=С доказательством можно ознакомиться по ссылке &amp;lt;ref&amp;gt;http://arxiv.org/pdf/math/0607715.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
[[Файл:HypercubeEuler2_2.png|200px|thumb|m = 2, n = 1. V = 1/2]]&lt;br /&gt;
[[Файл:HypercubeEuler3.png|200px|thumb|m = 3, n = 2. V = 1/6]]&lt;br /&gt;
Рассмотрим пересечение гиперкуба полупространством &amp;lt;tex&amp;gt;G^n_{1_{[n]},m}&amp;lt;/tex&amp;gt;. Вектор &amp;lt;tex&amp;gt;1_{[n]}&amp;lt;/tex&amp;gt; (все координаты которого равны единицы) появляется здесь ввиду того, как мы определили в формулировке секущие гиперплоскости (&amp;lt;tex&amp;gt;x_1+x_2+\ldots +x_n = m | m+1&amp;lt;/tex&amp;gt;) {{---}} это вектор нормали к &amp;lt;tex&amp;gt;\mathrm{G}&amp;lt;/tex&amp;gt;. Очевидно, что при данном значении вектора произведение &amp;lt;tex&amp;gt;\prod\limits_{i=1}^{n}w_i&amp;lt;/tex&amp;gt; равно единице (вектор &amp;lt;tex&amp;gt;w_i&amp;lt;/tex&amp;gt; тут {{---}} единичный вектор &amp;lt;tex&amp;gt;1_{[n]}&amp;lt;/tex&amp;gt;, то есть рассматривается произведение всех его координат {{---}} единиц). Рассмотрим выражение, стоящее под знаком суммы. При итерации по подмножествам &amp;lt;tex&amp;gt;[n]&amp;lt;/tex&amp;gt; равной мощности будут получаться одинаковые слагаемые, так как выражение &amp;lt;tex&amp;gt;(-1)^{|K|}(z-w \cdot 1_K)^n_+&amp;lt;/tex&amp;gt; зависит лишь от мощности итерируемого в сумме подмножества &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; {{---}} скалярное произведение &amp;lt;tex&amp;gt;w \cdot 1_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;. Заменим итератор суммы значением мощности множества &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;. Также ограничим верхний индекс суммирования значением  &amp;lt;tex&amp;gt;m+1&amp;lt;/tex&amp;gt;, так как при больших значениях &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; слагаемое будет обращаться в ноль (&amp;lt;tex&amp;gt;r^n_+&amp;lt;/tex&amp;gt;). Отсюда имеем &amp;lt;tex&amp;gt;{n \choose j}&amp;lt;/tex&amp;gt; таких одинаковых слагаемых, где &amp;lt;tex&amp;gt;j = |K|&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Тогда перейдем от первоначальной формулировки теоремы к следующей:&lt;br /&gt;
:&amp;lt;tex&amp;gt;\mathrm{Vol}_{n}(G^n_{1_{[n]},m} \cap I^{n}) = \dfrac{1}{n!}\sum\limits_{j = 0}^{m + 1} (-1)^{j}{n \choose j}(m-j)^n&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;tex&amp;gt;W_n^m&amp;lt;/tex&amp;gt; — фигура, образованная сечением гиперкуба &amp;lt;tex&amp;gt;[0,1]^{n}&amp;lt;/tex&amp;gt; плоскостями &amp;lt;tex&amp;gt;\sum\limits_{i=1}^{n} x_{i} = m&amp;lt;/tex&amp;gt;  и &amp;lt;tex&amp;gt;\sum\limits_{i=1}^{n} x_{i} = m+1&amp;lt;/tex&amp;gt;. &lt;br /&gt;
:&amp;lt;tex&amp;gt;W_n^m := \{ x \in \mathbb{R} : m \leqslant x \cdot 1_{[n]} \leqslant m+1 \} \cap I^{n}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда перейдем к следующему равенству:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\mathrm{Vol}_{n}(W_n^m) = \mathrm{Vol}_n(G_{1_{[n]},m+1}^{n} \cap I^n) - \mathrm{Vol}_n(G_{1_{[n]},m}^{n} \cap I^n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
:&amp;lt;tex&amp;gt;= \dfrac{1}{n!}[\sum\limits_{j=0}^{m+1}(-1)^{j}{n \choose j}(m+1-j)^{n} - \sum\limits_{j=0}^{m}(-1)^{j}{n \choose j}(m-j)^{n}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
:&amp;lt;tex&amp;gt; = \dfrac{1}{n!}\sum\limits_{j=0}^{m+1}(-1)^j{n+1 \choose j}(m+1-j)^n&amp;lt;/tex&amp;gt; &lt;br /&gt;
:&amp;lt;tex&amp;gt; = \dfrac{1}{n!}\sum\limits_{j=0}^{m}(-1)^j{n+1 \choose j}(m+1-j)^n&amp;lt;/tex&amp;gt;   (элемент суммы с номером &amp;lt;tex&amp;gt;j=m+1&amp;lt;/tex&amp;gt; обращается в ноль)&lt;br /&gt;
:&amp;lt;tex&amp;gt; = &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\dfrac{1}{n!}&amp;lt;/tex&amp;gt; &amp;lt;tex dpi=190&amp;gt;\left\langle{n\atop m}\right\rangle&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 dpi=190&amp;gt;\left\langle{n\atop m}\right\rangle = \left\langle{n\atop (n-1) - k}\right\rangle&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;,\ n \geqslant 1,\ 0 \leqslant k \leqslant n-1. \, &amp;lt;/tex&amp;gt;&lt;br /&gt;
# Сумма всех значений каждого ряда равна &amp;lt;tex&amp;gt; n! &amp;lt;/tex&amp;gt;:&lt;br /&gt;
#:&amp;lt;tex&amp;gt;\sum\limits_{m=0}^{n}&amp;lt;/tex&amp;gt;&amp;lt;tex dpi=190&amp;gt; \left\langle{n\atop m}\right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; = n!,\ n \geqslant 0, \,&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Связь чисел Эйлера I рода с числом сочетаний:&lt;br /&gt;
#:&amp;lt;tex&amp;gt;\sum\limits_{m=0}^n (-1)^m &amp;lt;/tex&amp;gt;&amp;lt;tex dpi=190&amp;gt;{\left\langle{n\atop m}\right\rangle}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;{n-1\choose m}^{-1}=0.&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Вероятность того, что сумма &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; независимых равномерно распределённых в отрезке &amp;lt;tex&amp;gt;[0,1]&amp;lt;/tex&amp;gt; переменных лежит между &amp;lt;tex&amp;gt;m-1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; равна &amp;lt;tex&amp;gt;\dfrac{1}{n!}\left\langle{n\atop m}\right\rangle&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Числа Эйлера II рода==&lt;br /&gt;
'''''Числа Эйлера II рода''''' (англ. ''Eulerian numbers of the second kind'')  — количество перестановок мультимножества от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вида &amp;lt;tex&amp;gt;\{1,1,2,2\ldots n,n\}&amp;lt;/tex&amp;gt;, обладающих свойством &amp;quot;все элементы перестановки, встречающиеся между двумя вхождниями &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt;, больше, чем &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt;&amp;quot;, таких, что в каждой из них существует ровно &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; подъемов. Числа Эйлера II рода обозначаются как &amp;lt;tex dpi = &amp;quot;190&amp;quot;&amp;gt; \scriptstyle \left\langle \!\! \left\langle {n \atop m} \right\rangle \!\! \right\rangle &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; n = 3&amp;lt;/tex&amp;gt;. Тогда существует &amp;lt;tex&amp;gt;15&amp;lt;/tex&amp;gt; перестановок такого вида, среди которых одна не имеет подъемов, &amp;lt;tex&amp;gt;8&amp;lt;/tex&amp;gt; штук имеют всего &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; подъем, и &amp;lt;tex&amp;gt;6&amp;lt;/tex&amp;gt; перестановок имеют &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; подъема:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; 332211,\; &amp;lt;/tex&amp;gt;&lt;br /&gt;
:&amp;lt;tex&amp;gt; 221[13]3,\; 22[13]31,\; 2[23]311,\; [23]3211,\; 1[13]322,\; [13]3221,\; 331[12]2,\; 33[12]21, &amp;lt;/tex&amp;gt;&lt;br /&gt;
:&amp;lt;tex&amp;gt;1[12][23]3,\; [12]2[13]3,\; 1[123]32,\; [123]321,\; [13]3[12]2,\; [12][23]31. &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Количество перестановок мультимножества &amp;lt;tex&amp;gt;\{1,1,2,2\ldots n,n\}&amp;lt;/tex&amp;gt; со свойством &amp;quot;все элементы перестановки, встречающиеся между двумя вхождниями &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt;, больше, чем&lt;br /&gt;
&amp;lt;tex dpi=&amp;quot;130&amp;quot;&amp;gt;z&amp;lt;/tex&amp;gt;&amp;quot; равно двойному факториалу &amp;lt;tex dpi=&amp;quot;130&amp;quot;&amp;gt;(2n-1)!!&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof = Докажем лемму методом математической индукции. &lt;br /&gt;
*'''База'''. Для &amp;lt;tex&amp;gt;n=1&amp;lt;/tex&amp;gt; очевидно, что существует только одна такая перестановка.&lt;br /&gt;
*'''Переход'''.  Рассмотрим какую-нибудь перестановку длины &amp;lt;tex&amp;gt;2n&amp;lt;/tex&amp;gt;. Таких перестановок &amp;lt;tex&amp;gt;(2n-1)!!&amp;lt;/tex&amp;gt;. Теперь докажем, что перестановок длины &amp;lt;tex&amp;gt;2(n+1)&amp;lt;/tex&amp;gt; будет &amp;lt;tex&amp;gt;(2(n+1)-1)!!&amp;lt;/tex&amp;gt;. Попробуем вставить два числа &amp;lt;tex&amp;gt;n + 1&amp;lt;/tex&amp;gt;. Очевидно, что их нельзя вставить не на соседние места, так как в таком случае между ними точно будут меньшие элементы. Но их можно вставить в любые два соседних места, так как они больше всех чисел в перестановке, а значит они не нарушат свойства для других элементов. Таким образом два новых элемента можно вставить в &amp;lt;tex&amp;gt;2n+1&amp;lt;/tex&amp;gt; место. В итоге перестановок длины &amp;lt;tex&amp;gt;2(n+1)&amp;lt;/tex&amp;gt; будет &amp;lt;tex&amp;gt;(2n-1)!!\cdot (2n+1)=(2n+1)!!=(2(n+1)-1)!!&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Рекуррентная формула===&lt;br /&gt;
Числа Эйлера II рода можно выразить рекурсивно следующим образом:&lt;br /&gt;
:&amp;lt;tex dpi=190&amp;gt; \left\langle \!\! \left\langle {n \atop m} \right\rangle \!\! \right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; = (2n-m-1) &amp;lt;/tex&amp;gt; &amp;lt;tex dpi=180&amp;gt;\left\langle \!\! \left\langle {n-1 \atop m-1} \right\rangle \!\! \right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; + (m+1) &amp;lt;/tex&amp;gt; &amp;lt;tex dpi=190&amp;gt;\left\langle \!\! \left\langle {n-1 \atop m} \right\rangle \!\! \right\rangle, &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С начальным условием для &amp;lt;tex&amp;gt;n = 0&amp;lt;/tex&amp;gt;:&lt;br /&gt;
:&amp;lt;tex dpi=190&amp;gt; \left\langle \!\! \left\langle {0 \atop m} \right\rangle \!\! \right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; = [m=0]. &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Треугольник чисел Эйлера II рода===&lt;br /&gt;
Значения чисел Эйлера II рода для &amp;lt;tex&amp;gt;0 \leqslant n \leqslant m \leqslant 9&amp;lt;/tex&amp;gt; представлены в данном массиве. Нижнедиагональная его часть называется треугольником чисел Эйлера II рода.&lt;br /&gt;
&lt;br /&gt;
:::{| class=&amp;quot;number_triangle&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; |&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''m = 0'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''1'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''2'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''3'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''4'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''5'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''6'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''7'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''8'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''9'''''&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''n = 0'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''1'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''2'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''2'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''3'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''8'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''6'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''4'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''22'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''58'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''24'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''5'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''52'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''328'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''444'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''120'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''6'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''114'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1452'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''4400'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''3708'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''720'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''7'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''240'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''5610'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''32120'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''58140'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''33984'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''5040'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''8'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''494'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''19950'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''195800'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''644020'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''785304'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''341136'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''40320'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''9'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1004'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''67260'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1062500'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''5765500'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''12440064'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''11026296'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''3733920'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''362880'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Eulerian_number Eulerian number — Wikipedia]&lt;br /&gt;
*[http://oeis.org/wiki/Eulerian_numbers Треугольник чисел Эйлера I рода — OEIS Wiki]&lt;br /&gt;
*[http://www.mathpages.com/home/kmath012/kmath012.htm Eulerian number — Math Pages]&lt;br /&gt;
*[http://mathworld.wolfram.com/EulerianNumber.html Числа Эйлера — Wolfram Mathworld]&lt;br /&gt;
*[http://www-personal.umich.edu/~mconger/andkpaper.pdf A Refinement of the Eulerian numbers]&lt;br /&gt;
*[http://arxiv.org/pdf/math/0607715.pdf Доказательство свойства о взаимосвязи чисел Эйлера I рода и объема сечений гиперкуба] &lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Комбинаторика ]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A7%D0%B8%D1%81%D0%BB%D0%B0_%D0%AD%D0%B9%D0%BB%D0%B5%D1%80%D0%B0_I_%D0%B8_II_%D1%80%D0%BE%D0%B4%D0%B0&amp;diff=51519</id>
		<title>Числа Эйлера I и II рода</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A7%D0%B8%D1%81%D0%BB%D0%B0_%D0%AD%D0%B9%D0%BB%D0%B5%D1%80%D0%B0_I_%D0%B8_II_%D1%80%D0%BE%D0%B4%D0%B0&amp;diff=51519"/>
				<updated>2016-01-19T19:43:24Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: Добавлено доказательство леммы. Внесены мелкие поправки.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Числа Эйлера I рода==&lt;br /&gt;
'''''Числа Эйлера I рода''''' (англ. ''Eulerian numbers'') — количество [[Комбинаторные объекты|перестановок]] чисел от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; таких, что в каждой из них существует ровно &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; подъемов. Числа Эйлера I рода обозначают как &amp;lt;tex dpi=190&amp;gt;\langle{n\atop m}\rangle &amp;lt;/tex&amp;gt; или же &amp;lt;tex&amp;gt;A(n, m)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; — соседние элементы некоторой перестановки порядка &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; причем &amp;lt;tex&amp;gt;a &amp;lt; b&amp;lt;/tex&amp;gt;. Тогда пара &amp;lt;tex&amp;gt;(a, b)&amp;lt;/tex&amp;gt; называется '''подъемом''' (англ. ''ascent'') данной перестановки.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Вывод рекуррентной формулы===&lt;br /&gt;
Пусть у нас есть некая перестановка &amp;lt;tex&amp;gt; \pi = \pi_1, \pi_2...\pi_{n-1} &amp;lt;/tex&amp;gt;. Тогда операцией вставки элемента с номером &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; в какую-либо из позиций мы получим &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; перестановок вида &amp;lt;tex&amp;gt;\theta = \theta_1, \theta_2...\theta_p, n, \theta_q...\theta_{n-1}&amp;lt;/tex&amp;gt;. Далее рассмотрим два случая:&lt;br /&gt;
&lt;br /&gt;
# Количество подъемов в перестановке &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt; равно количеству подъемов в &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;. Этого можно добиться, вставляя элемент &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; на самое первое место в &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt; (всего &amp;lt;tex dpi=190&amp;gt;\langle{n\atop m}\rangle &amp;lt;/tex&amp;gt; возможностей) или перед последним последним элементом каждого подъема (еще &amp;lt;tex&amp;gt;m \times &amp;lt;/tex&amp;gt;&amp;lt;tex dpi=190&amp;gt; \langle{n\atop m}\rangle &amp;lt;/tex&amp;gt; раз).&lt;br /&gt;
# Количество подъемов в новой перестановке на один больше предыдущего количества. Этого эффекта добиваемся вставкой элемента &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; во все места, не подходящие по критерию первого пункта. Таких вставок, как не трудно догадаться, можно совершить &amp;lt;tex&amp;gt;(n - m)&amp;lt;/tex&amp;gt;&amp;lt;tex dpi=190&amp;gt;\langle{n\atop m}\rangle&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда рекуррентная формула имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex dpi=190&amp;gt;\left\langle{n\atop m}\right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; = (m + 1)&amp;lt;/tex&amp;gt; &amp;lt;tex dpi=190&amp;gt;\left\langle{n - 1\atop m}\right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; + (n - m)&amp;lt;/tex&amp;gt; &amp;lt;tex dpi=180&amp;gt;\left\langle{n - 1\atop m - 1}\right\rangle&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примем также следующее начальное значение:&lt;br /&gt;
:&amp;lt;tex dpi=190&amp;gt;\left\langle{0\atop m}\right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; = [m = 0]&amp;lt;/tex&amp;gt;&amp;lt;ref&amp;gt;http://ru.wikipedia.org/wiki/%D0%9D%D0%BE%D1%82%D0%B0%D1%86%D0%B8%D1%8F_%D0%90%D0%B9%D0%B2%D0%B5%D1%80%D1%81%D0%BE%D0%BD%D0%B0 нотация Айверсона&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Пример===&lt;br /&gt;
Рассмотрим все перестановки порядка &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;, в которых есть ровно &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; подъема (в квадратных скобках один или больше подъемов подряд):&lt;br /&gt;
:&amp;lt;tex dpi=190&amp;gt; \left\langle{4\atop 2}\right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; = 11:&lt;br /&gt;
[124]3,&lt;br /&gt;
[13][24],&lt;br /&gt;
[134]2,&lt;br /&gt;
[14][23],&lt;br /&gt;
2[134],&lt;br /&gt;
[23][14],&lt;br /&gt;
[23][41],&lt;br /&gt;
[24][13],&lt;br /&gt;
3[124],&lt;br /&gt;
[34][12],&lt;br /&gt;
4[123],&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Согласно алгоритму вывода рекуррентной формулы мы можем добавить &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; в следующие позиции всех перестановок порядка &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; с двумя подъемами, не увеличив количество подъемов:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex dpi=190&amp;gt;&lt;br /&gt;
\left\langle{3\atop 2}\right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; = 1:&lt;br /&gt;
[123] \Rightarrow  (4)[123], [1(4)][23], [12(4)]3&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее рассмотрим все перестановки порядка &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; с одним подъемом, причем операцией вставки &amp;lt;tex&amp;gt;4&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 dpi=190&amp;gt; \left\langle{3\atop 1}\right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; = 4:&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;[13]2 \Rightarrow  [13(4)]2, [13][2(4)];&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;2[13] \Rightarrow [2(4)][13], 2[13(4)];&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;[23]1 \Rightarrow [23(4)]1, [23][1(4)];&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;3[12] \Rightarrow [3(4)][12], 3[12(4)];&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом мы убеждаемся в верности формулы:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex dpi=190&amp;gt; \left\langle{4\atop 2}\right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; = (2 + 1)&amp;lt;/tex&amp;gt; &amp;lt;tex dpi=190&amp;gt;\left\langle{3\atop 2}\right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; + (4 - 2)&amp;lt;/tex&amp;gt; &amp;lt;tex dpi=190&amp;gt;\left\langle{3\atop 1}\right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;  = 11;&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Треугольник чисел Эйлера I рода===&lt;br /&gt;
На значениях &amp;lt;tex&amp;gt;n = m&amp;lt;/tex&amp;gt; чисел Эйлера I рода можно построить массив &amp;lt;tex&amp;gt;n \times m&amp;lt;/tex&amp;gt;, нижнедиагональная часть которого названа треугольником чисел Эйлера I рода.&lt;br /&gt;
&lt;br /&gt;
::{| class=&amp;quot;number_triangle&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; |&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''m = 0'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''1'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''2'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''3'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''4'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''5'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''6'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''7'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''8'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''9'''''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''n = 0'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''1'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''2'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''3'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''4'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''4'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''11'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''11'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''5'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''26'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''66'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''26'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''6'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''57'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''302'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''302'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''57'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''7'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''120'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1191'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''2416'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1191'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''120'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''8'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''247'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''4293'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''15619'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''15619'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''4293'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''247'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''9'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''502'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''14608'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''88234'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''156190'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''88234'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''14608'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''502'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Явные формулы===&lt;br /&gt;
:&amp;lt;tex dpi=190&amp;gt;\left\langle{n\atop m}\right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; = \sum\limits_{j=1}^{m+1} (-1)^{m-j+1} {n+1\choose m-j+1}j^{n}&amp;lt;/tex&amp;gt;&lt;br /&gt;
:&amp;lt;tex  dpi=190&amp;gt;\left\langle{n\atop m}\right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; = \sum\limits_{j=0}^{m}(-1)^j {n+1\choose j} (m+1-j)^n&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Связь чисел Эйлера I рода с сечениями гиперкубов===&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Число &amp;lt;tex dpi=190&amp;gt;\frac{1}{n!}\left\langle{n\atop m}\right\rangle&amp;lt;/tex&amp;gt; выражает объем части &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;-мерного единичного гиперкуба, ограниченного гиперплоскостями &amp;lt;tex&amp;gt;x_1+x_2+\dots+x_n=m&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x_1+x_2+\dots+x_n=m-1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
|proof=&lt;br /&gt;
Для доказательства этого факта нам потребуется следующая теорема: &lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=Об объемах сечений &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;-мерных гиперкубов полупространствами&lt;br /&gt;
|statement=&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;w \in \mathbb{R}&amp;lt;/tex&amp;gt; — вектор с ненулевыми компонентами (&amp;lt;tex&amp;gt;w = {w_1, w_2 ... w_n}&amp;lt;/tex&amp;gt;), а &amp;lt;tex&amp;gt;z \in \mathbb{R}_+&amp;lt;/tex&amp;gt;. Тогда верно следующее равенство:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex dpi = &amp;quot;140&amp;quot;&amp;gt;\mathrm{Vol}_{n}(G^n_{w,z} \cap I^{n}) = \frac{1}{n! \prod\limits_{i=1}^{n}w_i} \sum\limits_{K \subseteq [n]} (-1)^{|K|}(z-w \cdot 1_K)^n_+&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;G_{w, z}^{n} := \{x \in \mathbb{R}^{n} : (w \cdot x) \le z \}&amp;lt;/tex&amp;gt; — полупространство;&lt;br /&gt;
*&amp;lt;tex&amp;gt;I^n := [0,1]^n&amp;lt;/tex&amp;gt;;&lt;br /&gt;
*&amp;lt;tex&amp;gt;[n] := \{1,2...n\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
*&amp;lt;tex&amp;gt;1_K&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; — подмножество &amp;lt;tex&amp;gt;\{1,2...n\}&amp;lt;/tex&amp;gt;, {{---}} вектор, где значения координат с номерами, входящими в &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;, равны &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, а остальные {{---}} нули; &lt;br /&gt;
*Для &amp;lt;tex&amp;gt;r \in \mathbb{R}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;n \in \mathbb{N}&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;r^n_+ := (\max{\{r, 0\}})^n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
|proof=С доказательством можно ознакомиться по ссылке &amp;lt;ref&amp;gt;http://arxiv.org/pdf/math/0607715.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
[[Файл:HypercubeEuler2_2.png|200px|thumb|m = 2, n = 1. V = 1/2]]&lt;br /&gt;
[[Файл:HypercubeEuler3.png|200px|thumb|m = 3, n = 2. V = 1/6]]&lt;br /&gt;
Рассмотрим пересечение гиперкуба полупространством &amp;lt;tex&amp;gt;G^n_{1_{[n]},m}&amp;lt;/tex&amp;gt;. Вектор &amp;lt;tex&amp;gt;1_{[n]}&amp;lt;/tex&amp;gt; (все координаты которого равны единицы) появляется здесь ввиду того, как мы определили в формулировке секущие гиперплоскости (&amp;lt;tex&amp;gt;x_1+x_2+...+x_n = m | m+1&amp;lt;/tex&amp;gt;) {{---}} это вектор нормали к &amp;lt;tex&amp;gt;\mathrm{G}&amp;lt;/tex&amp;gt;. Очевидно, что при данном значении вектора произведение &amp;lt;tex&amp;gt;\prod\limits_{i=1}^{n}w_i&amp;lt;/tex&amp;gt; равно единице (вектор &amp;lt;tex&amp;gt;w_i&amp;lt;/tex&amp;gt; тут {{---}} единичный вектор &amp;lt;tex&amp;gt;1_{[n]}&amp;lt;/tex&amp;gt;, то есть рассматривается произведение всех его координат {{---}} единиц). Рассмотрим выражение, стоящее под знаком суммы. При итерации по подмножествам &amp;lt;tex&amp;gt;[n]&amp;lt;/tex&amp;gt; равной мощности будут получаться одинаковые слагаемые, так как выражение &amp;lt;tex&amp;gt;(-1)^{|K|}(z-w \cdot 1_K)^n_+&amp;lt;/tex&amp;gt; зависит лишь от мощности итерируемого в сумме подмножества &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; {{---}} скалярное произведение &amp;lt;tex&amp;gt;w \cdot 1_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;. Заменим итератор суммы значением мощности множества &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;. Также ограничим верхний индекс суммирования значением  &amp;lt;tex&amp;gt;m+1&amp;lt;/tex&amp;gt;, так как при больших значениях &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; слагаемое будет обращаться в ноль (&amp;lt;tex&amp;gt;r^n_+&amp;lt;/tex&amp;gt;). Отсюда имеем &amp;lt;tex&amp;gt;{n \choose j}&amp;lt;/tex&amp;gt; таких одинаковых слагаемых, где &amp;lt;tex&amp;gt;j = |K|&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Тогда перейдем от первоначальной формулировки теоремы к следующей:&lt;br /&gt;
:&amp;lt;tex&amp;gt;\mathrm{Vol}_{n}(G^n_{1_{[n]},m} \cap I^{n}) = \frac{1}{n!}\sum\limits_{j = 0}^{m + 1} (-1)^{j}{n \choose j}(m-j)^n&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;tex&amp;gt;W_n^m&amp;lt;/tex&amp;gt; — фигура, образованная сечением гиперкуба &amp;lt;tex&amp;gt;[0,1]^{n}&amp;lt;/tex&amp;gt; плоскостями &amp;lt;tex&amp;gt;\sum\limits_{i=1}^{n} x_{i} = m&amp;lt;/tex&amp;gt;  и &amp;lt;tex&amp;gt;\sum\limits_{i=1}^{n} x_{i} = m+1&amp;lt;/tex&amp;gt;. &lt;br /&gt;
:&amp;lt;tex&amp;gt;W_n^m := \{ x \in \mathbb{R} : m \le x \cdot 1_{[n]} \le m+1 \} \cap I^{n}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда перейдем к следующему равенству:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\mathrm{Vol}_{n}(W_n^m) = \mathrm{Vol}_n(G_{1_{[n]},m+1}^{n} \cap I^n) - \mathrm{Vol}_n(G_{1_{[n]},m}^{n} \cap I^n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
:&amp;lt;tex&amp;gt;= \frac{1}{n!}[\sum\limits_{j=0}^{m+1}(-1)^{j}{n \choose j}(m+1-j)^{n} - \sum\limits_{j=0}^{m}(-1)^{j}{n \choose j}(m-j)^{n}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
:&amp;lt;tex&amp;gt; = \frac{1}{n!}\sum\limits_{j=0}^{m+1}(-1)^j{n+1 \choose j}(m+1-j)^n&amp;lt;/tex&amp;gt; &lt;br /&gt;
:&amp;lt;tex&amp;gt; = \frac{1}{n!}\sum\limits_{j=0}^{m}(-1)^j{n+1 \choose j}(m+1-j)^n&amp;lt;/tex&amp;gt;   (элемент суммы с номером &amp;lt;tex&amp;gt;j=m+1&amp;lt;/tex&amp;gt; обращается в ноль)&lt;br /&gt;
:&amp;lt;tex&amp;gt; = &amp;lt;/tex&amp;gt; &amp;lt;tex dpi=190&amp;gt;\frac{1}{n!}\left\langle{n\atop m}\right\rangle&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 dpi=190&amp;gt;\left\langle{n\atop m}\right\rangle = \left\langle{n\atop (n-1) - k}\right\rangle&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;,\ n \ge 1,\ 0 \le k \le n-1. \, &amp;lt;/tex&amp;gt;&lt;br /&gt;
# Сумма всех значений каждого ряда равна &amp;lt;tex&amp;gt; n! &amp;lt;/tex&amp;gt;:&lt;br /&gt;
#:&amp;lt;tex&amp;gt;\sum\limits_{m=0}^{n}&amp;lt;/tex&amp;gt;&amp;lt;tex dpi=190&amp;gt; \left\langle{n\atop m}\right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; = n!,\ n \ge 0, \,&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Связь чисел Эйлера I рода с числом сочетаний:&lt;br /&gt;
#:&amp;lt;tex&amp;gt;\sum\limits_{m=0}^n (-1)^m &amp;lt;/tex&amp;gt;&amp;lt;tex dpi=190&amp;gt;{\left\langle{n\atop m}\right\rangle}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;{n-1\choose m}^{-1}=0.&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Вероятность того, что сумма &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; независимых равномерно распределённых в отрезке &amp;lt;tex&amp;gt;[0,1]&amp;lt;/tex&amp;gt; переменных лежит между &amp;lt;tex&amp;gt;m-1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; равна &amp;lt;tex&amp;gt;\frac{1}{n!}\left\langle{n\atop m}\right\rangle&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Числа Эйлера II рода==&lt;br /&gt;
'''''Числа Эйлера II рода''''' (англ. ''Eulerian numbers of the second kind'')  — количество перестановок мультимножества от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вида &amp;lt;tex&amp;gt;\{1,1,2,2..n,n\}&amp;lt;/tex&amp;gt;, обладающих свойством &amp;quot;все элементы перестановки, встречающиеся между двумя вхождниями &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt;, больше, чем &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt;&amp;quot;, таких, что в каждой из них существует ровно &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; подъемов. Числа Эйлера II рода обозначаются как &amp;lt;tex dpi = &amp;quot;190&amp;quot;&amp;gt; \scriptstyle \left\langle \!\! \left\langle {n \atop m} \right\rangle \!\! \right\rangle &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; n = 3&amp;lt;/tex&amp;gt;. Тогда существует &amp;lt;tex&amp;gt;15&amp;lt;/tex&amp;gt; перестановок такого вида, среди которых одна не имеет подъемов, &amp;lt;tex&amp;gt;8&amp;lt;/tex&amp;gt; штук имеют всего &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; подъем, и &amp;lt;tex&amp;gt;6&amp;lt;/tex&amp;gt; перестановок имеют &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; подъема:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; 332211,\; &amp;lt;/tex&amp;gt;&lt;br /&gt;
:&amp;lt;tex&amp;gt; 221[13]3,\; 22[13]31,\; 2[23]311,\; [23]3211,\; 1[13]322,\; [13]3221,\; 331[12]2,\; 33[12]21, &amp;lt;/tex&amp;gt;&lt;br /&gt;
:&amp;lt;tex&amp;gt;1[12][23]3,\; [12]2[13]3,\; 1[123]32,\; [123]321,\; [13]3[12]2,\; [12][23]31. &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Количество перестановок мультимножества &amp;lt;tex&amp;gt;\{1,1,2,2..n,n\}&amp;lt;/tex&amp;gt; со свойством &amp;quot;все элементы перестановки, встречающиеся между двумя вхождниями &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt;, больше, чем&lt;br /&gt;
&amp;lt;tex dpi=&amp;quot;130&amp;quot;&amp;gt;z&amp;lt;/tex&amp;gt;&amp;quot; равно двойному факториалу &amp;lt;tex dpi=&amp;quot;130&amp;quot;&amp;gt;(2n-1)!!&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof = Докажем лемму методом математической индукции. &lt;br /&gt;
*'''База'''. Для &amp;lt;tex&amp;gt;n=1&amp;lt;/tex&amp;gt; очевидно, что существует только одна такая перестановка.&lt;br /&gt;
*'''Переход'''.  Рассмотрим какую-нибудь перестановку длины &amp;lt;tex&amp;gt;2n&amp;lt;/tex&amp;gt;. Таких перестановок &amp;lt;tex&amp;gt;(2n-1)!!&amp;lt;/tex&amp;gt;. Теперь докажем, что перестановок длины &amp;lt;tex&amp;gt;2(n+1)&amp;lt;/tex&amp;gt; будет &amp;lt;tex&amp;gt;(2(n+1)-1)!!&amp;lt;/tex&amp;gt;. Попробуем вставить два числа &amp;lt;tex&amp;gt;n + 1&amp;lt;/tex&amp;gt;. Очевидно, что их нельзя вставить не на соседние места, так как в таком случае между ними точно будут меньшие элементы. Но их можно вставить в любые два соседних места, так как они больше всех чисел в перестановке, а значит они не нарушат свойства для других элементов. Таким образом два новых элемента можно вставить в &amp;lt;tex&amp;gt;2n+1&amp;lt;/tex&amp;gt; место. В итоге перестановок длины &amp;lt;tex&amp;gt;2(n+1)&amp;lt;/tex&amp;gt; будет &amp;lt;tex&amp;gt;(2n-1)!!\cdot (2n+1)=(2n+1)!!=(2(n+1)-1)!!&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Рекуррентная формула===&lt;br /&gt;
Числа Эйлера II рода можно выразить рекурсивно следующим образом:&lt;br /&gt;
:&amp;lt;tex dpi=190&amp;gt; \left\langle \!\! \left\langle {n \atop m} \right\rangle \!\! \right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; = (2n-m-1) &amp;lt;/tex&amp;gt; &amp;lt;tex dpi=180&amp;gt;\left\langle \!\! \left\langle {n-1 \atop m-1} \right\rangle \!\! \right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; + (m+1) &amp;lt;/tex&amp;gt; &amp;lt;tex dpi=190&amp;gt;\left\langle \!\! \left\langle {n-1 \atop m} \right\rangle \!\! \right\rangle, &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С начальным условием для &amp;lt;tex&amp;gt;n = 0&amp;lt;/tex&amp;gt;:&lt;br /&gt;
:&amp;lt;tex dpi=190&amp;gt; \left\langle \!\! \left\langle {0 \atop m} \right\rangle \!\! \right\rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; = [m=0]. &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Треугольник чисел Эйлера II рода===&lt;br /&gt;
Значения чисел Эйлера II рода для &amp;lt;tex&amp;gt;0 \le n \le m \le 9&amp;lt;/tex&amp;gt; представлены в данном массиве. Нижнедиагональная его часть называется треугольником чисел Эйлера II рода.&lt;br /&gt;
&lt;br /&gt;
:::{| class=&amp;quot;number_triangle&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; |&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''m = 0'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''1'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''2'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''3'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''4'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''5'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''6'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''7'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''8'''''&lt;br /&gt;
| style=&amp;quot;background:white; color:black; width:50px;&amp;quot; | '''''9'''''&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''n = 0'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''1'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''2'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''2'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''3'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''8'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''6'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''4'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''22'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''58'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''24'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''5'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''52'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''328'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''444'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''120'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''6'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''114'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1452'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''4400'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''3708'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''720'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''7'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''240'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''5610'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''32120'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''58140'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''33984'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''5040'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''8'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''494'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''19950'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''195800'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''644020'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''785304'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''341136'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''40320'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:white; color:black;&amp;quot; | '''''9'''''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1004'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''67260'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''1062500'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''5765500'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''12440064'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''11026296'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''3733920'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:black;&amp;quot; | '''362880'''&lt;br /&gt;
| style=&amp;quot;background:#FFDEAD; color:red;&amp;quot; | '''0'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Eulerian_number Eulerian number — Wikipedia]&lt;br /&gt;
*[http://oeis.org/wiki/Eulerian_numbers Треугольник чисел Эйлера I рода — OEIS Wiki]&lt;br /&gt;
*[http://www.mathpages.com/home/kmath012/kmath012.htm Eulerian number — Math Pages]&lt;br /&gt;
*[http://mathworld.wolfram.com/EulerianNumber.html Числа Эйлера — Wolfram Mathworld]&lt;br /&gt;
*[http://www-personal.umich.edu/~mconger/andkpaper.pdf A Refinement of the Eulerian numbers]&lt;br /&gt;
*[http://arxiv.org/pdf/math/0607715.pdf Доказательство свойства о взаимосвязи чисел Эйлера I рода и объема сечений гиперкуба] &lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Комбинаторика ]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</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=51333</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=51333"/>
				<updated>2016-01-18T07:49:54Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: /* Преобразование Мёбиуса */&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 \preceq 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>Nikitaevg</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=51332</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=51332"/>
				<updated>2016-01-18T07:44:51Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: /* Преобразование дизъюнктивной нормальной формы */  исправлено написание &amp;quot;Де-Морган&amp;quot;&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>Nikitaevg</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_%D0%A5%D1%8C%D1%8E%D0%B8&amp;diff=51292</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_%D0%A5%D1%8C%D1%8E%D0%B8&amp;diff=51292"/>
				<updated>2016-01-17T11:06:46Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Задача&lt;br /&gt;
|definition=Дано [[Основные определения теории графов#oriented_grath|ориентированное]] [[Дерево, эквивалентные определения#tree|дерево]], вершины которого раскрашены в цвета. Найти &amp;lt;tex&amp;gt;dc:V\rightarrow \{1\ldots k\}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;dc(u) -&amp;lt;/tex&amp;gt; число различных цветов в поддереве с корнем в вершине &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Время работы: &amp;lt;tex&amp;gt;O(V)&amp;lt;/tex&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Простое решение==&lt;br /&gt;
Ответ на задачу можно получить достаточно просто с помощью битовых масок. Для начала в каждую вершину поместим битовую маску с цветом данной вершины. Запустим [[Обход в глубину, цвета вершин|обход в глубину]] и на выходе из каждой вершины будем записывать в неё результат побитового &amp;lt;tex&amp;gt;OR&amp;lt;/tex&amp;gt; масок её детей и её самой. Таким образом в каждой вершине будет храниться битовая маска с цветами, лежащими в данном поддереве. Общая сложность алгоритма будет &amp;lt;tex&amp;gt;O(V \cdot K)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;K\ -&amp;lt;/tex&amp;gt; количество цветов. Если количество цветов меньше размера машинного слова, то сложность составит &amp;lt;tex&amp;gt;O(V)&amp;lt;/tex&amp;gt;.&lt;br /&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;last[k]&amp;lt;/tex&amp;gt;. Теперь, заходя в &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ую вершину с цветом &amp;lt;tex&amp;gt;col&amp;lt;/tex&amp;gt;, смотрим: если вершина с таким цветом еще не встречалась, то просто присваиваем &amp;lt;tex&amp;gt;last[col]=i&amp;lt;/tex&amp;gt;, иначе, если вершина с данным цветом уже встречалась, то находим [[Сведение задачи LCA к задаче RMQ|наименьшего общего предка]] данной вершины и последней вершины с таким цветом и вычитаем из их предка &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, присваиваем &amp;lt;tex&amp;gt;last[col]=i&amp;lt;/tex&amp;gt;. Теперь при выходе из вершины можно просуммировать числа в ее детях и получить ответ для данной вершины, так как для нее все дети уже подсчитаны. &lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм запускает один обход в глубину, на каждой итерации которого ищет наименьшего общего предка. Если искать наименьшего общего предка за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, к примеру [[Алгоритм Фарака-Колтона и Бендера|алгоритмом Фарака-Колтона и Бендера]], то сложность работы алгоритма будет &amp;lt;tex&amp;gt;O(V)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Пример==&lt;br /&gt;
&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № шага !! Изображение !! Описание&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 0&lt;br /&gt;
| [[Файл:algo_0.png|300px]]&lt;br /&gt;
| Расставим у каждой вершины &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| [[Файл:algo_1.png|300px]]&lt;br /&gt;
| Выходим из &amp;lt;tex&amp;gt;8&amp;lt;/tex&amp;gt;-ой вершины. Так как желтых вершин еще не было, запоминаем её как последнюю желтую.&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2&lt;br /&gt;
| [[Файл:algo_2.png|300px]]&lt;br /&gt;
| &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;-ая вершина. Последняя желтая &amp;lt;tex&amp;gt;-\ 8&amp;lt;/tex&amp;gt;-ая. Их LCA &amp;lt;tex&amp;gt;\ -4&amp;lt;/tex&amp;gt;-ая вершина. Вычитаем из значения &amp;lt;tex&amp;gt;4&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;
| 8&lt;br /&gt;
| [[Файл:8.png|300px]]&lt;br /&gt;
| Пропустим несколько тривиальных шагов. Выходим из &amp;lt;tex&amp;gt;11&amp;lt;/tex&amp;gt;-ой вершины. Последней посещенной зеленой была &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt;-ая (не &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;-я). Вычитаем из их LCA (&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;11&amp;lt;/tex&amp;gt;-ую как последнюю зеленую.&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 9&lt;br /&gt;
| [[Файл:9.png|300px]]&lt;br /&gt;
| Выходим из &amp;lt;tex&amp;gt;7&amp;lt;/tex&amp;gt;-ой вершины. Последней синей была &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;-ая. Вычтем из их LCA &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; и запомним &amp;lt;tex&amp;gt;7&amp;lt;/tex&amp;gt;-ую как последнюю синюю.&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
| суммирование&lt;br /&gt;
| [[Файл:algo_12.png|300px]]&lt;br /&gt;
|Пропустим еще два шага. В результате суммирования получаем в каждой вершине ответ на задачу для поддерева.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
 '''int''' col[MAX_COL], used[MAX_N], sum[MAX_N]&lt;br /&gt;
 &lt;br /&gt;
 '''func''' dfs('''Node''' v)''':'''&lt;br /&gt;
    used[v] = ''true''&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt;u \in&amp;lt;/tex&amp;gt; v.children&lt;br /&gt;
        '''if''' !used[u]&lt;br /&gt;
            dfs(u)&lt;br /&gt;
        sum[v] += sum[u]&lt;br /&gt;
    '''if''' last[col[v]] != -1&lt;br /&gt;
         sum[lca(v, last[col[v]])]--&lt;br /&gt;
    last[col[v]] = v&lt;br /&gt;
        &lt;br /&gt;
 '''func''' hugh('''int''' n, '''int''' k, '''Node''' root)''':'''&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt;v \in V&amp;lt;/tex&amp;gt;&lt;br /&gt;
        used[v] = ''false''&lt;br /&gt;
        sum[v] = 1&lt;br /&gt;
    '''for''' i = 1 '''to''' k&lt;br /&gt;
        last[i] = -1&lt;br /&gt;
    dfs(root)&lt;br /&gt;
&lt;br /&gt;
==Обоснование корректности==&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement = Наименьшим общим предком вершины и группы вершин, предшествующих по времени выхода, является наименьший общий предок данной вершины и последней, предшествующей ей из группы.&lt;br /&gt;
|proof = Рассмотрим дерево как последовательность букв, когда при входе в вершину или выходе из нее записывается ее буква. Пусть рассматриваемая вершина &amp;lt;tex&amp;gt;-\ u&amp;lt;/tex&amp;gt;, а последняя рассмотренная из той же группы &amp;lt;tex&amp;gt; -\ v&amp;lt;/tex&amp;gt;, их наименьший общий предок &amp;lt;tex&amp;gt;-\ w&amp;lt;/tex&amp;gt;. Рассмотрим два варианта расположения этих двух вершин.&lt;br /&gt;
&lt;br /&gt;
[[Файл:proof_1.png|200px]]&lt;br /&gt;
[[Файл:proof_2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Теперь возьмем вершину &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt;, которая встречается до выхода из &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Перебрав несложные пять случаев, можно легко убедиться, что наименьший общий предок &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; будет ниже, чем наименьший общий предок &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы учитывать вершины с одинаковым цветом, для каждой вершины требуется найти наименьшего общего предка этой вершины и вершин, предшествующих данной по времени выхода с таким же цветом и вычесть из значения этого предка &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;-&amp;lt;/tex&amp;gt; для каждой пары точек одного цвета учесть данный факт в их наименьшем общем предке. И по лемме, чтобы взять наименьшего общего предка текущей вершины и всех предшествующих вершин с данным цветом, надо взять наименьшего общего предка данной вершины и предыдущей вершины с данным цветом, он будет наименьшим для всех.&lt;br /&gt;
&lt;br /&gt;
[[Файл:hugh.png|300px]]&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Алгоритм Тарьяна поиска LCA за O(1) в оффлайн]]&lt;br /&gt;
&lt;br /&gt;
*[[Метод двоичного подъема]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Задача о наименьшем общем предке]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</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_%D0%A5%D1%8C%D1%8E%D0%B8&amp;diff=51290</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_%D0%A5%D1%8C%D1%8E%D0%B8&amp;diff=51290"/>
				<updated>2016-01-17T11:02:48Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Задача&lt;br /&gt;
|definition=Дано [[Основные определения теории графов#oriented_grath|ориентированное]] [[Дерево, эквивалентные определения#tree|дерево]], вершины которого раскрашены в цвета. Найти &amp;lt;tex&amp;gt;dc:V\rightarrow \{1\ldots k\}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;dc(u) -&amp;lt;/tex&amp;gt; число различных цветов в поддереве с корнем в вершине &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Время работы: &amp;lt;tex&amp;gt;O(V)&amp;lt;/tex&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Простое решение==&lt;br /&gt;
Ответ на задачу можно получить достаточно просто с помощью битовых масок. Для начала в каждую вершину поместим битовую маску с цветом данной вершины. Запустим [[Обход в глубину, цвета вершин|обход в глубину]] и на выходе из каждой вершины будем записывать в неё результат побитового &amp;lt;tex&amp;gt;OR&amp;lt;/tex&amp;gt; масок её детей и её самой. Таким образом в каждой вершине будет храниться битовая маска с цветами, лежащими в данном поддереве. Общая сложность алгоритма будет &amp;lt;tex&amp;gt;O(V \cdot K)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;K\ -&amp;lt;/tex&amp;gt; количество цветов. Если количество цветов меньше размера машинного слова, то сложность будет &amp;lt;tex&amp;gt;O(V)&amp;lt;/tex&amp;gt;.&lt;br /&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;last[k]&amp;lt;/tex&amp;gt;. Теперь, заходя в &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ую вершину с цветом &amp;lt;tex&amp;gt;col&amp;lt;/tex&amp;gt;, смотрим: если вершина с таким цветом еще не встречалась, то просто присваиваем &amp;lt;tex&amp;gt;last[col]=i&amp;lt;/tex&amp;gt;, иначе, если вершина с данным цветом уже встречалась, то находим [[Сведение задачи LCA к задаче RMQ|наименьшего общего предка]] данной вершины и последней вершины с таким цветом и вычитаем из их предка &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, присваиваем &amp;lt;tex&amp;gt;last[col]=i&amp;lt;/tex&amp;gt;. Теперь при выходе из вершины можно просуммировать числа в ее детях и получить ответ для данной вершины, так как для нее все дети уже подсчитаны. &lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм запускает один обход в глубину, на каждой итерации которого ищет наименьшего общего предка. Если искать наименьшего общего предка за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, к примеру [[Алгоритм Фарака-Колтона и Бендера|алгоритмом Фарака-Колтона и Бендера]], то сложность работы алгоритма будет &amp;lt;tex&amp;gt;O(V)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Пример==&lt;br /&gt;
&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № шага !! Изображение !! Описание&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 0&lt;br /&gt;
| [[Файл:algo_0.png|300px]]&lt;br /&gt;
| Расставим у каждой вершины &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| [[Файл:algo_1.png|300px]]&lt;br /&gt;
| Выходим из &amp;lt;tex&amp;gt;8&amp;lt;/tex&amp;gt;-ой вершины. Так как желтых вершин еще не было, запоминаем её как последнюю желтую.&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2&lt;br /&gt;
| [[Файл:algo_2.png|300px]]&lt;br /&gt;
| &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;-ая вершина. Последняя желтая &amp;lt;tex&amp;gt;-\ 8&amp;lt;/tex&amp;gt;-ая. Их LCA &amp;lt;tex&amp;gt;\ -4&amp;lt;/tex&amp;gt;-ая вершина. Вычитаем из значения &amp;lt;tex&amp;gt;4&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;
| 8&lt;br /&gt;
| [[Файл:8.png|300px]]&lt;br /&gt;
| Пропустим несколько тривиальных шагов. Выходим из &amp;lt;tex&amp;gt;11&amp;lt;/tex&amp;gt;-ой вершины. Последней посещенной зеленой была &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt;-ая (не &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;-я). Вычитаем из их LCA (&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;11&amp;lt;/tex&amp;gt;-ую как последнюю зеленую.&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 9&lt;br /&gt;
| [[Файл:9.png|300px]]&lt;br /&gt;
| Выходим из &amp;lt;tex&amp;gt;7&amp;lt;/tex&amp;gt;-ой вершины. Последней синей была &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;-ая. Вычтем из их LCA &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; и запомним &amp;lt;tex&amp;gt;7&amp;lt;/tex&amp;gt;-ую как последнюю синюю.&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
| суммирование&lt;br /&gt;
| [[Файл:algo_12.png|300px]]&lt;br /&gt;
|Пропустим еще два шага. В результате суммирования получаем в каждой вершине ответ на задачу для поддерева.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
 '''int''' col[MAX_COL], used[MAX_N], sum[MAX_N]&lt;br /&gt;
 &lt;br /&gt;
 '''func''' dfs('''Node''' v)''':'''&lt;br /&gt;
    used[v] = &amp;lt;b&amp;gt;true&amp;lt;/b&amp;gt;&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt;u \in&amp;lt;/tex&amp;gt; v.children&lt;br /&gt;
        '''if''' !used[u]&lt;br /&gt;
            dfs(u)&lt;br /&gt;
        sum[v] += sum[u]&lt;br /&gt;
    '''if''' last[col[v]] != -1&lt;br /&gt;
         sum[lca(v, last[col[v]])]--&lt;br /&gt;
    last[col[v]] = v&lt;br /&gt;
        &lt;br /&gt;
 '''func''' hugh('''int''' n, '''int''' k, '''Node''' root)''':'''&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt;v \in V&amp;lt;/tex&amp;gt;&lt;br /&gt;
        used[v] = &amp;lt;b&amp;gt;false&amp;lt;/b&amp;gt;&lt;br /&gt;
        sum[v] = 1&lt;br /&gt;
    '''for''' i = 1 to k&lt;br /&gt;
        last[i] = -1&lt;br /&gt;
    dfs(root)&lt;br /&gt;
&lt;br /&gt;
==Обоснование корректности==&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement = Наименьшим общим предком вершины и группы вершин, предшествующих по времени выхода, является наименьший общий предок данной вершины и последней, предшествующей ей из группы.&lt;br /&gt;
|proof = Рассмотрим дерево как последовательность букв, когда при входе в вершину или выходе из нее записывается ее буква. Пусть рассматриваемая вершина &amp;lt;tex&amp;gt;-\ u&amp;lt;/tex&amp;gt;, а последняя рассмотренная из той же группы &amp;lt;tex&amp;gt; -\ v&amp;lt;/tex&amp;gt;, их наименьший общий предок &amp;lt;tex&amp;gt;-\ w&amp;lt;/tex&amp;gt;. Рассмотрим два варианта расположения этих двух вершин.&lt;br /&gt;
&lt;br /&gt;
[[Файл:proof_1.png|200px]]&lt;br /&gt;
[[Файл:proof_2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Теперь возьмем вершину &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt;, которая встречается до выхода из &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Перебрав несложные пять случаев, можно легко убедиться, что наименьший общий предок &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; будет ниже, чем наименьший общий предок &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы учитывать вершины с одинаковым цветом, для каждой вершины требуется найти наименьшего общего предка этой вершины и вершин, предшествующих данной по времени выхода с таким же цветом и вычесть из значения этого предка &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;-&amp;lt;/tex&amp;gt; для каждой пары точек одного цвета учесть данный факт в их наименьшем общем предке. И по лемме, чтобы взять наименьшего общего предка текущей вершины и всех предшествующих вершин с данным цветом, надо взять наименьшего общего предка данной вершины и предыдущей вершины с данным цветом, он будет наименьшим для всех.&lt;br /&gt;
&lt;br /&gt;
[[Файл:hugh.png|300px]]&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Алгоритм Тарьяна поиска LCA за O(1) в оффлайн]]&lt;br /&gt;
&lt;br /&gt;
*[[Метод двоичного подъема]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Задача о наименьшем общем предке]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</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_%D0%A5%D1%8C%D1%8E%D0%B8&amp;diff=51289</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_%D0%A5%D1%8C%D1%8E%D0%B8&amp;diff=51289"/>
				<updated>2016-01-17T11:01:00Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Задача&lt;br /&gt;
|definition=Дано [[Основные определения теории графов#oriented_grath|ориентированное]] [[Дерево, эквивалентные определения#tree|дерево]], вершины которого раскрашены в цвета. Найти &amp;lt;tex&amp;gt;dc:V\rightarrow \{1\ldots k\}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;dc(u) -&amp;lt;/tex&amp;gt; число различных цветов в поддереве с корнем в вершине &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Время работы: &amp;lt;tex&amp;gt;O(V)&amp;lt;/tex&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Простое решение==&lt;br /&gt;
Ответ на задачу можно получить достаточно просто с помощью битовых масок. Для начала в каждую вершину поместим битовую маску с цветом данной вершины. Запустим [[Обход в глубину, цвета вершин|обход в глубину]] и на выходе из каждой вершины будем записывать в неё результат побитового &amp;lt;tex&amp;gt;OR&amp;lt;/tex&amp;gt; масок её детей и её самой. Таким образом в каждой вершине будет храниться битовая маска с цветами, лежащими в данном поддереве. Общая сложность алгоритма будет &amp;lt;tex&amp;gt;O(V \cdot K)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; - количество цветов. Если количество цветов меньше размера машинного слова, то сложность будет &amp;lt;tex&amp;gt;O(V)&amp;lt;/tex&amp;gt;.&lt;br /&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;last[k]&amp;lt;/tex&amp;gt;. Теперь, заходя в &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ую вершину с цветом &amp;lt;tex&amp;gt;col&amp;lt;/tex&amp;gt;, смотрим: если вершина с таким цветом еще не встречалась, то просто присваиваем &amp;lt;tex&amp;gt;last[col]=i&amp;lt;/tex&amp;gt;, иначе, если вершина с данным цветом уже встречалась, то находим [[Сведение задачи LCA к задаче RMQ|наименьшего общего предка]] данной вершины и последней вершины с таким цветом и вычитаем из их предка &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, присваиваем &amp;lt;tex&amp;gt;last[col]=i&amp;lt;/tex&amp;gt;. Теперь при выходе из вершины можно просуммировать числа в ее детях и получить ответ для данной вершины, так как для нее все дети уже подсчитаны. &lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм запускает один обход в глубину, на каждой итерации которого ищет наименьшего общего предка. Если искать наименьшего общего предка за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, к примеру [[Алгоритм Фарака-Колтона и Бендера|алгоритмом Фарака-Колтона и Бендера]], то сложность работы алгоритма будет &amp;lt;tex&amp;gt;O(V)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Пример==&lt;br /&gt;
&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № шага !! Изображение !! Описание&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 0&lt;br /&gt;
| [[Файл:algo_0.png|300px]]&lt;br /&gt;
| Расставим у каждой вершины &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| [[Файл:algo_1.png|300px]]&lt;br /&gt;
| Выходим из &amp;lt;tex&amp;gt;8&amp;lt;/tex&amp;gt;-ой вершины. Так как желтых вершин еще не было, запоминаем её как последнюю желтую.&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2&lt;br /&gt;
| [[Файл:algo_2.png|300px]]&lt;br /&gt;
| &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;-ая вершина. Последняя желтая &amp;lt;tex&amp;gt;-\ 8&amp;lt;/tex&amp;gt;-ая. Их LCA &amp;lt;tex&amp;gt;\ -4&amp;lt;/tex&amp;gt;-ая вершина. Вычитаем из значения &amp;lt;tex&amp;gt;4&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;
| 8&lt;br /&gt;
| [[Файл:8.png|300px]]&lt;br /&gt;
| Пропустим несколько тривиальных шагов. Выходим из &amp;lt;tex&amp;gt;11&amp;lt;/tex&amp;gt;-ой вершины. Последней посещенной зеленой была &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt;-ая (не &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;-я). Вычитаем из их LCA (&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;11&amp;lt;/tex&amp;gt;-ую как последнюю зеленую.&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 9&lt;br /&gt;
| [[Файл:9.png|300px]]&lt;br /&gt;
| Выходим из &amp;lt;tex&amp;gt;7&amp;lt;/tex&amp;gt;-ой вершины. Последней синей была &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;-ая. Вычтем из их LCA &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; и запомним &amp;lt;tex&amp;gt;7&amp;lt;/tex&amp;gt;-ую как последнюю синюю.&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
| суммирование&lt;br /&gt;
| [[Файл:algo_12.png|300px]]&lt;br /&gt;
|Пропустим еще два шага. В результате суммирования получаем в каждой вершине ответ на задачу для поддерева.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
 '''int''' col[MAX_COL], used[MAX_N], sum[MAX_N]&lt;br /&gt;
 &lt;br /&gt;
 '''func''' dfs('''Node''' v)''':'''&lt;br /&gt;
    used[v] = &amp;lt;b&amp;gt;true&amp;lt;/b&amp;gt;&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt;u \in&amp;lt;/tex&amp;gt; v.children&lt;br /&gt;
        '''if''' !used[u]&lt;br /&gt;
            dfs(u)&lt;br /&gt;
        sum[v] += sum[u]&lt;br /&gt;
    '''if''' last[col[v]] != -1&lt;br /&gt;
         sum[lca(v, last[col[v]])]--&lt;br /&gt;
    last[col[v]] = v&lt;br /&gt;
        &lt;br /&gt;
 '''func''' hugh('''int''' n, '''int''' k, '''Node''' root)''':'''&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt;v \in V&amp;lt;/tex&amp;gt;&lt;br /&gt;
        used[v] = &amp;lt;b&amp;gt;false&amp;lt;/b&amp;gt;&lt;br /&gt;
        sum[v] = 1&lt;br /&gt;
    '''for''' i = 1 to k&lt;br /&gt;
        last[i] = -1&lt;br /&gt;
    dfs(root)&lt;br /&gt;
&lt;br /&gt;
==Обоснование корректности==&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement = Наименьшим общим предком вершины и группы вершин, предшествующих по времени выхода, является наименьший общий предок данной вершины и последней, предшествующей ей из группы.&lt;br /&gt;
|proof = Рассмотрим дерево как последовательность букв, когда при входе в вершину или выходе из нее записывается ее буква. Пусть рассматриваемая вершина &amp;lt;tex&amp;gt;-\ u&amp;lt;/tex&amp;gt;, а последняя рассмотренная из той же группы &amp;lt;tex&amp;gt; -\ v&amp;lt;/tex&amp;gt;, их наименьший общий предок &amp;lt;tex&amp;gt;-\ w&amp;lt;/tex&amp;gt;. Рассмотрим два варианта расположения этих двух вершин.&lt;br /&gt;
&lt;br /&gt;
[[Файл:proof_1.png|200px]]&lt;br /&gt;
[[Файл:proof_2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Теперь возьмем вершину &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt;, которая встречается до выхода из &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Перебрав несложные пять случаев, можно легко убедиться, что наименьший общий предок &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; будет ниже, чем наименьший общий предок &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы учитывать вершины с одинаковым цветом, для каждой вершины требуется найти наименьшего общего предка этой вершины и вершин, предшествующих данной по времени выхода с таким же цветом и вычесть из значения этого предка &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;-&amp;lt;/tex&amp;gt; для каждой пары точек одного цвета учесть данный факт в их наименьшем общем предке. И по лемме, чтобы взять наименьшего общего предка текущей вершины и всех предшествующих вершин с данным цветом, надо взять наименьшего общего предка данной вершины и предыдущей вершины с данным цветом, он будет наименьшим для всех.&lt;br /&gt;
&lt;br /&gt;
[[Файл:hugh.png|300px]]&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Алгоритм Тарьяна поиска LCA за O(1) в оффлайн]]&lt;br /&gt;
&lt;br /&gt;
*[[Метод двоичного подъема]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Задача о наименьшем общем предке]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</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_%D0%A5%D1%8C%D1%8E%D0%B8&amp;diff=51253</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_%D0%A5%D1%8C%D1%8E%D0%B8&amp;diff=51253"/>
				<updated>2016-01-16T18:17:34Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Задача&lt;br /&gt;
|definition=Дано [[Основные определения теории графов#oriented_grath|ориентированный]] [[Дерево, эквивалентные определения#tree|дерево]], вершины которого раскрашены в цвета. Найти &amp;lt;tex&amp;gt;dc:V\rightarrow \{1\ldots k\}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;dc(u) -&amp;lt;/tex&amp;gt; число различных цветов в поддереве с корнем в вершине &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Время работы: &amp;lt;tex&amp;gt;O(V)&amp;lt;/tex&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&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;last[k]&amp;lt;/tex&amp;gt;. Теперь, заходя в &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ую вершину с цветом &amp;lt;tex&amp;gt;col&amp;lt;/tex&amp;gt;, смотрим: если вершина с таким цветом еще не встречалась, то просто присваиваем &amp;lt;tex&amp;gt;last[col]=i&amp;lt;/tex&amp;gt;, иначе, если вершина с данным цветом уже встречалась, то находим [[Сведение задачи LCA к задаче RMQ|наименьшего общего предка]] данной вершины и последней вершины с таким цветом и вычитаем из их предка &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, присваиваем &amp;lt;tex&amp;gt;last[col]=i&amp;lt;/tex&amp;gt;. Теперь при выходе из вершины можно просуммировать числа в ее детях и получить ответ для данной вершины, так как для нее все дети уже подсчитаны. Таким образом, алгоритм запускает один обход в глубину, на каждой итерации которого ищет наименьшего общего предка. Если искать наименьшего общего предка за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, к примеру [[Алгоритм Фарака-Колтона и Бендера|алгоритмом Фарака-Колтона и Бендера]], то сложность работы алгоритма будет &amp;lt;tex&amp;gt;O(V)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Пример==&lt;br /&gt;
&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № шага !! Изображение !! Описание&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 0&lt;br /&gt;
| [[Файл:algo_0.png|300px]]&lt;br /&gt;
| Расставим у каждой вершины &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| [[Файл:algo_1.png|300px]]&lt;br /&gt;
| Выходим из &amp;lt;tex&amp;gt;8&amp;lt;/tex&amp;gt;-ой вершины. Так как желтых вершин еще не было, запоминаем её как последнюю желтую.&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2&lt;br /&gt;
| [[Файл:algo_2.png|300px]]&lt;br /&gt;
| &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;-ая вершина. Последняя желтая &amp;lt;tex&amp;gt;-\ 8&amp;lt;/tex&amp;gt;-ая. Их LCA &amp;lt;tex&amp;gt;\ -4&amp;lt;/tex&amp;gt;-ая вершина. Вычитаем из значения &amp;lt;tex&amp;gt;4&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;
| 8&lt;br /&gt;
| [[Файл:8.png|300px]]&lt;br /&gt;
| Пропустим несколько тривиальных шагов. Выходим из &amp;lt;tex&amp;gt;11&amp;lt;/tex&amp;gt;-ой вершины. Последней посещенной зеленой была &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt;-ая (не &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;-я). Вычитаем из их LCA (&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;11&amp;lt;/tex&amp;gt;-ую как последнюю зеленую.&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 9&lt;br /&gt;
| [[Файл:9.png|300px]]&lt;br /&gt;
| Выходим из &amp;lt;tex&amp;gt;7&amp;lt;/tex&amp;gt;-ой вершины. Последней синей была &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;-ая. Вычтем из их LCA &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; и запомним &amp;lt;tex&amp;gt;7&amp;lt;/tex&amp;gt;-ую как последнюю синюю.&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
| суммирование&lt;br /&gt;
| [[Файл:algo_12.png|300px]]&lt;br /&gt;
|Пропустим еще два шага. В результате суммирования получаем в каждой вершине ответ на задачу для поддерева.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
 '''int''' col[MAX_COL], used[MAX_N], sum[MAX_N]&lt;br /&gt;
 &lt;br /&gt;
 '''func''' dfs('''Node''' v)''':'''&lt;br /&gt;
    used[v] = &amp;lt;b&amp;gt;true&amp;lt;/b&amp;gt;&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt;u \in v.children&amp;lt;/tex&amp;gt;&lt;br /&gt;
        '''if''' !used[u]&lt;br /&gt;
            dfs(u)&lt;br /&gt;
        sum[v] += sum[u]&lt;br /&gt;
    '''if''' last[col[v]] != -1&lt;br /&gt;
         sum[lca(v, last[col[v]])]--&lt;br /&gt;
    last[col[v]] = v&lt;br /&gt;
        &lt;br /&gt;
 '''func''' hugh('''int''' n, '''int''' k, '''Node''' root)''':'''&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt;v \in V&amp;lt;/tex&amp;gt;&lt;br /&gt;
        used[v] = &amp;lt;b&amp;gt;false&amp;lt;/b&amp;gt;&lt;br /&gt;
        sum[v] = 1&lt;br /&gt;
    '''for''' i = 1 to k&lt;br /&gt;
        last[i] = -1&lt;br /&gt;
    dfs(root)&lt;br /&gt;
&lt;br /&gt;
==Обоснование корректности==&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement = Наименьшим общим предком вершины и группы вершин, предшествующих по времени выхода, является наименьший общий предок данной вершины и последней, предшествующей ей из группы.&lt;br /&gt;
|proof = Рассмотрим дерево как последовательность букв, когда при входе в вершину или выходе из нее записывается ее буква. Пусть рассматриваемая вершина &amp;lt;tex&amp;gt;-\ u&amp;lt;/tex&amp;gt;, а последняя рассмотренная из той же группы &amp;lt;tex&amp;gt; -\ v&amp;lt;/tex&amp;gt;, их наименьший общий предок &amp;lt;tex&amp;gt;-\ w&amp;lt;/tex&amp;gt;. Рассмотрим два варианта расположения этих двух вершин.&lt;br /&gt;
&lt;br /&gt;
[[Файл:proof_1.png|200px]]&lt;br /&gt;
[[Файл:proof_2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Теперь возьмем вершину &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt;, которая встречается до выхода из &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Перебрав несложные пять случаев, можно легко убедиться, что наименьший общий предок &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; будет ниже, чем наименьший общий предок &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы учитывать вершины с одинаковым цветом, для каждой вершины требуется найти наименьшего общего предка этой вершины и вершин, предшествующих данной по времени выхода с таким же цветом и вычесть из значения этого предка &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;
[[Файл:hugh.png|300px]]&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
[[Алгоритм Тарьяна поиска LCA за O(1) в оффлайн]]&lt;br /&gt;
&lt;br /&gt;
[[Метод двоичного подъема]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Algo_12.png&amp;diff=51251</id>
		<title>Файл:Algo 12.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Algo_12.png&amp;diff=51251"/>
				<updated>2016-01-16T17:22:30Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Algo_11.png&amp;diff=51250</id>
		<title>Файл:Algo 11.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Algo_11.png&amp;diff=51250"/>
				<updated>2016-01-16T17:18:44Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:9.png&amp;diff=51249</id>
		<title>Файл:9.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:9.png&amp;diff=51249"/>
				<updated>2016-01-16T17:06:33Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:8.png&amp;diff=51247</id>
		<title>Файл:8.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:8.png&amp;diff=51247"/>
				<updated>2016-01-16T16:52:19Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:4.png&amp;diff=51245</id>
		<title>Файл:4.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:4.png&amp;diff=51245"/>
				<updated>2016-01-16T16:43:58Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Algo_3.png&amp;diff=51243</id>
		<title>Файл:Algo 3.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Algo_3.png&amp;diff=51243"/>
				<updated>2016-01-16T16:40:39Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: загружена новая версия «Файл:Algo 3.png»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Algo_2.png&amp;diff=51240</id>
		<title>Файл:Algo 2.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Algo_2.png&amp;diff=51240"/>
				<updated>2016-01-16T16:30:58Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: загружена новая версия «Файл:Algo 2.png»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Algo_1.png&amp;diff=51239</id>
		<title>Файл:Algo 1.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Algo_1.png&amp;diff=51239"/>
				<updated>2016-01-16T16:27:47Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: загружена новая версия «Файл:Algo 1.png»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nikitaevg</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_%D0%A5%D1%8C%D1%8E%D0%B8&amp;diff=50623</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_%D0%A5%D1%8C%D1%8E%D0%B8&amp;diff=50623"/>
				<updated>2016-01-02T08:06:18Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Задача&lt;br /&gt;
|definition=Дано ориентированное дерево, вершины которого раскрашены в цвета. Найти &amp;lt;tex&amp;gt;dc:V\rightarrow \{1..k\}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;dc(u) -&amp;lt;/tex&amp;gt; число различных цветов в поддереве с корнем в вершине &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Время работы: &amp;lt;tex&amp;gt;O(V)&amp;lt;/tex&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Алгоритм решения==&lt;br /&gt;
Для начала в каждой вершине поставим 1. Теперь, если бы все вершины имели различные цвета, надо было бы пройти снизу вверх по дереву и просуммировать для каждой вершины числа, записанные в ее детях. Но некоторые вершины будут иметь одинаковые цвета, и это надо как-то учитывать. Для этого запустим [[Обход в глубину, цвета вершин|обход в глубину]]. Также будем хранить для каждого цвета последнюю посещенную вершину данного цвета в массиве &amp;lt;tex&amp;gt;last[k]&amp;lt;/tex&amp;gt;. Теперь, заходя в &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ую вершину с цветом &amp;lt;tex&amp;gt;col&amp;lt;/tex&amp;gt;, смотрим: если вершина с таким цветом еще не встречалась, то просто записываем в &amp;lt;tex&amp;gt;last[col]\ i&amp;lt;/tex&amp;gt;, иначе, если вершина с данным цветом уже встречалась, то находим [[Сведение задачи LCA к задаче RMQ|наименьшего общего предка]] данной вершины и последней вершины с таким цветом и вычитаем из их предка 1, и записываем в &amp;lt;tex&amp;gt;last[col]\ i&amp;lt;/tex&amp;gt;. Теперь при выходе из вершины можно просуммировать числа в ее детях и получить ответ для данной вершины, так как для нее все дети уже подсчитаны. Таким образом, алгоритм запускает один обход в глубину, на каждой итерации которого ищет наименьшего общего предка. Если искать наименьшего общего предка за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, к примеру [[Алгоритм Фарака-Колтона и Бендера|алгоритмом Фарака-Колтона и Бендера]], то сложность работы алгоритма будет &amp;lt;tex&amp;gt;O(V)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
Шаг 0:&lt;br /&gt;
[[Файл:algo_0.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
[[Файл:algo_1.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
[[Файл:algo_2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Шаг 3:&lt;br /&gt;
[[Файл:algo_3.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Шаг n:&lt;br /&gt;
[[Файл:algo_n-1.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Окончательное суммирование&lt;br /&gt;
[[Файл:algo_n.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
 '''func''' dfs (Node v)''':'''&lt;br /&gt;
    used[v] := true&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt;u \in v.children&amp;lt;/tex&amp;gt;&lt;br /&gt;
        '''if''' !used[u]&lt;br /&gt;
            dfs(u)&lt;br /&gt;
        sum[v] := sum[v] + sum[u]&lt;br /&gt;
    '''if''' last[col[v]] != -1&lt;br /&gt;
         sum[lca(v, last[col[v]])] -= 1&lt;br /&gt;
    last[col[v]] := v&lt;br /&gt;
        &lt;br /&gt;
 '''func''' hugh (int n, int k, Node root)''':'''&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt;v \in V&amp;lt;/tex&amp;gt;&lt;br /&gt;
        used[v] := false&lt;br /&gt;
        sum[v] := 1&lt;br /&gt;
    '''for''' k := 1 to k&lt;br /&gt;
        last[k] := -1&lt;br /&gt;
    dfs (root)&lt;br /&gt;
&lt;br /&gt;
==Обоснование корректности==&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement = Наименьшим общим предком вершины и группы вершин, предшествующих по времени выхода, является наименьший общий предок данной вершины и последней, предшествующей ей из группы.&lt;br /&gt;
|proof = Рассмотрим дерево как последовательность букв, когда при входе в вершину или выходе из нее записывается ее буква. Пусть рассматриваемая вершина &amp;lt;tex&amp;gt;-\ u&amp;lt;/tex&amp;gt;, а последняя рассмотренная из той же группы &amp;lt;tex&amp;gt; -\ v&amp;lt;/tex&amp;gt;, их наименьший общий предок &amp;lt;tex&amp;gt;-\ w&amp;lt;/tex&amp;gt;. Рассмотрим два варианта расположения этих двух вершин.&lt;br /&gt;
&lt;br /&gt;
[[Файл:proof_1.png|200px]]&lt;br /&gt;
[[Файл:proof_2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Теперь возьмем вершину &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt;, которая встречается до выхода из &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Перебрав несложные пять случаев, можно легко убедиться, что наименьший общий предок &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; будет ниже, чем наименьший общий предок &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы учитывать вершины с одинаковым цветом, для каждой вершины требуется найти наименьшего общего предка этой вершины и вершин, предшествующих данной по времени выхода с таким же цветом и вычесть из значения этого предка 1. Так, при конечном подсчете значение наименьшего общего предка данной вершины и любой вершины, предшествующей данной с тем же цветом, уменьшится на 1, так как наименьший предок этой точки и любой предшествующей того же цвета находится на пути из наименьшего общего предка этой группы точек. А как раз это и требуется - для каждой пары точек одного цвета учесть данный факт в их наименьшем общем предке. И по лемме, чтобы взять наименьшего общего предка текущей вершины и всех предшествующих вершин с данным цветом, надо взять наименьшего общего предка данной вершины и предыдущей вершины с данным цветом, он будет наименьшим для всех.&lt;br /&gt;
&lt;br /&gt;
[[Файл:hugh.png|300px]]&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;/div&gt;</summary>
		<author><name>Nikitaevg</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_%D0%A5%D1%8C%D1%8E%D0%B8&amp;diff=50604</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_%D0%A5%D1%8C%D1%8E%D0%B8&amp;diff=50604"/>
				<updated>2015-12-30T19:36:37Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Задача&lt;br /&gt;
|definition=Дано ориентированное дерево, вершины которого раскрашены в цвета. Найти &amp;lt;tex&amp;gt;dc:V\rightarrow \{1..k\}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;dc(u) -&amp;lt;/tex&amp;gt; число различных цветов в поддереве с корнем в вершине &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Время работы: &amp;lt;tex&amp;gt;O(V)&amp;lt;/tex&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Алгоритм решения==&lt;br /&gt;
Для начала в каждой вершине поставим единицу. Теперь, если бы все вершины имели различные цвета, надо было бы пройти снизу вверх по дереву и просуммировать для каждой вершины числа, записанные в ее детях. Но некоторые вершины будут иметь одинаковые цвета, и это надо как-то учитывать. Для этого запустим [[Обход в глубину, цвета вершин|обход в глубину]]. Также будем хранить для каждого цвета последнюю посещенную вершину данного цвета в массиве &amp;lt;tex&amp;gt;last[k]&amp;lt;/tex&amp;gt;. Теперь, заходя в &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ую вершину с цветом &amp;lt;tex&amp;gt;col&amp;lt;/tex&amp;gt;, смотрим: если вершина с таким цветом еще не встречалась, то просто записываем в &amp;lt;tex&amp;gt;last[col]\ i&amp;lt;/tex&amp;gt;, иначе, если вершина с данным цветом уже встречалась, то находим [[Сведение задачи LCA к задаче RMQ|наименьшего общего предка]] данной вершины и последней вершины с таким цветом и вычитаем из их предка 1, и записываем в &amp;lt;tex&amp;gt;last[col]\ i&amp;lt;/tex&amp;gt;. Теперь при выходе из вершины можно просуммировать числа в ее детях и получить ответ для данной вершины, так как для нее все дети уже подсчитаны.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
Шаг 0:&lt;br /&gt;
[[Файл:algo_0.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
[[Файл:algo_1.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
[[Файл:algo_2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Шаг 3:&lt;br /&gt;
[[Файл:algo_3.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Шаг n:&lt;br /&gt;
[[Файл:algo_n-1.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Окончательное суммирование&lt;br /&gt;
[[Файл:algo_n.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
 '''func''' dfs (Node v)''':'''&lt;br /&gt;
    used[v] := true&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt;u \in v.children&amp;lt;/tex&amp;gt;&lt;br /&gt;
        '''if''' !used[u]&lt;br /&gt;
            dfs(u)&lt;br /&gt;
        sum[v] := sum[v] + sum[u]&lt;br /&gt;
    '''if''' last[col[v]] != -1&lt;br /&gt;
         sum[lca(v, last[col[v]])] -= 1&lt;br /&gt;
    last[col[v]] := v&lt;br /&gt;
        &lt;br /&gt;
 '''func''' hugh (int n, int k, Node root)''':'''&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt;v \in V&amp;lt;/tex&amp;gt;&lt;br /&gt;
        used[v] := false&lt;br /&gt;
        sum[v] := 1&lt;br /&gt;
    '''for''' k := 1 to k&lt;br /&gt;
        last[k] := -1&lt;br /&gt;
    dfs (root)&lt;br /&gt;
&lt;br /&gt;
==Обоснование корректности==&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement = Наименьшим общим предком вершины и группы вершин, предшествующих по времени выхода, является наименьший общий предок данной вершины и последней, предшествующей ей из группы.&lt;br /&gt;
|proof = Рассмотрим дерево как последовательность букв, когда при входе в вершину или выходе из нее записывается ее буква. Пусть рассматриваемая вершина &amp;lt;tex&amp;gt;-\ u&amp;lt;/tex&amp;gt;, а последняя рассмотренная из той же группы &amp;lt;tex&amp;gt; -\ v&amp;lt;/tex&amp;gt;, их наименьший общий предок &amp;lt;tex&amp;gt;-\ w&amp;lt;/tex&amp;gt; Рассмотрим два варианта расположения этих двух вершин.&lt;br /&gt;
&lt;br /&gt;
[[Файл:proof_1.png|200px]]&lt;br /&gt;
[[Файл:proof_2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Теперь возьмем вершину &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt;, которая встречается до выхода из &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Перебрав несложные пять случаев, можно легко убедиться, что наименьший общий предок &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; будет ниже, чем наименьший общий предок &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы учитывать две вершины с одинаковым цветом, для каждой вершины требуется найти наименьшего общего предка этой вершины и вершин, предшествующих данной по времени выхода с таким же цветом и вычесть из значения этого предка 1. Так, при конечном подсчете значение наименьшего общего предка данной вершины и любой вершины, предшествующей данной с тем же цветом, уменьшится на единицу, так как наименьший предок этой точки и любой предшествующей того же цвета находится на пути из наименьшего общего предка всех этих вершин до корня. А как раз это и требуется - для каждой пары точек одного цвета учесть данный факт в их наименьшем общем предке. И по лемме, чтобы взять наименьшего общего предка текущей вершины и всех предшествующих вершин с данным цветом, надо взять наименьшего общего предка данной вершины и предыдущей вершины с данным цветом, он будет наименьшим для всех.&lt;br /&gt;
&lt;br /&gt;
[[Файл:hugh.png|300px]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</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_%D0%A5%D1%8C%D1%8E%D0%B8&amp;diff=50603</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_%D0%A5%D1%8C%D1%8E%D0%B8&amp;diff=50603"/>
				<updated>2015-12-30T19:27:02Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: Новая страница: «{{Задача |definition=Дано ориентированное дерево, вершины которого раскрашены в цвета. Найти &amp;lt;t...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Задача&lt;br /&gt;
|definition=Дано ориентированное дерево, вершины которого раскрашены в цвета. Найти &amp;lt;tex&amp;gt;dc:V\rightarrow \{1..k\}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;dc(u) -&amp;lt;/tex&amp;gt; число различных цветов в поддереве с корнем в вершине &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Время работы: &amp;lt;tex&amp;gt;O(V)&amp;lt;/tex&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Алгоритм решения==&lt;br /&gt;
Для начала в каждой вершине поставим единицу. Теперь, если бы все вершины имели различные цвета, надо было бы пройти снизу вверх по дереву и просуммировать для каждой вершины числа, записанные в ее детях. Но некоторые вершины будут иметь одинаковые цвета, и это надо как-то учитывать. Для этого запустим обход в глубину. Также будем хранить для каждого цвета последнюю посещенную вершину данного цвета в массиве &amp;lt;tex&amp;gt;last[k]&amp;lt;/tex&amp;gt;. Теперь, заходя в &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ую вершину с цветом &amp;lt;tex&amp;gt;col&amp;lt;/tex&amp;gt;, смотрим: если вершина с таким цветом еще не встречалась, то просто записываем в &amp;lt;tex&amp;gt;last[col]\ i&amp;lt;/tex&amp;gt;, иначе, если вершина с данным цветом уже встречалась, то находим наименьшего общего предка данной вершины и последней вершины с таким цветом и вычитаем из их предка 1, и записываем в &amp;lt;tex&amp;gt;last[col]\ i&amp;lt;/tex&amp;gt;. Теперь при выходе из вершины можно просуммировать числа в ее детях и получить ответ для данной вершины, так как для нее все дети уже подсчитаны.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
Шаг 0:&lt;br /&gt;
[[Файл:algo_0.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
[[Файл:algo_1.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
[[Файл:algo_2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Шаг 3:&lt;br /&gt;
[[Файл:algo_3.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Шаг n:&lt;br /&gt;
[[Файл:algo_n-1.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Окончательное суммирование&lt;br /&gt;
[[Файл:algo_n.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
 '''func''' dfs (Node v)''':'''&lt;br /&gt;
    used[v] := true&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt;u \in v.children&amp;lt;/tex&amp;gt;&lt;br /&gt;
        '''if''' !used[u]&lt;br /&gt;
            dfs(u)&lt;br /&gt;
        sum[v] := sum[v] + sum[u]&lt;br /&gt;
    '''if''' last[col[v]] != -1&lt;br /&gt;
         sum[lca(v, last[col[v]])] -= 1&lt;br /&gt;
    last[col[v]] := v&lt;br /&gt;
        &lt;br /&gt;
 '''func''' hugh (int n, int k, Node root)''':'''&lt;br /&gt;
    '''for''' &amp;lt;tex&amp;gt;v \in V&amp;lt;/tex&amp;gt;&lt;br /&gt;
        used[v] := false&lt;br /&gt;
        sum[v] := 1&lt;br /&gt;
    '''for''' k := 1 to k&lt;br /&gt;
        last[k] := -1&lt;br /&gt;
    dfs (root)&lt;br /&gt;
&lt;br /&gt;
==Обоснование корректности==&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement = Наименьшим общим предком вершины и группы вершин, предшествующих по времени выхода, является наименьший общий предок данной вершины и последней, предшествующей ей из группы.&lt;br /&gt;
|proof = Рассмотрим дерево как последовательность букв, когда при входе в вершину или выходе из нее записывается ее буква. Пусть рассматриваемая вершина &amp;lt;tex&amp;gt;-\ u&amp;lt;/tex&amp;gt;, а последняя рассмотренная из той же группы &amp;lt;tex&amp;gt; -\ v&amp;lt;/tex&amp;gt;, их наименьший общий предок &amp;lt;tex&amp;gt;-\ w&amp;lt;/tex&amp;gt; Рассмотрим два варианта расположения этих двух вершин.&lt;br /&gt;
&lt;br /&gt;
[[Файл:proof_1.png|200px]]&lt;br /&gt;
[[Файл:proof_2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Теперь возьмем вершину &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt;, которая встречается до выхода из &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Перебрав несложные пять случаев, можно легко убедиться, что наименьший общий предок &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; будет ниже, чем наименьший общий предок &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы учитывать две вершины с одинаковым цветом, для каждой вершины требуется найти наименьшего общего предка этой вершины и вершин, предшествующих данной по времени выхода с таким же цветом и вычесть из значения этого предка 1. Так, при конечном подсчете значение наименьшего общего предка данной вершины и любой вершины, предшествующей данной с тем же цветом, уменьшится на единицу, так как наименьший предок этой точки и любой предшествующей того же цвета находится на пути из наименьшего общего предка всех этих вершин до корня. А как раз это и требуется - для каждой пары точек одного цвета учесть данный факт в их наименьшем общем предке. И по лемме, чтобы взять наименьшего общего предка текущей вершины и всех предшествующих вершин с данным цветом, надо взять наименьшего общего предка данной вершины и предыдущей вершины с данным цветом, он будет наименьшим для всех.&lt;br /&gt;
&lt;br /&gt;
[[Файл:hugh.png|300px]]&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Algo_3.png&amp;diff=50602</id>
		<title>Файл:Algo 3.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Algo_3.png&amp;diff=50602"/>
				<updated>2015-12-30T19:23:54Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: загружена новая версия «Файл:Algo 3.png»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Algo_3.png&amp;diff=50601</id>
		<title>Файл:Algo 3.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Algo_3.png&amp;diff=50601"/>
				<updated>2015-12-30T19:22:05Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Hugh.png&amp;diff=50600</id>
		<title>Файл:Hugh.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Hugh.png&amp;diff=50600"/>
				<updated>2015-12-30T19:11:45Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Algo_n.png&amp;diff=50599</id>
		<title>Файл:Algo n.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Algo_n.png&amp;diff=50599"/>
				<updated>2015-12-30T18:49:30Z</updated>
		
		<summary type="html">&lt;p&gt;Nikitaevg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nikitaevg</name></author>	</entry>

	</feed>