<?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=185.220.101.2&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=185.220.101.2&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/185.220.101.2"/>
		<updated>2026-06-11T19:29:23Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<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%9B%D0%B0%D0%BD%D0%B4%D0%B0%D1%83-%D0%92%D0%B8%D1%88%D0%BA%D0%B8%D0%BD%D0%B0_(k_%D0%BD%D0%B5%D1%81%D0%BE%D0%B2%D0%BF%D0%B0%D0%B4%D0%B5%D0%BD%D0%B8%D0%B9)&amp;diff=83001</id>
		<title>Алгоритм Ландау-Вишкина (k несовпадений)</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%9B%D0%B0%D0%BD%D0%B4%D0%B0%D1%83-%D0%92%D0%B8%D1%88%D0%BA%D0%B8%D0%BD%D0%B0_(k_%D0%BD%D0%B5%D1%81%D0%BE%D0%B2%D0%BF%D0%B0%D0%B4%D0%B5%D0%BD%D0%B8%D0%B9)&amp;diff=83001"/>
				<updated>2022-09-01T04:04:55Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Постановка задачи:''' дано число &amp;lt;tex&amp;gt;k &amp;gt; 0&amp;lt;/tex&amp;gt; текст &amp;lt;tex&amp;gt;y[1...n]&amp;lt;/tex&amp;gt; и образец &amp;lt;tex&amp;gt;x[1...m]&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;m &amp;lt; n&amp;lt;/tex&amp;gt;. Требуется найти все подстроки текста длины &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;, с не более чем &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; несовпадающими символами с образцом. Эту задачу решает алгоритм Ландау-Вишкина (k несовпадений) (''англ.Landau-Vishkin Algorithm'')&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
&lt;br /&gt;
===Идея===&lt;br /&gt;
&lt;br /&gt;
[[Файл:algLandauVishkin1.png|thumb|250px|right|  Красным отмечены несовпадения. В таблицу &amp;lt;tex&amp;gt;tm&amp;lt;/tex&amp;gt; по номеру несовпадения записывается соответстующий индекс образца, то есть &amp;lt;tex&amp;gt;tm[i][1] = a&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;tm[i][2] = b&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;tm[i][3] = c&amp;lt;/tex&amp;gt; и т. д.]]&lt;br /&gt;
&lt;br /&gt;
При анализе используется двумерный массив несовпадений текста &amp;lt;tex&amp;gt;tm[0...n-m][1...k+1]&amp;lt;/tex&amp;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;k+1&amp;lt;/tex&amp;gt; несовпадений между строками &amp;lt;tex&amp;gt;x[1...m]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y[i+1...i+m]&amp;lt;/tex&amp;gt;. Таким образом, если &amp;lt;tex&amp;gt;tm[i][v] = s&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;y[i+s] \neq x[s]&amp;lt;/tex&amp;gt;, и это &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;-е несовпадение между &amp;lt;tex&amp;gt;x[1...m]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y[i+1...i+m]&amp;lt;/tex&amp;gt;, считая слева направо. Если число &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; несовпадений &amp;lt;tex&amp;gt;x[1...m]&amp;lt;/tex&amp;gt; с подстрокой &amp;lt;tex&amp;gt;y[i+1...i+m]&amp;lt;/tex&amp;gt; меньше &amp;lt;tex&amp;gt;k+1&amp;lt;/tex&amp;gt;, то, начиная с &amp;lt;tex&amp;gt;d+1&amp;lt;/tex&amp;gt;, элементы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й строки равны значению по умолчанию &amp;lt;tex&amp;gt;m+1&amp;lt;/tex&amp;gt;. (См. [[Алгоритм Ландау-Вишкина (k несовпадений)#Пример|пример]]).&lt;br /&gt;
&lt;br /&gt;
Заметим, если &amp;lt;tex&amp;gt;tm[i][k+1] = m+1&amp;lt;/tex&amp;gt;, то подстрока &amp;lt;tex&amp;gt;y[i+1...i+m]&amp;lt;/tex&amp;gt; отличается от образца &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; не более, чем на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; символов, и, таким образом, является решением задачи.&lt;br /&gt;
&lt;br /&gt;
Затем образец сканируется параллельно с текстом слева направо по одному символу за раз. На итерации &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; с образцом сравнивается подстрока &amp;lt;tex&amp;gt;y[i+1...i+m]&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; {{---}} это самая правая позиция в тексте, достигнутая за предыдущие итерации, то есть &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; является максимальным из чисел &amp;lt;tex&amp;gt;r+tm[r][k + 1]&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;0 \leqslant r &amp;lt; i&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;i &amp;lt; j&amp;lt;/tex&amp;gt;, в &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; присваивается результат работы &amp;lt;tex&amp;gt;\mathrm{merge}&amp;lt;/tex&amp;gt;, которая находит количество несовпадений между &amp;lt;tex&amp;gt;x[1...j-i]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y[i+1...j]&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; не превышает &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, вызывается процедура &amp;lt;tex&amp;gt;\mathrm{extend}&amp;lt;/tex&amp;gt;, которая сравнивает подстроки &amp;lt;tex&amp;gt;y[j + 1...i + m]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x[j - i + 1...m]&amp;lt;/tex&amp;gt;, где изменяется таблица текстовых несовпадений. Переменная &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; будет рассмотрена ниже.&lt;br /&gt;
 &lt;br /&gt;
{| border=&amp;quot;0&amp;quot; &lt;br /&gt;
|align=&amp;quot;left&amp;quot; colspan=&amp;quot;4&amp;quot;|&lt;br /&gt;
&amp;lt;font size=2&amp;gt;&lt;br /&gt;
  '''int[][]''' algorithmLandauViskin(y : '''string''', x : '''string''')&lt;br /&gt;
    n = y.length&lt;br /&gt;
    m = x.length&lt;br /&gt;
    tm[0...n - m][1...k + 1] = m + 1 &amp;lt;font color=green&amp;gt; // инициализация &amp;lt;/font&amp;gt;&lt;br /&gt;
    r = 0&lt;br /&gt;
    j = 0&lt;br /&gt;
    '''for''' i = 0 to n - m&lt;br /&gt;
      b = 0&lt;br /&gt;
      '''if''' i &amp;lt; j&lt;br /&gt;
        b = merge(i, r, j) &lt;br /&gt;
      '''if''' b &amp;lt; k + 1&lt;br /&gt;
        r = i&lt;br /&gt;
        extend(i, j, b)&lt;br /&gt;
    '''return''' tm&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Процедура extend===&lt;br /&gt;
&lt;br /&gt;
[[Файл:algLandauVishkin2.png|thumb|380px|right| Синие подстроки сравниваются в процедуре &amp;lt;tex&amp;gt;\mathrm{extend}&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;w &amp;lt; k + 1&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим процедуру &amp;lt;tex&amp;gt;\mathrm{extend}&amp;lt;/tex&amp;gt; подробнее. Она сравнивает подстроки &amp;lt;tex&amp;gt;y[j + 1...i + m]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x[j - i + 1...m]&amp;lt;/tex&amp;gt;, в случае несовпадения &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; увеличивается, и таблица текстовых несовпадений обновляется. Это происходит пока либо не будет найдено &amp;lt;tex&amp;gt;k + 1&amp;lt;/tex&amp;gt; несовпадений (учитывая несовпадения, которые были найдены раньше на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой итерации), либо не будет достигнуто &amp;lt;tex&amp;gt;y[i+m]&amp;lt;/tex&amp;gt; с не больше чем &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; несовпадениями, то есть найдено вхождение образца, начинающееся с &amp;lt;tex&amp;gt;y[i+1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; &lt;br /&gt;
|align=&amp;quot;left&amp;quot; colspan=&amp;quot;4&amp;quot;|&lt;br /&gt;
&amp;lt;font size=2&amp;gt;&lt;br /&gt;
  '''void''' extend(i : '''int''', j : '''int''', b : '''int''')&lt;br /&gt;
    '''while''' (b &amp;lt; k + 1) '''and''' (j - i &amp;lt; m) &lt;br /&gt;
      j++&lt;br /&gt;
      '''if''' y[j] &amp;lt;tex&amp;gt;\neq&amp;lt;/tex&amp;gt; x[j-1]&lt;br /&gt;
        b++&lt;br /&gt;
        tm[i][b] = j - i&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Процедура merge===&lt;br /&gt;
&lt;br /&gt;
[[Файл:algLandauVishkin3.png|thumb|400px|right| Синие подстроки сравниваются в процедуре &amp;lt;tex&amp;gt;\mathrm{merge}&amp;lt;/tex&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим процедуру &amp;lt;tex&amp;gt;\mathrm{merge}&amp;lt;/tex&amp;gt; подробнее. Она находит количество несовпадений между &amp;lt;tex&amp;gt;x[1... j-i]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y[i+1...j]&amp;lt;/tex&amp;gt; и устанавливает &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; равным найденному числу, при этом используется полученная ранее информация. Введем &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; {{---}} это строка таблицы несовпадений, в которой есть информация о несовпадениях, полученных при совмещении начала образца и &amp;lt;tex&amp;gt;y[r+1]&amp;lt;/tex&amp;gt;. Текущий номер самой правой из проверенных на настоящий момент позиции текста равен &amp;lt;tex&amp;gt;r+tm[r][k+1]&amp;lt;/tex&amp;gt;. Поэтому при обработки подстроки начинающейся с &amp;lt;tex&amp;gt;y[i+1]&amp;lt;/tex&amp;gt;, можно учитывать информацию в &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt;-ой строке &amp;lt;tex&amp;gt;tm&amp;lt;/tex&amp;gt;, которая содержит информацию о сопоставлении образца с &amp;lt;tex&amp;gt;y[i]&amp;lt;/tex&amp;gt;. Подходящими значениями из таблицы несовпадений являются, таким образом, &amp;lt;tex&amp;gt;tm[r][q ... k+1]&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; {{---}} это наименьшее из целых чисел, для которых &amp;lt;tex&amp;gt;r+tm[r][q] &amp;gt; i&amp;lt;/tex&amp;gt;. Однако, следует учитывать тот факт, что эти несовпадения соответствуют началу образца, который был выровнен с &amp;lt;tex&amp;gt;y[r+1]&amp;lt;/tex&amp;gt;, в то время как текущая позиция образца выровнена с &amp;lt;tex&amp;gt;y[i+1]&amp;lt;/tex&amp;gt; {{---}} разница в &amp;lt;tex&amp;gt;i - r&amp;lt;/tex&amp;gt; мест.&lt;br /&gt;
&lt;br /&gt;
[[Файл:algLandauVishkin4.png|thumb|250px|right| В таблицу &amp;lt;tex&amp;gt;pm&amp;lt;/tex&amp;gt; по номеру несовпадения записывается соответствующий индекс верхнего образца, то есть &amp;lt;tex&amp;gt;pm[i][1] = a&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;pm[i][2] = b&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;pm[i][3] = c&amp;lt;/tex&amp;gt;  и т д.]]&lt;br /&gt;
&lt;br /&gt;
Также в алгоритме используется двумерный массив несовпадений образца &amp;lt;tex&amp;gt;pm[1...m-1][1...2k+1]&amp;lt;/tex&amp;gt;, генерируемой на стадии предварительной обработки образца. В нем содержатся позиции несовпадения образца с самим собой при различных сдвигах, аналогично &amp;lt;tex&amp;gt;tm&amp;lt;/tex&amp;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;2k+1&amp;lt;/tex&amp;gt; несовпадений между подстроками &amp;lt;tex&amp;gt;x[1...m-i]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x[i+1...m]&amp;lt;/tex&amp;gt;. Таким образом, если &amp;lt;tex&amp;gt;pm[i][v] = s&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;x[i+s] \neq x[s]&amp;lt;/tex&amp;gt;, и это &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;-е несовпадение между &amp;lt;tex&amp;gt;x[1...m-i]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x[i+1...m]&amp;lt;/tex&amp;gt; слева направо. Если число &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; несовпадений между этими строками меньше &amp;lt;tex&amp;gt;2k+1&amp;lt;/tex&amp;gt;, то, начиная с &amp;lt;tex&amp;gt;d+1&amp;lt;/tex&amp;gt;, элементы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й строки равны &amp;lt;tex&amp;gt;m+1&amp;lt;/tex&amp;gt;, значению по умолчанию. Построение &amp;lt;tex&amp;gt;tm&amp;lt;/tex&amp;gt; будет подробнее рассмотрено позднее.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для &amp;lt;tex&amp;gt;\mathrm{merge}&amp;lt;/tex&amp;gt; интерес представляет строка &amp;lt;tex&amp;gt;i - r&amp;lt;/tex&amp;gt; таблицы несовпадений образца, причем используются значения &amp;lt;tex&amp;gt;pm[i-r][1...t]&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; {{---}} самое правое несовпадение в &amp;lt;tex&amp;gt;pm[i-r][1...2k+1]&amp;lt;/tex&amp;gt;, такое, что &amp;lt;tex&amp;gt;pm[i-r][t] &amp;lt; j-i+1&amp;lt;/tex&amp;gt;, так как требуются только несовпадения в подстроке &amp;lt;tex&amp;gt;x[1...j-i]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Чтобы использовать упомянутую информацию в процедуре &amp;lt;tex&amp;gt;\mathrm{merge}&amp;lt;/tex&amp;gt;, рассмотрим в тексте позицию &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;, находящуюся в диапазоне, &amp;lt;tex&amp;gt;i+1 &amp;lt; p &amp;lt; j&amp;lt;/tex&amp;gt;. Рассмотрим следующие условия для позиции &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
'''Условие A''': когда символы &amp;lt;tex&amp;gt;x[1]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y[r+1]&amp;lt;/tex&amp;gt; совмещены, позиция &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; в тексте соответствует предварительно выявленному несовпадению между образцом и текстом, то есть &amp;lt;tex&amp;gt;y[p] \neq x[p-r]&amp;lt;/tex&amp;gt;, и это несовпадение номер &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;q &amp;lt; v &amp;lt; k+1&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;p - r = tm[r][v]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:algLandauVishkin5.png|380px]] &lt;br /&gt;
&lt;br /&gt;
'''Условие B''': для двух копий образца, со сдвигом относительно друг друга &amp;lt;tex&amp;gt;i - r&amp;lt;/tex&amp;gt;, совмещенных с текстом так, что их начальные символы лежат, соответственно, над &amp;lt;tex&amp;gt;y[r+1]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y[i+1]&amp;lt;/tex&amp;gt;, позиция &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; соответствует несовпадению между двумя образцам, то есть &amp;lt;tex&amp;gt;x[p-r] \neq x[p-i]&amp;lt;/tex&amp;gt;. Это &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;-е несовпадение при этом сдвиге, где &amp;lt;tex&amp;gt;1 &amp;lt; u &amp;lt; t&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;p-i = pm[i-r][u]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:algLandauVishkin6.png|450px]]&lt;br /&gt;
&lt;br /&gt;
Вспомним, что нас интересует, совпадает ли символ текста в позиции &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; с соответствующими символом образца, когда &amp;lt;tex&amp;gt;x[1]&amp;lt;/tex&amp;gt; совмещен с &amp;lt;tex&amp;gt;y[i+1]&amp;lt;/tex&amp;gt;, то есть верно ли, что &amp;lt;tex&amp;gt;y[p] = x[p-i]&amp;lt;/tex&amp;gt;. Рассмотрим этот вопрос при разных комбинациях указанных выше условий.&lt;br /&gt;
&lt;br /&gt;
'''Случай 1: !A and !B:''' То есть, &amp;lt;tex&amp;gt;y[p] = x[p-r]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x[p-r] = x[p-i]&amp;lt;/tex&amp;gt;, откуда &amp;lt;tex&amp;gt;y[p] = x[p-i]&amp;lt;/tex&amp;gt;. Нет необходимости сравнивать символ текста с символом образца, так как ясно, что в этой позиции они совпадают.&lt;br /&gt;
&lt;br /&gt;
'''Случай 2: (A and !B) or (!A and B):''' В любом случае &amp;lt;tex&amp;gt;y[p] \neq x[p-i]&amp;lt;/tex&amp;gt; (если лишь ''условие A'' истинно, то &amp;lt;tex&amp;gt;y[p] \neq x[p-r]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x[p-r] = x[p-i]&amp;lt;/tex&amp;gt;, откуда &amp;lt;tex&amp;gt;y[p] \neq x[p-i]&amp;lt;/tex&amp;gt;, с другой стороны, если выполнено только ''условие B'', то &amp;lt;tex&amp;gt;y[p] = x[p-r]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x[p-r] \neq x[p-i]&amp;lt;/tex&amp;gt;, и опять, &amp;lt;tex&amp;gt;y[p] \neq x[p-i]&amp;lt;/tex&amp;gt;). Как и в предыдущем случае, нет необходимости сравнивать символ текста с символом образца, так как известно, что они не совпадают.&lt;br /&gt;
&lt;br /&gt;
'''Случай 3: A and B:''' В этом случае мы ничего не можем сказать о том, совпадают ли символы &amp;lt;tex&amp;gt;y[p]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x[p-i]&amp;lt;/tex&amp;gt;, поэтому их надо сравнить.&lt;br /&gt;
&lt;br /&gt;
Возвращаемся к процедуре &amp;lt;tex&amp;gt;\mathrm{merge}&amp;lt;/tex&amp;gt;. В ''случае 2'', или если в ''случае 3'' выявлено несовпадение символов, необходимо увеличить количество несовпадений символов &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; на единицу и обновить &amp;lt;tex&amp;gt;tm[i][b]&amp;lt;/tex&amp;gt;. Соответствующими значениями таблицы для &amp;lt;tex&amp;gt;\mathrm{merge}&amp;lt;/tex&amp;gt; являются &amp;lt;tex&amp;gt;tm[i-r][1...t]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;tm[r][q...k+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;
* Если &amp;lt;tex&amp;gt;b = k+1&amp;lt;/tex&amp;gt;, то для случая, когда образец расположен относительно текста так, что &amp;lt;tex&amp;gt;x[1]&amp;lt;/tex&amp;gt; совмещен с &amp;lt;tex&amp;gt;y[i+1]&amp;lt;/tex&amp;gt;, обнаружено &amp;lt;tex&amp;gt;k+1&amp;lt;/tex&amp;gt; несовпадение, поэтому из процедуры можно выйти. &lt;br /&gt;
&lt;br /&gt;
* Bспомним, что самая правая из интересующих нас позиций в &amp;lt;tex&amp;gt;\mathrm{merge}&amp;lt;/tex&amp;gt;, а именно, &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;, равна &amp;lt;tex&amp;gt;r+tm[r][k+1]&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;v = k+2&amp;lt;/tex&amp;gt;, поэтому &amp;lt;tex&amp;gt;tm[r][k+1]&amp;lt;/tex&amp;gt; будет уже использовано для предыдущего значения &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, а именно, &amp;lt;tex&amp;gt;v = k+1&amp;lt;/tex&amp;gt;, и поэтому позиция &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; должна быть пропущена. Следовательно, в этом случае также можно выйти из процедуры. &lt;br /&gt;
&lt;br /&gt;
* Процедуру можно прервать, если &amp;lt;tex&amp;gt;i+pm[i-r][u] &amp;gt; j&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;tm[r][v] = m+1&amp;lt;/tex&amp;gt;. Если выполняется вторая часть этого условия, то &amp;lt;tex&amp;gt;r+tm[r][v]&amp;lt;/tex&amp;gt; равняется &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;, и соответствует суммам для последующих значений &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; вплоть до &amp;lt;tex&amp;gt;k+1&amp;lt;/tex&amp;gt;. В этом случае процедура может быть прервана, если выполняется также первая часть приведенного условия, так как она указывает, что позиция текста &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; фактически пропущена.&lt;br /&gt;
&lt;br /&gt;
Остается показать, что число позиций несовпадений в таблице несовпадений образца достаточно для того, чтобы &amp;lt;tex&amp;gt;\mathrm{merge}&amp;lt;/tex&amp;gt; нашла все, или, если их больше &amp;lt;tex&amp;gt;k+1&amp;lt;/tex&amp;gt;, первые &amp;lt;tex&amp;gt;k+1&amp;lt;/tex&amp;gt; несовпадений для &amp;lt;tex&amp;gt;y[i+1...j]&amp;lt;/tex&amp;gt;. Это можно показать следующим образом. ''Условие A'' выполняется не больше чем для &amp;lt;tex&amp;gt;k+1&amp;lt;/tex&amp;gt; позиции текста в диапазоне &amp;lt;tex&amp;gt;y[i+1...j]&amp;lt;/tex&amp;gt;. ''Условие B'' выполняется для некоторого неизвестного числа позиций в этом же интервале. Строка &amp;lt;tex&amp;gt;i-r&amp;lt;/tex&amp;gt; в таблице несовпадений образца, &amp;lt;tex&amp;gt;tm[i-r][1...2k+1]&amp;lt;/tex&amp;gt;, содержит не больше чем &amp;lt;tex&amp;gt;2k+1&amp;lt;/tex&amp;gt; позиций несовпадений между двумя копиями образца, с соответствующим сдвигом &amp;lt;tex&amp;gt;i-r&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;pm[i-r][2k+1] &amp;gt; j - i&amp;lt;/tex&amp;gt;, то таблица содержит все позиции несовпадения образца самим с собой, у которых ''условие B'' выполняется для позиций текста в интервале &amp;lt;tex&amp;gt;y[i+1...j]&amp;lt;/tex&amp;gt;. С другой стороны, если &amp;lt;tex&amp;gt;pm[i-r][2k+1] &amp;lt; j-i&amp;lt;/tex&amp;gt;, то таблица может дать &amp;lt;tex&amp;gt;2k+1&amp;lt;/tex&amp;gt; позиций текста в диапазоне &amp;lt;tex&amp;gt;y[i+1...j-1]&amp;lt;/tex&amp;gt;, для которых выполняется ''условие B''. Поскольку &amp;lt;tex&amp;gt;j = r+tm[r][k+1]&amp;lt;/tex&amp;gt;, в диапазоне &amp;lt;tex&amp;gt;y[i+1...j-1]&amp;lt;/tex&amp;gt; имеется до &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; позиций текста, для которых выполняется ''условие A''. Таким образом, в худшем случае может быть &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; позиций, для которых имеет место ''случай 3'', и которые требуется сравнить напрямую. Остается по крайней мере &amp;lt;tex&amp;gt;k+1&amp;lt;/tex&amp;gt; позиций, удовлетворяющих ''условию B'', но не ''условию A'' (''случай 2''), что является достаточным, чтобы заключить, что для данного положения образца относительно текста имеется не меньше &amp;lt;tex&amp;gt;k+1&amp;lt;/tex&amp;gt; несовпадений между текстом и образцом.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; &lt;br /&gt;
|align=&amp;quot;left&amp;quot; colspan=&amp;quot;4&amp;quot;|&lt;br /&gt;
&amp;lt;font size=2&amp;gt;&lt;br /&gt;
  '''int''' merge(i : '''int''', r : '''int''', j : '''int''')&lt;br /&gt;
    u = 1&lt;br /&gt;
    v = q&lt;br /&gt;
    '''while''' (b &amp;lt; k + 1) '''and''' (v &amp;lt; k + 2) '''and''' (i + pm[i - r][u] &amp;lt; j '''or''' tm[r][v] &amp;lt;tex&amp;gt;\neq&amp;lt;/tex&amp;gt; m + 1)&lt;br /&gt;
      '''if''' i + pm[i - r][u] &amp;gt; r + tm[r][v]  &amp;lt;font color=green&amp;gt;     // Случай 2, условие A &amp;lt;/font&amp;gt;&lt;br /&gt;
        b++&lt;br /&gt;
        tm[i][b] = tm[r][v] - (i - r)&lt;br /&gt;
        v++&lt;br /&gt;
      '''else''' '''if''' i + pm[i - r][u] &amp;lt; r + tm[r][v] &amp;lt;font color=green&amp;gt; // Случай 2, условие B &amp;lt;/font&amp;gt;&lt;br /&gt;
        b++    &lt;br /&gt;
        tm[i][b] = pm[i - r][u]&lt;br /&gt;
        u++&lt;br /&gt;
      '''else'''  '''if''' i + pm[i - r][u] = r + tm[r][v] &amp;lt;font color=green&amp;gt;// Случай 3 &amp;lt;/font&amp;gt;&lt;br /&gt;
        '''if''' x[pm[i - r][u]] &amp;lt;tex&amp;gt;\neq&amp;lt;/tex&amp;gt;  y[i + pm[i - r][u]]&lt;br /&gt;
          b++&lt;br /&gt;
          tm[i][b] = pm[i - r][u]&lt;br /&gt;
      u++&lt;br /&gt;
      v++&lt;br /&gt;
    '''return''' b&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Построение pm===&lt;br /&gt;
&lt;br /&gt;
Теперь осталось только обратиться к вычислению таблицы несовпадений образца на стадии предварительных вычислений. Не теряя общности, можно предположить, что &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; является некоторой степенью &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;. В алгоритме предварительной обработки используется разбиение множества &amp;lt;tex&amp;gt;{1, 2, ... , m-1}&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;m-1&amp;lt;/tex&amp;gt; строк &amp;lt;tex&amp;gt;pm&amp;lt;/tex&amp;gt; на следующие &amp;lt;tex&amp;gt;\log m&amp;lt;/tex&amp;gt; подмножеств:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\{1\}, \{2, 3\}, \{4, 5, 6, 7\}, ... , \{m/2, ... , m-1\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из &amp;lt;tex&amp;gt;\log m&amp;lt;/tex&amp;gt; этапов. На этапе &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;1 \leqslant s &amp;lt; \log m&amp;lt;/tex&amp;gt;, вычисляются строки &amp;lt;tex&amp;gt;pm&amp;lt;/tex&amp;gt; в множестве &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, где множество &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; {{---}} это &amp;lt;tex&amp;gt;\{2^{s-1}, ... , 2^{s}-1\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод, используемый для вычисления этой таблицы, основан на методе, используемом на стадии анализа текста. Рассмотрим алгоритм для этапа &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. На стадии &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; входами для алгоритма анализа образца являются подстроки образца &amp;lt;tex&amp;gt;x[1...m-2^{s-1}]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x[2^{s-1}+1...m]&amp;lt;/tex&amp;gt;, которые трактуются здесь, соответственно, как образец и текст, и массив &amp;lt;tex&amp;gt;pm[1...2^{s-1}-1][1...\min\{2^{\log(m)-s}4k+1, m-2^{s-1}\}]&amp;lt;/tex&amp;gt;, содержащий выходы предыдущих &amp;lt;tex&amp;gt;s - 1&amp;lt;/tex&amp;gt; стадий. Выходы стадии &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; вводятся в &amp;lt;tex&amp;gt;pm&amp;lt;/tex&amp;gt;. За исключением стадии &amp;lt;tex&amp;gt;\log m&amp;lt;/tex&amp;gt;, на которой находят до &amp;lt;tex&amp;gt;2k+1&amp;lt;/tex&amp;gt; несовпадений, на стадии &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; для каждой строки &amp;lt;tex&amp;gt;pm&amp;lt;/tex&amp;gt; требуется найти до &amp;lt;tex&amp;gt;\min\{2^{\log(m)-s}2k+1, m-2^{s}\}&amp;lt;/tex&amp;gt; несовпадений, а не до &amp;lt;tex&amp;gt;k+1&amp;lt;/tex&amp;gt;, как в алгоритме анализа текста.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; &lt;br /&gt;
|align=&amp;quot;left&amp;quot; colspan=&amp;quot;4&amp;quot;|&lt;br /&gt;
&amp;lt;font size=2&amp;gt;&lt;br /&gt;
  '''void''' precalcPm()  &lt;br /&gt;
    pm[&amp;lt;tex&amp;gt;2^{s-1}&amp;lt;/tex&amp;gt;...&amp;lt;tex&amp;gt;2^{s} - 1&amp;lt;/tex&amp;gt;][1...min{&amp;lt;tex&amp;gt;2^{\log (m-1)}2k - 1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;m - 2^{s}&amp;lt;/tex&amp;gt;}] = m + 1&lt;br /&gt;
    r = &amp;lt;tex&amp;gt;2^{s-1}&amp;lt;/tex&amp;gt;&lt;br /&gt;
    j = &amp;lt;tex&amp;gt;2^{s-1}&amp;lt;/tex&amp;gt;&lt;br /&gt;
    '''for''' i = &amp;lt;tex&amp;gt;2^{s-1}&amp;lt;/tex&amp;gt; to &amp;lt;tex&amp;gt;2^{s} - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
      b = 0&lt;br /&gt;
      '''if''' i &amp;lt; j&lt;br /&gt;
        b = merge(i, r, j)&lt;br /&gt;
        '''if''' b &amp;lt; min{&amp;lt;tex&amp;gt;2^{\log(m-1)}2k - 1, m - 2^{s} &amp;lt;/tex&amp;gt;}&lt;br /&gt;
          r = i&lt;br /&gt;
          extend(i, j, b)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Оценка сложности===&lt;br /&gt;
&lt;br /&gt;
Теперь исследуем затраты времени на анализ текста. Если исключить вызовы процедур &amp;lt;tex&amp;gt;\mathrm{merge}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{extend}&amp;lt;/tex&amp;gt;, каждая из &amp;lt;tex&amp;gt;n-m+1&amp;lt;/tex&amp;gt; итераций цикла анализа текста выполняется за фиксированное время, что дает в общей сложности время &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;. Общее число операций, выполняемых процедурой &amp;lt;tex&amp;gt;\mathrm{extend}&amp;lt;/tex&amp;gt; во время вызовов равно &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;, так как она проверяет каждый символ текста не больше одного раза. Процедура &amp;lt;tex&amp;gt;\mathrm{merge}&amp;lt;/tex&amp;gt; при каждом вызове обрабатывает массив &amp;lt;tex&amp;gt;pm[i-r][1...2k+1]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;tm[r][1...k+1]&amp;lt;/tex&amp;gt;, которые в сумме имеют &amp;lt;tex&amp;gt;3k+2&amp;lt;/tex&amp;gt; элементов. Время работы &amp;lt;tex&amp;gt;\mathrm{merge}&amp;lt;/tex&amp;gt; можно рассчитать, соотнеся операции с фиксированным временем с каждым из этих входов, что дает время счета для каждого вызова, равное &amp;lt;tex&amp;gt;O(k)&amp;lt;/tex&amp;gt;. Таким образом, можно видеть, что общее время анализа текста составляет &amp;lt;tex&amp;gt;O(nk)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим построение &amp;lt;tex&amp;gt;pm&amp;lt;/tex&amp;gt;. Используя аргументы, аналогичные применявшимся при проверке корректности процедуры &amp;lt;tex&amp;gt;\mathrm{merge}&amp;lt;/tex&amp;gt;, можно показать, что для нахождения требуемого количества несовпадений на стадии &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; требуется &amp;lt;tex&amp;gt;\min\{2^{\log(m)-s}4k+1, m-2^{s}\}&amp;lt;/tex&amp;gt; позиций, для которых выполняется ''условие B'', и в особом случае, а именно, на стадии &amp;lt;tex&amp;gt;\log m&amp;lt;/tex&amp;gt;, требуется &amp;lt;tex&amp;gt;4k + 1&amp;lt;/tex&amp;gt; таких позиций.&lt;br /&gt;
&lt;br /&gt;
На каждой стадии &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;\log m&amp;lt;/tex&amp;gt; стадий анализа образца цикл &amp;lt;tex&amp;gt;\mathrm{for}&amp;lt;/tex&amp;gt; производит &amp;lt;tex&amp;gt;2^{s-1}&amp;lt;/tex&amp;gt; итераций &amp;lt;tex&amp;gt;(2^{s-1} \leqslant i \leqslant 2^{s}-1)&amp;lt;/tex&amp;gt;. Если не считать время работы процедур &amp;lt;tex&amp;gt;\mathrm{merge}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{extend}&amp;lt;/tex&amp;gt;, каждая итерация требует фиксированного времени. Для всех итераций на шаге &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; процедуре &amp;lt;tex&amp;gt;\mathrm{extend}&amp;lt;/tex&amp;gt; требуется время &amp;lt;tex&amp;gt;O(m)&amp;lt;/tex&amp;gt;. Ранее было показано, что время работы &amp;lt;tex&amp;gt;\mathrm{merge}&amp;lt;/tex&amp;gt; пропорционально числу искомых несовпадений. Таким образом, каждый вызов &amp;lt;tex&amp;gt;\mathrm{merge}&amp;lt;/tex&amp;gt; занимает время &amp;lt;tex&amp;gt;O(\min\{2^{\log(m)-s}4k+1, m-2^{s}\})&amp;lt;/tex&amp;gt;, что равно &amp;lt;tex&amp;gt;O(2k2^{\log (m)-s})&amp;lt;/tex&amp;gt;. Таким образом, общее время для стадии &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; равно &amp;lt;tex&amp;gt;O(m+2^{s-1}(2k2^{\log (m) -s}))&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;O(km)&amp;lt;/tex&amp;gt;. Проведя суммирование по всем стадиям, получаем общее время счета &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\displaystyle \left(\sum_{i=1}^{\log m} km\right) = O(km \log m)&amp;lt;/tex&amp;gt;. Таким образом, общие затраты времени, включающие предварительную обработку образца и анализ текста, равны &amp;lt;tex&amp;gt;O(k(n + m \log m))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Пример==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x = &amp;quot;tram&amp;quot;&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y = &amp;quot;thetrippedtrap&amp;quot;&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;k = 2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;4&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| tm || '''1''' || '''2''' || '''3''' || x[1 &amp;lt;tex&amp;gt;\ldots&amp;lt;/tex&amp;gt; m] || y[i+1 &amp;lt;tex&amp;gt;\ldots&amp;lt;/tex&amp;gt; i+m]&lt;br /&gt;
|-&lt;br /&gt;
| '''0''' ||  2  ||  3  ||  4  || '''t'''ram || '''t'''het&lt;br /&gt;
|-&lt;br /&gt;
| '''1''' ||  1  ||  2  ||  3  ||  tram || hetr&lt;br /&gt;
|-&lt;br /&gt;
| '''2''' ||  1  ||  2  ||  3   || tram || etri&lt;br /&gt;
|-&lt;br /&gt;
| '''3''' ||  3  ||  4  ||  style=&amp;quot;background:#b1b1ff&amp;quot;| 5  || '''tr'''am || '''tr'''ip&lt;br /&gt;
|-&lt;br /&gt;
| '''4''' ||  1  ||  2  ||  3 || tram || ripp&lt;br /&gt;
|-&lt;br /&gt;
| '''5''' ||  1  ||  2  ||  3 || tram || ippe&lt;br /&gt;
|-&lt;br /&gt;
| '''6''' ||  1  ||  2  ||  3  || tram || pped&lt;br /&gt;
|-&lt;br /&gt;
| '''7''' ||  1  ||  2  ||  3  || tram || pedt&lt;br /&gt;
|-&lt;br /&gt;
| '''8''' ||  1  ||  2  ||  3  || tram || edtr&lt;br /&gt;
|-&lt;br /&gt;
| '''9''' ||  1  ||  2  ||  3  || tram || dtra&lt;br /&gt;
|-&lt;br /&gt;
| '''10''' ||  4  || style=&amp;quot;background:#b1b1ff&amp;quot;| 5  || style=&amp;quot;background:#b1b1ff&amp;quot;| 5 || '''tra'''m || '''tra'''p&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;4&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| pm || '''1''' || '''2''' || '''3''' || '''4''' || '''5''' || x[1 &amp;lt;tex&amp;gt;\ldots&amp;lt;/tex&amp;gt; m-i] || x[i+1 &amp;lt;tex&amp;gt;\ldots&amp;lt;/tex&amp;gt; m]&lt;br /&gt;
|-&lt;br /&gt;
| '''1''' ||  1  ||  2  ||  3  || 5  ||  5  || tra || ram&lt;br /&gt;
|-&lt;br /&gt;
| '''2''' ||  1  ||  2  ||  5  || 5  ||  5  || tr || am&lt;br /&gt;
|-&lt;br /&gt;
| '''3''' ||  1  ||  5  ||  5   || 5  ||  5  || t || m&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
* [[Алгоритм Бойера-Мура]]&lt;br /&gt;
* [[Алгоритм Кнута-Морриса-Пратта]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [http://algolist.manual.ru/search/fsearch/k_nesovp.php Алгоритм Ландау-Вишкина {{---}} k несовпадений]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Поиск подстроки в строке]]&lt;br /&gt;
[[Категория: Нечёткий поиск]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D1%8B_%D0%B2_%D1%81%D0%BE%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%BC_%D0%BC%D0%B8%D1%80%D0%B5&amp;diff=83000</id>
		<title>Автоматы в современном мире</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D1%8B_%D0%B2_%D1%81%D0%BE%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%BC_%D0%BC%D0%B8%D1%80%D0%B5&amp;diff=83000"/>
				<updated>2022-09-01T04:04:48Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&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;
{| cellpadding=&amp;quot;1&amp;quot; style=&amp;quot;margin-left: auto; margin-right: auto;&amp;quot;&lt;br /&gt;
|[[Файл:RegExp.png|779px|thumb|regular expression and text size n &amp;lt;tex&amp;gt;a?^na^n&amp;lt;/tex&amp;gt; matching &amp;lt;tex&amp;gt;a^n&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
|}&lt;br /&gt;
Это произошло из-за того, что обычного функционала регулярных выражений зачастую недостаточно, не хватает выразительной мощности. В языках PCRE, Ruby, Python, Perl добавили поддержку обратных ссылок (англ. ''back reference''). Она позволяет связывать ранее найденное сгруппированное выражение в скобках с числом от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;9&amp;lt;/tex&amp;gt;. Например: &amp;lt;tex&amp;gt;\mathtt{(cat|dog)\backslash1}&amp;lt;/tex&amp;gt; найдет &amp;lt;tex&amp;gt;\mathtt{catcat}&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;\mathtt{dogdog}&amp;lt;/tex&amp;gt;, но никак не &amp;lt;tex&amp;gt;\mathtt{catdog}&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;\mathtt{dogcat}&amp;lt;/tex&amp;gt;. Интересно, что с добавлением обратных ссылок регулярные выражения перестаю относиться к классу регулярных языков. К сожалению, лучшая реализация требует экспоненциального времени работы. Приведенная на графике синяя кривая является реализацией построения НКА по регулярному выражению написанная на C, занимающая чуть меньше, чем &amp;lt;tex&amp;gt;400&amp;lt;/tex&amp;gt; строк и описанная в  данной статье&amp;lt;ref&amp;gt;[https://swtch.com/~rsc/regexp/regexp1.html Article: Regular Expression Matching Can Be Simple And Fast]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
=== Построение НКА ===&lt;br /&gt;
Для построения автомата нам нужно построить отдельно части НКА для каждой части выражения, финальным шагом будет соединение всего автомата вместе. Представим НКА как связанный список структур состояний &amp;lt;tex&amp;gt;\mathrm{state}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 '''struct''' state:&lt;br /&gt;
     '''int''' c&lt;br /&gt;
     '''state''' out&lt;br /&gt;
     '''state''' out1&lt;br /&gt;
     '''int''' lastlist&lt;br /&gt;
Каждый &amp;lt;tex&amp;gt;\mathrm{state}&amp;lt;/tex&amp;gt; представляет один из фрагментов НКА, зависящий от символа &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Данная реализация будет поддерживать постфиксную нотацию регулярного выражения. Допустим у нас есть функция &amp;lt;tex&amp;gt;\mathrm{re2post}&amp;lt;/tex&amp;gt;, которая переписывает инфиксную форму регулярного выражения &amp;lt;tex&amp;gt;``a(bb)+a&amp;quot;&amp;lt;/tex&amp;gt; в эквивалентную постфиксную вида &amp;lt;tex&amp;gt;``abb.+.a.&amp;quot;&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;.&amp;lt;/tex&amp;gt; используется в качестве разделителя). По мере сканирования постфиксного выражения, будем поддерживать стек вычисленных НКА фрагментов. Символы добавляют новый НКА фрагмент в стек, а операторы вынимают фрагменты и добавляют новые. Каждый фрагмент определяется стартовым состояние и исходящей стрелкой:&lt;br /&gt;
 '''struct''' frag:&lt;br /&gt;
     '''state''' start&lt;br /&gt;
     '''ptrList''' out&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{start}&amp;lt;/tex&amp;gt; указывает на стартовое состояние фрагмента, а &amp;lt;tex&amp;gt;\mathrm{out}&amp;lt;/tex&amp;gt; {{---}} лист указателей на &amp;lt;tex&amp;gt;\mathrm{state*}&amp;lt;/tex&amp;gt; указатели, которые ещё не соединены. &lt;br /&gt;
Некоторые полезные функции для управления списком указателей:&lt;br /&gt;
 '''fun''' list1('''state''' outp): '''ptrList'''&lt;br /&gt;
 '''fun''' append('''ptrList''' l1, '''ptrList''' l2): '''ptrList'''&lt;br /&gt;
 '''fun''' patch('''ptrList''' l, '''state''' s)&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{list1}&amp;lt;/tex&amp;gt; создает новый список указателей состоящий из одного указателя &amp;lt;tex&amp;gt;\mathrm{outp}&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;\mathrm{append}&amp;lt;/tex&amp;gt; конкатенирует два списка указателей, возвращая результат. &amp;lt;tex&amp;gt;\mathrm{patch}&amp;lt;/tex&amp;gt; связывает повисшую стрелку в списке &amp;lt;tex&amp;gt;\mathrm{l}&amp;lt;/tex&amp;gt; с состоянием &amp;lt;tex&amp;gt;\mathrm{s}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Используя данные примитивы и стек фрагментов можно реализовать построение НКА.&lt;br /&gt;
 '''fun''' post2nfa('''string''' postfix): '''state'''&lt;br /&gt;
     '''frag''' stack[1000], e1, e2, e&lt;br /&gt;
     '''state''' s&lt;br /&gt;
     '''for''' i = 0 '''to''' postfix.length - 1&lt;br /&gt;
         '''switch'''(postfix[i])&lt;br /&gt;
             '''case''' '.': &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;// конкатенация&amp;lt;/span&amp;gt;&lt;br /&gt;
                 e2 = stack.pop()&lt;br /&gt;
                 e1 = stack.pop()&lt;br /&gt;
                 patch(e1.out, e2.start)&lt;br /&gt;
                 push(frag(e1.start, e2.out))&lt;br /&gt;
                 '''break'''&lt;br /&gt;
             '''case''' '|': &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;// альтернатива&amp;lt;/span&amp;gt;&lt;br /&gt;
                 e2 = stack.pop()&lt;br /&gt;
                 e1 = stack.pop()&lt;br /&gt;
                 s = state(Split, e1.start, e2.start)&lt;br /&gt;
                 push(frag(s, append(e1.out, e2.out)))&lt;br /&gt;
                 '''break'''&lt;br /&gt;
             '''case''' '?': &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;// ноль или один&amp;lt;/span&amp;gt;&lt;br /&gt;
                 e = stack.pop()&lt;br /&gt;
                 s = state(Split, e.start, NULL)&lt;br /&gt;
                 push(frag(s, append(e.out, list1(s.out1))))&lt;br /&gt;
                 '''break'''&lt;br /&gt;
             '''case''' '*': &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;// ноль или больше&amp;lt;/span&amp;gt;&lt;br /&gt;
                 e = stack.pop()&lt;br /&gt;
                 s = state(Split, e.start, NULL)&lt;br /&gt;
                 patch(e.out, s)&lt;br /&gt;
                 push(frag(s, list1(s.out1)))&lt;br /&gt;
                 '''break'''&lt;br /&gt;
             '''case''' '+': &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;// один или больше&amp;lt;/span&amp;gt;&lt;br /&gt;
                 e = stack.pop()&lt;br /&gt;
                 s = state(Split, e.start, NULL)&lt;br /&gt;
                 patch(e.out, s)&lt;br /&gt;
                 stack.push(frag(e.start, list1(s.out1)))&lt;br /&gt;
                 '''break'''&lt;br /&gt;
             '''defaul'''t: &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;// символ&amp;lt;/span&amp;gt;&lt;br /&gt;
                 s = state(postfix[i], NULL, NULL)&lt;br /&gt;
                 push(frag(s, list1(s.out))&lt;br /&gt;
                 '''break'''&lt;br /&gt;
     e = stack.pop()&lt;br /&gt;
     patch(e.out, matchState)&lt;br /&gt;
     '''return''' e.start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теперь когда мы построили НКА, нужно научиться ходить по нему. Будем сохранять посещенные состояния в массиве.&lt;br /&gt;
 '''struct''' List:&lt;br /&gt;
     '''state''' s&lt;br /&gt;
     '''int''' n&lt;br /&gt;
&lt;br /&gt;
Обход будет использовать два списка: &amp;lt;tex&amp;gt;\mathrm{cList}&amp;lt;/tex&amp;gt; набор состояний, в которых уже находится, и &amp;lt;tex&amp;gt;\mathrm{nList}&amp;lt;/tex&amp;gt; набор состояний в которых НКА будет после обработки текущего символа. Цикл исполнения инициализирует &amp;lt;tex&amp;gt;\mathrm{cList}&amp;lt;/tex&amp;gt; стартовым состоянием и пошагово проходит.&lt;br /&gt;
 '''fun''' match('''state''' start, '''string''' s): '''int'''&lt;br /&gt;
     '''List''' cList, nList, t&lt;br /&gt;
     '''cList''' = startList(start, l1)&lt;br /&gt;
     '''nList''' = l2&lt;br /&gt;
     '''for''' i = 0 '''to''' s.length - 1&lt;br /&gt;
         step(cList, s[i], nList)&lt;br /&gt;
         t = cList&lt;br /&gt;
         cList = nList&lt;br /&gt;
         nList = t&lt;br /&gt;
     '''return''' isMatch(cList)&lt;br /&gt;
Чтобы избежать преаллокаций на каждой итерации цикла, &amp;lt;tex&amp;gt;\mathrm{match}&amp;lt;/tex&amp;gt; использует два преаллоцированных списка &amp;lt;tex&amp;gt;\mathrm{l1}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{l2}&amp;lt;/tex&amp;gt; как &amp;lt;tex&amp;gt;\mathrm{cList}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{nList}&amp;lt;/tex&amp;gt;, и меняет их на каждом шаге. &lt;br /&gt;
&lt;br /&gt;
Если список последних вершин содержит терминальную вершину, то строка распознана.&lt;br /&gt;
&lt;br /&gt;
 '''fun''' isMatch('''List''' l): '''int'''&lt;br /&gt;
     '''int''' i&lt;br /&gt;
     '''for''' i = 0 '''to''' l.n - 1&lt;br /&gt;
         '''if''' (l.s[i] == matchState)&lt;br /&gt;
         '''return''' 1&lt;br /&gt;
     '''return''' 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{addState}&amp;lt;/tex&amp;gt; добавляет состояние в список, но только если их ещё не было в нем.&lt;br /&gt;
&lt;br /&gt;
 '''fun''' addState('''List''' l, '''state''' s):&lt;br /&gt;
     '''if''' (s == NULL || s.lastlist == listid)&lt;br /&gt;
         '''return'''&lt;br /&gt;
     s.lastlist = listid&lt;br /&gt;
     '''if'''(s.c == split)&lt;br /&gt;
         addState(l, s.out)&lt;br /&gt;
         addState(l, s.out1)&lt;br /&gt;
         '''return'''&lt;br /&gt;
     l.s[l.n++] = s&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{startList}&amp;lt;/tex&amp;gt; создает начальный список состояний и добавляет туда стартовое состояние.&lt;br /&gt;
&lt;br /&gt;
 '''fun''' startList('''state''' s, '''List''' l): '''List'''&lt;br /&gt;
     listid++&lt;br /&gt;
     l.n = 0&lt;br /&gt;
     addState(l, s)&lt;br /&gt;
     '''return''' l&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{step}&amp;lt;/tex&amp;gt; вычисляет по символу, использую список текущих состояний &amp;lt;tex&amp;gt;\mathrm{cList}&amp;lt;/tex&amp;gt; следующий список &amp;lt;tex&amp;gt;\mathrm{nList}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''fun''' step('''List''' client, '''int''' c, '''List''' nList)&lt;br /&gt;
     '''int''' i&lt;br /&gt;
     '''state''' s&lt;br /&gt;
     listid++&lt;br /&gt;
     nList.n = 0&lt;br /&gt;
     '''for''' i = 0 '''to''' cList.n - 1&lt;br /&gt;
         s = cList.s[i]&lt;br /&gt;
         '''if''' (s.c == c)&lt;br /&gt;
             addState(nList, s.out)&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные возможности регулярных выражений ===&lt;br /&gt;
&lt;br /&gt;
==== Символьные классы ==== &lt;br /&gt;
Набор символов в квадратных скобках &amp;lt;tex&amp;gt;[ ]&amp;lt;/tex&amp;gt; именуется символьным классом и позволяет указать интерпретатору регулярных выражений, что на данном месте в строке может стоять один из перечисленных символов. Можно указывать диапазоны &amp;lt;tex&amp;gt;\mathrm{[0-9]}, \mathrm{[a-z]}&amp;lt;/tex&amp;gt;, а также существуют дополнительные символьные классы &amp;lt;tex&amp;gt;\mathtt{[[:upper:]]}, \mathtt{[[:word:]]}&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
==== Квантификация. ====&lt;br /&gt;
Позволяет установить точное соответствие повторов равное числу &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} &amp;lt;tex&amp;gt;{n};&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;{n,m}&amp;lt;/tex&amp;gt; {{---}} не меньше чем &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, и не больше чем &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;{n,}&amp;lt;/tex&amp;gt; {{---}} &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; и больше. Можно найти эквиваленты символам &amp;lt;tex&amp;gt;*, +, ?&amp;lt;/tex&amp;gt;.  С помощью символов &amp;lt;tex&amp;gt;\{ \}&amp;lt;/tex&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;?&amp;lt;/tex&amp;gt;&lt;br /&gt;
| &amp;lt;tex&amp;gt;{0,1}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tex&amp;gt;+&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;
| &amp;lt;tex&amp;gt;*&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;\{ \}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Позиция внутри строки ====&lt;br /&gt;
Следующие символы позволяют с позиционировать регулярное выражение относительно элементов текста: начала и конца строки, границ слова.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Представление&lt;br /&gt;
! Позиция&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt; \wedge &amp;lt;/tex&amp;gt;&lt;br /&gt;
| Начало текста&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;$&amp;lt;/tex&amp;gt;&lt;br /&gt;
| Конец текста&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;\backslash b&amp;lt;/tex&amp;gt;&lt;br /&gt;
| Граница слова&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;\backslash G&amp;lt;/tex&amp;gt;&lt;br /&gt;
| Предыдущий успешный поиск&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Жадная и ленивая квантификация ====&lt;br /&gt;
В некоторых реализациях квантификаторам в регулярных выражениях соответствует максимально длинная строка из возможных (квантификаторы являются жадными, англ. ''greedy''). Это может оказаться значительной проблемой. Например, часто ожидают, что выражение &amp;lt;tex&amp;gt;(&amp;lt;.*&amp;gt;)&amp;lt;/tex&amp;gt; найдёт в тексте теги HTML. Однако если в тексте есть более одного HTML-тега, то этому выражению соответствует целиком строка, содержащая множество тегов.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Жадный&lt;br /&gt;
! Ленивый&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;*&amp;lt;/tex&amp;gt;&lt;br /&gt;
| &amp;lt;tex&amp;gt;*?&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt;&lt;br /&gt;
| &amp;lt;tex&amp;gt;+?&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;\{n,\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
| &amp;lt;tex&amp;gt;\{n,\}?&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Эту проблему можно решить двумя способами.&lt;br /&gt;
&lt;br /&gt;
Учитывать символы, не соответствующие желаемому образцу ( &amp;lt;tex&amp;gt;&amp;lt;[^&amp;gt;]*&amp;gt;&amp;lt;/tex&amp;gt; для вышеописанного случая).&lt;br /&gt;
Определить квантификатор как нежадный (ленивый, англ. ''lazy'') {{---}} большинство реализаций позволяют это сделать, добавив после него знак вопроса.&lt;br /&gt;
&lt;br /&gt;
==== Ревнивая квантификация (Сверхжадная) ====&lt;br /&gt;
В отличие от обычной (жадной) квантификации, ревнивая (англ. ''possessive'') квантификация не только старается найти максимально длинный вариант, но ещё и не позволяет алгоритму возвращаться к предыдущим шагам поиска для того, чтобы найти возможные соответствия для оставшейся части регулярного выражения.&lt;br /&gt;
&lt;br /&gt;
Использование квантификаторов увеличивает скорость поиска, особенно в тех случаях, когда строка не соответствует регулярному выражению. Кроме того, ревнивые квантификаторы могут быть использованы для исключения нежелательных совпадений.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Жадный&lt;br /&gt;
! Ревнивый&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;*&amp;lt;/tex&amp;gt;&lt;br /&gt;
| &amp;lt;tex&amp;gt;*+&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;?&amp;lt;/tex&amp;gt;&lt;br /&gt;
| &amp;lt;tex&amp;gt;?+&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt;&lt;br /&gt;
| &amp;lt;tex&amp;gt;++&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;\{n,\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
| &amp;lt;tex&amp;gt;\{n,\}+&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Несколько полезных оптимизаций на примере Haskell ==&lt;br /&gt;
&lt;br /&gt;
Gabriel Gonzalez &amp;lt;ref&amp;gt;[https://begriffs.com/posts/2016-06-27-fast-haskell-regexes.html Gabriel Gonzalez {{---}} Regex in Haskell]&amp;lt;/ref&amp;gt; реализовал алгоритм Томпсона на языке Haskell. В первоначальном варианте это алгоритм получился в &amp;lt;tex&amp;gt;480&amp;lt;/tex&amp;gt; раз медленнее, чем grep на том же тесте, чтобы улучшить результат он предпринял ряд оптимизаций:&lt;br /&gt;
* вместо &amp;lt;tex&amp;gt;\mathrm{Set Int}&amp;lt;/tex&amp;gt; использовал &amp;lt;tex&amp;gt;\mathrm{Integer}&amp;lt;/tex&amp;gt;, а также использовал битовые операции, в результате производительность выросла в &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt; раз&lt;br /&gt;
* использовал &amp;lt;tex&amp;gt;\mathrm{Word}&amp;lt;/tex&amp;gt; вместо &amp;lt;tex&amp;gt;\mathrm{Integer}&amp;lt;/tex&amp;gt;, ещё в &amp;lt;tex&amp;gt;8&amp;lt;/tex&amp;gt; раз быстрее&lt;br /&gt;
* а также использовал &amp;lt;tex&amp;gt;\mathrm{ByteString}&amp;lt;/tex&amp;gt; оптимизации, что увеличило производительность ещё &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; раза.&lt;br /&gt;
В итоге его реализация оказалась всего в &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; раза медленнее grep. Но это не предел, у него получилось реализовать  параллельный конечный автомат&amp;lt;ref&amp;gt;[https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/asplos302-mytkowicz.pdf Data-Parallel Finite-State Machines]&amp;lt;/ref&amp;gt; и сделать свою реализацию в &amp;lt;tex&amp;gt;1.5&amp;lt;/tex&amp;gt; раза быстрее, чем grep.&lt;br /&gt;
&lt;br /&gt;
== ReDoS (regular expression denial of service) ==&lt;br /&gt;
Интересно, что злоумышленники научились атаковать системы используя то, что некоторые алгоритмы имеют экспоненциальную сложность. В регулярных выражениях использующих обратную связь есть несколько вариантов:&lt;br /&gt;
* использовать повторение &amp;lt;tex&amp;gt;(``+&amp;quot;,``*&amp;quot;)&amp;lt;/tex&amp;gt; для достаточно сложных подвыражений;&lt;br /&gt;
* сделать так, чтобы повторяющиеся подвыражения были суффиксами валидного совпадения.&lt;br /&gt;
Примеры вредоносных регулярных выражений:&lt;br /&gt;
* &amp;lt;tex&amp;gt;(a+)+&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;([a-zA-Z]+)*&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;(a|aa)+&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;(a|a?)+&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;(.*a)\{11,\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
Все эти выражения чувствительны к входной строке &amp;lt;tex&amp;gt;aaaaaaaaaaaaaaaaaaaaaaaaaa&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Также вредоносные регулярные выражения были обнаружены в онлайн репозиториях.&lt;br /&gt;
# RegExLib, email validation &amp;lt;ref&amp;gt;[http://regexlib.com/REDetails.aspx?regexp_id=1757 RegEx for email validation]&amp;lt;/ref&amp;gt; {{---}} '''выделенная''' часть является вредоносной&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;^([a-zA-Z0-9])'''(([\-.]|[_]+)?([a-zA-Z0-9]+))*'''(@){1}[a-z0-9]+[.]{1}(([a-z]{2,3})|([a-z]{2,3}[.]{1}[a-z]{2,3}))$&amp;lt;/code&amp;gt;&lt;br /&gt;
# OWASP Validation Regex Repository  &amp;lt;ref&amp;gt;[http://www.owasp.org/index.php/OWASP_Validation_Regex_Repository OWASP Validation Regex Repository]&amp;lt;/ref&amp;gt;, Java Classname {{---}} '''выделенная''' часть является вредоносной&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;^'''(([a-z])+.)+'''[A-Z]([a-z])+$&amp;lt;/code&amp;gt;&lt;br /&gt;
Эти два примера также чувствительны к входной строке &amp;lt;tex&amp;gt;aaaaaaaaaaaaaaaaaaaaaaaa&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[ Регулярные языки: два определения и их эквивалентность ]]&lt;br /&gt;
* [[ Недетерминированные конечные автоматы ]]&lt;br /&gt;
* [[ Детерминированные конечные автоматы ]]&lt;br /&gt;
* [[ Построение по НКА эквивалентного ДКА, алгоритм Томпсона ]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
&lt;br /&gt;
* [https://swtch.com/~rsc/regexp/regexp1.html  Regular Expression Matching Can Be Simple And Fast]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/ReDoS ReDos]&lt;br /&gt;
* [https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/asplos302-mytkowicz.pdf Data-Parallel Finite-state Machines]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Автоматы и регулярные языки]]&lt;br /&gt;
[[Категория: Контекстно-свободные грамматики]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D1%83%D0%BC_%D0%BF%D0%BE_%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D1%83_%D0%B7%D0%B0_1_%D1%81%D0%B5%D0%BC%D0%B5%D1%81%D1%82%D1%80&amp;diff=82999</id>
		<title>Теоретический минимум по математическому анализу за 1 семестр</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%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D1%83%D0%BC_%D0%BF%D0%BE_%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D1%83_%D0%B7%D0%B0_1_%D1%81%D0%B5%D0%BC%D0%B5%D1%81%D1%82%D1%80&amp;diff=82999"/>
				<updated>2022-09-01T04:04:29Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
1. Аксиома непрерывности в множестве вещественных чисел, точные грани числовых&lt;br /&gt;
множеств.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;A &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B &amp;lt;/tex&amp;gt; &amp;amp;mdash; 2 произвольных подмножества из пополненного множества рациональных чисел, и &amp;lt;tex&amp;gt; A \le B &amp;lt;/tex&amp;gt;, то в пополненном множестве &amp;lt;tex&amp;gt; \exists d: A \le d \le B &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Принцип вложенных отрезков.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Пусть дана система отрезков: &amp;lt;tex&amp;gt; a_n \le b_n, \Delta_n = [a_n, b_n] &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \forall n \in \mathbb N: \Delta_{n+1} \subset \Delta_n &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда эта система отрезков называется '''вложенной'''.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
3. Определение предела последовательности.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Число &amp;lt;tex&amp;gt; a \in \mathbb R &amp;lt;/tex&amp;gt; называется '''пределом последовательности''' &amp;lt;tex&amp;gt; a_n &amp;lt;/tex&amp;gt;, если:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \forall \varepsilon &amp;gt; 0, \exists n_0 \in \mathbb N: \forall n &amp;gt; n_0: |a_n - a| &amp;lt; \varepsilon &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Записывают: &amp;lt;tex&amp;gt; a = \lim\limits_{n \rightarrow \infty} a_n &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
4. Теорема Вейерштрасса о монотонных последовательностях.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id = thWeier&lt;br /&gt;
|author=Вейерштрасс&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; a_n \uparrow &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; a_n &amp;lt;/tex&amp;gt; ограничена сверху. Тогда она сходится. (Аналогично, если &amp;lt;tex&amp;gt; a_n \downarrow &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; a_n &amp;lt;/tex&amp;gt; {{---}} ограничена снизу).}}&lt;br /&gt;
&lt;br /&gt;
5. Число е.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \exists \lim\limits_{n \rightarrow \infty} (1 + \frac 1n)^n &amp;lt;/tex&amp;gt;. Его обозначают числом &amp;lt;tex&amp;gt; e &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Теорема Больцано-Вейерштрасса.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id = thBolzano&lt;br /&gt;
|author=Больцано&lt;br /&gt;
|statement=Из любой ограниченной последовательности можно выделить сходящуюся подпоследовательность}}&lt;br /&gt;
&lt;br /&gt;
7. Теорема Коши о сходящихся в себе последовательностях.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id = thCauchy&lt;br /&gt;
|author=Коши&lt;br /&gt;
|statement=Если числовая последовательность сходится в себе, то она сходится.}}&lt;br /&gt;
&lt;br /&gt;
8. Определение МП, открытые и замкнутые множества в МП.&lt;br /&gt;
&lt;br /&gt;
Если на &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; определена метрика, то пара &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt; называется ''метрическим пространством'', аббревиатура {{---}} ''МП''.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; (X, \rho) &amp;lt;/tex&amp;gt; {{---}} метрическое пространство, пусть &amp;lt;tex&amp;gt;\ \ r \in \mathbb{R},\ r &amp;gt; 0,\ a \in X &amp;lt;/tex&amp;gt;, тогда открытый шар радиуса&lt;br /&gt;
&amp;lt;tex&amp;gt;\ r\ &amp;lt;/tex&amp;gt; в точке  &amp;lt;tex&amp;gt;\ a\ &amp;lt;/tex&amp;gt; {{---}} это множество  &amp;lt;tex&amp;gt; V_r(a) = \{x \in X| \rho(x, a) &amp;lt; r \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Множество &amp;lt;tex&amp;gt; G \subset X &amp;lt;/tex&amp;gt; называется открытым в метрическом пространстве, если его можно записать как некоторое объединение открытых шаров (в общем случае объединение может состоять из несчетного числа шаров).&lt;br /&gt;
: &amp;lt;tex&amp;gt; \tau &amp;lt;/tex&amp;gt; &amp;amp;mdash; класс открытых множеств. &lt;br /&gt;
: &amp;lt;tex&amp;gt; \tau = \{ G &amp;lt;/tex&amp;gt; {{---}} открытые в МП &amp;lt;tex&amp;gt;(X, \rho) \}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Множество &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; называется замкнутым в МП&amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt; \overline F = X \backslash F &amp;lt;/tex&amp;gt; {{---}} открыто.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
9. Компакты в МП, теорема Хаусдорфа.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Множество ''ограниченное'', если его можно поместить в шар.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; (X, \rho) &amp;lt;/tex&amp;gt; {{---}} МП. &amp;lt;tex&amp;gt; K \in X &amp;lt;/tex&amp;gt; является '''компактом''' в X, если из любой последовательности точек принадлежащих K можно выделить сходящуюся подпоследовательность &amp;lt;tex&amp;gt; x_n: \lim x_n \in K &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement = Легко видеть что если K {{---}} компакт, то оно ограниченное, замкнутое. Обратное в общем случае не верно.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=Хаусдорф&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;{{---}} полное метрическое пространство, &amp;lt;tex&amp;gt;K \subset X&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; {{---}} замкнуто. &lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; {{---}} компакт &amp;lt;tex&amp;gt;\iff&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;
10. Предел отображения в МП.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt; x_n \rightarrow x &amp;lt;/tex&amp;gt; в МП &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt;, если:&lt;br /&gt;
# &amp;lt;tex&amp;gt;\ \lim\limits_{n \rightarrow \infty} \rho(x_n, x) = 0\ &amp;lt;/tex&amp;gt; , или&lt;br /&gt;
# &amp;lt;tex&amp;gt;\forall \varepsilon &amp;gt; 0, \exists N \in \mathbb{N}, \forall n &amp;gt; N \Rightarrow \rho(x_n, x) &amp;lt; \varepsilon &amp;lt;/tex&amp;gt;&lt;br /&gt;
: или&lt;br /&gt;
: &amp;lt;tex&amp;gt;\forall \varepsilon &amp;gt; 0, \exists N \in \mathbb{N}, \forall n &amp;gt; N: x_n \in V_\varepsilon(x)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; V_\varepsilon(x) = \{ y: \rho(y, x) &amp;lt; \varepsilon \} &amp;lt;/tex&amp;gt;, то есть открытый шар радиуса &amp;lt;tex&amp;gt;\ \varepsilon&amp;lt;/tex&amp;gt; с центром в точке &amp;lt;tex&amp;gt;\ x&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = &lt;br /&gt;
Пусть даны два метрических пространства &amp;lt;tex&amp;gt; (X,\rho) &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; (Y, \tilde \rho) &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; A \subset X&amp;lt;/tex&amp;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; f: A \rightarrow Y &amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Тогда &amp;lt;tex&amp;gt; b = \lim\limits_{x \rightarrow a} f(x), b \in Y&amp;lt;/tex&amp;gt; , если &amp;lt;tex&amp;gt;\forall \varepsilon &amp;gt; 0 \, \exists \delta &amp;gt; 0: 0 &amp;lt; \rho(x, a) &amp;lt; \delta \Rightarrow \tilde \rho(f(x), b) &amp;lt; \varepsilon &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
11. Теорема Кантора о равномерной непрерывности.&lt;br /&gt;
&lt;br /&gt;
Равномерная непрерывность - &amp;lt;tex&amp;gt; \forall \varepsilon &amp;gt;0 \exists \delta &amp;gt; 0 \forall x_1, x_2 \in X: | x_1 - x_2| &amp;lt; \delta : |f(x_1) - f(x_2)| &amp;lt; \varepsilon &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=&lt;br /&gt;
Кантор&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть даны МП &amp;lt;tex&amp;gt; (X, \rho), (Y, \rho)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; K \subset X&amp;lt;/tex&amp;gt; - компакт, &amp;lt;tex&amp;gt; f: K \rightarrow Y &amp;lt;/tex&amp;gt; - непрерывное отображение. Тогда &amp;lt;tex&amp;gt; f &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;
12. Теорема Вейерштрасса об экстремумах.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=&lt;br /&gt;
Вейерштрасс&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; f: K \rightarrow \mathbb R &amp;lt;/tex&amp;gt; {{---}} непрерывная функция на компакте &amp;lt;tex&amp;gt; K &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда существуют такие &amp;lt;tex&amp;gt; x_1, x_2 &amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt; f(x_1) = \inf\limits_{K}f, f(x_2) = \sup\limits_{K}f &amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
13. Теорема Коши о промежуточных значениях.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=&lt;br /&gt;
Коши&lt;br /&gt;
|about=&lt;br /&gt;
о промежуточных значениях функции&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; f: \mathbb R \rightarrow \mathbb R &amp;lt;/tex&amp;gt; {{---}} непрерывная функция на &amp;lt;tex&amp;gt; [a; b], f(a) = A, f(b) = B&amp;lt;/tex&amp;gt;, для определенности считаем, что &amp;lt;tex&amp;gt; A &amp;lt; B &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt; \forall D: A &amp;lt; D &amp;lt; B\ \exists d \in (a; b): f(d) = D &amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
14. Определение дифференциала и производной, критерий дифференцируемости.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; {{---}} '''дифференцируема''' в точке &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;\Delta y = A(x) \Delta x + o(\Delta x)&amp;lt;/tex&amp;gt;, где &lt;br /&gt;
&amp;lt;tex&amp;gt;o(\Delta x)&amp;lt;/tex&amp;gt; {{---}} такая величина, что &amp;lt;tex&amp;gt;\frac{o(\Delta x)}{\Delta x} \to 0&amp;lt;/tex&amp;gt; при &amp;lt;tex&amp;gt;\Delta x \to 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;A(x)\Delta x&amp;lt;/tex&amp;gt; называют '''дифференциалом''' в точке &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Также обозначают &amp;lt;tex&amp;gt;A(x) \Delta x = df(x, \Delta x) = dy&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Функция дифференцируема &amp;lt;tex&amp;gt;\iff \, \exists \lim\limits_{\Delta x \to 0} \frac{\Delta y}{\Delta x} = A(x)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Если функция дифференцируема, то &amp;lt;tex&amp;gt;\frac{\Delta y}{\Delta x} = A(x) + \frac{o(\Delta x)}{\Delta x}&amp;lt;/tex&amp;gt;, &lt;br /&gt;
где &amp;lt;tex&amp;gt;\frac{o(\Delta x)}{\Delta x}&amp;lt;/tex&amp;gt; {{---}}  бесконечно малая.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;f'(x) = \lim\limits_{\Delta x \to 0} \frac{\Delta y}{\Delta x}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
15. Производная сложной функции.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
Дифференцирование сложной функции&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;y = f(x)&amp;lt;/tex&amp;gt; дифференцируема в точке &amp;lt;tex&amp;gt;x_0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y_0 = f(x_0)&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;z = g(y)&amp;lt;/tex&amp;gt; дифференцируема в &amp;lt;tex&amp;gt;y_0&amp;lt;/tex&amp;gt;. Тогда в некоторой окрестности &amp;lt;tex&amp;gt;x_0&amp;lt;/tex&amp;gt; корректно определена сложная функция &amp;lt;tex&amp;gt;z = g(f(x))&amp;lt;/tex&amp;gt; и её производная равна &amp;lt;tex&amp;gt;z' = g'(y_0)f'(x_0)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
16. Теорема Ферма о значении производной в экстремальной точке.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=&lt;br /&gt;
Ферма&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; f(x) &amp;lt;/tex&amp;gt; существует и дифференцируема в &amp;lt;tex&amp;gt; O(x_0) &amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt; x_0 &amp;lt;/tex&amp;gt; {{---}} точка локального экстремума. Тогда &amp;lt;tex&amp;gt; f'(x_0) = 0.&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
17. Теорема Ролля о нулях производной.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=&lt;br /&gt;
Ролль&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; f(x) &amp;lt;/tex&amp;gt; непрерывна на &amp;lt;tex&amp;gt; [a; b] &amp;lt;/tex&amp;gt;, дифференцируема на &amp;lt;tex&amp;gt;(a, b)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;f(a) = f(b)&amp;lt;/tex&amp;gt;. Тогда существует точка &amp;lt;tex&amp;gt; c \in (a; b)&amp;lt;/tex&amp;gt;, такая, что &amp;lt;tex&amp;gt; f'(c) = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
18. Формула конечных приращений Лагранжа.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=&lt;br /&gt;
Лагранж&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; f &amp;lt;/tex&amp;gt; непрерывна на &amp;lt;tex&amp;gt; [a; b] &amp;lt;/tex&amp;gt; и дифференцируема на &amp;lt;tex&amp;gt; (a; b) &amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt; \exists c \in (a; b): &amp;lt;/tex&amp;gt; &amp;lt;tex dpi = '150'&amp;gt; \frac{f(b) - f(a)}{b - a} &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; = f'(c) &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
19. Правило Лопиталя раскрытия неопределенностей.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=&lt;br /&gt;
правило Лопиталя&lt;br /&gt;
|statement=&lt;br /&gt;
Если при &amp;lt;tex&amp;gt;x \rightarrow a&amp;lt;/tex&amp;gt; &amp;lt;tex dpi = '150'&amp;gt;\frac{f(x)}{g(x)} = \frac{0}{0} &amp;lt;/tex&amp;gt;, то &amp;lt;tex dpi = '150'&amp;gt; \lim\limits_{x \rightarrow a} \frac{f(x)}{g(x)} = \lim\limits_{x \rightarrow a} \frac{f'(x)}{g'(x)} &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
20. Формула Тейлора с остатком Лагранжа.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
Лагранж&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;n + 1&amp;lt;/tex&amp;gt; раз дифференцируема в окрестности точки &amp;lt;tex&amp;gt;x_0&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Тогда &amp;lt;tex dpi=140&amp;gt;\forall x \in V(x_0)\ \exists c_x \in (x_0; x) \cup (x; x_0) \ : f(x)&amp;lt;/tex&amp;gt; &amp;lt;tex dpi=140&amp;gt;= \sum\limits_{k = 0}^{n} \frac{f^{(k)}(x_0)}{k!}(x - x_0)^k + &lt;br /&gt;
\frac{f^{(n + 1)}(c_x)}{(n + 1)!} (x - x_0)^{n + 1}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;c_x = x_0 + \Theta(x - x_0), \quad \Theta \in (0; 1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(x)&amp;lt;/tex&amp;gt; {{---}} формула Тейлора с остатком по Лагранжу.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
21. Интерполяционная формула Лагранжа и ее остаток.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Фундаментальные полиномы &amp;lt;tex&amp;gt;\Phi_j(x)&amp;lt;/tex&amp;gt; степени не выше &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; &amp;amp;mdash; полиномы, отвечающие заданной &lt;br /&gt;
системе узлов &amp;lt;tex&amp;gt;x_0 &amp;lt; x_1 &amp;lt; x_2 &amp;lt;\ldots &amp;lt; x_n&amp;lt;/tex&amp;gt; такие, что&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
\Phi_j(x_k) = \left\{&lt;br /&gt;
	\begin{aligned}&lt;br /&gt;
		1 &amp;amp; ,\quad k = j\\&lt;br /&gt;
		0 &amp;amp; ,\quad k \ne j\\&lt;br /&gt;
	\end{aligned}\right.&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для его построения обозначим за &amp;lt;tex&amp;gt;\omega_n(x) = \prod\limits_{j = 0}^n (x - x_j)&amp;lt;/tex&amp;gt;. Это полином степени &amp;lt;tex&amp;gt;n + 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt;L_n(x) = \sum\limits_{j = 0}^n y_j \Phi_j(x)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;L_n(x_k) = \sum\limits_{j = 0}^n y_j \Phi_j(x_k) = y_k \Phi_k(x_k) = y_k&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
Лагранжа&lt;br /&gt;
|statement= &lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;n + 1&amp;lt;/tex&amp;gt; раз дифференцируема на &amp;lt;tex&amp;gt;\langle a; b\rangle&amp;lt;/tex&amp;gt;. На этом промежутке задана система узлов.&lt;br /&gt;
Тогда для соответственного интерполяционного полинома Лагранжа выполняется равенство&lt;br /&gt;
&amp;lt;tex&amp;gt;f(x) = L_n(x) + \frac{f^{(n + 1)}(c_x)}{(n+1)!} \cdot \omega_n(x)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;c_x&amp;lt;/tex&amp;gt; &amp;amp;mdash; некоторая точка из &amp;lt;tex&amp;gt;\langle a; b \rangle&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;
22. Определение выпуклой функции, неравенство Иенсена.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Пусть [[Отображения|функция]] &amp;lt;tex&amp;gt;f(x)&amp;lt;/tex&amp;gt; задана на &amp;lt;tex&amp;gt;[a; b]&amp;lt;/tex&amp;gt;. Тогда она выпукла вверх на этом отрезке, если &lt;br /&gt;
&amp;lt;tex&amp;gt;\forall x_1, x_2 \in [a; b] \forall \alpha \in [0; 1] \quad \alpha f(x_1) + (1 - \alpha) f(x_2) \leq f(\alpha x_1 + (1 - \alpha)x_2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Если же всё время неравенство противоположно, то функция называется выпуклой вниз.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
В силу того, что было сказано о выпуклой комбинации, определение корректно: &amp;lt;tex&amp;gt;\alpha x_1 + (1 - \alpha)x_2 \in [a; b]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Геометрической смысл этого факта состоит в том, что для выпуклой вверх функции её график будет лежать выше хорды.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
Неравенство Йенсена&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;f(x)&amp;lt;/tex&amp;gt; выпукла вверх на &amp;lt;tex&amp;gt;[a; b]&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\forall x_1, x_2 \ldots x_n \in [a; b]&amp;lt;/tex&amp;gt; и их выпуклой комбинации выполнено неравенство&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{k = 1}^n \alpha_k f(x_k) \leq f\left(\sum\limits_{k = 1}^n \alpha_k x_k\right)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
23. Неравенство Гельдера для сумм.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
Гёльдера&lt;br /&gt;
|statement= &lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;a_1, a_2 \ldots a_n, b_1, b_2 \ldots b_n &amp;gt; 0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;p &amp;gt; 1&amp;lt;/tex&amp;gt;, &amp;lt;tex dpi = &amp;quot;150&amp;quot;&amp;gt;\frac1p + \frac1q = 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
Тогда &lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
\sum\limits_{k=1}^n a_k b_k \leq &lt;br /&gt;
\left(\sum\limits_{k = 1}^n a_k^p \right)^{1/p}&lt;br /&gt;
\left(\sum\limits_{k = 1}^n b_k^q \right)^{1/q}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
24. Неравенство Минковского для сумм.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
Минковского&lt;br /&gt;
|statement= &lt;br /&gt;
Пусть снова &amp;lt;tex&amp;gt;a_1; a_2 \ldots a_n &amp;gt; 0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;b_1; b_2 \ldots b_n &amp;gt; 0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;p \ge 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
\left(\sum\limits_{k = 1}^n (a_k + b_k)^p \right)^{1/p} \leq &lt;br /&gt;
\left(\sum\limits_{k = 1}^n a_k^p\right)^{1/p} + \left(\sum\limits_{k = 1}^n b_k^p\right)^{1/p}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
25. Теорема о выпуклом модуле непрерывности.&lt;br /&gt;
&lt;br /&gt;
Класс модулей непрерывности обозначим &amp;lt;tex&amp;gt;\Omega&amp;lt;/tex&amp;gt;. Класс выпуклых вверх модулей непрерывности обозначим &amp;lt;tex&amp;gt;\Omega^*&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть имеется семейство выпуклых функций &amp;lt;tex&amp;gt;F_\alpha(t), \alpha \in A&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;f(t) = \inf\limits_{\alpha \in A} f_{\alpha} (t)&amp;lt;/tex&amp;gt; &amp;amp;mdash; также выпуклая функция.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
о выпуклом модуле непрерывности&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\omega \in \Omega&amp;lt;/tex&amp;gt;. Тогда существует &amp;lt;tex&amp;gt;\omega^* \in \Omega^*&amp;lt;/tex&amp;gt; такая, что &amp;lt;tex&amp;gt;\forall \lambda, t \ge 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
:&amp;lt;tex&amp;gt;\omega(\lambda t) \le \omega^* (\lambda t) \le (1 + \lambda) \cdot \omega(t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
26. Полиномы и теорема Бернштейна.&lt;br /&gt;
&lt;br /&gt;
Существует ли &amp;lt;tex&amp;gt;\forall \varepsilon &amp;gt; 0&amp;lt;/tex&amp;gt; некоторый полином &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; (неважно, какой степени) такой, что &amp;lt;tex&amp;gt;\forall x \in [a; b]: \  |f(x) - P(x)| &amp;lt; \varepsilon&amp;lt;/tex&amp;gt;?&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=&lt;br /&gt;
Бернштейн&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть функция &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; - непрерывна на &amp;lt;tex&amp;gt;[0; 1]&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\forall \varepsilon &amp;gt; 0 \ \exists P(x)&amp;lt;/tex&amp;gt; - полином, такой, что &amp;lt;tex&amp;gt;\forall x \in [0; 1] \Rightarrow |f(x) - P(x)| &amp;lt; \varepsilon&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=&lt;br /&gt;
Вейерштрасс&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть функция &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; непрерывна на отрезке &amp;lt;tex&amp;gt;[a; b]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;\forall \varepsilon &amp;gt; 0\ \exists P \forall x \in [0; 1]: |f(x) - P(f, x)|  \le \varepsilon&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
27. Неопределенный интеграл: линейность, замена переменной интегрирования,&lt;br /&gt;
формула интегрирования по частям.&lt;br /&gt;
&lt;br /&gt;
Линейность - интеграл суммы функций, произведения на число.&lt;br /&gt;
&lt;br /&gt;
Пусть имеется [[Отображения|функция]] &amp;lt;tex&amp;gt;y = f(x)&amp;lt;/tex&amp;gt;, заданная на &amp;lt;tex&amp;gt;[a; b]&amp;lt;/tex&amp;gt;. Требуется найти функцию &amp;lt;tex&amp;gt;F(x)&amp;lt;/tex&amp;gt;, такую, что &amp;lt;tex&amp;gt;F'(x) = f(x) \forall x \in [a; b]&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;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;F_1' = f, F_2' = f&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;F_2 = F_1 + \mathrm{const}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;g(x) = F_2(x) - F_1(x)&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;F_1, F_2&amp;lt;/tex&amp;gt; непрерывны, следовательно, непрерывна и &amp;lt;tex&amp;gt;g&amp;lt;/tex&amp;gt;, и можно применить теорему Лагранжа:&lt;br /&gt;
:&amp;lt;tex&amp;gt;g(x_2) - g(x_1) = g'(c)(x_2 - x_1)&amp;lt;/tex&amp;gt;, но &amp;lt;tex&amp;gt;g' = F_2' - F_1' = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, &amp;lt;tex&amp;gt;g(x_2) = g(x_1) \forall x_1, x_2 \in [a; b]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; задана на &amp;lt;tex&amp;gt;[a; b]&amp;lt;/tex&amp;gt;. Тогда совокупность всех её первообразных называется неопределённым интегралом и записывается:&lt;br /&gt;
:&amp;lt;tex&amp;gt;\int f(x)dx = \{F(x) + C, F' = f, c \in \mathbb R\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Интегрирование по частям - &amp;lt;tex&amp;gt;\int udv = uv - \int vdu&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Формула подстановки&lt;br /&gt;
: &amp;lt;tex&amp;gt; F(x) = \int f(x)dx &amp;lt;/tex&amp;gt;&lt;br /&gt;
: &amp;lt;tex&amp;gt; x = \varphi(t) &amp;lt;/tex&amp;gt;&lt;br /&gt;
: &amp;lt;tex&amp;gt; F(x) = \int f(\varphi(t)) \varphi'(t) dt &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
28. Интегральные суммы Римана, необходимое условие интегрируемости.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\overline{x_k}&amp;lt;/tex&amp;gt; {{---}} произвольное &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;\left [ x_k,x_{k+1} \right ]&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; {{---}} функция, заданная на отрезке &amp;lt;tex&amp;gt;[a; b]&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; {{---}} разбиение отрезка &amp;lt;tex&amp;gt;[a; b]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;\sigma \left ( f, \tau, \left \{ \overline{x_k} \right \} \right )&amp;lt;/tex&amp;gt;&lt;br /&gt;
(также обозначается как &amp;lt;tex&amp;gt;\sigma \left ( f, \tau \right )&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;\sigma \left ( \tau \right )&amp;lt;/tex&amp;gt;)&lt;br /&gt;
&amp;lt;tex&amp;gt;~= \sum\limits_{k=0}^{n-1}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;f \left ( \overline{x_k} \right )\cdot\Delta_{k}&amp;lt;/tex&amp;gt;&lt;br /&gt;
называется '''интегральной суммой Римана''' по разбиению &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Необхомдимое условие интегрируемости - функция является ограниченной.&lt;br /&gt;
&lt;br /&gt;
29. Критерий интегрируемости по Риману.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\omega(f, \tau) = \overline{s}(\tau) - \underline{s}(\tau) = \sum\limits_{k = 0}^{n - 1} (M_k - m_k)\Delta x_k \ge 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\lim\limits_{\operatorname{rang} \tau \to 0} \omega(f, \tau) \to 0 \Rightarrow&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\forall \varepsilon &amp;gt; 0\ \exists \delta &amp;gt; 0 : \ \operatorname{rang} \tau &amp;lt; \delta \Rightarrow \omega(f, \tau) &amp;lt; \varepsilon&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Определим &amp;lt;tex&amp;gt;\underline{I} = \sup\limits_{\{\tau\}} \underline{s}(\tau)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&amp;lt;tex&amp;gt;\overline{I} = \inf\limits_{\{\tau\}} \overline{s}(\tau)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;I = \lim\limits_{\operatorname{rang} \tau \to 0} \sigma(\tau)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
Критерий интегрируемости&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;f \in \mathcal{R}(a; b) \iff \lim\limits_{\operatorname{rang} \tau \to 0} \omega(f, \tau) = 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
30. Теорема Барроу.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Объектом исследования этого параграфа является &amp;lt;tex&amp;gt;F(x) = \int\limits_a^x f(t) dt&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;f \in \mathcal{R}(a, b)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;x \in [a, b]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Такая функция называется ''интегралом с переменным верхним пределом'&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=Барроу&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;f \in \mathcal{R}(a, b)&amp;lt;/tex&amp;gt; и непрерывна в &amp;lt;tex&amp;gt;x_0 \in (a; b)&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_0) = f(x_0)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
31. Формула Ньютона-Лейбница.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=формула Ньютона-Лейбница&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; дифференцируема на &amp;lt;tex&amp;gt;[a; b]&amp;lt;/tex&amp;gt;, её производная &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; интегрируема на этом же отрезке. Тогда &lt;br /&gt;
&amp;lt;tex&amp;gt;F(b) - F(a) = \int\limits_a^b f(x) dx&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
32. Критерий сходимости несобственных интегралов.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;F(A) = \int\limits_a^A f(x) dx&amp;lt;/tex&amp;gt;. Применяя критерий Коши существования предела функции, приходим к критерию Коши сходимости несобственного интеграла:&lt;br /&gt;
&amp;lt;tex&amp;gt;\int\limits_a^{+\infty}&amp;lt;/tex&amp;gt; сходится &amp;lt;tex&amp;gt;\iff \lim\limits_{A, B \to +\infty} \int\limits_A^B f(x)dx = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
33. Остаток формулы Тейлора в интегральной форме.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть в окрестности точки &amp;lt;tex&amp;gt;x_0&amp;lt;/tex&amp;gt; функция &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;n + 1&amp;lt;/tex&amp;gt; раз дифференцируема и её &amp;lt;tex&amp;gt;(n + 1)&amp;lt;/tex&amp;gt;-я производная интегрируема. Тогда в окрестности точки &amp;lt;tex&amp;gt;x_0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;f(x) = \sum\limits_{k = 0}^n \frac{f^{(k)} (x_0)}{k!}(x - x_0)^k + \frac1{n!} \int\limits_{x_0}^x f^{(n + 1)}(t) (x-t)^n dt&amp;lt;/tex&amp;gt;. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
34. Определение суммы числового ряда. Необходимый признак и критерий Коши сходимости ряда.&lt;br /&gt;
&lt;br /&gt;
Классический способ суммирования:&lt;br /&gt;
&amp;lt;tex&amp;gt;S_n = \sum\limits_{k = 1}^n a_k&amp;lt;/tex&amp;gt; {{---}} частичные суммы ряда.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;\lim\limits_{n\to\infty} S_n&amp;lt;/tex&amp;gt; {{---}} сумма числового ряда. Если этот предел существует и конечен, то ряд называют сходящимся, иначе {{---}} расходящийся.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Если ряд сходится, то его слагаемые необходимо стремятся к нулю. Однако, это требование лишь необходимое&lt;br /&gt;
|proof=&lt;br /&gt;
Переписывая на языке частичных сумм критерий Коши существования предела последовательности, приходим к критерию Коши сходимости ряда:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{k = 1}^\infty a_k&amp;lt;/tex&amp;gt; {{---}} сходится &amp;lt;tex&amp;gt;\iff&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\sum\limits_{k = n}^{n + p} a_k \xrightarrow[n,p\to \infty]{} 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
35. Интегральный признак Коши сходимости рядов.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть при &amp;lt;tex&amp;gt;x \geq 1&amp;lt;/tex&amp;gt; определена функция &amp;lt;tex&amp;gt;y = f(x)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; убывает, &amp;lt;tex&amp;gt;y \geq 0&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\int\limits_1^{+\infty} f(x) dx \equiv \sum\limits_{k = 1}^\infty f(k)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
36. Ряды и теорема Лейбница.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Знакочередующийся ряд, в котором &amp;lt;tex&amp;gt;a_n&amp;lt;/tex&amp;gt; убывает и &amp;lt;tex&amp;gt;a_n&amp;lt;/tex&amp;gt; стремится к нулю {{---}} ряд Лейбница&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=Лейбниц&lt;br /&gt;
|statement=&lt;br /&gt;
1. Любой ряд Лейбница сходится.&lt;br /&gt;
2. Для остатка такого ряда справедлива оценка &amp;lt;tex&amp;gt;|R_n| \leq |a_{n + 1}|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
37. Теорема Мертенса о произведении рядов по Коши.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
Мертенс&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть ряд из &amp;lt;tex&amp;gt;a_n&amp;lt;/tex&amp;gt; — абсолютно сходящийся, а ряд из &amp;lt;tex&amp;gt;b_n&amp;lt;/tex&amp;gt; — условно сходящийся. Тогда эти два ряда можно перемножить по способу Коши.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Математический анализ 1 курс]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B2%D1%83%D0%BC%D0%B5%D1%80%D0%BD%D0%B0%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0&amp;diff=82998</id>
		<title>Двумерная разреженная таблица</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B2%D1%83%D0%BC%D0%B5%D1%80%D0%BD%D0%B0%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0&amp;diff=82998"/>
				<updated>2022-09-01T04:04:14Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Двумерная разреженная таблица''' (англ. ''2D Sparse Table'') {{---}} структура данных, которая позволяет решать задачу online static RMQ. &lt;br /&gt;
&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition = Дан двумерный массив &amp;lt;tex&amp;gt;A[1 \ldots N][1 \ldots M]&amp;lt;/tex&amp;gt; целых чисел. Поступают запросы вида &amp;lt;tex&amp;gt;(x_1, y_1, x_2, y_2)&amp;lt;/tex&amp;gt; такие, что &amp;lt;tex&amp;gt; x_1 \leqslant x_2 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; y_1 \leqslant y_2 &amp;lt;/tex&amp;gt; , для каждого из которых требуется найти минимум среди &amp;lt;tex&amp;gt;A[i][j], x_1 \leqslant i \leqslant x_2 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; y_1 \leqslant j \leqslant y_2 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Структура 2D Sparse Table ==&lt;br /&gt;
&lt;br /&gt;
В целом структура 2D Sparse Table схожа со структурой обычной [[Решение_RMQ_с_помощью_разреженной_таблицы| разреженной таблицы]]. &lt;br /&gt;
&lt;br /&gt;
Разреженная таблица представляет собой четырехмерный массив:&lt;br /&gt;
&amp;lt;tex&amp;gt;ST[N][M][LOGN][LOGM]&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;LOGN = \log(N), LOGM = \log(M)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tex&amp;gt; ST[i][j][k_1][k_2] = \min\limits_{r = i,\dots,i+2^{k_1}-1, c = j,\ldots,j + 2^{k_2}-1} A[r][c], r &amp;lt; N, c &amp;lt; M &amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
То есть в ячейке структуры мы храним минимум для подматрицы, длины сторон которого являются некоторыми степенями двойки.&lt;br /&gt;
&lt;br /&gt;
[[Файл:STP1.png|left]]&lt;br /&gt;
[[Файл:SparseTableExample1Picture.png|right]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим иллюстрации.&lt;br /&gt;
&lt;br /&gt;
Слева изображен общий случай. Пусть &amp;lt;tex&amp;gt;n + 1&amp;lt;/tex&amp;gt; {{---}} количество строк, &amp;lt;tex&amp;gt;m + 1&amp;lt;/tex&amp;gt; {{---}} количество столбцов массива A. Рассмотрим элемент на позиции &amp;lt;tex&amp;gt;(i, j)&amp;lt;/tex&amp;gt;, который выделен желтым цветом. Данный элемент является левым верхним углом прямоугольника, стороны которого равны &amp;lt;tex&amp;gt;2^{k_1}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;2^{k_2}&amp;lt;/tex&amp;gt;. Прямоугольна выделен красным, а проекции его сторон - зеленым. Тогда в &amp;lt;tex&amp;gt;ST[i][j][k_1][k_2]&amp;lt;/tex&amp;gt; будет храниться минимум из всех элементов, которые входят в красную и желтую область.&lt;br /&gt;
&lt;br /&gt;
Справа изображен частный случай, когда N = 11, M = 11. Посмотрим, что будет храниться в &amp;lt;tex&amp;gt;ST[2][1][2][3]&amp;lt;/tex&amp;gt;:&lt;br /&gt;
Клетка (2, 1), которая выделена желтым цветом, является левым верхним углом красного прямоугольника, длины сторон которого &amp;lt;tex&amp;gt;2^{2}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;2^{3}&amp;lt;/tex&amp;gt; (проекции этих сторон выделены зеленым цветом). И по определению выше, &amp;lt;tex&amp;gt;ST[2][1][3][2]&amp;lt;/tex&amp;gt; хранит минимум из элементов красной области.&lt;br /&gt;
&lt;br /&gt;
== Реализация 2D Sparse Table ==&lt;br /&gt;
&lt;br /&gt;
===Построение===&lt;br /&gt;
&lt;br /&gt;
Изначально заполним таблицу следующим образом:&lt;br /&gt;
&lt;br /&gt;
$$ST[i][j][k_1][k_2]=&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\infty ,&amp;amp;\text{если $k_1\neq0 \lor k_2\neq0$ ;}\\&lt;br /&gt;
A[i][j], &amp;amp;\text {если $k_1=0 \wedge k_2=0$ ;}&lt;br /&gt;
\end{cases}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Далее мы считаем [[Решение_RMQ_с_помощью_разреженной_таблицы|одномерную разреженную таблицу]] для каждого столбца:&lt;br /&gt;
 '''for''' &amp;lt;tex&amp;gt; i = 0 &amp;lt;/tex&amp;gt; '''to''' &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''for''' &amp;lt;tex&amp;gt; lg = 1 &amp;lt;/tex&amp;gt; '''to''' &amp;lt;tex&amp;gt; \log(M) &amp;lt;/tex&amp;gt;         &lt;br /&gt;
         '''for''' &amp;lt;tex&amp;gt; j = 0 &amp;lt;/tex&amp;gt; '''to''' &amp;lt;tex&amp;gt; M &amp;lt;/tex&amp;gt;   &lt;br /&gt;
             &amp;lt;tex&amp;gt;ST[i][j][0][lg] = \min(ST[i][j][0][lg - 1], ST[i][j+ 2^{lg-1}][0][lg - 1])&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующим шагом мы можем обновить значения для подматриц, так как для всех столбцов ответы уже известны. Будем это делать по аналогичному алгоритму для 1D Sparse Table.&lt;br /&gt;
 '''for''' &amp;lt;tex&amp;gt; k_1 = 1 &amp;lt;/tex&amp;gt; '''to''' &amp;lt;tex&amp;gt; \log(N) &amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''for''' &amp;lt;tex&amp;gt; i = 0 &amp;lt;/tex&amp;gt; '''to''' &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''for''' &amp;lt;tex&amp;gt; k_2 = 0 &amp;lt;/tex&amp;gt; '''to''' &amp;lt;tex&amp;gt; \log(M) &amp;lt;/tex&amp;gt;&lt;br /&gt;
             '''for''' &amp;lt;tex&amp;gt; j = 0 &amp;lt;/tex&amp;gt; '''to''' &amp;lt;tex&amp;gt; M &amp;lt;/tex&amp;gt;         &lt;br /&gt;
                 &amp;lt;tex&amp;gt;ST[i][j][k_1][k_2]=\min\left(ST[i][j][k_1 - 1][k_2],ST[i+2^{k_1-1}][j][k_1 - 1][k_2]\right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом мы получили двумерную разреженную таблицу за &amp;lt;tex&amp;gt;O(NM\log(N)\log(M))&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ответы на запросы===&lt;br /&gt;
&lt;br /&gt;
Для ответа на запрос &amp;lt;tex&amp;gt; \mathrm {RMQ(l, r)} &amp;lt;/tex&amp;gt; в 1D Sparse Table использовалось пересечение отрезков &amp;lt;tex&amp;gt; [l, l + 2^{k}] &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; [r - 2^{k} + 1, r] &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; k = \lfloor  \log(SZ) \rfloor , SZ &amp;lt;/tex&amp;gt; {{---}} размера массива для одномерной задачи.&lt;br /&gt;
&lt;br /&gt;
Тут мы будем пользоваться аналогичным утверждением для матриц. Таким образов минимум на подматрице  &amp;lt;tex&amp;gt;(x_1, y_1, x_2, y_2)&amp;lt;/tex&amp;gt; будет высчитываться следующим образом:&lt;br /&gt;
 &amp;lt;tex&amp;gt; k_1 = \lfloor  \log(x_2 - x_1 + 1) \rfloor &amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt; k_2 = \lfloor  \log(y_2 - y_1 + 1) \rfloor &amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt; ans_1 = ST[x_1][y_1][k_1][k_2] &amp;lt;/tex&amp;gt; &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;     // красный прямоугольник&lt;br /&gt;
 &amp;lt;tex&amp;gt; ans_2 = ST[x_2 - 2^{k_1} + 1][y_1][k_1][k_2] &amp;lt;/tex&amp;gt; &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;     // Y-прямоугольник&lt;br /&gt;
 &amp;lt;tex&amp;gt; ans_3 = ST[x_1][y_2 - 2^{k_2} + 1][k_1][k_2] &amp;lt;/tex&amp;gt; &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;     // AA-прямоугольник&lt;br /&gt;
 &amp;lt;tex&amp;gt; ans_4 = ST[x_2 - 2^{k_1} + 1][y_2 - 2^{k_2} + 1][k_1][k_2] &amp;lt;/tex&amp;gt; &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;     // белый прямоугольник&lt;br /&gt;
 &amp;lt;tex&amp;gt; ans = \min\left(ans_1, ans_2, ans_3, ans_4\right) &amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Файл:ST3.png|center]]&lt;br /&gt;
&lt;br /&gt;
Таким образом мы получаем ответ на запрос &amp;lt;tex&amp;gt; \mathrm {RMQ(x_1, y_1, x_2, y_2)} &amp;lt;/tex&amp;gt; за &amp;lt;tex&amp;gt; O(1) &amp;lt;/tex&amp;gt;, если предпосчитать логарифмы двоек, например так: &lt;br /&gt;
 &amp;lt;tex&amp;gt; lg[1] = 0 &amp;lt;/tex&amp;gt;&lt;br /&gt;
 '''for''' &amp;lt;tex&amp;gt; i = 2 &amp;lt;/tex&amp;gt; '''to''' &amp;lt;tex&amp;gt;\max\left(N, M\right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt; lg[i] = lg[i / 2] + 1 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Обобщение на большие размерности ===&lt;br /&gt;
&lt;br /&gt;
Можно заметить, что возможно реализовать и D-мерную разреженную таблицу за &amp;lt;tex&amp;gt;O((N\log(n))^{D})&amp;lt;/tex&amp;gt; памяти и &amp;lt;tex&amp;gt;O((N\log(n))^{D})&amp;lt;/tex&amp;gt; времени на построение, где ответ на запрос, например, &amp;lt;tex&amp;gt; \mathrm {RMQ(l, r)} &amp;lt;/tex&amp;gt; будет выполняться за &amp;lt;tex&amp;gt; O(2^{D}) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
''Способ построения'': Если в данном случае, для того, чтобы построить двумерную структуру мы сначала должны были построить одномерную, то также и в случае с D-мерной структуре - сначала нужно построить (D-1)-мерную, а из нее получить D-мерную.&lt;br /&gt;
&lt;br /&gt;
''Ответ на запрос'': Абсолютно аналогичен рассмотренному здесь, только обобщается до размерности D.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Решение_RMQ_с_помощью_разреженной_таблицы| Решение RMQ с помощью разреженной таблицы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Задача о наименьшем общем предке]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C&amp;diff=82997</id>
		<title>Ортогональность</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C&amp;diff=82997"/>
				<updated>2022-09-01T04:04:08Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Ортогональность в евклидовом пространстве==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
[http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%BB%D0%B5%D0%BA%D1%81%D0%BD%D0%BE%D0%B5_%D0%B5%D0%B2%D0%BA%D0%BB%D0%B8%D0%B4%D0%BE%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%BE Евклидово пространство] над комплексным полем &amp;lt;tex&amp;gt; \mathbb{C} &amp;lt;/tex&amp;gt; называется '''унитарным пространством'''&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Расстояние между двумя элементами унитарного пространства: &amp;lt;tex&amp;gt;dist(x;y)= \Vert x-y \Vert &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x,y \in E&amp;lt;/tex&amp;gt;. Говорят, что &amp;lt;tex&amp;gt;x \bot y &amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;\left \langle x;y \right \rangle_G=G(x,y)=0&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x \bot x_1, x_2...x_k&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt; x \bot \forall &amp;lt;/tex&amp;gt; линейной комбинации &amp;lt;tex&amp;gt; \sum\limits_{i=1}^{k} \alpha^ix_i&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;x \bot x_i, \ (i=1..k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt; \left \langle \sum\limits_{i=1}^{k} \alpha^ix_i;x \right \rangle=\sum\limits_{i=1}^{k} \alpha^i \left \langle x_i;x \right \rangle=\sum\limits_{i=1}^{k} \alpha^i \overline{\left \langle x;x_i \right \rangle}=0 &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;L - &amp;lt;/tex&amp;gt; подпространство унитарного линейного пространства &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt;, тогда говорят, что &amp;lt;tex&amp;gt;x \bot L &amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;x \bot \forall y \in L &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Подпространство &amp;lt;tex&amp;gt;M=\{&amp;lt;/tex&amp;gt; все &amp;lt;tex&amp;gt;x \in E: \ x \bot L \}&amp;lt;/tex&amp;gt; называется ортогональным дополнением к &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt;, обозначается &amp;lt;tex&amp;gt;M=L^ \bot &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если в наборе векторов &amp;lt;tex&amp;gt; \{x_i\}_{i=1}^{k}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;x_i \bot x_j (i \ne j)&amp;lt;/tex&amp;gt;, тогда набор&amp;lt;tex&amp;gt; \{x_i\}_{i=1}^{k} - &amp;lt;/tex&amp;gt; ЛНЗ&lt;br /&gt;
|proof=&lt;br /&gt;
Предположим, что &amp;lt;tex&amp;gt; \sum\limits_{i=1}^{k} \alpha^ix_i=0_E \Rightarrow \alpha^1=...= \alpha_k=0&amp;lt;/tex&amp;gt; (доказать).&lt;br /&gt;
&amp;lt;tex&amp;gt;\left \langle  \sum\limits_{i=1}^{k} \alpha^ix_i;x_j \right \rangle = \left \langle 0_E;x_j \right \rangle=\sum\limits_{i=1}^{k} \alpha^i \left \langle x_i;x_j \right \rangle=0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;tex&amp;gt;i \ne j \Rightarrow \left \langle x_i;x_j \right \rangle=0 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;tex&amp;gt;i=j \Rightarrow \left \langle x_i;x_j \right \rangle \ne 0 \Rightarrow \alpha^j=0&amp;lt;/tex&amp;gt; &lt;br /&gt;
}}&lt;br /&gt;
NB: &amp;lt;tex&amp;gt;k \leqslant n =\dim E&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Теорема Пифагора: пусть &amp;lt;tex&amp;gt;\{x_i\}_{i=1}^{k}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x_i \bot x_j (i \ne j)&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;\Vert \sum\limits_{i=1}^{k} x_i \Vert^2= \sum\limits_{i=1}^{k} \Vert x_i \Vert^2 &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
 &amp;lt;tex&amp;gt;\Vert \sum\limits_{i=1}^{k} x_i \Vert^2= \left \langle \sum\limits_{i=1}^{k} x_i;\sum\limits_{j=1}^{k} x_j \right \rangle=\sum\limits_{i,j=1}^{k} \left \langle x_i;x_j \right \rangle=\sum\limits_{i=1}^{k} \left \langle x_i;x_i \right \rangle=\sum\limits_{i=1}^{k} \Vert x_i \Vert^2 &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Ортогональный и ортонормированный базис==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; - унитарное пространство. Базис &amp;lt;tex dpi='140'&amp;gt;\{e_i\}_{i=1}^{n}&amp;lt;/tex&amp;gt; называется '''ортогональным''', если &amp;lt;tex&amp;gt;\left \langle e_i;e_j \right \rangle=0&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;(i \ne j)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Базис &amp;lt;tex dpi='140'&amp;gt;\{e_i\}_{i=1}^{n}&amp;lt;/tex&amp;gt; называется '''ортонормированным''' (ОРТН), если &amp;lt;tex&amp;gt;\left \langle e_i;e_j \right \rangle=\delta_{ij}&amp;lt;/tex&amp;gt;, то есть:&lt;br /&gt;
1) &amp;lt;tex&amp;gt;e_i \bot e_j&amp;lt;/tex&amp;gt;, для &amp;lt;tex&amp;gt;(i \ne j)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
2) &amp;lt;tex&amp;gt; \Vert e_i \Vert=1 \ (i=1..n) &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Процесс ортогонализации набора векторов (Грам-Шмидт)==&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex dpi='140'&amp;gt;\{x_i\}_{i=1}^{n} - &amp;lt;/tex&amp;gt; ЛНЗ &amp;lt;tex&amp;gt;(x_i \ne 0)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;tex&amp;gt;e_1=x_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;tex&amp;gt;e_2=x_2 + \alpha_1 e_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и так далее&lt;br /&gt;
&lt;br /&gt;
k) &amp;lt;tex&amp;gt;e_k=x_k + \alpha_1 e_1 + \alpha_2 e_2 + ... + \alpha_{k-1} e_{k-1}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
На 2-ом шаге надо, чтобы &amp;lt;tex&amp;gt;e_1 \bot e_2&amp;lt;/tex&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;0= \left \langle e_2;e_1 \right \rangle = \left \langle x_2;e_1 \right \rangle + \alpha_1 \left \langle e_1;e_1 \right \rangle &amp;lt;/tex&amp;gt; &amp;lt;tex dpi='140'&amp;gt; \Rightarrow \alpha_1 = \frac{- \left \langle x_2;e_1 \right \rangle }{ \left \langle e_1;e_1 \right \rangle } &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На k-ом шаге уже есть &amp;lt;tex&amp;gt;e_1, e_2...e_{k-1}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt; попарно &amp;lt;tex&amp;gt; \bot \ (k \leqslant m)&amp;lt;/tex&amp;gt;. Надо, чтобы &amp;lt;tex&amp;gt;e_k \bot e_i \ (i=1..k-1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt; \left \langle (*);e_i \right \rangle &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Необходимо, чтобы &amp;lt;tex&amp;gt;0=\left \langle e_k;e_i \right \rangle = \left \langle x_k;e_i \right \rangle + \alpha_1 \left \langle e_1;e_i \right \rangle +...+ \alpha_i \left \langle e_i;e_i \right \rangle +...+ \alpha_{k-1} \left \langle e_{k-1};e_i \right \rangle &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\left \langle e_i;e_j \right \rangle =0, \ i \ne j &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex dpi='140'&amp;gt;\alpha_i = \frac{- \left \langle x_k;e_i \right \rangle }{ \left \langle e_i;e_i \right \rangle }&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&lt;br /&gt;
Данный процесс не оборвется, то есть все &amp;lt;tex&amp;gt;e_i \ne 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем методом от противного.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;e_k=0&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;(*): \ 0=e_k=x_k + \alpha_1 e_1 + \alpha_2 e_2 + ... + \alpha_{k-1}e_{k-1}&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\alpha_1 e_1=x_1, \ \alpha_2 e_2&amp;lt;/tex&amp;gt; - линейная комбинация&amp;lt;tex&amp;gt; \{x_1, x_2\} &amp;lt;/tex&amp;gt; и так далее &amp;lt;tex&amp;gt;\alpha_{k-1} e_{k-1}&amp;lt;/tex&amp;gt; - линейная комбинация&amp;lt;tex&amp;gt;\{x_1, x_2...x_{k-1}\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;0_E=x_k+\sum\limits _{i=1}^{k-1} \beta_ix_i &amp;lt;/tex&amp;gt;. Но &amp;lt;tex&amp;gt;\{x_1...x_k\} - &amp;lt;/tex&amp;gt; ЛНЗ набор, как поднабор ЛНЗ набора, среди коэффициентов разложения есть не нулевой (у &amp;lt;tex&amp;gt;x_k&amp;lt;/tex&amp;gt;), тогда приходим к противоречию, так как набор коэффициентов не тривиальный, а вектора ЛНЗ.&lt;br /&gt;
Значит, предположение не верно и &amp;lt;tex&amp;gt;e_k \ne 0&amp;lt;/tex&amp;gt;, то есть процесс ортогонализации не оборвется пока набор будет ЛНЗ.&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;tex&amp;gt;\{x_i\}_{i=1}^{n} \rightarrow \{e_i\}_{i=1}^{n}&amp;lt;/tex&amp;gt;, таким образом получаем ортогональный набор векторов.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\{x_i\}_{i=1}^{k-1} - &amp;lt;/tex&amp;gt; ЛНЗ, &amp;lt;tex&amp;gt;\{x_i\}_{i=1}^{k} - &amp;lt;/tex&amp;gt; ЛЗ, тогда &amp;lt;tex&amp;gt;e_k=0&amp;lt;/tex&amp;gt; &lt;br /&gt;
|proof=&lt;br /&gt;
Доказательство очевидно из леммы, доказанной выше.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Свойства==&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; \Vert e_k \Vert \leqslant \Vert x_k \Vert &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt; \left \langle (*);e_k \right \rangle &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \left \langle e_k;e_k \right \rangle = \left \langle x_k;e_k \right \rangle + \alpha_1 \left \langle e_1;e_k \right \rangle +...+ \alpha_{k-1} \left \langle e_{k-1};e_k \right \rangle &amp;lt;/tex&amp;gt;, но &amp;lt;tex&amp;gt; \left \langle e_i;e_k \right \rangle=0 \ (i=1..k-1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \Rightarrow \Vert e_k \Vert^2= \left \langle x_k;e_k \right \rangle &amp;lt;/tex&amp;gt; по неравенству Шварца &amp;lt;tex&amp;gt; \Rightarrow \Vert e_k \Vert^2 \leqslant \Vert x_k \Vert \cdot \Vert e_k \Vert &amp;lt;/tex&amp;gt;, так как &amp;lt;tex&amp;gt;\Vert e_k \Vert \ne 0 \Rightarrow \Vert e_k \Vert \leqslant \Vert x_k \Vert &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
В любом конечномерном унитарном пространстве существует ортогональный и даже ортонормированный базис.&lt;br /&gt;
|proof=&lt;br /&gt;
Ортогональный базис получается процессом ортогонализации Грама-Шмидта. Из ортогонального по определению легко получить ортонормированный. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; \forall x,y \in E &amp;lt;/tex&amp;gt; в ОРТН базисе &amp;lt;tex&amp;gt;\{e_i\}_{i=1}^{n} \Rightarrow \left \langle x;y \right \rangle=\sum\limits_{i=1}^n \xi^i  \overline{ \eta^k }&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt; \left \langle x;y \right \rangle=\left \langle \sum\limits_{i=1}^n \xi^i e_i; \sum\limits_{k=1}^n \eta^k e_k \right \rangle= \sum\limits_{i,k=1}^n \xi^i  \overline{\eta^k} \left \langle e_i;e_k \right \rangle=\sum\limits_{i=1}^n \xi^i  \overline{\eta^k} &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&lt;br /&gt;
Если для &amp;lt;tex&amp;gt; \forall x,y \in E &amp;lt;/tex&amp;gt; верно, что &amp;lt;tex&amp;gt; \left \langle x;y \right \rangle=\sum\limits_{i=1}^n \xi^i  \overline{\eta^k}&amp;lt;/tex&amp;gt;, то соответствующий базис &amp;lt;tex&amp;gt;\{e_i\}_{i=1}^{n} - &amp;lt;/tex&amp;gt; ОРТН.&lt;br /&gt;
|proof=&lt;br /&gt;
Доказательство предыдущей леммы в обратную сторону, то есть получаем, что &amp;lt;tex&amp;gt; \left \langle e_i;e_j \right \rangle= \delta_{ik} &amp;lt;/tex&amp;gt;, тогда базис ОРТН по определению.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгебра и геометрия 1 курс]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D1%80%D0%BE%D0%B3%D0%BE%D0%B2%D0%B0%D1%8F_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F&amp;diff=82996</id>
		<title>Пороговая функция</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D1%80%D0%BE%D0%B3%D0%BE%D0%B2%D0%B0%D1%8F_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F&amp;diff=82996"/>
				<updated>2022-09-01T04:03:56Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
Булева функция &amp;lt;tex&amp;gt;f(A_1,A_2,\ldots,A_n)&amp;lt;/tex&amp;gt; называется '''пороговой''' (англ. ''threshold function''), если ее можно представить в виде &amp;lt;tex&amp;gt;f(A_1,A_2,\ldots,A_n) = [\sum\limits_{i=1}^n A_i a_i \geqslant T]&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;a_i&amp;lt;/tex&amp;gt; {{---}} '''вес''' (англ. ''weight'') аргумента &amp;lt;tex&amp;gt;A_i&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; {{---}} '''порог''' (англ. ''threshold'') функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;; &amp;lt;tex&amp;gt;a_i, T \in R&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Обычно пороговую функцию записывают в следующим виде: &amp;lt;tex&amp;gt;f = [a_1,a_2,a_3,\ldots,a_n;T]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Пример == &lt;br /&gt;
&lt;br /&gt;
Рассмотрим функцию трёх аргументов &amp;lt;tex&amp;gt;f(A_1,A_2,A_3)=[3,4,6;5]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Согласно этой записи имеем&lt;br /&gt;
:&amp;lt;tex&amp;gt;a_1=3; a_2=4; a_3=6; T=5&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Все  наборы  значений  аргументов  &amp;lt;tex&amp;gt;A_1, A_2, A_3&amp;lt;/tex&amp;gt;,  на  которых  функция  принимает  единичное (либо  нулевое)  значение, можно получить из соотношения вида &amp;lt;tex&amp;gt;3A_1+4A_2+6A_3 \geqslant 5&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если &amp;lt;tex&amp;gt;A_1=0,A_2=0,A_3=0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;0&amp;lt;5 \Rightarrow f=0&amp;lt;/tex&amp;gt;.  &lt;br /&gt;
:Если &amp;lt;tex&amp;gt;A_1=0,A_2=0,A_3=1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;6 \geqslant 5 \Rightarrow f=1&amp;lt;/tex&amp;gt;.  &lt;br /&gt;
:Если &amp;lt;tex&amp;gt;A_1=0,A_2=1,A_3=0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;4&amp;lt;5 \Rightarrow f=0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
:Если &amp;lt;tex&amp;gt;A_1=0,A_2=1,A_3=1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;10 \geqslant 5 \Rightarrow f=1&amp;lt;/tex&amp;gt;. &lt;br /&gt;
:Если &amp;lt;tex&amp;gt;A_1=1,A_2=0,A_3=0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;3&amp;lt;5 \Rightarrow f=0&amp;lt;/tex&amp;gt;. &lt;br /&gt;
:Если &amp;lt;tex&amp;gt;A_1=1,A_2=0,A_3=1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;9 \geqslant 5 \Rightarrow f=1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
:Если &amp;lt;tex&amp;gt;A_1=1,A_2=1,A_3=0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;7 \geqslant 5 \Rightarrow f=1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
:Если &amp;lt;tex&amp;gt;A_1=1,A_2=1,A_3=1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;13 \geqslant 5 \Rightarrow f=1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
Таким  образом,  заданная  функция  принимает  единичное  значение  на  наборах &amp;lt;tex&amp;gt;001&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;011&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;101&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;110&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;111&amp;lt;/tex&amp;gt;.  Её [[Сокращенная и минимальная ДНФ|минимальная форма]] имеет вид &lt;br /&gt;
:&amp;lt;tex&amp;gt;f=A_1 A_2 + A_3&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Для  всякой  пороговой  функции  справедливо&lt;br /&gt;
:&amp;lt;tex&amp;gt;[a_1,a_2,a_3,\ldots,a_n;T]=[ka_1,ka_2,ka_3,\ldots,ka_n;kT]&amp;lt;/tex&amp;gt;,&lt;br /&gt;
где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; — положительное вещественное число.&lt;br /&gt;
|proof=Чтобы убедиться в этом достаточно записать&lt;br /&gt;
: &amp;lt;tex&amp;gt;ka_1 A_1+ka_2 A_2+\ldots+ka_n A_n \geqslant kT&amp;lt;/tex&amp;gt;&lt;br /&gt;
: &amp;lt;tex&amp;gt;ka_1 A_1+ka_2 A_2+\ldots+ka_n A_n &amp;lt; kT&amp;lt;/tex&amp;gt;&lt;br /&gt;
и разделить обе части неравенства на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Примеры пороговых функций ==&lt;br /&gt;
&lt;br /&gt;
Примерами пороговых функций служат функции &amp;lt;tex&amp;gt; \operatorname{AND} &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; \operatorname{OR} &amp;lt;/tex&amp;gt;. Представим функцию &amp;lt;tex&amp;gt; \operatorname{AND} &amp;lt;/tex&amp;gt; в виде &amp;lt;tex&amp;gt;[1,1;2]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Докажем, что это именно пороговая функция, подставив все возможные значения аргументов:&lt;br /&gt;
:&amp;lt;tex&amp;gt;A_1=0,A_2=0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;0&amp;lt;2 \Rightarrow f=0&amp;lt;/tex&amp;gt;.  &lt;br /&gt;
:&amp;lt;tex&amp;gt;A_1=0,A_2=1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;1&amp;lt;2 \Rightarrow f=0&amp;lt;/tex&amp;gt;.  &lt;br /&gt;
:&amp;lt;tex&amp;gt;A_1=1,A_2=0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;1&amp;lt;2 \Rightarrow f=0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
:&amp;lt;tex&amp;gt;A_1=1,A_2=1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;2 \geqslant 2 \Rightarrow f=1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Таблица значений совпадает с таблицей истинности функции &amp;lt;tex&amp;gt; \operatorname{AND} &amp;lt;/tex&amp;gt;, следовательно &amp;lt;tex&amp;gt; \operatorname{AND} &amp;lt;/tex&amp;gt; {{---}} пороговая функция.&lt;br /&gt;
&lt;br /&gt;
Функцию &amp;lt;tex&amp;gt; \operatorname{OR} &amp;lt;/tex&amp;gt; представим в виде &amp;lt;tex&amp;gt;[1,1;1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Аналогично докажем, что это пороговая функция:&lt;br /&gt;
:&amp;lt;tex&amp;gt;A_1=0,A_2=0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;0&amp;lt;1 \Rightarrow f=0&amp;lt;/tex&amp;gt;.  &lt;br /&gt;
:&amp;lt;tex&amp;gt;A_1=0,A_2=1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;1 \geqslant 1 \Rightarrow f=1&amp;lt;/tex&amp;gt;.  &lt;br /&gt;
:&amp;lt;tex&amp;gt;A_1=1,A_2=0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;1 \geqslant 1 \Rightarrow f=1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
:&amp;lt;tex&amp;gt;A_1=1,A_2=1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;2 \geqslant 1 \Rightarrow f=1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Таблица значений совпадает с таблицей истинности функции &amp;lt;tex&amp;gt; \operatorname{OR} &amp;lt;/tex&amp;gt;, следовательно &amp;lt;tex&amp;gt; \operatorname{OR} &amp;lt;/tex&amp;gt; {{---}} пороговая функция.&lt;br /&gt;
&lt;br /&gt;
== Пример непороговой функции ==&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Функция &amp;lt;tex&amp;gt; \operatorname{XOR} &amp;lt;/tex&amp;gt; {{---}} непороговая.&lt;br /&gt;
|proof=&lt;br /&gt;
Предположим, что &amp;lt;tex&amp;gt; \operatorname{XOR} &amp;lt;/tex&amp;gt; {{---}} пороговая функция. При аргументах &amp;lt;tex&amp;gt;(0, 0)&amp;lt;/tex&amp;gt; значение функции &amp;lt;tex&amp;gt; \operatorname{XOR} &amp;lt;/tex&amp;gt; равно &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;. Тогда по определению пороговой функции неравенство &amp;lt;tex&amp;gt;A_1 x_1+A_2 x_2 \geqslant T&amp;lt;/tex&amp;gt; не должно выполняться. Подставляя значение аргументов, получаем, что &amp;lt;tex&amp;gt;T&amp;gt;0&amp;lt;/tex&amp;gt;. При аргументах &amp;lt;tex&amp;gt;(0, 1)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(1, 0)&amp;lt;/tex&amp;gt; значение функции &amp;lt;tex&amp;gt; \operatorname{XOR} &amp;lt;/tex&amp;gt; равно &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Тогда по определению выполняется неравенство &amp;lt;tex&amp;gt;A_1 x_1+A_2 x_2 \geqslant T&amp;lt;/tex&amp;gt;, подставляя в которое значения соответствующих аргументов, получаем &amp;lt;tex&amp;gt;A_1 \geqslant T, A_2 \geqslant T&amp;lt;/tex&amp;gt;. Отсюда следует, что &amp;lt;tex&amp;gt;A_1&amp;gt;0, A_2&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A_1+A_2 \geqslant 2T&amp;lt;/tex&amp;gt;. При аргументах &amp;lt;tex&amp;gt;(1, 1)&amp;lt;/tex&amp;gt; значение функции &amp;lt;tex&amp;gt; \operatorname{XOR} &amp;lt;/tex&amp;gt; равно 0, следовательно неравенство &amp;lt;tex&amp;gt;A_1 x_1+A_2 x_2 \geqslant T&amp;lt;/tex&amp;gt; выполняться не должно, то есть &amp;lt;tex&amp;gt;A_1+A_2 &amp;lt; T&amp;lt;/tex&amp;gt;. Но неравенства &amp;lt;tex&amp;gt;A_1+A_2 \geqslant 2T&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A_1+A_2 &amp;lt; T&amp;lt;/tex&amp;gt; при положительных &amp;lt;tex&amp;gt;A_1,A_2&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; одновременно выполняться не могут. Получили противоречие, следовательно, функция &amp;lt;tex&amp;gt; \operatorname{XOR} &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;
* [[Полные_системы_функций._Теорема_Поста_о_полной_системе_функций#.D0.97.D0.B0.D0.BC.D0.BA.D0.BD.D1.83.D1.82.D1.8B.D0.B5_.D0.BA.D0.BB.D0.B0.D1.81.D1.81.D1.8B_.D0.B1.D1.83.D0.BB.D0.B5.D0.B2.D1.8B.D1.85_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B9|Замкнутые классы булевых функций]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.simvol.biz/uploadfiles/File/sostav/books/Diskret_mat1.pdf Пороговая функция]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/Искусственный_нейрон Википедия — Искусственный нейрон]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Булевы функции ]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D1%83%D0%BC(2_%D1%81%D0%B5%D0%BC%D0%B5%D1%81%D1%82%D1%80)&amp;diff=82995</id>
		<title>Теоретический минимум(2 семестр)</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%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D1%83%D0%BC(2_%D1%81%D0%B5%D0%BC%D0%B5%D1%81%D1%82%D1%80)&amp;diff=82995"/>
				<updated>2022-09-01T04:03:40Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
1)&lt;br /&gt;
Ряд &amp;lt;tex&amp;gt;\sum\limits_{n = 0}^\infty a_n&amp;lt;/tex&amp;gt; имеет сумму &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; по '''методу средних арифметических''' (обозначают аббревиатурой с.а.), если &amp;lt;tex&amp;gt;S = \lim\limits_{n \rightarrow \infty} \frac 1{n + 1} \sum\limits_{k = 0}^n S_k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2)&lt;br /&gt;
Пусть дан ряд &amp;lt;tex&amp;gt;\sum\limits_{n = 0}^{\infty}a_n&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; \forall t \in (0; 1) : \sum\limits_{n = 0}^{\infty}a_nt^n = f(t)&amp;lt;/tex&amp;gt; (в классическом смысле). Тогда этот ряд имеет сумму &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; по '''методу Абеля''', если &amp;lt;tex&amp;gt; S = \lim\limits_{t \to 1 - 0} f(t)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3)&lt;br /&gt;
&amp;lt;tex&amp;gt; \sum\limits_{n = 0}^\infty a_n = S &amp;lt;/tex&amp;gt; (с.а) &amp;lt;tex&amp;gt; \Rightarrow &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \sum\limits_{n = 0}^\infty a_n = S &amp;lt;/tex&amp;gt; (А).&lt;br /&gt;
&lt;br /&gt;
4)&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{k = 0}^\infty a_k = S&amp;lt;/tex&amp;gt;(с.а.)&lt;br /&gt;
Тогда, если существует такое &amp;lt;tex&amp;gt; M &amp;gt; 0 &amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt; \forall n \in \mathbb N: \sum\limits_{k = n + 1}^\infty a_k^2 \leq \frac{M}n &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; \sum\limits_{k=0}^\infty a_k = S&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
5)&lt;br /&gt;
Пусть на &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; задан функциональный ряд &amp;lt;tex&amp;gt;\sum\limits_{n = 1}^\infty f_n&amp;lt;/tex&amp;gt;. Тогда он равномерно сходится к&lt;br /&gt;
&amp;lt;tex&amp;gt;f = \sum f_n&amp;lt;/tex&amp;gt;, если&lt;br /&gt;
&amp;lt;tex&amp;gt;\forall\varepsilon\ &amp;gt; 0\ \exists N\ \forall n &amp;gt; N\ \forall x \in E : |S_n(x) - f(x)| &amp;lt; \varepsilon&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5)&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{n = 1}^\infty f_n&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\forall n \in \mathbb{N} &amp;lt;/tex&amp;gt; , &amp;lt;tex&amp;gt; \forall x \in E : |f_n(x)| \leq a_n&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\sum\limits_{n = 1}^\infty a_n&amp;lt;/tex&amp;gt; {{---}} сходится.&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;\sum\limits_{n = 1}^\infty f_n&amp;lt;/tex&amp;gt; равномерно сходится на &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6)&lt;br /&gt;
Пусть на множестве &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; заданы функции &amp;lt;tex&amp;gt;f_n&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; {{---}} предельная точка этого множества и &lt;br /&gt;
&amp;lt;tex&amp;gt;\forall n \in \mathbb{N}\ \exists\ \lim \limits_{x \to a} f_n(x)&amp;lt;/tex&amp;gt;. Тогда если &amp;lt;tex&amp;gt;\sum \limits_{n = 0}^{\infty} f_n&amp;lt;/tex&amp;gt; - равномерно&lt;br /&gt;
сходится на &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt;, то выполняется равенство :&lt;br /&gt;
&amp;lt;tex&amp;gt;\lim \limits_{x \to a} \sum \limits_{n = 0}^{\infty} f_n(x) = \sum \limits_{n = 0}^{\infty} \lim\limits_{x \to a} f_n(x)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8)&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; f_{n} &amp;lt;/tex&amp;gt; интегрируема и равномерно сходится к &amp;lt;tex&amp;gt; f &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; [a; b] &amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt; f &amp;lt;/tex&amp;gt; тоже интегрируема, и&lt;br /&gt;
&amp;lt;tex&amp;gt; \lim \limits_{n \to \infty} \int\limits_{a}^{b} f_{n}  = \int\limits_{a}^{b}f &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
9)&lt;br /&gt;
Пусть на &amp;lt;tex&amp;gt; (a, b) &amp;lt;/tex&amp;gt; задан функциональный ряд &amp;lt;tex&amp;gt;\sum\limits_{n = 1}^{\infty} f_n&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\exists c \in \langle a, b \rangle, \sum\limits_{n = 1}^{\infty}f_n(c)&amp;lt;/tex&amp;gt; - сходится.&lt;br /&gt;
Пусть также &amp;lt;tex&amp;gt;\exists f_n'&amp;lt;/tex&amp;gt; - непрерывна на &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt; и&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{n = 1}^{\infty} f_n'&amp;lt;/tex&amp;gt; - равномерно сходится на &amp;lt;tex&amp;gt;\langle a, b\rangle&amp;lt;/tex&amp;gt;, тогда на &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt; выполняется :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(\sum\limits_{n = 1}^{\infty} f_n(x))' = \sum\limits_{n = 1}^{\infty}f_n'(x)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
10)&lt;br /&gt;
Пусть для некоторого &amp;lt;tex&amp;gt;x_0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\sum\limits_{n = 0}^{\infty} a_n x_0^n&amp;lt;/tex&amp;gt; {{---}} сходится. &lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;\forall x_1 : |x_1| &amp;lt; |x_0|&amp;lt;/tex&amp;gt; ряд &amp;lt;tex&amp;gt;\sum\limits_{n = 0}^\infty |a_n x_1^n|&amp;lt;/tex&amp;gt; сходится.&lt;br /&gt;
&lt;br /&gt;
11)&lt;br /&gt;
&amp;lt;tex&amp;gt;R = \sup \{|x| : \sum\limits_{n = 0}^\infty a_n x^n&amp;lt;/tex&amp;gt; {{---}} сходится &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;. Заметим, что возможны случаи &amp;lt;tex&amp;gt;R = 0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;R = \infty&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Пусть есть ряд &amp;lt;tex&amp;gt;\sum\limits_{n = 0}^\infty a_n x^n&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; {{---}} его радиус сходимости. Тогда&lt;br /&gt;
1) &amp;lt;tex&amp;gt;|x| &amp;lt; R&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt; ряд абсолютно сходится.&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;tex&amp;gt;\forall [a; b] \in (-R; R)&amp;lt;/tex&amp;gt; ряд сходится абсолютно и равномерно.&lt;br /&gt;
 &lt;br /&gt;
3) &amp;lt;tex&amp;gt;|x| &amp;gt; R&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt; ряд расходится. &lt;br /&gt;
&lt;br /&gt;
4) &amp;lt;tex&amp;gt;|x| = R&amp;lt;/tex&amp;gt; {{---}} неопределённость. &lt;br /&gt;
&lt;br /&gt;
12)&lt;br /&gt;
Пусть есть &amp;lt;tex&amp;gt;\sum\limits_{n = 0}^\infty a_n x^n&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; {{---}} его радиус сходимости. Тогда:&lt;br /&gt;
&lt;br /&gt;
1) Если &amp;lt;tex&amp;gt;\exists q = \lim\limits_{n \to \infty} \left|\frac{a_n}{a_{n + 1}}\right|&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;R = q&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2) Если &amp;lt;tex&amp;gt;\exists q = \lim\limits_{n \to \infty} \sqrt[n]{a_n}&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;R = \frac1q&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
13)&lt;br /&gt;
Промежуток сходимости степенного ряда совпадает с промежутком сходимости продифференцированного степенного ряда&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%BB%D0%B5%D0%BA%D1%81%D0%BD%D0%BE%D0%B5_%D0%B5%D0%B2%D0%BA%D0%BB%D0%B8%D0%B4%D0%BE%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%BE&amp;diff=82994</id>
		<title>Комплексное евклидово пространство</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%BB%D0%B5%D0%BA%D1%81%D0%BD%D0%BE%D0%B5_%D0%B5%D0%B2%D0%BA%D0%BB%D0%B8%D0%B4%D0%BE%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%BE&amp;diff=82994"/>
				<updated>2022-09-01T04:03:33Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; - линейное пространство над &amp;lt;tex&amp;gt;\mathbb{C}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; задана эрмитова метрическая форма, т.е &amp;lt;tex&amp;gt;G:\: E\times E\longrightarrow \mathbb{C}&amp;lt;/tex&amp;gt; co свойствами:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;1)\: G(\alpha x_{1}+\beta x_{2};y)=\alpha G(x_{1},y)+\beta G(x_{2},y)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; , &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt; - комплексные числа&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;2)\: G(x,y)=\overline{G(y,x)}&amp;lt;/tex&amp;gt;; &amp;lt;tex&amp;gt;G(x,x)=\overline{G(x,x)} \Longrightarrow G(x,x) \in \mathbb{R}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;3)\: G(x,x) \ge 0;\: G(x,x)=0 \Longleftrightarrow x = 0_{E}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
NB 1: &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; полуторалинейна:&lt;br /&gt;
&amp;lt;tex&amp;gt;G(x;\alpha y_{1}+\beta y_{2})=\overline{\alpha}G(x,y_{1})+\overline{\beta}G(x,y_{2})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NB 2: &amp;lt;tex&amp;gt;G(x,y)=\left\langle x,y\right\rangle _{G}; x,y \in E(&amp;lt;/tex&amp;gt;над &amp;lt;tex&amp;gt; \mathbb{C})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NB 3: &amp;lt;tex&amp;gt;G(x,y)=\left\langle x,y\right\rangle _{G}&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Vert x\Vert_{G}=\sqrt{\left\langle x,x\right\rangle _{G}};&lt;br /&gt;
\:\Vert\alpha x\Vert_{G}=\sqrt{\left\langle \alpha x,\alpha x\right\rangle _{G}}=\sqrt{\alpha\cdot\overline{\alpha}\cdot\left\langle x,x\right\rangle _{G}}=|\alpha|\cdot\Vert x\Vert_{G}&lt;br /&gt;
 &amp;lt;/tex&amp;gt;&lt;br /&gt;
==Примеры==&lt;br /&gt;
&amp;lt;tex&amp;gt;E = \mathbb{C}^{n}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\left\langle x,y\right\rangle =\sum\limits_{i=1}^{n}\xi^{i}\overline{\eta^{i}}&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\left\langle y,x\right\rangle =\sum\limits_{i=1}^{n}\eta^{i}\overline{\xi^{i}}=\overline{\sum\limits \overline{\eta^{i}}\xi^{i}}=\overline{\left\langle x,y\right\rangle }&amp;lt;/tex&amp;gt;;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\left\langle x,x\right\rangle =\sum\limits_{i=1}^{n}\xi^{i}\overline{\xi^{i}}=\sum\limits_{i=1}^{n}|\xi^{i}|^{2}&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Неравенство Шварца(Коши-Буняковского)==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement= &amp;lt;tex&amp;gt;\forall\: x,y\in \mathbb{C}:\;|\left\langle x,y\right\rangle _{G}|\leq\Vert x\Vert_{G}\cdot\Vert y\Vert_{G}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt;\left\langle \lambda x+y;\lambda x+y\right\rangle =\Vert\lambda x+y\Vert^{2}\geq0&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\lambda \in \mathbb{R}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\left\langle \lambda x+y;\lambda x+y\right\rangle = \left\langle \lambda x;\lambda x\right\rangle +\left\langle \lambda x;y\right\rangle +\left\langle y;\lambda x\right\rangle +\left\langle y;y\right\rangle &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;= \lambda\cdot\overline{\lambda}\left\langle x,x\right\rangle +\lambda\cdot(\left\langle x;y\right\rangle +\overline{\left\langle x;y\right\rangle })+\left\langle y,y\right\rangle &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;= \Vert x\Vert^{2}\cdot\lambda^{2}+\lambda\cdot 2Re\left\langle x;y\right\rangle + \Vert y\Vert^{2}\geq0&amp;lt;/tex&amp;gt; - многочлен второй степени, все коэффициенты вещественные&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;D \le 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; D/4=(-Re\left\langle x,y\right\rangle )^{2}-\Vert x\Vert^{2}\cdot\Vert y\Vert^{2}\le0\Longrightarrow |Re\left\langle x,y\right\rangle |\le\Vert x\Vert\cdot\Vert y\Vert&amp;lt;/tex&amp;gt; - верно для &amp;lt;tex&amp;gt;\forall x,y\in E&amp;lt;/tex&amp;gt;. Назовём это неравенство &amp;lt;tex&amp;gt;(\times)&amp;lt;/tex&amp;gt; - крестик.&lt;br /&gt;
&lt;br /&gt;
Трюк: пусть &amp;lt;tex&amp;gt;\left\langle x,y\right\rangle = |\left\langle x,y\right\rangle|\cdot e^{i\varphi}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\varphi=arg\left\langle x,y\right\rangle&amp;lt;/tex&amp;gt;. Тогда пусть в &amp;lt;tex&amp;gt;(\times): y \longrightarrow y\cdot e^{i\varphi} \Longrightarrow \Vert e^{i\varphi}y\Vert=|e^{i\varphi}|\cdot\Vert y\Vert&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;tex&amp;gt;\left\langle x,e^{i\varphi}y\right\rangle= \overline{e^{i\varphi}}\left\langle x,y \right\rangle = &lt;br /&gt;
\overline{e^{i\varphi}}e^{i\varphi}\left|\left\langle x, y\right\rangle\right| = \left|\left\langle x, y\right\rangle\right|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заменим в &amp;lt;tex&amp;gt;(\times)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;e^{i\varphi}y \: : |Re\left\langle x,e^{i\varphi}y\right\rangle|&lt;br /&gt;
\le\Vert x\Vert\cdot\Vert e^{i\varphi}y\Vert&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
левая часть равна &amp;lt;tex&amp;gt;|Re|\left\langle x,y\right\rangle|| = |\left\langle x,y\right\rangle|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
правая часть равна &amp;lt;tex&amp;gt;\Vert x \Vert\cdot\Vert y\Vert&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, &amp;lt;tex&amp;gt;|\left\langle x,y\right\rangle| \le \Vert x \Vert\cdot\Vert y\Vert&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=следствие из Шварца, неравенство треугольника&lt;br /&gt;
|statement= &amp;lt;tex&amp;gt;\Vert x+y \Vert \leq \Vert x\Vert+\Vert y\Vert&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof= Рассмотрим &amp;lt;tex&amp;gt;\left\langle x+y, x+y\right\rangle={\Vert x+y \Vert}^{2} = \Vert x\Vert^{2}+\left\langle x,y\right\rangle+\left\langle y,x\right\rangle + \Vert y\Vert^{2} = \Vert x\Vert^{2}+2Re\left\langle x,y\right\rangle+ \Vert y\Vert^{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Re\left\langle x,y\right\rangle \le |\left\langle x,y\right\rangle| \le \Vert x\Vert\cdot\Vert y\Vert&amp;lt;/tex&amp;gt; (из неравенства Шварца)&lt;br /&gt;
&lt;br /&gt;
Таким образом, &amp;lt;tex&amp;gt;{\Vert x+y \Vert}^{2} \le \Vert x\Vert^{2}+2\cdot\Vert x\Vert\cdot\Vert y\Vert+ \Vert y\Vert^{2}=(\Vert x\Vert+\Vert y\Vert)^2&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Взяв корень из левой и правой части, получим искомое неравенство.&lt;br /&gt;
}}&lt;br /&gt;
[[Категория: Алгебра и геометрия 1 курс]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D0%B3%D1%80%D0%B0_%C2%AB%D0%96%D0%B8%D0%B7%D0%BD%D1%8C%C2%BB&amp;diff=82993</id>
		<title>Игра «Жизнь»</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D0%B3%D1%80%D0%B0_%C2%AB%D0%96%D0%B8%D0%B7%D0%BD%D1%8C%C2%BB&amp;diff=82993"/>
				<updated>2022-09-01T04:03:17Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Игра «Жизнь»''' (англ. ''Conway's Game of Life'') — [[Линейный_клеточный_автомат,_эквивалентность_МТ#cellularautomaton |клеточный автомат]], придуманный английским математиком Джоном Конвеем в 1970.&lt;br /&gt;
&lt;br /&gt;
== Правила ==&lt;br /&gt;
: '''Правило 1.''' Действие происходит на бесконечной плоскости, разделенной на клетки, которую можно иногда представить как зацикленную конечную.&lt;br /&gt;
: '''Правило 2.''' Каждая клетка может находиться в двух состояниях: быть живой или быть мёртвой.&lt;br /&gt;
: '''Правило 3.''' У каждой клетки &amp;lt;tex&amp;gt;8&amp;lt;/tex&amp;gt; соседей.&lt;br /&gt;
: '''Правило 4.''' Если клетка жива и у нее &amp;lt;tex&amp;gt;2-3&amp;lt;/tex&amp;gt; живых соседа, то она остается живой, иначе умирает.&lt;br /&gt;
: '''Правило 5.''' Если клетка мертва и у нее &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; живых соседа, то она становится живой, иначе остается мертвой.&lt;br /&gt;
: '''Правило 6.''' Игра прекращается, если на поле не останется ни одной живой клетки.&lt;br /&gt;
: '''Правило 7.''' Игра прекращается, если при очередном шаге ни одна из клеток не меняет своего состояния.&lt;br /&gt;
: '''Правило 8.''' Игра прекращается, если конфигурация на очередном шаге в точности повторит себя же на одном из более ранних шагов.&lt;br /&gt;
&lt;br /&gt;
== Булевы функции ==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement = В игре «Жизнь» можно построить любую булеву функцию.&lt;br /&gt;
|proof =&lt;br /&gt;
[[Файл:Types.png|250px|thumb|right|Базовые конструкции]]&lt;br /&gt;
[[Файл:Glidergun.png|200px|thumb|right| Glider gun]]&lt;br /&gt;
[[Файл:Eater.png|150px|thumb|right| Glider eater]]&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;n&amp;lt;/tex&amp;gt; итераций (третий ряд),&lt;br /&gt;
* планер (glider) {{---}} фигура, которая смещается на одну клетку вниз и в право каждые &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; итерации (четвертый ряд),&lt;br /&gt;
* космический корабль {{---}} фигура, которая смещается ортогонально на &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; клетку каждые &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; итерации,&lt;br /&gt;
* glider gun {{---}} фигура, бесконечно производящая планер каждые &amp;lt;tex&amp;gt;30&amp;lt;/tex&amp;gt; итераций,&lt;br /&gt;
* glider eater {{---}} фигура, поглощающая планеры.&lt;br /&gt;
&lt;br /&gt;
===Булевы функции===&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;\triangledown&amp;lt;/tex&amp;gt; ([[Определение_булевой_функции#.D0.91.D0.B8.D0.BD.D0.B0.D1.80.D0.BD.D1.8B.D0.B5_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B8|штрих Шеффера]] или NAND) является [[Полные системы функций. Теорема Поста о полной системе функций |полной системой]], то достаточно построить &amp;lt;tex&amp;gt;NOT&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;AND&amp;lt;/tex&amp;gt;, чтобы показать возможность построения любой булевой функции.&lt;br /&gt;
===Построение NOT===&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;. При столкновении планеры исчезают, следовательно на месте &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; образуется &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и наоборот.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Not.png|300px]]&lt;br /&gt;
===Построение AND===&lt;br /&gt;
См. рисунок. Пусть &amp;lt;tex&amp;gt;AND(x, y)&amp;lt;/tex&amp;gt;, тогда y соударяется с &amp;lt;tex&amp;gt;NOT(x)&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;NOT(x) = 1&amp;lt;/tex&amp;gt;, то на выходе ничего не попадет, если &amp;lt;tex&amp;gt;NOT( x) = 0&amp;lt;/tex&amp;gt;, то просто пройдет &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;.&lt;br /&gt;
[[Файл:And.png|300px]]&lt;br /&gt;
}}&lt;br /&gt;
==Неразрешимость==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Проблема останова игры «Жизнь» неразрешима.&lt;br /&gt;
|proof = &lt;br /&gt;
[[Файл:TM.png|300px|thumb|right| МТ в игре «Жизнь»]]&lt;br /&gt;
[[Файл:TM_diagram.png|300px|thumb|right| Схема МТ в игре «Жизнь»]]&lt;br /&gt;
[[Файл:Finite_state_control.png|300px|thumb|right| Схема конечного автомата в игре «Жизнь»]]&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;ref&amp;gt;[http://eprints.uwe.ac.uk/22323 Rendell, P. (2014) Turing machine universality of the game of life. PhD, University of the West of England]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
=== Конечный автомат ===&lt;br /&gt;
Конечный автомат представляет собой двумерный массив с двумя входами: предыдущее состояние, получаемое от детектора сигнала, и считанный символ от одного из стеков {{---}} для выбора ряда и колонки ячейки, в которой лежит информация о переходе.&lt;br /&gt;
=== Детектор сигнала ===&lt;br /&gt;
Детектор сигнала распознает информацию, полученную от конечного автомата, и передает ее дальше: информацию о следующем состоянии {{---}} обратно в автомат (с задержкой), где она используется для выбора адреса ряда; информацию о символе для записи {{---}} на один из стеков.&lt;br /&gt;
=== Стек ===&lt;br /&gt;
Лента МТ представлена в виде двух стеков, которые могут эмулировать передвижение головки чтения записи по ленте: в каждом цикле один стек делает push символа, другой {{---}} pop.&lt;br /&gt;
=== Контроллер стека ===&lt;br /&gt;
Контроллер стека производит конструкцию из планеров, необходимую стекам для произведения push или pop, осуществляет перемещение символов.&lt;br /&gt;
===Некоторые конструкции===&lt;br /&gt;
Ниже приведены некоторые конструкций игры, с помощью которых построены вышеупомянутые элементы.&lt;br /&gt;
&lt;br /&gt;
====Пчелиная королева====&lt;br /&gt;
[[Файл:Queen_bee.png|350px]]&lt;br /&gt;
&lt;br /&gt;
Небольшая конструкция передвигающаяся туда-обратно, при развороте оставляет стабильную конструкцию, называемую ульем. Умирает, если при возвращении улей не исчез. Используется для построения glider gun.&lt;br /&gt;
&lt;br /&gt;
====Buckaroo====&lt;br /&gt;
Пчелиная королева с eater. Эта конструкция примечательная тем, что при исчезновении улья возникает &amp;quot;вспышка&amp;quot;, которая может менять направление планера.&lt;br /&gt;
&lt;br /&gt;
====Pentadecathlon====&lt;br /&gt;
[[Файл:Pentadecathlon.png|500px]]&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;
&amp;lt;references/&amp;gt;&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%96%D0%B8%D0%B7%D0%BD%D1%8C_(%D0%B8%D0%B3%D1%80%D0%B0) Википедия {{---}} Жизнь (игра)]&lt;br /&gt;
* [http://academic.regis.edu/dbahr/generalpages/CellularAutomata/CA_part14_files/frame.htm Proving Life is Universal]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Теория вычислимости]]&lt;br /&gt;
[[Категория: Примеры неразрешимых задач]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%82%D1%80%D0%B0%D0%BD%D1%81%D0%BB%D1%8F%D1%86%D0%B8%D0%B8&amp;diff=82992</id>
		<title>Методы трансляции</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%82%D1%80%D0%B0%D0%BD%D1%81%D0%BB%D1%8F%D1%86%D0%B8%D0%B8&amp;diff=82992"/>
				<updated>2022-09-01T04:03:03Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Нисходящий разбор ==&lt;br /&gt;
* [[LL(k)-грамматики, множества FIRST и FOLLOW]]&lt;br /&gt;
* [[Построение FIRST и FOLLOW]]&lt;br /&gt;
* [[Предиктивный синтаксический анализ]]&lt;br /&gt;
* [[Атрибутные транслирующие грамматики]]&lt;br /&gt;
== Восходящий разбор ==&lt;br /&gt;
* [[LR(k)-грамматики]]&lt;br /&gt;
* [[LR(0)-разбор]]&lt;br /&gt;
* [[SLR(1)-разбор]]&lt;br /&gt;
* [[LR(1)-разбор]]&lt;br /&gt;
* [[LALR-разбор]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Методы трансляции]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D0%BD%D0%B0%D0%B8%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%D0%B9_%D0%BE%D0%B1%D1%89%D0%B5%D0%B9_%D0%BF%D0%B0%D0%BB%D0%B8%D0%BD%D0%B4%D1%80%D0%BE%D0%BC%D0%BD%D0%BE%D0%B9_%D0%BF%D0%BE%D0%B4%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=82991</id>
		<title>Задача о наибольшей общей палиндромной подпоследовательности</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D0%BD%D0%B0%D0%B8%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%D0%B9_%D0%BE%D0%B1%D1%89%D0%B5%D0%B9_%D0%BF%D0%B0%D0%BB%D0%B8%D0%BD%D0%B4%D1%80%D0%BE%D0%BC%D0%BD%D0%BE%D0%B9_%D0%BF%D0%BE%D0%B4%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=82991"/>
				<updated>2022-09-01T04:02:56Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''[[Задача о наибольшей общей подпоследовательности]]''' (англ. ''longest common subsequence (LCS)'') {{---}} классическая и хорошо изученная проблема.&lt;br /&gt;
&lt;br /&gt;
'''[[Задача о наибольшей подпоследовательности-палиндроме]]''' (англ. ''longest palindromic subsequence (LPS)'') {{---}} также хорошо изучена.&lt;br /&gt;
&lt;br /&gt;
Здесь мы рассмотрим задачу, которая объединяет две вышеперечисленные задачи в одну.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = Для последовательности &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, мы обозначим её подпоследовательность &amp;lt;tex&amp;gt;x_{i}...x_{j}\ (1 \leqslant i \leqslant j \leqslant n)\ &amp;lt;/tex&amp;gt; как &amp;lt;tex&amp;gt;X_{i,j}&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; последовательностей &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; называется '''общей подпалиндромной подпоследовательностью''' (англ. ''common palindromic subsequence''). Общая подпалиндромная последовательность, имеющая максимальную длину, называется '''наибольшей общей подпалиндромной подпоследовательностью''' (англ. ''longest common palindromic subsequence (LCPS)'') и мы обозначим её как &amp;lt;tex&amp;gt;LCPS(X,Y)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}{{Задача&lt;br /&gt;
|definition = '''Наибольшая общая подпалиндромная подпоследовательность''' {{---}} задача, являющаяся интересным вариантом классической задачи о поиске наибольшей общей подпоследовательности, которая также накладывает условия, что эта подпоследовательность должна быть палиндромом.&lt;br /&gt;
}}&lt;br /&gt;
==Наивное решение==&lt;br /&gt;
Можно придумать такое решение данной задачи: найти наибольшую общую подпоследовательность, в ней найти наибольшую подпалиндромную подпоследовательность. Но, к сожалению, это решение '''неверно'''.&lt;br /&gt;
===Контрпример===&lt;br /&gt;
Возьмем две последовательности &amp;lt;tex&amp;gt;X=[1,\ 2,\ 3,\ 1]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y=[1,\ 1,\ 2,\ 3]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наибольшей общая подпоследовательность данных последовательностей равна &amp;lt;tex&amp;gt;LCS(X,Y) = [1,\ 2,\ 3]&amp;lt;/tex&amp;gt; и в ней наибольшая подпалиндромная последовательность имеет длину &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Но очевидно, что на самом деле последовательность &amp;lt;tex&amp;gt;Z=[1,\ 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;2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
==Решение с помощью динамического программирования==&lt;br /&gt;
Заметим, что в качестве подзадач для &amp;lt;tex&amp;gt;LCPS&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;LCPS&amp;lt;/tex&amp;gt;, что даст возможность воспользоваться идеей [[Динамическое программирование | динамического программирования]].&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Пусть &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;n&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; соответственно, а &amp;lt;tex&amp;gt;X_{i,j}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y_{k,l}&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 = z_{1}z_{2}...z_{u}&amp;lt;/tex&amp;gt; {{---}} наибольшая общая подпалиндромная последовательность двух подпоследовательностей &amp;lt;tex&amp;gt;X_{i,j}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y_{k,l}&amp;lt;/tex&amp;gt;. Тогда выполняются следующие утверждения,&lt;br /&gt;
&lt;br /&gt;
# Если &amp;lt;tex&amp;gt;x_i=x_j=y_k=y_l=a&amp;lt;/tex&amp;gt; (для произвольного &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;), тогда &amp;lt;tex&amp;gt;z_1=z_u=a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Z_{2, u-1}&amp;lt;/tex&amp;gt; {{---}} НОПП от подпоследовательностей &amp;lt;tex&amp;gt;X_{i+1,j-1}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y_{k+1,l-1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Если &amp;lt;tex&amp;gt;x_i=x_j=y_k=y_l&amp;lt;/tex&amp;gt; не выполняется, то &amp;lt;tex&amp;gt;Z&amp;lt;/tex&amp;gt; {{---}} НОПП от подпоследовательностей (&amp;lt;tex&amp;gt;X_{i+1,j}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y_{k,l}&amp;lt;/tex&amp;gt;) или (&amp;lt;tex&amp;gt;X_{i,j-1}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y_{k,l}&amp;lt;/tex&amp;gt;) или (&amp;lt;tex&amp;gt;X_{i,j}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y_{k+1,l}&amp;lt;/tex&amp;gt;) или (&amp;lt;tex&amp;gt;X_{i,j}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y_{k,l-1}&amp;lt;/tex&amp;gt;).&lt;br /&gt;
}}&lt;br /&gt;
На основании теоремы мы напишем следующую рекурсивную формулу для длины наибольшей общей подпалиндромной подпоследовательности:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
lcps[i,j,k,l] = \left\{\begin{array}{llcl}&lt;br /&gt;
0&amp;amp;&amp;amp;;&amp;amp;i &amp;gt; j\ \lor\ k &amp;gt; l\\&lt;br /&gt;
1&amp;amp;&amp;amp;;&amp;amp;(i = j)\ \land\ (k = l)\ \land\ (x_i=x_j=y_k=y_l)\\&lt;br /&gt;
2+lcps[i+1,j-1,k+1,l-1]&amp;amp;&amp;amp;;&amp;amp;(i &amp;lt; j)\ \land\ (k &amp;lt; l)\ \land\ (x_i=x_j=y_k=y_l)\\&lt;br /&gt;
\max{(}lcps[i+1,j,k,l],lcps[i,j-1,k,l],&amp;amp;&amp;amp;;&amp;amp;(i \leqslant j)\ \land\ (k \leqslant l)\ \land\ \lnot(x_i=x_j=y_k=y_l)\\&lt;br /&gt;
\:\:\:\:\:\:\:\:\:\:\:lcps[i,j,k+1,l],lcps[i,j,k,l-1])&lt;br /&gt;
\end{array}\right.&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где &amp;lt;tex&amp;gt;lcps[i,j,k,l]&amp;lt;/tex&amp;gt; {{---}} длина наибольшей общей палиндромной подпоследовательности от &amp;lt;tex&amp;gt;X_{i,j}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y_{k,l}&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;lcps[1,n,1,m]&amp;lt;/tex&amp;gt;. Мы можем вычислить эту длину за время &amp;lt;tex&amp;gt;O(n^4)&amp;lt;/tex&amp;gt; используя динамическое программирование.&lt;br /&gt;
&lt;br /&gt;
===Реализация===&lt;br /&gt;
Будем использовать динамику с запоминанием ответа (с мемоизацией). Оформим решения в виде рекурсивной функции &amp;lt;tex&amp;gt;lcps&amp;lt;/tex&amp;gt;, которая возвращает ответ для подзадачи, на которую она была вызвана.&amp;lt;br&amp;gt; В массиве &amp;lt;tex&amp;gt;\mathtt{ans}&amp;lt;/tex&amp;gt; хранятся ответы для подзадач. До запуска функции &amp;lt;tex&amp;gt;lcps&amp;lt;/tex&amp;gt; заполним массив &amp;lt;tex&amp;gt;ans&amp;lt;/tex&amp;gt; значением &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt;. Так как каждое значение считается не более одного раза и эта операция происходит за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, мы получим асимптотику &amp;lt;tex&amp;gt;O(n^4)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
 '''int''' lcps(i: '''int''', j: '''int''', k: '''int''', l: '''int''')&lt;br /&gt;
   '''if''' (ans[i][j][k][l] &amp;lt;tex&amp;gt; \neq &amp;lt;/tex&amp;gt; -1) &amp;lt;span style=&amp;quot;color:Green&amp;quot;&amp;gt;// если значение уже посчитано, то надо его вернуть&amp;lt;/span&amp;gt;&lt;br /&gt;
     '''return''' ans[i][j][k][l]&lt;br /&gt;
   '''if''' (i &amp;gt; j '''or''' k &amp;gt; l)&lt;br /&gt;
     ans[i][j][k][l] = 0&lt;br /&gt;
     '''return''' 0&lt;br /&gt;
   '''if''' (X[i] == X[j] == Y[k] == Y[l])&lt;br /&gt;
     '''if''' (i == j '''and''' k == l)&lt;br /&gt;
       ans[i][j][k][l] = 1&lt;br /&gt;
       '''return''' 1       &lt;br /&gt;
     '''else'''   &lt;br /&gt;
       ans[i][j][k][l] = (2 + lcps(i + 1, j - 1, k + 1, l - 1))    &lt;br /&gt;
       '''return''' ans[i][j][k][l]&lt;br /&gt;
   ans[i][j][k][l] = max(lcps(i + 1, j, k, l), lcps(i, j - 1, k, l), lcps(i, j, k + 1, l), lcps(i, j, k, l - 1))&lt;br /&gt;
   '''return''' ans[i][j][k][l]&lt;br /&gt;
==См. также==&lt;br /&gt;
* [[Задача о наибольшей возрастающей подпоследовательности]]&lt;br /&gt;
* [[Задача о редакционном расстоянии, алгоритм Вагнера-Фишера]]&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [https://www.academia.edu/2015585/Computing_a_Longest_Common_Palindromic_Subsequence Academia.edu {{---}} Computing a Longest Common Palindromic Subsequence]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Динамическое программирование]]&lt;br /&gt;
[[Категория:Другие задачи динамического программирования]]&lt;br /&gt;
[[Категория:Алгоритмы на строках]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_%27P%5Cpoly%27&amp;diff=82990</id>
		<title>Класс 'P\poly'</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_%27P%5Cpoly%27&amp;diff=82990"/>
				<updated>2022-09-01T04:02:30Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;i&amp;gt;P\poly &amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;tex&amp;gt; = \{L | L &amp;lt;/tex&amp;gt; имеет схемную сложность полином&amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Альтернативное определение==&lt;br /&gt;
Класс &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;C\f&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt; &amp;lt;tex&amp;gt; = \{L | \exists&amp;lt;/tex&amp;gt; двуместная &amp;lt;tex&amp;gt; R \in C ~\exists a_1, \ldots, a_n, \ldots : |a_n| \le f(n): x \in L \Leftrightarrow R(x, a_{|x|}) = 1\}&amp;lt;/tex&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Тогда &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;P\poly &amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;tex&amp;gt; = \{L | \exists R \in P ~\exists a_1, \ldots, a_n, \ldots : |a_n| \le p(n) : x \in L \Leftrightarrow R(x, a_{|x|}) = 1 \}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Некоторые факты о &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;P\poly&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;==&lt;br /&gt;
* В &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;P\poly&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt; входят [[Редкие языки|редкие языки]]&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;NP&amp;lt;/tex&amp;gt; не входит в &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;P\poly&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;, то &amp;lt;tex&amp;gt;P \ne NP&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;NP \subset &amp;lt;/tex&amp;gt; &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;P\poly&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt; &amp;lt;tex&amp;gt;\Rightarrow \Sigma_2 = PH&amp;lt;/tex&amp;gt; ([[Теорема Карпа-Липтона]])&lt;br /&gt;
* &amp;lt;tex&amp;gt; BPP \subset &amp;lt;/tex&amp;gt; &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;P\poly&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D1%80%D1%8F%D0%B4%D0%B0&amp;diff=82989</id>
		<title>Определение суммы числового ряда</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D1%80%D1%8F%D0%B4%D0%B0&amp;diff=82989"/>
				<updated>2022-09-01T04:02:16Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Математический анализ 1 курс]]&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{k=1}^\infty a_k = a_1 + a_2 + a_3 \ldots&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;a_k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;k &amp;gt; n&amp;lt;/tex&amp;gt; равны нулю, то &amp;lt;tex&amp;gt;\sum\limits_{k = 1}^\infty = \sum\limits_{k = 1}^n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*Линейность ряда: &amp;lt;tex&amp;gt;\sum\limits_{k = 1}^\infty (\alpha a_k + \beta b_k) = \alpha\sum\limits_{k = 1}^\infty a_k + \beta\sum\limits_{k = 1}^\infty b_k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
То, каким правилом определяется сумма ряда, называется способом суммирования.&lt;br /&gt;
&lt;br /&gt;
Классический способ суммирования:&lt;br /&gt;
&amp;lt;tex&amp;gt;S_n = \sum\limits_{k = 1}^n a_k&amp;lt;/tex&amp;gt; {{---}} частичные суммы ряда.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;\lim\limits_{n\to\infty} S_n&amp;lt;/tex&amp;gt; {{---}} сумма числового ряда. Если этот предел существует и конечен, то ряд называют сходящимся, иначе {{---}} расходящийся.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Сумму ряда обычно обозначают так же, как и ряд: &amp;lt;tex&amp;gt;\sum\limits_{k = 1}^\infty a_k = \lim\limits_{n\to\infty} \sum\limits_{k = 1}^n a_k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Из арифметики предела становится ясно, что:&lt;br /&gt;
*&amp;lt;tex&amp;gt;S_{n + 1} = S_n + a_{n + 1}&amp;lt;/tex&amp;gt;&lt;br /&gt;
*&amp;lt;tex&amp;gt;S_n \to S \Rightarrow a_n \to 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Если ряд сходится, то его слагаемые необходимо стремятся к нулю. Однако, это требование лишь необходимое&lt;br /&gt;
|proof=&lt;br /&gt;
Переписывая на языке частичных сумм критерий Коши существования предела последовательности, приходим к критерию Коши сходимости ряда:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{k = 1}^\infty a_k&amp;lt;/tex&amp;gt; {{---}} сходится &amp;lt;tex&amp;gt;\iff&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\sum\limits_{k = n}^{n + p} a_k \xrightarrow[n,p\to \infty]{} 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Это видно из равенства &amp;lt;tex&amp;gt;S_{n + p} - S_{n - 1} = \sum\limits_{k = n}^{n + p} a_k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;tex&amp;gt;S_n = \sum\limits_{k = 1}^p a_k + \sum\limits_{k = p + 1}^n a_k&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; {{---}} ограничено, &amp;lt;tex&amp;gt;n \to \infty&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значит, &amp;lt;tex&amp;gt;S_n&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\sum\limits_{k = p+1}^n a_k&amp;lt;/tex&amp;gt; равносходятся.&lt;br /&gt;
&lt;br /&gt;
Вывод: на сходимость конечное число слагаемых не влияет. Однако, очевидно, они вляют на значение суммы.&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81_%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%BC%D0%B8_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%D0%BC%D0%B8&amp;diff=82988</id>
		<title>Регулярные выражения с обратными ссылками</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81_%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%BC%D0%B8_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%D0%BC%D0%B8&amp;diff=82988"/>
				<updated>2022-09-01T04:01:56Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Базовые определения==&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=groupdef&lt;br /&gt;
|definition='''Группа''' (англ. ''capture group'') {{---}} часть [[Регулярные языки: два определения и их эквивалентность|регулярного выражения]]. Общепринятое условное обозначение группы {{---}} круглые скобки.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Пример: &amp;lt;tex&amp;gt;aba(ca)ba.\,&amp;lt;/tex&amp;gt; В данном регулярном выражении представлена одна группа {{---}} &amp;lt;tex&amp;gt;(ca).&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждой группе соответствует порядковый номер. Нумерация идёт слева направо: номеру группы соответствует порядковый номер открывающей круглой скобки этой группы в тексте регулярного выражения (исключая случаи, когда скобки являются частью синтаксической конструкции).&lt;br /&gt;
&lt;br /&gt;
Пример: &amp;lt;tex&amp;gt;(ab(cd))(ef).&amp;lt;/tex&amp;gt; Группа &amp;lt;tex&amp;gt;№1&amp;lt;/tex&amp;gt; {{---}} &amp;lt;tex&amp;gt;(ab(cd)),\,&amp;lt;/tex&amp;gt; группа &amp;lt;tex&amp;gt;№2&amp;lt;/tex&amp;gt; {{---}} &amp;lt;tex&amp;gt;(cd),\,&amp;lt;/tex&amp;gt; группа &amp;lt;tex&amp;gt;№3&amp;lt;/tex&amp;gt; {{---}} &amp;lt;tex&amp;gt;(ef)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=referencedef&lt;br /&gt;
|definition='''Обратная ссылка''' (англ. ''backreference'') {{---}} механизм повторного использования групп или [[Основные определения, связанные со строками|слов]] группы.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для повторного использования '''слова''' группы используется обозначение &amp;lt;tex&amp;gt;\backslash n,\,&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} номер группы.&lt;br /&gt;
&lt;br /&gt;
Пример использования: &amp;lt;tex&amp;gt;((1\,|\,0)^*)\backslash 1.\,&amp;lt;/tex&amp;gt; Данное регулярное выражение будет задавать язык тандемных повторов. Несмотря на то, что он не является [[Регулярные языки: два определения и их эквивалентность|регулярным]], его можно представить с помощью механизма обратных ссылок.&lt;br /&gt;
&lt;br /&gt;
Для повторного использования '''регулярного выражения''' группы используется обозначение &amp;lt;tex&amp;gt;(?n),\,&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} номер группы. Использование круглых скобок обусловленно тем, что &amp;lt;tex&amp;gt;?,&amp;lt;/tex&amp;gt; как управляющий символ, уже используется. В данном случае круглые скобки следует воспринимать как общепринятое '''условное обозначение''' обратной ссылки; запись &amp;lt;tex&amp;gt;(?n)&amp;lt;/tex&amp;gt; не задаёт группу. Например, в выражении &amp;lt;tex&amp;gt;(aba)(?1)(caba)(?2)\;&amp;lt;/tex&amp;gt; ссылке &amp;lt;tex&amp;gt;(?2)&amp;lt;/tex&amp;gt; будет соответствовать &amp;lt;tex&amp;gt;(caba),\,&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;
Обратите внимание, что символы круглых скобок и обратной косой черты являются управляющими. Чтобы использовать их непосредственно как часть слова, их нужно [https://ru.wikipedia.org/wiki/Экранирование_символов экранировать].&lt;br /&gt;
&lt;br /&gt;
Пример экранирования (в данном случае в качестве символа экранирования используется символ обратной косой черты): &amp;lt;tex&amp;gt;\backslash 1&amp;lt;/tex&amp;gt; {{---}} обратная ссылка на первую группу, &amp;lt;tex&amp;gt;\backslash\backslash 1&amp;lt;/tex&amp;gt; {{---}} слово, состоящее из символа обратной косой черты и единицы.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=maindef&lt;br /&gt;
|definition='''Регулярные выражения с обратными ссылками''' (англ. ''regex with backreferences'') {{---}} регулярные выражения, использующие механизм обратных ссылок.&lt;br /&gt;
}} &lt;br /&gt;
==Примеры==&lt;br /&gt;
# Регулярное выражение &amp;lt;tex&amp;gt;(aba?)c(?1)\,&amp;lt;/tex&amp;gt; породит язык &amp;lt;tex&amp;gt;L=\{abcab,abacab,abcaba,abacaba\}.\;&amp;lt;/tex&amp;gt; Для сравнения, запишем эквивалентное регулярное выражение без использования механизма обратных ссылок: &amp;lt;tex&amp;gt;(aba?)c(aba?).&amp;lt;/tex&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt;(a^*)\backslash 1.\,&amp;lt;/tex&amp;gt; Данное регулярное выражение будет допускать только слова, в которых количество букв &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; чётно.&lt;br /&gt;
# Выведем регулярное выражение для языка, состоящего из палиндромов фиксированной длины &amp;lt;tex&amp;gt;n=2\cdot m\,&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;\,n=2\cdot m+1&amp;lt;/tex&amp;gt; над алфавитом &amp;lt;tex&amp;gt;\Sigma=\{0,1\}&amp;lt;/tex&amp;gt;:&lt;br /&gt;
#* для чётного &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;\;\underbrace{(0\,|\,1)(0\,|\,1)(0\,|\,1)\dotsc(0\,|\,1)}_{m}\,\backslash m\dotsc\backslash 3\backslash 2\backslash 1;&amp;lt;/tex&amp;gt;&lt;br /&gt;
#* для нечётного &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;\;\underbrace{(0\,|\,1)(0\,|\,1)(0\,|\,1)\dotsc(0\,|\,1)}_{m}\,(0\,|\,1)\backslash m\dotsc\backslash 3\backslash 2\backslash 1,\;&amp;lt;/tex&amp;gt; &lt;br /&gt;
# Запишем выражение для языка &amp;lt;tex&amp;gt;L=b^kab^kab^ka,\,k&amp;gt;0.\,&amp;lt;/tex&amp;gt; Данный язык не является ни регулярным, ни контекстно-свободным (по [[Лемма о разрастании для КС-грамматик|лемме о разрастании]]), то есть является [[Иерархия Хомского формальных грамматик|контекстно-зависимым]], но также легко представим с помощью обратных ссылок:&lt;br /&gt;
#: &amp;lt;tex&amp;gt;L=(bb^*a)\backslash 1\backslash 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Язык &amp;lt;tex&amp;gt;L=a^nb^n,\,n&amp;gt;0\,&amp;lt;/tex&amp;gt; можно представить при помощи обратных ссылок:&lt;br /&gt;
#: &amp;lt;tex&amp;gt;L=(a(?1)?b).&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;
#: &amp;lt;tex&amp;gt;(?1)&amp;lt;/tex&amp;gt; ссылается на первую группу {{---}} &amp;lt;tex&amp;gt;(a(?1)?b)&amp;lt;/tex&amp;gt;, что равносильно рекурсивной зависимости:        &lt;br /&gt;
#:::: &amp;lt;tex&amp;gt;(a(?1)?b)=&amp;lt;/tex&amp;gt;&lt;br /&gt;
#::: &amp;lt;tex&amp;gt;=(a(a(?1)?b)?b)=&amp;lt;/tex&amp;gt;&lt;br /&gt;
#:: &amp;lt;tex&amp;gt;=(a(a(a(?1)?b)?b)?b)=&amp;lt;/tex&amp;gt;&lt;br /&gt;
#: &amp;lt;tex&amp;gt;=(a(a(a(a(?1)?b)?b)?b)?b)=\dotsc&amp;lt;/tex&amp;gt;&lt;br /&gt;
#: Очевидно, что все слова из языка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; удовлетворяют данному регулярному выражению.&lt;br /&gt;
==Теорема о КС-языках==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=theorem. &lt;br /&gt;
|statement=С помощью механизма обратных ссылок можно представить любой [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободный язык]].&lt;br /&gt;
|proof=&lt;br /&gt;
Любую контекстно-свободную грамматику можно привести к [[Нормальная форма Хомского|нормальной форме Хомского]], следовательно, достаточно доказать, что грамматику, заданную в такой форме, можно преобразовать в регулярное выражение с обратными ссылками. Рассмотрим правила, которые могут содержаться в такой грамматике:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A\rightarrow BC\\A\rightarrow a\\S\rightarrow\varepsilon&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Представим каждое из них в виде регулярного выражения с обратными ссылками.&lt;br /&gt;
&lt;br /&gt;
Используя ссылки на регулярные выражения, соответствующие нетерминалам &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, можно представить первое правило:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A\rightarrow BC\leftrightarrow A\rightarrow ((?n_B)\,(?n_C)),\,&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;(?n_B)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(?n_C)&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;; &lt;br /&gt;
&lt;br /&gt;
Второе и третье правила не требуют использования обратных ссылок:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A\rightarrow a\leftrightarrow A\rightarrow (a);\\S\rightarrow\varepsilon\leftrightarrow S\rightarrow ().&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если какому-то нетерминалу &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; соответствуют несколько регулярных выражений &amp;lt;tex&amp;gt;r_1, r_2, \dotsc, r_n&amp;lt;/tex&amp;gt;, заменить их на одно: &amp;lt;tex&amp;gt;A=(r_1\,|\,r_2\,|\,\dotsc\,|\,r_n)\,&amp;lt;/tex&amp;gt; (очевидно, что оно также будет соответствовать этому нетерминалу).&lt;br /&gt;
&lt;br /&gt;
Регулярное выражение для данной КС-грамматики соответствует нетерминалу &amp;lt;tex&amp;gt;S,\,&amp;lt;/tex&amp;gt; однако в нём могут встречаться ссылки на внешние {{---}} отличные от &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; {{---}} группы. Будем обрабатывать такие ссылки, используя метод [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|левостороннего вывода]]. При обработке очередной ссылки:&lt;br /&gt;
# если эта ссылка встречается впервые, вместо неё подставим соответствующее регулярное выражение и запомним номер его группы в текущем регулярном выражении;&lt;br /&gt;
# иначе вместо этой ссылки подставим ссылку на соответствующую группу в текущем регулярном выражении.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После соответствующих замен регулярное выражение для &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; будет искомым.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Пример преобразования===&lt;br /&gt;
Рассмотрим следующую КС-грамматику:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;S\rightarrow cA\\S\rightarrow dA\\S\rightarrow cB\\S\rightarrow eB\\A\rightarrow a\\B\rightarrow b&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Приведём её к нормальной форме Хомского:&lt;br /&gt;
#: &amp;lt;tex&amp;gt;S\rightarrow CA\\S\rightarrow DA\\S\rightarrow CB\\S\rightarrow EB\\A\rightarrow a\\B\rightarrow b\\C\rightarrow c\\D\rightarrow d\\E\rightarrow e&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Каждому нетерминалу поставим в соответствие свой номер:&lt;br /&gt;
#: &amp;lt;tex&amp;gt;S\leftrightarrow 1, A\leftrightarrow 2, B\leftrightarrow 3, C\leftrightarrow 4, D\leftrightarrow 5, E\leftrightarrow 6&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Каждое правило представим в виде регулярного выражения с обратными ссылками: &lt;br /&gt;
#: &amp;lt;tex&amp;gt;S\rightarrow ((?4)(?2))\\S\rightarrow ((?5)(?2))\\S\rightarrow ((?4)(?3))\\S\rightarrow ((?6)(?3))\\A\rightarrow (a)\\B\rightarrow (b)\\C\rightarrow (c)\\D\rightarrow (d)\\E\rightarrow (e)&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Объединим регулярные выражения, соответствующие одинаковым нетерминалам:&lt;br /&gt;
#: &amp;lt;tex&amp;gt;S\rightarrow (((?4)(?2))\,|\,((?5)(?2))\,|\,((?4)(?3))\,|\,((?6)(?3)))\\A\rightarrow (a)\\B\rightarrow (b)\\C\rightarrow (c)\\D\rightarrow (d)\\E\rightarrow (e)&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Избавимся от внешних ссылок в регулярном выражении для &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;display: inline-table; white-space: nowrap; text-align: center;&amp;quot;&lt;br /&gt;
|+Пошаговый вывод&lt;br /&gt;
! № || Текущее регулярное выражение&lt;br /&gt;
|-&lt;br /&gt;
| 1. || &amp;lt;tex&amp;gt;(((\underline{\textbf{?4}})(\underline{?2}))\,|\,((\underline{?5})(\underline{?2}))\,|\,((\underline{?4})(\underline{?3}))\,|\,((\underline{?6})(\underline{?3})))\,&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2. || &amp;lt;tex&amp;gt;(((c)(\underline{\textbf{?2}}))\,|\,((\underline{?5})(\underline{?2}))\,|\,((\underline{?4})(\underline{?3}))\,|\,((\underline{?6})(\underline{?3})))\,&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3. || &amp;lt;tex&amp;gt;(((c)(a))\,|\,((\underline{\textbf{?5}})(\underline{?2}))\,|\,((\underline{?4})(\underline{?3}))\,|\,((\underline{?6})(\underline{?3})))\,&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 4. || &amp;lt;tex&amp;gt;(((c)(a))\,|\,((d)(\underline{\textbf{?2}}))\,|\,((\underline{?4})(\underline{?3}))\,|\,((\underline{?6})(\underline{?3})))\,&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 5. || &amp;lt;tex&amp;gt;(((c)(a))\,|\,((d)(?4))\,|\,((\underline{\textbf{?4}})(\underline{?3}))\,|\,((\underline{?6})(\underline{?3})))\,&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 6. || &amp;lt;tex&amp;gt;(((c)(a))\,|\,((d)(?4))\,|\,((?3)(\underline{\textbf{?3}}))\,|\,((\underline{?6})(\underline{?3})))\,&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 7. || &amp;lt;tex&amp;gt;(((c)(a))\,|\,((d)(?4))\,|\,((?3)(b))\,|\,((\underline{\textbf{?6}})(\underline{?3})))\,&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 8. || &amp;lt;tex&amp;gt;(((c)(a))\,|\,((d)(?4))\,|\,((?3)(b))\,|\,((e)(\underline{\textbf{?3}})))\,&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 9. || &amp;lt;tex&amp;gt;(((c)(a))\,|\,((d)(?4))\,|\,((?3)(b))\,|\,((e)(?8)))\,&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;display: inline-table; white-space: nowrap; text-align: center;&amp;quot; &lt;br /&gt;
|+№ группы в &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;&lt;br /&gt;
! &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 1 ||   ||   ||  style=&amp;quot;background: #1b5de2; color: white;&amp;quot; |  ||   || &lt;br /&gt;
|-&lt;br /&gt;
| 1 ||  style=&amp;quot;background: #1b5de2; color: white;&amp;quot; |  ||   || &amp;lt;b&amp;gt;3&amp;lt;/b&amp;gt; ||   ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || &amp;lt;b&amp;gt;4&amp;lt;/b&amp;gt; ||   || 3 ||  style=&amp;quot;background: #1b5de2; color: white;&amp;quot; |  || &lt;br /&gt;
|-&lt;br /&gt;
| 1 ||  style=&amp;quot;background: #1b5de2; color: white;&amp;quot; | 4 ||   || 3 || &amp;lt;b&amp;gt;6&amp;lt;/b&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| 1 || 4 ||   ||  style=&amp;quot;background: #1b5de2; color: white;&amp;quot; | 3 || 6 || &lt;br /&gt;
|-&lt;br /&gt;
| 1 || 4 ||  style=&amp;quot;background: #1b5de2; color: white;&amp;quot; |  || 3 || 6 || &lt;br /&gt;
|-&lt;br /&gt;
| 1 || 4 || &amp;lt;b&amp;gt;8&amp;lt;/b&amp;gt; || 3 || 6 ||  style=&amp;quot;background: #1b5de2; color: white;&amp;quot; |  &lt;br /&gt;
|-&lt;br /&gt;
| 1 || 4 || style=&amp;quot;background: #1b5de2; color: white;&amp;quot; | 8 || 3 || 6 || &amp;lt;b&amp;gt;10&amp;lt;/b&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 4 || 8 || 3 || 6 || 10&lt;br /&gt;
|}&lt;br /&gt;
'''Напоминание''': круглые скобки в записи обратной ссылки являются синтаксической конструкцией и не задают группу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, регулярное выражение для данной грамматики будет выглядеть так: &amp;lt;tex&amp;gt;(((c)(a))\,|\,((d)(?4))\,|\,((?3)(b))\,|\,((e)(?8))).&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Рассмотрим другой пример:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;S\rightarrow\varepsilon\\S\rightarrow (S)S\\S\rightarrow S(S)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Приведём её к нормальной форме Хомского:&lt;br /&gt;
#: &amp;lt;tex&amp;gt;S\rightarrow\varepsilon\\S\rightarrow AS\\S\rightarrow SA\\A\rightarrow OB\\B\rightarrow SC\\O\rightarrow (\\C\rightarrow\; )&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Каждому нетерминалу поставим в соответствие свой номер:&lt;br /&gt;
#: &amp;lt;tex&amp;gt;S\leftrightarrow 1, A\leftrightarrow 2, B\leftrightarrow 3, O\leftrightarrow 4, C\leftrightarrow 5&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Каждое правило представим в виде регулярного выражения с обратными ссылками: &lt;br /&gt;
#: &amp;lt;tex&amp;gt;S\rightarrow ()\\S\rightarrow ((?2)(?1))\\S\rightarrow ((?1)(?2))\\A\rightarrow ((?4)(?3))\\B\rightarrow ((?1)(?5))\\O\rightarrow (\backslash (\,)\\C\rightarrow (\backslash )\,)&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Объединим регулярные выражения, соответствующие одинаковым нетерминалам:&lt;br /&gt;
#: &amp;lt;tex&amp;gt;S\rightarrow (()\,|\,((?2)(?1))\,|\,((?1)(?2)))\\A\rightarrow ((?4)(?3))\\B\rightarrow ((?1)(?5))\\O\rightarrow (\backslash (\,)\\C\rightarrow (\backslash )\,)&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Избавимся от внешних ссылок в регулярном выражении для &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;display: inline-table; white-space: nowrap; text-align: center;&amp;quot;&lt;br /&gt;
|+Пошаговый вывод&lt;br /&gt;
! № || Текущее регулярное выражение&lt;br /&gt;
|-&lt;br /&gt;
| 1. || &amp;lt;tex&amp;gt;(()\,|\,((\underline{\textbf{?2}})(?1))\,|\,((?1)(\underline{?2})))&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2. || &amp;lt;tex&amp;gt;(()\,|\,(((\underline{\textbf{?4}})(\underline{?3}))(?1))\,|\,((?1)(\underline{?2})))&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3. || &amp;lt;tex&amp;gt;(()\,|\,(((\backslash (\,)(\underline{\textbf{?3}}))(?1))\,|\,((?1)(\underline{?2})))&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 4. || &amp;lt;tex&amp;gt;(()\,|\,(((\backslash (\,)((?1)(\underline{\textbf{?5}})))(?1))\,|\,((?1)(\underline{?2})))&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 5. || &amp;lt;tex&amp;gt;(()\,|\,(((\backslash (\,)((?1)(\backslash )\,)))(?1))\,|\,((?1)(\underline{\textbf{?2}})))&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 6. || &amp;lt;tex&amp;gt;(()\,|\,(((\backslash (\,)((?1)(\backslash )\,)))(?1))\,|\,((?1)(?4)))&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;display: inline-table; white-space: nowrap; text-align: center;&amp;quot; &lt;br /&gt;
|+№ группы в &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;&lt;br /&gt;
! &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;O&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 1 || style=&amp;quot;background: #1b5de2; color: white;&amp;quot; |  ||   ||   || &lt;br /&gt;
|-&lt;br /&gt;
| 1 || &amp;lt;b&amp;gt;4&amp;lt;/b&amp;gt; ||   || style=&amp;quot;background: #1b5de2; color: white;&amp;quot; |  || &lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 4 || style=&amp;quot;background: #1b5de2; color: white;&amp;quot; |  || &amp;lt;b&amp;gt;5&amp;lt;/b&amp;gt;  || &lt;br /&gt;
|-&lt;br /&gt;
| 1 || 4 || &amp;lt;b&amp;gt;6&amp;lt;/b&amp;gt; || 5 || style=&amp;quot;background: #1b5de2; color: white;&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| 1 || style=&amp;quot;background: #1b5de2; color: white;&amp;quot; | 4 || 6 || 5 || &amp;lt;b&amp;gt;7&amp;lt;/b&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 4 || 6 || 5 || 7&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Таким образом, регулярное выражение для данной грамматики будет выглядеть так: &amp;lt;tex&amp;gt;(()\,|\,(((\backslash (\,)((?1)(\backslash )\,)))(?1))\,|\,((?1)(?4))).&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;html&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;
* [https://stackoverflow.com/questions/3644266/how-can-we-match-an-bn-with-java-regex/3644267#3644267 Работа с обратными ссылками в Java]&lt;br /&gt;
* [https://regexr.com Визуализатор регулярных выражений]&lt;br /&gt;
* [https://habr.com/post/171667/ habr.com {{---}} Истинное могущество регулярных выражений]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Автоматы и регулярные языки]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&amp;diff=82987</id>
		<title>Распределённые вычислительные системы</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&amp;diff=82987"/>
				<updated>2022-09-01T04:01:38Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&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;
Распределённая система состоит из конечного множества N независимых процессов {P1...PN}. Множеством возможных событий, происходящих внутри процессов, называют множество из:&lt;br /&gt;
* внутренних событий&lt;br /&gt;
* событий отправки&lt;br /&gt;
* событий получения сообщения.&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A5%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D1%83%D0%BA%D1%83%D1%88%D0%BA%D0%B8&amp;diff=82986</id>
		<title>Хеширование кукушки</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A5%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D1%83%D0%BA%D1%83%D1%88%D0%BA%D0%B8&amp;diff=82986"/>
				<updated>2022-09-01T04:01:22Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Image:cuckoo.png|thumb|Пример хеширования кукушки. Стрелки показывают второе возможное место элементов. Если нам надо будет вставить новый элемент на место А, то мы поместим А в его вторую ячейку, занятую В, а В переместим в его вторую ячейку, которая сейчас свободна. А вот помещение нового элемента на место Н не получится: так как Н — часть цикла, добавленный элемент будет вытеснен после прохода по циклу.]]&lt;br /&gt;
&lt;br /&gt;
'''Хеширование кукушки'''(англ. ''Cuckoo hashing'') {{---}} один из способов [[Разрешение коллизий|борьбы с коллизиями]] при создании [[Хеш-таблица|хеш-таблицы]].&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
&lt;br /&gt;
Основная идея хеширования кукушки — использование двух хеш-функций вместо одной (далее &amp;lt;tex&amp;gt;h_1(x)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;h_2(x)&amp;lt;/tex&amp;gt;). Также есть вариант алгоритма, в котором используются две хеш-таблицы, и первая хеш-функция указывает на ячейку из первой таблицы, а вторая — из второй. Рассмотрим алгоритмы функций &amp;lt;tex&amp;gt;add(x), remove(x)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;contains(x)&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;h_1(x)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;h_2(x)&amp;lt;/tex&amp;gt; (из [[Универсальное семейство хеш-функций | универсального семейства хэш-функций]]).&lt;br /&gt;
&lt;br /&gt;
===='''Add'''==== &lt;br /&gt;
Добавляет элемент с ключом &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; в хэш-таблицу&lt;br /&gt;
&lt;br /&gt;
# Если одна из ячеек с индексами &amp;lt;tex&amp;gt;h_1(x)&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;h_2(x)&amp;lt;/tex&amp;gt; свободна, кладем в нее элемент. &lt;br /&gt;
# Иначе произвольно выбираем одну из этих ячеек, запоминаем элемент, который там находится, помещаем туда новый.&lt;br /&gt;
# Смотрим в ячейку, на которую указывает другая хеш-функция от элемента, который запомнили, если она свободна, помещаем его в нее. &lt;br /&gt;
# Иначе запоминаем элемент из этой ячейки, кладем туда старый. Проверяем, не зациклились ли мы.&lt;br /&gt;
# Если не зациклились, то продолжаем данную процедуру поиска свободного места пока не найдем свободное место или зациклимся.&lt;br /&gt;
# Иначе выбираем &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; новые хеш-функции и перехешируем все добавленные элементы.&lt;br /&gt;
# Также после добавления нужно увеличить размер таблицы в случае если она заполнена.&lt;br /&gt;
&lt;br /&gt;
===='''Remove'''====&lt;br /&gt;
Удаляет элемент с ключом &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; из хэш-таблицы.&lt;br /&gt;
&lt;br /&gt;
# Смотрим ячейки с индексами &amp;lt;tex&amp;gt;h_1(x)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;h_2(x)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Если в одной из них есть искомый элемент, просто помечаем эту ячейку как свободную.&lt;br /&gt;
&lt;br /&gt;
===='''Contains'''====&lt;br /&gt;
Проверяет на наличие элемента &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; в хэш-таблице&lt;br /&gt;
&lt;br /&gt;
# Смотрим ячейки с индексами &amp;lt;tex&amp;gt;h_1(x)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;h_2(x)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Если в одной из них есть искомый элемент, возвращаем true.&lt;br /&gt;
# Иначе возвращаем false.&lt;br /&gt;
&lt;br /&gt;
== Зацикливание ==&lt;br /&gt;
&lt;br /&gt;
Зацикливание может возникнуть при добавлении элемента. Пусть мы добавляем элемент &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;. И обе ячейки &amp;lt;tex&amp;gt;h_1(x)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;h_2(x)&amp;lt;/tex&amp;gt; заняты. Элемент &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; положили изначально в ячейку &amp;lt;tex&amp;gt;h_i(x)&amp;lt;/tex&amp;gt;. Если в ходе перемещений элементов в таблице на очередном шаге мы опять хотим переместить элемент &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; в ячейку &amp;lt;tex&amp;gt;h_i(x)&amp;lt;/tex&amp;gt;, чтобы в ячейку &amp;lt;tex&amp;gt;h_j(x) ~(i \ne j) &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;h_j(x)&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;x,y,z&amp;lt;/tex&amp;gt; у которых &amp;lt;tex&amp;gt;h_1(x)=h_1(y)=h_1(z)&amp;lt;/tex&amp;gt;  и &amp;lt;tex&amp;gt;h_2(x)=h_2(y)=h_2(z)&amp;lt;/tex&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
Одним из способов решения проблемы зацикливания является смена хэш-функции, что было доказано Джоном Трампом&amp;lt;ref&amp;gt;https://eprint.iacr.org/2014/059.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&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(1)&amp;lt;/tex&amp;gt;. Первые два утверждения очевидны: требуется проверить всего лишь &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; ячейки таблицы. &lt;br /&gt;
&lt;br /&gt;
{{ Утверждение&lt;br /&gt;
|id = Cuckoo_hashing add&lt;br /&gt;
|statement = Добавление в среднем происходит за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
|proof = Один из способов доказательства данного утверждения использует теорию случайных графов. Это делается через неориентированный &amp;quot;кукушкин граф&amp;quot;, где каждой ячейке хеш-таблицы соответствует ровно одна вершина, а каждому добавленному элементу — ребро с концами в вершинах, соответствующих ячейкам, в которые указывают хеш-функции элемента. При этом элемент будет добавлен без перехеширования тогда и только тогда, когда после добавления нового ребра граф будет оставаться псевдолесом, то есть каждая его компонента связности будет содержать не более одного цикла.&lt;br /&gt;
}}&lt;br /&gt;
Таким образом хеширование кукушки является одним из самых быстрых способов хеширования.&lt;br /&gt;
&lt;br /&gt;
==Плюсы и минусы алгоритма==&lt;br /&gt;
&lt;br /&gt;
Есть другие алгоритмы, которые используют несколько хеш-функций, в частности [[Фильтр Блума|фильтр Блума]], эффективная по памяти структура данных для нечётких множеств. Альтернативная структура данных для задач с теми же нечёткими множествами, основанная на кукушкином хешировании, называемая кукушкиным фильтром, использует даже меньшую память и (в отличие от классических фильтров Блума) позволяет удаление элемента, не только вставку и проверку существования. Однако теоретический анализ этих методов проведён существенно слабее, чем анализ фильтров Блума&amp;lt;ref&amp;gt;''Bin Fan, Michael Kaminsky, David Andersen'' Cuckoo Filter: Better Than Bloom // ;login:. — USENIX, 2013. — Т. 38, вып. 4. — С. 36–40.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Исследования, проведённые Жуковским, Хеманом и Бонзом&amp;lt;ref&amp;gt;''Marcin Zukowski, Sandor Heman, Peter Boncz'' Architecture-Conscious Hashing. — Proceedings of the International Workshop on Data Management on New Hardware (DaMoN), 2006.&amp;lt;/ref&amp;gt;, показали, что кукушкино хеширование существенно быстрее метода цепочек для малых хеш-таблиц, находящихся в кэше современных процессоров. Кеннет Росс&amp;lt;ref&amp;gt;''Kenneth Ross'' Efficient Hash Probes on Modern Processors. — IBM Research Report RC24100, 2006.&amp;lt;/ref&amp;gt; показал блочную версию кукушкиного хеширования (блок содержит более одного ключа), который работает быстрее обычных методов для больших хеш-таблиц в случае высокого коэффициента загрузки. Скорость работы блочной версии кукушкиной хеш-таблицы позднее исследовал Аскитис по сравнению с другими схемами хэширования.&lt;br /&gt;
&lt;br /&gt;
Обзор Мутцемахера&amp;lt;ref&amp;gt;''M. Mitzenmacher.'' Proceedings of of the 17th Annual European Symposium on Algorithms (ESA). — 2009.&amp;lt;/ref&amp;gt; представляет открытые проблемы, связанные с кукушкиным хешированием.&lt;br /&gt;
&lt;br /&gt;
Самый большой минуc {{---}} потраченная память. Чтобы гарантировать &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; по времени, нужно чтобы пары ключ/значение занимали не более &amp;lt;tex&amp;gt;50\%&amp;lt;/tex&amp;gt; памяти, потому что вытеснение старых элементов становится трудоемким. Также, добавление каждой новой хеш-функции значительно увеличивает среднюю скорость заполнения таблицы.&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
* [[Хеш-таблица]]&lt;br /&gt;
* [[Разрешение коллизий]]&lt;br /&gt;
* [[Идеальное хеширование]]&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Cuckoo_hashing Wikipedia — Cuckoo hashing]&lt;br /&gt;
* [http://www.cs.cmu.edu/afs/cs.cmu.edu/project/aladdin/wwwlocal/hash/PaRo01.pdf Cuckoo hashing — Pagh, Rasmus; Rodler, Flemming Friche (2001) (PDF, PS)]&lt;br /&gt;
&lt;br /&gt;
== Примеры ==&lt;br /&gt;
* [https://github.com/efficient/libcuckoo Concurrent high-performance Cuckoo hashtable written in C++]&lt;br /&gt;
* [http://sourceforge.net/projects/cuckoo-cpp/ Cuckoo hash map written in C++]&lt;br /&gt;
* [http://www.theiling.de/projects/lookuptable.html Static cuckoo hashtable generator for C/C++]&lt;br /&gt;
* [https://github.com/joacima/Cuckoo-hash-map/blob/master/CuckooHashMap.java Generic Cuckoo hashmap in Java]&lt;br /&gt;
* [http://hackage.haskell.org/packages/archive/hashtables/latest/doc/html/Data-HashTable-ST-Cuckoo.html Cuckoo hash table written in Haskell]&lt;br /&gt;
* [https://github.com/salviati/cuckoo Cuckoo hashing for Go]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Хеширование]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE,_%D1%8D%D0%BA%D0%B2%D0%B8%D0%B2%D0%B0%D0%BB%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=82985</id>
		<title>Дерево, эквивалентные определения</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE,_%D1%8D%D0%BA%D0%B2%D0%B8%D0%B2%D0%B0%D0%BB%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=82985"/>
				<updated>2022-09-01T04:01:13Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id = tree&lt;br /&gt;
|definition =&lt;br /&gt;
'''Дерево''' (англ. ''tree'') {{---}} связный ациклический [[Основные определения теории графов|граф]].&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
[[Файл:tree_def_1.png|300px|Пример дерева]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Лес''' (англ. ''forest'') {{---}} [[Основные определения теории графов|граф]], являющийся набором непересекающихся деревьев.&lt;br /&gt;
}}&lt;br /&gt;
[[Файл:tree_def_2.png|400px|Примеры леса]]&lt;br /&gt;
&lt;br /&gt;
==Определения==&lt;br /&gt;
Для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; эквивалентны следующие утверждения:&lt;br /&gt;
# &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; — дерево.&lt;br /&gt;
# Любые две вершины графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; соединены единственным простым путем.&lt;br /&gt;
# &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; — связен и &amp;lt;tex&amp;gt; p = q + 1 &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; — количество вершин, а &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; количество ребер.&lt;br /&gt;
# &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; — ацикличен и  &amp;lt;tex&amp;gt; p = q + 1 &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; — количество вершин, а &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; количество ребер.&lt;br /&gt;
# &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; — ацикличен и при добавлении любого ребра для [[Основные определения теории графов|несмежных вершин]] появляется один простой [[Основные определения теории графов|цикл]].&lt;br /&gt;
# &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; — связный граф, отличный от &amp;lt;tex&amp;gt; K_p &amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt; p &amp;gt; 3 &amp;lt;/tex&amp;gt;, а также при добавлении любого ребра для несмежных вершин появляется один простой цикл.&lt;br /&gt;
# &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; — граф, отличный от &amp;lt;tex&amp;gt; K_3 \cup K_1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; K_3 \cup K_2 &amp;lt;/tex&amp;gt;, а также  &amp;lt;tex&amp;gt; p = q + 1 &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; — количество вершин, а &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; количество ребер, и при добавлении любого ребра для несмежных вершин появляется один простой цикл.&lt;br /&gt;
&lt;br /&gt;
==Доказательство эквивалентности==&lt;br /&gt;
&amp;lt;tex&amp;gt; 1 \Rightarrow 2 &amp;lt;/tex&amp;gt; &lt;br /&gt;
:Граф связен, поэтому любые две вершнины соединены путем. Граф ацикличен, значит путь единственен, а также [[Теорема о существовании простого пути в случае существования пути|прост]], поскольку никакой путь не может зайти в одну вершину два раза, потому что это противоречит ацикличности.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; 2 \Rightarrow 3 &amp;lt;/tex&amp;gt; &lt;br /&gt;
:Очевидно, что граф связен. Докажем по индукции, соотношение &amp;lt;tex&amp;gt;p = q + 1&amp;lt;/tex&amp;gt;. Утверждение очевидно для связных графов с одной и двумя вершинами. Предположим, что оно верно для графов, имеющих меньше &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; вершин. Если же граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; вершин, то удаление из него любого ребра делает граф &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; несвязным в силу единственности простых цепей; более того, получаемый граф будет иметь в точности две компоненты. По предположению индукции в каждой компоненте число вершин на единицу больше числа ребер. Таким образом, &amp;lt;tex&amp;gt; p = q + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; 3 \Rightarrow 4 &amp;lt;/tex&amp;gt; &lt;br /&gt;
:Очевидно, что если граф связен и ребер на одно меньше, чем вершин, то он ацикличен. Преположим, что у нас есть p вершин, и мы добавляем ребра. Если мы добавили ребро для получения цикла, то добавили второй путь между парой вершин, а значит нам не хватит его на добавление вершины и мы получим не связный граф, что противоречит условию.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; 4 \Rightarrow 5 &amp;lt;/tex&amp;gt; &lt;br /&gt;
:&amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; — ациклический граф, значит каждая компонента связности графа является деревом. Так как в каждой из них вершин на единицу больше чем ребер, то &amp;lt;tex&amp;gt; p = q + k &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; — число [[Отношение связности, компоненты связности|компонент связности]]. Поскольку &amp;lt;tex&amp;gt; p = q + k &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; k = 1 &amp;lt;/tex&amp;gt;, а значит &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; — связен. Таким образом наш граф — дерево, у которого между любой парой вершин есть единственный простой путь. Очевидно, при добавлении ребра появится второй путь между парой вершин, то есть мы получим цикл.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; 5 \Rightarrow 6 &amp;lt;/tex&amp;gt; &lt;br /&gt;
:Поскольку &amp;lt;tex&amp;gt; K_p &amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt; p &amp;gt; 3 &amp;lt;/tex&amp;gt; содержит простой цикл, то &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не может им являться. &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; связен,  так как в ином случае можно было бы добавить ребро так, что граф остался бы ациклическим.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; 6 \Rightarrow 7 &amp;lt;/tex&amp;gt; &lt;br /&gt;
:Докажем, что любые две вершины графа соединены единственной простой цепью, а тогда поскольку &amp;lt;tex&amp;gt; 2 \Rightarrow 3 &amp;lt;/tex&amp;gt;, получим &amp;lt;tex&amp;gt; p = q + 1 &amp;lt;/tex&amp;gt;. Любые две вершины соединены простой цепью, так как &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;  — связен. Если две вершины соединены более чем одной простой цепью, то мы получим цикл. Причем он должен являться &amp;lt;tex&amp;gt; K_3 &amp;lt;/tex&amp;gt;, так как иначе добавив ребро, соединяющее две вершины цикла, мы получим более одного простого цикла, что противоречит условию. &amp;lt;tex&amp;gt; K_3 &amp;lt;/tex&amp;gt; является собственным подграфом &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, поскольку &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не является &amp;lt;tex&amp;gt; K_p &amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt; p &amp;gt; 3 &amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; — связен, а значит есть вершина смежная с &amp;lt;tex&amp;gt; K_3 &amp;lt;/tex&amp;gt;. Очевидно, можно добавить ребро так, что образуется более одного простого цикла. Если нельзя добавить ребра так, чтобы не нарушалось исходное условие, то граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;K_p&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt; p &amp;gt; 3 &amp;lt;/tex&amp;gt;, и мы получаем противоречие с исходным условием. Значит, любые две вершины графа соединены единственной простой цепью, что и требовалось.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; 7 \Rightarrow 1 &amp;lt;/tex&amp;gt; &lt;br /&gt;
:Если &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; имеет простой цикл, то он является отдельной компонентой &amp;lt;tex&amp;gt;K_3&amp;lt;/tex&amp;gt; по ранее доказанному. Все остальные компоненты должны быть деревьями, но для выполнения соотношения &amp;lt;tex&amp;gt; p = q + 1 &amp;lt;/tex&amp;gt; должно быть не более одной компоненты отличной от &amp;lt;tex&amp;gt;K_3&amp;lt;/tex&amp;gt;, так как в &amp;lt;tex&amp;gt;K_3&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; p = q = 3 &amp;lt;/tex&amp;gt;. Если это дерево содержит простой путь длины 2, то в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; можно добавить ребро так, что образуются два простых цикла. Следовательно, этим деревом является &amp;lt;tex&amp;gt;K_1&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;K_2&amp;lt;/tex&amp;gt;. Значит &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;K_3 \cup K_1&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;K_3 \cup K_2&amp;lt;/tex&amp;gt;, которые мы исключили из рассмотрения. Значит наш граф ацикличен. Если &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; ациклический и &amp;lt;tex&amp;gt; p = q + 1 &amp;lt;/tex&amp;gt;, то из &amp;lt;tex&amp;gt; 4 \Rightarrow 5 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; 5 \Rightarrow 6 &amp;lt;/tex&amp;gt; верно, что &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;  — связен. В итоге получаем, что &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; является деревом по определению.&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
* [[Алгоритмы на деревьях|Алгоритмы на деревьях]]&lt;br /&gt;
* [[Дерево поиска, наивная реализация|Двоичное дерево поиска]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
&lt;br /&gt;
* ''Харари Ф.'' Теория графов. /пер. с англ. — изд. 2-е — М.: Едиториал УРСС, 2003. — 296 с. — ISBN 5-354-00301-6&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Tree_(graph_theory) Википедия {{---}} дерево(теория графов)]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Основные определения теории графов]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9._%D0%A1%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE_%D0%9A%D0%B0%D1%80%D0%BF%D1%83._%D0%A2%D1%80%D1%83%D0%B4%D0%BD%D1%8B%D0%B5_%D0%B8_%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8&amp;diff=82984</id>
		<title>Сведение относительно класса функций. Сведение по Карпу. Трудные и полные задачи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9._%D0%A1%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE_%D0%9A%D0%B0%D1%80%D0%BF%D1%83._%D0%A2%D1%80%D1%83%D0%B4%D0%BD%D1%8B%D0%B5_%D0%B8_%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8&amp;diff=82984"/>
				<updated>2022-09-01T04:00:52Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Определения ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Язык &amp;lt;tex&amp;gt;L_1&amp;lt;/tex&amp;gt; сводится по Карпу к языку &amp;lt;tex&amp;gt;L_2&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;L_1 \leq L_2&amp;lt;/tex&amp;gt;)''', если существует такая функция &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;, работающая за полином, что &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;L_1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;f(x)&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;L_2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Простой пример сведения по Карпу ==&lt;br /&gt;
Зададим следующие языки:&lt;br /&gt;
* &amp;lt;tex&amp;gt;IND&amp;lt;/tex&amp;gt; — множество пар вида &amp;lt;tex&amp;gt; \langle G, k \rangle &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; — граф, а &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; — число, такое, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть [http://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D0%BD%D0%B5%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D0%BC_%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B5#.D0.9E.D0.BF.D1.80.D0.B5.D0.B4.D0.B5.D0.BB.D0.B5.D0.BD.D0.B8.D1.8F независимое множество] размера &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* &amp;lt;tex&amp;gt;CLIQUE&amp;lt;/tex&amp;gt; — множество пар вида &amp;lt;tex&amp;gt; \langle G, k \rangle &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; — граф, а &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; — число, такое, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть [http://ru.wikipedia.org/wiki/%D0%9A%D0%BB%D0%B8%D0%BA%D0%B0_(%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2) клика] размера &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement= &amp;lt;tex&amp;gt;IND \leq CLIQUE&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим функцию &amp;lt;tex&amp;gt;f( \langle G, k \rangle ) = \langle \overline{G}, k \rangle&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\overline{G}&amp;lt;/tex&amp;gt; — [http://ru.wikipedia.org/wiki/%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B3%D1%80%D0%B0%D1%84%D0%B0 дополнение графа] &amp;lt;tex&amp;gt;G&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;x \in L_1 \Rightarrow f(x) \in L_2&amp;lt;/tex&amp;gt;). Заметим, что, если в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; было независимое множество размера &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, то в &amp;lt;tex&amp;gt;\overline{G}&amp;lt;/tex&amp;gt; будет клика такого же размера (вершины, которые были в независимом множестве, в &amp;lt;tex&amp;gt;\overline{G}&amp;lt;/tex&amp;gt; попарно соединены рёбрами и образуют клику).&lt;br /&gt;
* (&amp;lt;tex&amp;gt;x \in L_1 \Leftarrow f(x) \in L_2&amp;lt;/tex&amp;gt;). Обратно, если в &amp;lt;tex&amp;gt;\overline{G}&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;
Таким образом, &amp;lt;tex&amp;gt;IND \leq CLIQUE&amp;lt;/tex&amp;gt; по определению.&lt;br /&gt;
}}&lt;br /&gt;
'''Замечание.''' Другие примеры сведения по Карпу приведены в статье, содержащей [[Примеры NP-полных языков. Теорема Кука | примеры NP-полных языков]].&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; ( L_1 \leq L_2, L_2 \leq L_3 ) \Rightarrow L_1 \leq L_3 &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;g&amp;lt;/tex&amp;gt; — функции из определения сведения для &amp;lt;tex&amp;gt; L_1 \leq L_2 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; L_2 \leq L_3 &amp;lt;/tex&amp;gt; соответственно. Из определения следует: &amp;lt;tex&amp;gt;x \in L_1 \Leftrightarrow f(x) \in L_2 \Leftrightarrow g(f(x)) \in L_3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Проверим, что &amp;lt;tex&amp;gt;g(f(x))&amp;lt;/tex&amp;gt; вычислима за полиномиальное от &amp;lt;tex&amp;gt;|x|&amp;lt;/tex&amp;gt; время.&amp;lt;br/&amp;gt;&lt;br /&gt;
Действительно, первым делом необходимо вычислить &amp;lt;tex&amp;gt;f(x)&amp;lt;/tex&amp;gt;, на это уйдет полином от &amp;lt;tex&amp;gt;|x|&amp;lt;/tex&amp;gt; времени.&amp;lt;br/&amp;gt;&lt;br /&gt;
Кроме того, длина входа &amp;lt;tex&amp;gt;g&amp;lt;/tex&amp;gt;, являющегося выводом &amp;lt;tex&amp;gt;f(x)&amp;lt;/tex&amp;gt;, тоже полиномиальна, так как за единицу времени может быть выведено не более, чем константное число символов. Значит, вычисление &amp;lt;tex&amp;gt;g(f(x))&amp;lt;/tex&amp;gt; также займет времени не более, чем полином от &amp;lt;tex&amp;gt;|x|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, полное время работы программы есть сумма полиномов от &amp;lt;tex&amp;gt;|x|&amp;lt;/tex&amp;gt; и потому тоже является полиномом от &amp;lt;tex&amp;gt;|x|&amp;lt;/tex&amp;gt;.&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;C&amp;lt;/tex&amp;gt; — сложностный класс. Язык &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; называется '''&amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;-трудным (относительно полиномиального сведения) (&amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;-hard)''', если любой язык &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; сводится по Карпу к &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; (L &amp;lt;/tex&amp;gt; — &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;-hard &amp;lt;tex&amp;gt;) \overset{\underset{\mathrm{def}}{}}{\Leftrightarrow} ( \forall M \in C \Rightarrow M \leq L) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
&amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; — сложностный класс. Язык &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; называется '''&amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;-полным (относительно полиномиального сведения) (&amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;-complete)''', если &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;-трудным и сам лежит в &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Обобщение на другие ограничения на сведения ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
&amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; — класс языков, распознаваемых программами с некоторыми ограничениями. Тогда обозначим &amp;lt;tex&amp;gt;\widetilde{D}&amp;lt;/tex&amp;gt; класс вычислимых функций, вычисляемых программами с теми же ограничениями.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Язык &amp;lt;tex&amp;gt;L_1&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\widetilde{D}&amp;lt;/tex&amp;gt;-сводится по Карпу к языку &amp;lt;tex&amp;gt;L_2&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;L_1 \leq_{\widetilde{D}} L_2&amp;lt;/tex&amp;gt;)''', если существует такая функция &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;\widetilde{D}&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;L_1&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;f(x)&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;L_2&amp;lt;/tex&amp;gt;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; (L_1 \leq_{\widetilde{D}} L_2) \overset{\underset{\mathrm{def}}{}}{\iff} ( \exists f \in \widetilde{D} : x \in L_1 \Leftrightarrow f(x) \in L_2 ) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
'''Замечание.''' Часто используется сведение из &amp;lt;tex&amp;gt;\widetilde{P}&amp;lt;/tex&amp;gt;, поэтому вместо «&amp;lt;tex&amp;gt;\widetilde{P}&amp;lt;/tex&amp;gt;-сводится по Карпу» говорят просто «сводится». Также индекс у символа сведения обычно опускают.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;(L_1 \leq_{\widetilde{D}} L_2) \Leftrightarrow (\overline {L_1} \leq_{\widetilde{D}} \overline {L_2})&amp;lt;/tex&amp;gt;&lt;br /&gt;
|id=lemma&lt;br /&gt;
|proof=&lt;br /&gt;
По определению сведения существует такая функция &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; из класса &amp;lt;tex&amp;gt;\widetilde{D}&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;x \in L_1 \Leftrightarrow f(x) \in L_2&amp;lt;/tex&amp;gt;. Для того, чтобы свести &amp;lt;tex&amp;gt;\overline{L_1}&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;\overline{L_2}&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;( x \in L_1 \Leftrightarrow f(x) \in L_2 ) \iff ( \overline{x \in L_1} \Leftrightarrow \overline{f(x) \in L_2} ) &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\iff ( x \in \overline{L_1} \Leftrightarrow f(x) \in \overline{L_2} ) \iff (\overline {L_1} \leq_{\widetilde{D}} \overline {L_2})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
&amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; — сложностный класс, &amp;lt;tex&amp;gt;\widetilde{D}&amp;lt;/tex&amp;gt; — класс вычислимых функций. Язык &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; называется '''&amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;-трудным относительно &amp;lt;tex&amp;gt;\widetilde{D}&amp;lt;/tex&amp;gt;-сведения (&amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;-hard)''', если любой язык &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\widetilde{D}&amp;lt;/tex&amp;gt;-сводится к &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; (L &amp;lt;/tex&amp;gt; — &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;-hard &amp;lt;tex&amp;gt;) \overset{\underset{\mathrm{def}}{}}{\Leftrightarrow} ( \forall M \in C \Rightarrow M \leq_{f} L, f \in \widetilde{D} ) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
&amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; — сложностный класс, &amp;lt;tex&amp;gt;\widetilde{D}&amp;lt;/tex&amp;gt; — класс вычислимых функций. Язык &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; называется '''&amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;-полным относительно &amp;lt;tex&amp;gt;\widetilde{D}&amp;lt;/tex&amp;gt;-сведения (&amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;-complete)''', если &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;-трудным относительно &amp;lt;tex&amp;gt;\widetilde{D}&amp;lt;/tex&amp;gt;-сведения и сам лежит в &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_RMQ_%D0%BA_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B5_LCA&amp;diff=82983</id>
		<title>Сведение задачи RMQ к задаче LCA</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_RMQ_%D0%BA_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B5_LCA&amp;diff=82983"/>
				<updated>2022-09-01T04:00:45Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Шаблон:Задача&lt;br /&gt;
|definition =Дан массив &amp;lt;tex&amp;gt;A[1..N]&amp;lt;/tex&amp;gt;. Поступают запросы вида &amp;lt;tex&amp;gt;(i, j)&amp;lt;/tex&amp;gt;, на каждый запрос требуется найти минимум в массиве &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, начиная с позиции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; и заканчивая позицией &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
===Описание===&lt;br /&gt;
[[Файл:Wiki.PNG|thumb|right|400x200px|Пример декартового дерева]]&lt;br /&gt;
Будем решать задачу RMQ, уже умея решать задачу LCA. Для хранения решения задачи о LCA будем использовать  [[декартово дерево по неявному ключу]]. Тогда минимум на отрезке от &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; массива &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; будет равен наименьшему общему предку &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-того и &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;-того элементов из декартова дерева, построенного на массиве &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Декартово дерево по неявному ключу на массиве &amp;lt;tex&amp;gt;A[1..N]&amp;lt;/tex&amp;gt; {{---}} это бинарное дерево, допускающее следующее рекурсивное построение:&lt;br /&gt;
* Корнем дерева является элемент массива, имеющий минимальное значение &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, скажем &amp;lt;tex&amp;gt;A[i]&amp;lt;/tex&amp;gt;. Если минимальных элементов несколько, можно взять любой.&lt;br /&gt;
* Левым поддеревом является декартово дерево на массиве &amp;lt;tex&amp;gt;A[1..i-1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Правым поддеревом является декартово дерево на массиве &amp;lt;tex&amp;gt;A[i+1..N]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Здесь и далее &amp;lt;tex&amp;gt;A[i]&amp;lt;/tex&amp;gt; будет также использоваться для обозначения соответствующей вершины дерева.&lt;br /&gt;
&lt;br /&gt;
Построим декартово дерево на массиве &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;RMQ(i, j)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;LCA(A[i], A[j])&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Корректность ===&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;RMQ(i, j)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;LCA(A[i], A[j])&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Положим &amp;lt;tex&amp;gt;w = LCA(A[i], A[j])&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;tex&amp;gt;A[i]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A[j]&amp;lt;/tex&amp;gt; не принадлежат одновременно либо правому, либо левому поддереву &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, потому как тогда бы соответствующий сын находился на большей глубине, чем &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, и также являлся предком как &amp;lt;tex&amp;gt;A[i]&amp;lt;/tex&amp;gt;, так и &amp;lt;tex&amp;gt;A[j]&amp;lt;/tex&amp;gt;, что противоречит определению &amp;lt;tex&amp;gt;LCA&amp;lt;/tex&amp;gt;. Из этого замечания следует, что &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; лежит между &amp;lt;tex&amp;gt;A[i]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A[j]&amp;lt;/tex&amp;gt; и, следовательно, принадлежит отрезку &amp;lt;tex&amp;gt;A[i..j]&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;w&amp;lt;/tex&amp;gt; содержит в себе подмассив &amp;lt;tex&amp;gt;A[i..j]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Суммируя, получаем, что &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; имеет минимальное значение на отрезке, покрывающем &amp;lt;tex&amp;gt;A[i..j]&amp;lt;/tex&amp;gt;, и принадлежит отрезку &amp;lt;tex&amp;gt;A[i..j]&amp;lt;/tex&amp;gt;, отсюда &amp;lt;tex&amp;gt;RMQ(i, j) = w&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Сложность ===&lt;br /&gt;
Существует [[Декартово дерево#Построение декартова дерева|алгоритм]], который строит декартово дерево за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;. Используя [[Сведение задачи LCA к задаче RMQ | алгоритм построения LCA]], получаем:&lt;br /&gt;
препроцессинг для &amp;lt;tex&amp;gt;LCA&amp;lt;/tex&amp;gt; {{---}} &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; и ответ на запрос {{---}} &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;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)&amp;lt;/tex&amp;gt; и отвечать на запросы за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В итоге получили &amp;lt;tex&amp;gt;RMQ&amp;lt;/tex&amp;gt; с построением за &amp;lt;tex&amp;gt;O(n)&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;
*[[Сведение задачи LCA к задаче RMQ]]&lt;br /&gt;
*[[Декартово дерево]]&lt;br /&gt;
*[[Алгоритм Фарака-Колтона и Бендера]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Задача о наименьшем общем предке]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Busy_beaver&amp;diff=82982</id>
		<title>Busy beaver</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Busy_beaver&amp;diff=82982"/>
				<updated>2022-09-01T04:00:37Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Поиск усердных бобров''' (англ. ''busy beaver'') {{---}} известная задача в теории вычислимости. Под усердным бобром в теории вычислимости понимают [[Машина Тьюринга | машину Тьюринга]] с заданным числом состояний конечного автомата, которая будучи запущенной на пустой ленте, записывает на нее максимальное количество ненулевых символов и останавливается. &lt;br /&gt;
&lt;br /&gt;
В данном конспекте будет рассмотрена функция, которая используется в этой задаче для подсчета числа шагов для завершения программы при определенном числе состояний. &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;tex&amp;gt;BB(n)&amp;lt;/tex&amp;gt;&amp;lt;/b&amp;gt; {{---}} функция от натурального аргумента &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, равная максимальному числу шагов, которое может совершить программа длиной &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; символов и затем остановиться.&lt;br /&gt;
}}&lt;br /&gt;
----&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement= Функция &amp;lt;tex&amp;gt;BB(n)&amp;lt;/tex&amp;gt; не убывает.&lt;br /&gt;
|proof= Рассмотрим программу длины &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;BB&amp;lt;/tex&amp;gt; не убывает.&lt;br /&gt;
}}&lt;br /&gt;
----&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;BB(n)&amp;lt;/tex&amp;gt; растет быстрее любой всюду определенной неубывающей [[Вычислимые функции|вычислимой функции]] &amp;lt;tex&amp;gt;f(n) : N \rightarrow N &amp;lt;/tex&amp;gt;, то есть для всех &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; кроме конечного числа выполнено &amp;lt;tex&amp;gt;BB(n) &amp;gt; f(n).&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем, что для любой вычислимой функции &amp;lt;tex&amp;gt;f(n)&amp;lt;/tex&amp;gt; функция &amp;lt;tex&amp;gt;BB(n)&amp;lt;/tex&amp;gt; будет превышать ее значение (за исключением конечного множества значений числа &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;). &amp;lt;br&amp;gt; &lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;f(n)&amp;lt;/tex&amp;gt; представлена своим кодом. Для каждого &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; определим программы вида:&lt;br /&gt;
  &amp;lt;tex&amp;gt;p_n()&amp;lt;/tex&amp;gt;:&lt;br /&gt;
    k = десятичная запись числа n&lt;br /&gt;
    m = f(k)&lt;br /&gt;
    '''for''' i = 1 '''to''' m + 1 &lt;br /&gt;
      шаг программы&lt;br /&gt;
&lt;br /&gt;
Каждая такая программа делает как минимум &amp;lt;tex&amp;gt;f(n) + 1&amp;lt;/tex&amp;gt; шагов.&lt;br /&gt;
Так как мы рассматриваем &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; в десятичной записи, то длина &amp;lt;tex&amp;gt;p_n&amp;lt;/tex&amp;gt; будет равна &amp;lt;tex&amp;gt; \lg n + const &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;const&amp;lt;/tex&amp;gt; {{---}} длина кода без десятичной записи &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;n_0&amp;lt;/tex&amp;gt; {{---}} решение уравнения &amp;lt;tex&amp;gt;\lg n + const = n&amp;lt;/tex&amp;gt;. Тогда для всех натуральных &amp;lt;tex&amp;gt; n &amp;gt; \left \lceil n_0 \right \rceil &amp;lt;/tex&amp;gt; будет выполнено неравенство: &amp;lt;tex&amp;gt; n &amp;gt; len(p_n) \Rightarrow BB(n) \geqslant BB(len(p_n)) &amp;gt; m = f(n) &amp;lt;/tex&amp;gt;. Данный переход корректен, так как мы доказали, что &amp;lt;tex&amp;gt;BB(n)&amp;lt;/tex&amp;gt; {{---}} монотонно возрастающая функция. Так как &amp;lt;tex&amp;gt;n_0&amp;lt;/tex&amp;gt; конечно, то мы всегда можем найти такие значения &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, при которых будет выполняться полученное неравенство. Отсюда следует, что утверждение доказано.&lt;br /&gt;
}}&lt;br /&gt;
'''Вывод:''' доказав предыдущее утверждение, мы проверили, что максимальное число шагов, которое может совершить программа и при этом остановиться, на самом деле растет с большей скоростью, чем любая вычислимая функция. Отсюда следует, что &amp;lt;tex&amp;gt;BB(n)&amp;lt;/tex&amp;gt; невычислима.&lt;br /&gt;
----&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|id=proposalU. &lt;br /&gt;
|statement=Функция [[Busy beaver]] невычислима.&lt;br /&gt;
|proof=  По [[Теорема о рекурсии | теореме о рекурсии]], программа может знать свой исходный код. Значит, в неё можно написать функцию &amp;lt;tex&amp;gt; \mathrm{getSrc()} &amp;lt;/tex&amp;gt;, которая вернёт строку {{---}} исходный код программы. Предположим, что функция [[Busy beaver]] вычислима. Тогда напишем такую программу&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  &amp;lt;tex&amp;gt;p(){:}&amp;lt;/tex&amp;gt;&lt;br /&gt;
    '''for''' i = 1..BB(&amp;lt;tex&amp;gt;|\mathrm{getSrc()}|&amp;lt;/tex&amp;gt;) + 1&lt;br /&gt;
      '''do''' smth&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Такая программа всегда совершает больше шагов, чем функция &amp;lt;tex&amp;gt; BB &amp;lt;/tex&amp;gt; от этой программы. А это невозможно, так &amp;lt;tex&amp;gt; BB(|p|) &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;
* ''Хопкрофт Д., Мотвани Р., Ульман Д.'' — '''Введение в теорию автоматов, языков и вычислений''', 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Busy_beaver#The_busy_beaver_function Английская Википедия {{---}} Busy beaver]&lt;br /&gt;
* [http://is.ifmo.ru/works/_bobri.pdf Федотов П.В., Царев Ф.Н., Шалыто А.А. {{---}} Задача поиска усердных бобров и ее решения]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Теория вычислимости]]&lt;br /&gt;
[[Категория: Разрешимые и перечислимые языки]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%81%D1%82%D0%B5%D1%80-%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0&amp;diff=82981</id>
		<title>Мастер-теорема</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%81%D1%82%D0%B5%D1%80-%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0&amp;diff=82981"/>
				<updated>2022-09-01T04:00:28Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Мастер теорема''' (англ. ''Master theorem'') позволяет найти асимптотическое решение рекуррентных соотношений, которые могут возникнуть в анализе асимптотики многих алгоритмов. Однако не все рекуррентные соотношения могут быть решены через мастер теорему, ее обобщения включаются в метод Акра-Бацци&amp;lt;ref&amp;gt;[http://en.wikipedia.org/wiki/Akra%E2%80%93Bazzi_method Википедия {{---}} Метод Акра-Бацци]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Формулировка и доказательство мастер-теоремы==&lt;br /&gt;
{{&lt;br /&gt;
&lt;br /&gt;
Теорема&lt;br /&gt;
|about = &lt;br /&gt;
мастер-теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть имеется рекуррентное соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex dpi = &amp;quot;135&amp;quot;&amp;gt; T(n) = \begin{cases}&lt;br /&gt;
  a \; T\!\left(\dfrac{n}{b}\right) + O(n^{c})  , &amp;amp;      n &amp;gt; 1\\ &lt;br /&gt;
  O(1)    , &amp;amp;       n = 1&lt;br /&gt;
\end{cases}&lt;br /&gt;
, &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где  &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\in \mathbb N &amp;lt;/tex&amp;gt;,  &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \in \mathbb R &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; b &amp;gt; 1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\mathbb \in R^{+} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда асимптотическое решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
# Если &amp;lt;tex&amp;gt;c &amp;gt; \log_b a&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;T(n) = O\left( n^{c} \right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Если &amp;lt;tex&amp;gt;c = \log_b a&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;T(n) = O\left( n^{c} \log n \right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Если &amp;lt;tex&amp;gt;c &amp;lt; \log_b a&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;T(n) = O\left( n^{\log_b a} \right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|proof= Рассмотрим дерево рекурсии данного соотношения. Всего в нем будет &amp;lt;tex&amp;gt;\log_b n&amp;lt;/tex&amp;gt; уровней. На каждом таком уровне, количество детей в дереве будет умножаться на &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, так на уровне &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; будет &amp;lt;tex&amp;gt;a^i&amp;lt;/tex&amp;gt; детей. Также известно, что каждый ребенок на уровне &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; размера &amp;lt;tex&amp;gt;\dfrac{n}{b^i}&amp;lt;/tex&amp;gt;. Ребенок размера &amp;lt;tex&amp;gt;\left(\dfrac{n}{b^i}\right)&amp;lt;/tex&amp;gt; требует &amp;lt;tex&amp;gt;O\left(\left(\dfrac{n}{b^i}\right) ^ c\right)&amp;lt;/tex&amp;gt; дополнительных затрат, поэтому общее количество совершенных действий на уровне &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; :   &lt;br /&gt;
&amp;lt;tex&amp;gt; O\left(a^i\left(\dfrac{n}{b^i}\right)^c\right) = O\left (n^c\left(\dfrac{a^i}{b^{ic}}\right)\right) = O\left (n^c\left(\dfrac{a}{b^c}\right)^i\right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
Заметим, что количество операций увеличивается, уменьшается и остается константой, если &amp;lt;tex&amp;gt;\left(\dfrac{a}{b^c}\right)^i&amp;lt;/tex&amp;gt; увеличивается, уменьшается или остается константой соответственно.&lt;br /&gt;
&lt;br /&gt;
Поэтому решение разбивается на три случая, когда &amp;lt;tex&amp;gt;\dfrac{a}{b^c}&amp;lt;/tex&amp;gt; больше &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, равна &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; или меньше &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.  Рассмотрим &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;\dfrac{a}{b^c}\ = 1\Leftrightarrow a = b^c \Leftrightarrow\ \log_b a = c \log_b b \Leftrightarrow\ \log_b a = c&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Распишем всю работу в течение рекурсивного спуска:&lt;br /&gt;
&amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;T(n) = \displaystyle\sum_{i=0}^{\log_b n}O\left(n^c\cdot\left(\frac{a}{b^c}\right)^i\right) +  O(1)= O\left(n^c\cdot\displaystyle\sum_{i=0}^{\log_b n}\left(\frac{a}{b^c}\right)^i\right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Откуда получаем:&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;tex&amp;gt;c &amp;gt; \log_b a  &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;T(n) = O\left( n^{c} \right)&amp;lt;/tex&amp;gt; (так как &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt; \left(\dfrac{a}{b^c}\right)^i&amp;lt;/tex&amp;gt; убывающая геометрическая прогрессия)&lt;br /&gt;
#&amp;lt;tex&amp;gt;c = \log_b a  &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt; &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt; T(n) = \displaystyle\sum_{i=0}^{\log_b n}n^c\cdot\left(\frac{a}{b^c}\right)^i = &amp;lt;/tex&amp;gt; &amp;lt;tex dpi = &amp;quot;130&amp;gt; n^c\cdot\displaystyle\sum_{i=0}^{\log_b n}\left(\frac{a}{b^c}\right)^i = n^c\cdot\displaystyle\sum_{i=0}^{\log_b n}1^i = n^c + n^c\log_b n = O\left( n^{c} \log n \right) &amp;lt;/tex&amp;gt;&lt;br /&gt;
#&amp;lt;tex&amp;gt;c &amp;lt; \log_b a &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt; &amp;lt;tex dpi = &amp;quot;125&amp;quot;&amp;gt; T(n) = \displaystyle\sum_{i=0}^{\log_b n}n^c\cdot\left(\frac{a}{b^c}\right)^i = n^c\cdot\displaystyle\sum_{i=0}^{\log_b n}\left(\dfrac{a}{b^c}\right)^i =  O\left(n^c\cdot\left(\dfrac{a}{b^c}\right)^{\log_b n}\right)&amp;lt;/tex&amp;gt;, но   &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt; n^c\cdot\left(\dfrac{a}{b^c}\right)^{\log_b n} &amp;lt;/tex&amp;gt; &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt; =  &amp;lt;/tex&amp;gt;  &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;  n^c\cdot\left(\dfrac{a^{\log_b n} }{(b^c)^{\log_b n}}\right)  &amp;lt;/tex&amp;gt; &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt; =  &amp;lt;/tex&amp;gt; &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;  n^c\cdot\left(\dfrac{n^{\log_b a}}{n^c}\right)&amp;lt;/tex&amp;gt; &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt; =  &amp;lt;/tex&amp;gt;  &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;   n^{\log_b a} \Rightarrow T(n) = O\left(n^{\log_b a}\right)&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
Мастер-теорема имеет прямое отношение к анализу алгоритмов, так как рекуррентное соотношение можно воспринимать следующим образом: имеется задача размера &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;, алгоритм разбивает её на &amp;lt;tex&amp;gt; a &amp;lt;/tex&amp;gt; подзадач размера &amp;lt;tex&amp;gt; \dfrac{n}{b} &amp;lt;/tex&amp;gt; , тратит дополнительно &amp;lt;tex&amp;gt; O(n^c) &amp;lt;/tex&amp;gt;  действий, а если размер подзадачи становится равен единице, то алгоритму требуется &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; действий на её решение. &lt;br /&gt;
&lt;br /&gt;
Из доказательства теоремы видно, что если в рекурретном соотношении заменить &amp;lt;tex&amp;gt; O &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; \Theta &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; \Omega &amp;lt;/tex&amp;gt;, то и асимптотика решения изменится соответствующим образом на &amp;lt;tex&amp;gt; \Theta &amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt; \Omega &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Примеры==  &lt;br /&gt;
&lt;br /&gt;
=== Примеры задач ===&lt;br /&gt;
==== Пример 1 ====&lt;br /&gt;
Пусть задано такое рекуррентное соотношение:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; t(n) = \begin{cases}&lt;br /&gt;
  2 \; t\!\left(\dfrac{n}{2}\right) + O(n\log n)  , &amp;amp;      n &amp;gt; 1\\ &lt;br /&gt;
  1    , &amp;amp;       n = 1 &lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;tex&amp;gt; n\log n = O(n^c) &amp;lt;/tex&amp;gt;, для любого &amp;lt;tex&amp;gt; c &amp;gt; 1 &amp;lt;/tex&amp;gt;, что удовлетворяет 1 условию. Тогда &amp;lt;tex&amp;gt; T(n) = O(n^c) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; c &amp;gt; 1 &amp;lt;/tex&amp;gt;, при &amp;lt;tex&amp;gt; a = 2, b = 2, \log_b a = 1&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;f(n) =&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;n\sqrt{n + 1}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; T(n) = \begin{cases}&lt;br /&gt;
  2 \; T\!\left(\dfrac{n}{3}\right) + O(f(n))  , &amp;amp;      n &amp;gt; 1\\ &lt;br /&gt;
  d    , &amp;amp;       n = 1 &lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(n) = n\sqrt {n + 1} &amp;lt; n\sqrt{n + n} &amp;lt; n\sqrt{2n} = O(n^{3/2}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данное соотношение подходит под первый случай &amp;lt;tex&amp;gt;\left(a = 2, b = 3, c = \dfrac{3}{2}\right)&amp;lt;/tex&amp;gt;, поэтому его асимптотика совпадает с асимптотикой &amp;lt;tex&amp;gt;O(f(n))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Недопустимые соотношения ===&lt;br /&gt;
Рассмотрим пару соотношений, которые нельзя решить мастер-теоремой:&lt;br /&gt;
*&amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;T(n) = 2^nT\left (\dfrac{n}{2}\right )+O(n^n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
*:&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; не является константой; количество подзадач может меняться,&lt;br /&gt;
*&amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;T(n) = 2T\left (\dfrac{n}{2}\right )+O\left(\dfrac{n}{\log n}\right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
*:рассмотрим &amp;lt;tex&amp;gt; f(n) = \dfrac{n}{\log n} &amp;lt;/tex&amp;gt; , тогда не существует такого &amp;lt;tex&amp;gt; O(n^c) &amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt; f(n) \in O(n^c) &amp;lt;/tex&amp;gt;, так как при &amp;lt;tex&amp;gt; n = 1 , f(n) \rightarrow \!\, \infty &amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt; O(n^c) &amp;lt;/tex&amp;gt; ограничено,&lt;br /&gt;
*&amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;T(n) = 0.5T\left (\dfrac{n}{2}\right )+O(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
*:&amp;lt;tex&amp;gt;|a| &amp;lt; 1&amp;lt;/tex&amp;gt;, однако пример можно решить следующим образом: заметим, что на &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; шаге, размер &amp;lt;tex&amp;gt; T(i) \leqslant \dfrac{c \cdot n}{4^i} &amp;lt;/tex&amp;gt; , тогда, оценивая сумму, получаем, что &amp;lt;tex&amp;gt; T(n) = O(n) &amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;T(n) = -2T\left (\dfrac{n}{3}\right )+O(n^2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
*:&amp;lt;tex&amp;gt; a &amp;lt; 0 &amp;lt;/tex&amp;gt;, при составлении асимптотического решения перед &amp;lt;tex&amp;gt; O &amp;lt;/tex&amp;gt; каждый раз будет новый знак, что противоречит мастер-теореме.&lt;br /&gt;
&lt;br /&gt;
=== Приложение к известным алгоритмам ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&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;T(n) = T\left(\dfrac{n}{2}\right) + O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
| &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
| По мастер-теореме &amp;lt;tex&amp;gt;c = \log_b a&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;a = 1, b = 2, c = 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[Дерево поиска, наивная реализация | Обход бинарного дерева]]&lt;br /&gt;
| &amp;lt;tex&amp;gt;T(n) = 2 T\left(\dfrac{n}{2}\right) + O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
| &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
| По мастер-теореме &amp;lt;tex&amp;gt;c &amp;lt; \log_b a&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;a = 2, b = 2, c = 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|  [[Сортировка слиянием]]&lt;br /&gt;
| &amp;lt;tex&amp;gt;T(n) = 2 T\left(\dfrac{n}{2}\right) + O(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
| &amp;lt;tex&amp;gt;O(n \log n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
| По мастер-теореме &amp;lt;tex&amp;gt;c = \log_b a&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;a = 2, b = 2, c = 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;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Master_theorem Википедия — Мастер-теорема]&lt;br /&gt;
* [https://math.dartmouth.edu/archive/m19w03/public_html/Section5-2.pdf Dartmouth university — The master theorem]&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание.стр. 110 М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Амортизационный анализ]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BF%D0%B5%D0%BA%D1%82%D1%80%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%B0_%D1%81%D0%BA%D0%B0%D0%BB%D1%8F%D1%80%D0%BD%D0%BE%D0%B3%D0%BE_%D1%82%D0%B8%D0%BF%D0%B0&amp;diff=82980</id>
		<title>Спектральный анализ линейного оператора скалярного типа</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BF%D0%B5%D0%BA%D1%82%D1%80%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%B0_%D1%81%D0%BA%D0%B0%D0%BB%D1%8F%D1%80%D0%BD%D0%BE%D0%B3%D0%BE_%D1%82%D0%B8%D0%BF%D0%B0&amp;diff=82980"/>
				<updated>2022-09-01T04:00:23Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\mathcal{X}_\mathcal{A}(\lambda)=\prod\limits_{i=1}^{л}(\lambda-\lambda_i)^{n_i}&amp;lt;/tex&amp;gt; &lt;br /&gt;
и &amp;lt;tex&amp;gt;\sigma_\mathcal{A}=\{\lambda_1 ... \lambda_k\}&amp;lt;/tex&amp;gt; &lt;br /&gt;
и &amp;lt;tex&amp;gt;k&amp;lt;n=dimX&amp;lt;/tex&amp;gt; &lt;br /&gt;
Пусть существует базис из собственных векторов &amp;lt;tex&amp;gt;\{X_s\}_{s=1}^n&amp;lt;/tex&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\lambda_i\leftrightarrow\{x_1^{(i)},x_2^{(i)}...x_{r_i}^{(i)}\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;X_{\lambda_i}=&amp;lt;/tex&amp;gt;л.о.&amp;lt;tex&amp;gt;_{i=1,2...k}\{x_1^{(i)},x_2^{(i)}...x_{r_i}^{(i)}\}&amp;lt;/tex&amp;gt;&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

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

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Rake-Compress_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D1%8F&amp;diff=82978</id>
		<title>Rake-Compress деревья</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Rake-Compress_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D1%8F&amp;diff=82978"/>
				<updated>2022-09-01T03:59:58Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Задача, которая решается с помощью [[Link-Cut Tree|динамических деревьев]], формулируется следующим образом. Необходимо поддерживать лес деревьев и выполнять на нем следующие операции:&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathrm{link(u, v)}&amp;lt;/tex&amp;gt; {{---}} добавить ребро &amp;lt;tex&amp;gt;(u, v)&amp;lt;/tex&amp;gt;. Вершина &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; должна быть корнем некоторого дерева. Вершины &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; должны находиться в разных деревьях,&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathrm{cut(u, v)}&amp;lt;/tex&amp;gt; {{---}} удалить ребро &amp;lt;tex&amp;gt;(u, v)&amp;lt;/tex&amp;gt;. Ребро &amp;lt;tex&amp;gt;(u, v)&amp;lt;/tex&amp;gt; должно присутствовать в графе,&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathrm{query()}&amp;lt;/tex&amp;gt; {{---}} некоторый запрос относительно структуры дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
==Идея==&lt;br /&gt;
===Описание===&lt;br /&gt;
Пусть дано некоторое дерево &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;, для которого мы хотим выполнять описанные выше операции. Рассмотрим алгоритм '''сжатия дерева''' (англ. ''tree-contraction algorithm''), предложенный Миллером и Райфом. Алгоритм сжимает &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; в одну вершину путем применения операций &amp;lt;tex&amp;gt;\mathrm{Rake}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{Compress}&amp;lt;/tex&amp;gt; в несколько раундов:&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathrm{Rake}&amp;lt;/tex&amp;gt; {{---}} все листья дерева сжимаются к своим родителям,&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathrm{Compress}&amp;lt;/tex&amp;gt; {{---}} выбирается и объединяется некоторое множество несмежных друг с другом вершин, имеющих ровно одного сына.&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Файл:Rctree-rake.png|x180px|thumb|Операция &amp;lt;tex&amp;gt;\mathrm{Rake}&amp;lt;/tex&amp;gt;]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Файл:Rctree-compress.png|x180px|thumb|Операция &amp;lt;tex&amp;gt;\mathrm{Compress}&amp;lt;/tex&amp;gt;]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сжатие дерева требует линейного времени и логарифмическое число раундов.&amp;lt;br&amp;gt;&lt;br /&gt;
Для выбора вершин, которые будут удалены во время операции &amp;lt;tex&amp;gt;\mathrm{Compress}&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;br&amp;gt;&lt;br /&gt;
Рассмотрим, как изменяется количество вершин в дереве после применения к нему операций &amp;lt;tex&amp;gt;\mathrm{Rake}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{Compress}&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;Разобьём все вершины дерева на три группы: &lt;br /&gt;
* &amp;lt;tex&amp;gt;T_0&amp;lt;/tex&amp;gt; {{---}} входящая степень равна нулю,&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_1&amp;lt;/tex&amp;gt; {{---}} входящая степень равна одному,&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_2&amp;lt;/tex&amp;gt; {{---}} входящая степень больше одного.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=1&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;T_2 \leqslant T_0 - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем по индукции по высоте дерева.&amp;lt;br&amp;gt;&lt;br /&gt;
* '''База &lt;br /&gt;
*: Для дерева из одной вершины утверждение верно.&lt;br /&gt;
* '''Переход&lt;br /&gt;
*: Пусть утверждение доказано для деревьев высоты меньше &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;. Докажем для дерева высоты ровно &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;. Рассмотрим степень корня:&amp;lt;br&amp;gt;&lt;br /&gt;
*:: Если корень имеет ровно одного ребенка, то переходим к случаю дерева высоты &amp;lt;tex&amp;gt;h - 1&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;Если у дерева несколько поддеревьев, то имеем:&amp;lt;br&amp;gt;&amp;lt;tex&amp;gt;T_2 = 1 + \sum\limits_{u \in *: children(root)}T_2(u) \leqslant 1 + \sum\limits_{u \in children(root)}(T_0(u) - 1)&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt; \leqslant -1 + \sum\limits_{u \in children}T_0(u) \leqslant -1 + T_0 = T_0 - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Заметим, что для леса деревьев лемма также справедлива.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=2&lt;br /&gt;
|statement=После применения операций &amp;lt;tex&amp;gt;\mathrm{Rake}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{Compress}&amp;lt;/tex&amp;gt; к лесу, математическое ожидание количества вершин в нём не превосходит &amp;lt;tex&amp;gt;\dfrac{7}{8}&amp;lt;/tex&amp;gt; от их исходного числа.&lt;br /&gt;
|proof=Все листья будут удалены после операции &amp;lt;tex&amp;gt;\mathrm{Rake}&amp;lt;/tex&amp;gt;, а каждая вершина, у которой ровно один сын, будет удалена с вероятностью &amp;lt;tex&amp;gt;\dfrac{1}{8}&amp;lt;/tex&amp;gt; после операции &amp;lt;tex&amp;gt;\mathrm{Compress}&amp;lt;/tex&amp;gt; (так как мы рассматриваем три бита при выборе вершин и добавляем вершину в множество удаляемых только когда эти биты для родителя, вершины и ребёнка соответственно равны &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;).&amp;lt;br&amp;gt;&lt;br /&gt;
Таким образом математическое ожидание количества удаленных вершин &amp;lt;tex&amp;gt;\mathrm{deleted} = T_0 + \dfrac{T_1}{8}&amp;lt;/tex&amp;gt;. Из предыдущей леммы получаем:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{deleted} = \dfrac{1}{2} (T_0 + T_2) + \dfrac{1}{8} T_1 \geqslant \dfrac{1}{8} (T_0 + T_1 + T_2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Математическое ожидание количества операций &amp;lt;tex&amp;gt;\mathrm{Rake}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{Compress}&amp;lt;/tex&amp;gt;, которые будут выполнены до полного сжатия дерева, равно &amp;lt;tex&amp;gt;O(\log{n})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} общее количество вершин.&lt;br /&gt;
|proof=Из леммы 2 известно, что после каждой итерации применения операций &amp;lt;tex&amp;gt;\mathrm{Rake}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{Compress}&amp;lt;/tex&amp;gt; число вершин в среднем уменьшается в константное число раз. Значит, количество итераций в среднем ограничено &amp;lt;tex&amp;gt;O(\log{n})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Для конкретного применения можно предположить, что рёбра дерева имеют вес, а вершины имеют метки.&lt;br /&gt;
&lt;br /&gt;
===Пример операций===&lt;br /&gt;
В качестве примера сжатия дерева рассмотрим следующее взвешенное дерево:&lt;br /&gt;
[[Файл:RC_graph_example.png|400px|center|thumb|Исходное дерево &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:RC_graph_contraction.png|350px|right|thumb|Алгоритм сжатия дерева &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;.]]&lt;br /&gt;
На каждом раунде сжатия (перечислены сверху вниз) удаляется множество вершин с использованием операций &amp;lt;tex&amp;gt;\mathrm{Rake}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{Compress}&amp;lt;/tex&amp;gt;:&lt;br /&gt;
* Операция &amp;lt;tex&amp;gt;\mathrm{Rake}&amp;lt;/tex&amp;gt; удаляет лист и ребро, смежное с ним, сохраняя в соседях данные: метку удалённой вершины, вес удалённого ребра и данные о сжатых на предыдущих раундах вершинах.&lt;br /&gt;
* Операция &amp;lt;tex&amp;gt;\mathrm{Compress}&amp;lt;/tex&amp;gt; удаляет вершины, имеющие ровно одного сына, и смежные им рёбра. Например, для вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; c сыном &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; и родителем &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; будут удалены рёбра &amp;lt;tex&amp;gt;(u, v)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(v, w)&amp;lt;/tex&amp;gt;. После этого добавляется ребро &amp;lt;tex&amp;gt;(u, w)&amp;lt;/tex&amp;gt;, а данные вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и удалённых рёбер (метка удалённой вершины, сохранённые данные и веса удалённых рёбер) сохраняются в соседние вершины. &lt;br /&gt;
&lt;br /&gt;
Например, для приведённого дерева на первом раунде сжатия применяется операция &amp;lt;tex&amp;gt;\mathrm{Rake}&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;n&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; и операция &amp;lt;tex&amp;gt;\mathrm{Compress}&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;g&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Сжатие может быть рассмотрено как рекурсивная кластеризация дерева в один '''кластер''' (англ. ''cluster''). Изначально вершины и рёбра составляют базовый кластер. Операции &amp;lt;tex&amp;gt;\mathrm{Rake}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{Compress}&amp;lt;/tex&amp;gt; формируют большие кластеры из нескольких меньших кластеров.&amp;lt;br&amp;gt;&amp;lt;br&amp;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;a&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; и ребро &amp;lt;tex&amp;gt;(a, b)&amp;lt;/tex&amp;gt;; сжатая вершина &amp;lt;tex&amp;gt;g&amp;lt;/tex&amp;gt; создает кластер &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, содержащий эту вершину и рёбра &amp;lt;tex&amp;gt;(f, g)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(g, h)&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;A&amp;lt;/tex&amp;gt; и ребро &amp;lt;tex&amp;gt;(b, c)&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;Представление сжатого дерева в виде кластеров:&lt;br /&gt;
[[Файл:RC_graph_clusters.png|400px|left|thumb|Кластеризованное дерево &amp;lt;tex&amp;gt;T&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Определим кластер как поддерево исходного дерева, порожденное множеством вершин.&lt;br /&gt;
&lt;br /&gt;
Для кластера &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; скажем, что вершина &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; называется '''граничной вершиной''', если &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; смежная с вершинами не из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. '''Граница кластера''' {{---}} множество граничных вершин кластера, а '''степень кластера''' {{---}} количество граничных вершин кластера.&lt;br /&gt;
&lt;br /&gt;
Например, для рассматриваемого дерева кластер &amp;lt;tex&amp;gt;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;G&amp;lt;/tex&amp;gt; имеет границу &amp;lt;tex&amp;gt;\{f, g\}&amp;lt;/tex&amp;gt; и степень &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;. При сжатии дерева все кластеры, кроме последнего, имеют степени &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;. Свойством алгоритмом сжатия является то, что:&lt;br /&gt;
* операции &amp;lt;tex&amp;gt;\mathrm{Rake}&amp;lt;/tex&amp;gt; создают кластеры со степенью &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, &lt;br /&gt;
* операции &amp;lt;tex&amp;gt;\mathrm{Compress}&amp;lt;/tex&amp;gt; создают кластеры со степенью &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;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;\mathrm{RC-tree}&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;Пример такого дерева для рассматриваемого исходного дерева:&lt;br /&gt;
[[Файл:RC_graph_tree.png|500px|center|thumb|RC-tree для дерева &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку матожидание количества раундов {{---}} логарифм, то такое дерево будет сбалансированным.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{RC}&amp;lt;/tex&amp;gt; дерево можно использовать для ответа на динамические запросы для статического дерева. Для этого в &amp;lt;tex&amp;gt;\mathrm{RC}&amp;lt;/tex&amp;gt; дереве сохраним требуемую информацию (необходимо модифицировать для пересчёта информации операции &amp;lt;tex&amp;gt;\mathrm{Rake}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{Compress}&amp;lt;/tex&amp;gt;) и используем обход для ответа на запросы. Поскольку дерево с большой вероятностью является сбалансированным, обход дерева также можно осуществить за логарифм.&amp;lt;br&amp;gt;&lt;br /&gt;
Для динамических деревьев, например, если доступны операции добавления/удаления ребра (операции &amp;lt;tex&amp;gt;\mathrm{link}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{cut}&amp;lt;/tex&amp;gt;), нужно эффективно перестраивать отдельные кластеры, пересчитывая данные. Для этого можно обновлять данные начиная с листа дерева, соответствующего обновляемой вершине в исходном дереве, и подниматься вверх.&lt;br /&gt;
&lt;br /&gt;
==Реализация==&lt;br /&gt;
===Хранение===&lt;br /&gt;
Для того, чтобы отвечать на запросы относительно структуры леса необходимо сохранить информацию о том, как происходил процесс сжатия леса. Для этого будем хранить таблицу, в каждой строке которой записана информация о структуре леса после выполнения операций. Каждая клетка таблицы будет хранить информацию о вершине после выполнения операций &amp;lt;tex&amp;gt;\mathrm{Rake}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{Compress}&amp;lt;/tex&amp;gt;. Из информации будем сохранять родителя вершины, множество детей и метку, сжата ли вершина.&amp;lt;br&amp;gt;&lt;br /&gt;
Пример таблицы для следующей последовательности операций:&lt;br /&gt;
[[Файл:RC_tree_example.png|x200px|thumb|Пример выполнения операций.]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Шаг&lt;br /&gt;
! align=&amp;quot;center&amp;quot; | Операция&lt;br /&gt;
! &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
! &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
! &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
! &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 4&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;tex&amp;gt;\mathrm{Rake}&amp;lt;/tex&amp;gt;&lt;br /&gt;
| Родитель: {{---}}&amp;lt;br&amp;gt;Дети: &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | {{---}} &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | {{---}}&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | {{---}}&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 3&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | &amp;lt;tex&amp;gt;\mathrm{Compress}&amp;lt;/tex&amp;gt;&lt;br /&gt;
| Родитель: {{---}}&amp;lt;br&amp;gt;Дети: &amp;lt;tex&amp;gt;\{3\}&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;br&amp;gt;Дети: &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | {{---}}&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 2&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |  &amp;lt;tex&amp;gt;\mathrm{Rake}&amp;lt;/tex&amp;gt;&lt;br /&gt;
| Родитель: {{---}}&amp;lt;br&amp;gt;Дети: &amp;lt;tex&amp;gt;\{2\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
| Родитель: &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;lt;br&amp;gt;Дети: &amp;lt;tex&amp;gt;\{3\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
| Родитель: &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;lt;br&amp;gt;Дети: &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | {{---}}&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| &lt;br /&gt;
| Родитель: {{---}}&amp;lt;br&amp;gt;Дети: &amp;lt;tex&amp;gt;\{2\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
| Родитель: &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;lt;br&amp;gt;Дети: &amp;lt;tex&amp;gt;\{3\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
| Родитель: &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;lt;br&amp;gt;Дети: &amp;lt;tex&amp;gt;\{4\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
| Родитель: &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;lt;br&amp;gt;Дети: &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Для того, чтобы выбирать множество вершин для применения операции &amp;lt;tex&amp;gt;\mathrm{Compress}&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;1&amp;lt;/tex&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим более подробно, как необходимо хранить клетки таблицы &amp;lt;tex&amp;gt;\mathrm{Rake-Compress}&amp;lt;/tex&amp;gt; дерева. Для вершины необходимо сохранить ее родителя, а также множество детей. Для того, чтобы обрабатывать каждую клетку таблицы за &amp;lt;tex&amp;gt;O(\log{n})&amp;lt;/tex&amp;gt;, нужно производить операции с множеством детей за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Рассмотрим, в каких случаях можно сжать вершину:&lt;br /&gt;
* если детей у вершины больше одного, то ее точно нельзя сжать, &lt;br /&gt;
* если у неё нет детей, то ее можно сжать только во время операции &amp;lt;tex&amp;gt;\mathrm{Rake}&amp;lt;/tex&amp;gt;&lt;br /&gt;
* если у вершины один ребёнок, то её возможно сжать во время операции &amp;lt;tex&amp;gt;\mathrm{Compress}&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Чтобы определить, можно ли применить операцию &amp;lt;tex&amp;gt;\mathrm{Compress}&amp;lt;/tex&amp;gt; к вершине, в том случае, когда у нее один ребёнок, нужно узнать, какой бит был сгенерирован на текущей итерации для ребёнка (один из трёх битов, генерируемых при операции &amp;lt;tex&amp;gt;\mathrm{Compress}&amp;lt;/tex&amp;gt;). Для этого необходимо знать номер вершины-ребёнка. Значит, нам нужно определять, какие элементы находятся в множестве детей только в том случае, когда размер множества равен &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Поэтому, всю информацию о множестве можно хранить с помощью двух величин {{---}} хранить количество элементов в множестве и сумму их номеров. Поддерживая сумму номеров детей и их количество, можно эффективно узнавать номер вершины-ребёнка, когда это необходимо. Данная оптимизация позволяет за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; получать номер ребёнка и за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; обновлять множество детей.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Если вершина является корнем, то в качестве ее родителя будем хранить ее номер. Кроме того необходимо хранить изменения, которые произойдут с клеткой при переходе к следующему слою: будем хранить, кто должен стать новым родителем, на сколько изменится количество детей, а также как изменится сумма их номеров. Все это необходимо для того, чтобы обрабатывать каждую изменившуюся клетку за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод хранения клетки таблицы:&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathrm{id}&amp;lt;/tex&amp;gt; {{---}} номер вершины,&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathrm{parent}&amp;lt;/tex&amp;gt; {{---}} родитель вершины,&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathrm{cntChild}&amp;lt;/tex&amp;gt; {{---}} количество детей вершины,&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathrm{sumChild}&amp;lt;/tex&amp;gt; {{---}} сумма номеров детей,&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathrm{newParent}&amp;lt;/tex&amp;gt; {{---}} новый родитель вершины после изменений, &lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathrm{diffCntChild}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{diffSumChild}&amp;lt;/tex&amp;gt; {{---}} изменения, произведенные с полями &amp;lt;tex&amp;gt;\mathrm{cntChild}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{sumChild}&amp;lt;/tex&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
 '''struct''' Cell''':'''&lt;br /&gt;
     '''int''' id, parent, cntChild, sumChild&lt;br /&gt;
     '''int''' newParent, diffCntChild, diffSumChild&lt;br /&gt;
     &lt;br /&gt;
     '''func''' applyChanges()''':'''&lt;br /&gt;
         parent = newParent&lt;br /&gt;
         sumChild += diffSumChild&lt;br /&gt;
         cntChild += diffCntChild&lt;br /&gt;
         diffCntChild = diffSumChild = 0&lt;br /&gt;
     &lt;br /&gt;
     '''func''' addChild(v: '''int''')''':'''&lt;br /&gt;
         diffCntChild++&lt;br /&gt;
         diffSumChild += v&lt;br /&gt;
  &lt;br /&gt;
     '''func''' removeChild(v: '''int''')''':'''&lt;br /&gt;
         diffCntChild--&lt;br /&gt;
         diffSumChild -= v&lt;br /&gt;
&lt;br /&gt;
Для хранения &amp;lt;tex&amp;gt;\mathrm{Rake-Compress}&amp;lt;/tex&amp;gt; дерева будем использовать следующие данные:&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathrm{cells[]}&amp;lt;/tex&amp;gt; {{---}} список клеток, которые ей соответствуют, для каждой вершины,&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathrm{rand}&amp;lt;/tex&amp;gt; {{---}} генератор псевдослучайных чисел,&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathrm{time}&amp;lt;/tex&amp;gt; {{---}} счётчик количества примененных операций по изменению структуры леса,&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathrm{lastUpdateTime[]}&amp;lt;/tex&amp;gt; {{---}} массив, в котором для каждой вершины запишем номер последней операции, при обработки которой была изменена хотя бы одна клетка, которая соответствуют вершине: это позволит эффективно узнавать, была ли вершина уже помечена как поменявшаяся или нет.&lt;br /&gt;
&lt;br /&gt;
 '''struct''' RCTree(n: '''int''')''':'''&lt;br /&gt;
     '''RndGen''' rand = RandBitsGenerator()&lt;br /&gt;
     '''int''' time = 0&lt;br /&gt;
     '''for''' i = 0 '''to''' n&lt;br /&gt;
         lastUpdateTime[i] = 0&lt;br /&gt;
         cells[i] = []&lt;br /&gt;
&lt;br /&gt;
Кроме запросов о структуре леса, &amp;lt;tex&amp;gt;\mathrm{Rake-Compress}&amp;lt;/tex&amp;gt; деревья можно использовать для подсчета значений некоторых функций. Например, каждой вершине можно сопоставить некоторое значение и узнавать, чему равна сумма значений всех вершин, которые находятся в поддереве.&lt;br /&gt;
Для этого в клетках таблицы &amp;lt;tex&amp;gt;\mathrm{Rake-Compress}&amp;lt;/tex&amp;gt; дерева необходимо хранить не только состояние вершины, но и значение функции, посчитанной на части дерева, которое уже было сжато в вершину. Если функция является аддитивной, то ее пересчет аналогичен пересчету множества детей вершины. Так, если некоторая вершина сжимается к родителю, то в соответствующей родителю клетке необходимо обновить значение функции. При добавлении и удалении ребер необходимо в изменившихся клетках пересчитывать значение функции.&lt;br /&gt;
&lt;br /&gt;
===Построение===&lt;br /&gt;
Рассмотрим, как работает алгоритм построения &amp;lt;tex&amp;gt;\mathrm{Rake-Compress}&amp;lt;/tex&amp;gt; дерева. Будем строить таблицу по строкам. В каждый момент будем хранить множество вершин, которые еще не были сжаты, и перестраивать следующий слой. Также будем делать операции &amp;lt;tex&amp;gt;\mathrm{Rake}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{Compress}&amp;lt;/tex&amp;gt; одновременно. Чтобы определить, нужно ли сжимать вершину, воспользуемся следующим алгоритмом:&lt;br /&gt;
 '''bool''' shouldRemoveVertex(c: '''Cell''', rand, layer: '''int''')''':'''&lt;br /&gt;
     '''if''' c.cntChild == 0&lt;br /&gt;
         '''return''' ''true''&lt;br /&gt;
     '''if''' c.cntChild &amp;gt; 1 '''or''' c.parent == c.id&lt;br /&gt;
         '''return''' ''false''&lt;br /&gt;
     '''if''' getCellForVertex(c.sumChild).cntChild == 0&lt;br /&gt;
         '''return''' ''false''&lt;br /&gt;
     '''if''' rand.getBit(c.id, layer) == 0 '''and''' rand.getBit(c.sumChild, layer) == 1 '''and''' rand.getBit(c.parent, layer) == 1:&lt;br /&gt;
         '''return''' ''true''&lt;br /&gt;
     '''return''' ''false''&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм построения дерева выглядит следующим образом:&lt;br /&gt;
 '''func''' build(parent: '''int[n]''')''':'''&lt;br /&gt;
     alive = &amp;lt;tex&amp;gt;\{0 \dots n - 1\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''int''' layer = 0&lt;br /&gt;
     '''for''' i = 0 '''to''' n                                              &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// заполним таблицу вершинами изначального дерева&amp;lt;/font&amp;gt;&lt;br /&gt;
         cells[i].add(Cell(parent[i]))&lt;br /&gt;
     '''while''' &amp;lt;tex&amp;gt;\mathrm{alive} \neq \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         nextAlive = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''for''' &amp;lt;tex&amp;gt;v \in \mathrm{alive}&amp;lt;/tex&amp;gt;&lt;br /&gt;
             '''Cell''' c = getCellForVertex(v)                        &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// получить клетку таблицы, соответствующую вершине&amp;lt;/font&amp;gt;&lt;br /&gt;
             '''if''' shouldRemoveVertex(c, rand, layer)&lt;br /&gt;
                 '''if''' c.cntChild == 1&lt;br /&gt;
                     getCellForVertex(c.sumChild).newParent = c.parent&lt;br /&gt;
                     getCellForVertex(c.parent).addChild(c.sumChild)&lt;br /&gt;
                 '''if''' c.parent &amp;lt;tex&amp;gt;\neq&amp;lt;/tex&amp;gt; v&lt;br /&gt;
                     getCellForVertex(c.parent).remove(v)&lt;br /&gt;
             '''else'''&lt;br /&gt;
                 nextAlive.add(v)&lt;br /&gt;
         alive = nextAlive&lt;br /&gt;
         '''for''' &amp;lt;tex&amp;gt;v \in \mathrm{alive}&amp;lt;/tex&amp;gt;&lt;br /&gt;
             '''Cell''' newCell = getCellForVertex(v).clone().applyChanges()&lt;br /&gt;
             cells[v].add(newCell)&lt;br /&gt;
         layer++&lt;br /&gt;
===Операции удаления и добавления ребра===&lt;br /&gt;
Как только некоторая вершина помечается как изменившаяся, отменим её действие на таблицу:&lt;br /&gt;
# Найдем момент времени, когда вершина сжимается к родителю. &lt;br /&gt;
# Рассмотрим, какие вершины поменяются при сжатии данной: это ее родитель (если он есть), а также сын (если он есть). Для каждой из этих вершин поменяем значения изменений, которые необходимо применить к состоянию. &lt;br /&gt;
# Пометим, что эти вершины поменялись на этом слое. Для этого на каждом слое будем хранить список вершин, которые на нем поменялись. А перед тем как обрабатывать очередной слой будем добавлять в множество изменившихся вершин вершины из соответствующего списка. &lt;br /&gt;
# Кроме удаления эффекта от изменившихся вершин также необходимо и добавить правильный эффект. Для этого будем для каждой из изменившихся вершин определять, как ее состояние меняется при переходе к следующему слою. Если вершина сжимается к ее родителю, то пометим родителя и ребенка (если он есть) и поменяем изменение, которое хранится в соответствующих клетках. А для пересчета состояния клеток воспользуемся значениями изменений, которые сохранены в клетках.&amp;lt;br&amp;gt;&lt;br /&gt;
Рассмотрим, что происходит с таблицей при изменении одного ребра. Основная идея заключается в том, чтобы научится пересчитывать все изменения таблицы за время пропорциональное их количеству. Для этого будем эффективно поддерживать множество изменившихся клеток. В момент, когда вершина помечается, как изменившаяся, найдем, как она влияет на таблицу и отменим это влияние. &amp;lt;br&amp;gt;Для начала необходимо найти момент времени, когда вершина сжимается. В этот момент она влияет на не более чем две вершины. Изменим значения &amp;lt;tex&amp;gt;\mathrm{cntChild}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mathrm{sumChild}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{newParent}&amp;lt;/tex&amp;gt; нужным образом. Также необходимо добавить эти вершины в множество изменившихся (в момент, когда будет обработан соответствующий слой). Поэтому, для каждого слоя еще будем хранить список вершин, которые должны быть помечены перед обработкой слоя.&amp;lt;br&amp;gt;Алгоритм обновления дерева:&lt;br /&gt;
 '''func''' changeTree(&amp;lt;tex&amp;gt;(u, v)&amp;lt;/tex&amp;gt;: '''Edge''')''':'''&lt;br /&gt;
     time = time + 1&lt;br /&gt;
     affected = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
     markAffected(u)                     &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// пусть из дерева было удалено ребро &amp;lt;tex&amp;gt;(u, v)&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     markAffected(v)&lt;br /&gt;
     cells[u].parent = u&lt;br /&gt;
     cells[v].cntChild--&lt;br /&gt;
     cells[v].sumChild -= u&lt;br /&gt;
     '''int''' layer = 0&lt;br /&gt;
     '''while''' &amp;lt;tex&amp;gt;\mathrm{affected} \neq \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''for''' &amp;lt;tex&amp;gt;v \in \mathrm{affectedOnLayer}&amp;lt;/tex&amp;gt;&lt;br /&gt;
             markAffected(v)&lt;br /&gt;
         '''for''' &amp;lt;tex&amp;gt;v \in \mathrm{affected}&amp;lt;/tex&amp;gt;&lt;br /&gt;
             '''Cell''' c = getCellForVertex(v)&lt;br /&gt;
             '''if''' shouldRemoveVertex(v)&lt;br /&gt;
                 cells[v].size = layer + 1&lt;br /&gt;
                 '''if''' c.cntChild == 1&lt;br /&gt;
                     getCellForVertex(c.sumChild).newParent = c.parent&lt;br /&gt;
                     getCellForVertex(c.parent).addChild(c.sumChild)&lt;br /&gt;
                     markAffected(c.sumChild)&lt;br /&gt;
                 '''if''' c.parent &amp;lt;tex&amp;gt;\neq&amp;lt;/tex&amp;gt; v&lt;br /&gt;
                     getCellForVertex(c.parent).removeChild(v)&lt;br /&gt;
                     markAffected(c.parent)&lt;br /&gt;
                 affected.remove(v)&lt;br /&gt;
         '''for''' &amp;lt;tex&amp;gt;v \in \mathrm{affected}&amp;lt;/tex&amp;gt;&lt;br /&gt;
             '''Cell''' newCell = getCellForVertex(v).clone().applyChanges()&lt;br /&gt;
             cells[v][layer + 1] = newCell&lt;br /&gt;
         layer++&lt;br /&gt;
 &lt;br /&gt;
 '''func''' markAffected(v: '''int''')''':'''               &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// пометить вершину как изменившуюся&amp;lt;/font&amp;gt;&lt;br /&gt;
    '''if''' lastUpdateTime[v] == time&lt;br /&gt;
        '''return'''                            &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// вершина уже помечена&amp;lt;/font&amp;gt;&lt;br /&gt;
    lastUpdateTime[v] = time&lt;br /&gt;
    affected.add(v)&lt;br /&gt;
    removeEffectOfVertex(v)&lt;br /&gt;
 &lt;br /&gt;
 '''func''' removeEffectOfVertex(v: '''int''')''':'''       &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// удалить отметку о том, что вершина была помечена изменившийся&amp;lt;/font&amp;gt;&lt;br /&gt;
    '''int''' layer = cells[v].size&lt;br /&gt;
    '''Cell''' c = cells[v][layer]&lt;br /&gt;
    '''if''' c.parent == v&lt;br /&gt;
        '''return'''&lt;br /&gt;
    cells[c].parent.removeChild(v)&lt;br /&gt;
    '''if''' c.cntChild == 1&lt;br /&gt;
        cells[c.parent].addChild(c.sumChild)&lt;br /&gt;
        cells[c.sumChild].newParent = v&lt;br /&gt;
&lt;br /&gt;
==Сравнение с Link-Cut Tree==&lt;br /&gt;
Для Link-Cut деревьев (основанных на [[Splay-дерево|splay-деревьях]]), как и для &amp;lt;tex&amp;gt;\mathrm{Rake-Compress}&amp;lt;/tex&amp;gt; деревьев, время работы операций &amp;lt;tex&amp;gt;\mathrm{link}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{cut}&amp;lt;/tex&amp;gt; {{---}} &amp;lt;tex&amp;gt;O(\log{n})&amp;lt;/tex&amp;gt;. В реальности &amp;lt;tex&amp;gt;\mathrm{RC}&amp;lt;/tex&amp;gt; деревья оказываются медленнее, чем &amp;lt;tex&amp;gt;\mathrm{LC}&amp;lt;/tex&amp;gt; деревья. &amp;lt;br&amp;gt;&lt;br /&gt;
Отличительной особенностью &amp;lt;tex&amp;gt;\mathrm{RC}&amp;lt;/tex&amp;gt; деревьев является возможность параллельного построения: операции &amp;lt;tex&amp;gt;\mathrm{Rake}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{Compress}&amp;lt;/tex&amp;gt; можно выполнять параллельно для всех вершин. Если предположить, что множество детей можно пересчитывать за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\mathrm{Rake-Compress}&amp;lt;/tex&amp;gt; дерево можно построить за &amp;lt;tex&amp;gt;O(\log{n})&amp;lt;/tex&amp;gt; в модели PRAM&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Parallel_random-access_machine Wikipedia {{---}} Parallel random-access machine]&amp;lt;/ref&amp;gt; в случае наличия &amp;lt;tex&amp;gt;\Omega(n)&amp;lt;/tex&amp;gt; процессоров.&amp;lt;br&amp;gt;&lt;br /&gt;
Кроме этого, &amp;lt;tex&amp;gt;\mathrm{Rake-Compress}&amp;lt;/tex&amp;gt; деревья могут оказаться полезными, если необходимо пересчитывать значения не на путях, а на поддеревьях.&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
* [[Link-Cut Tree]]&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/Parallel_Tree_Contraction Wikipedia {{---}} Parallel Tree Contraction]&lt;br /&gt;
* [https://github.com/BorysMinaiev/bachelor/blob/master/thesis_v2.pdf Б. Ю. Минаев {{---}} Реализация динамических Rake-Compress деревьев в случае отсутствия ограничения на степени вершин]&lt;br /&gt;
* [http://www.cs.cmu.edu/~jvittes/rc-trees Acar, Blelloch, and Vittes {{---}} RC-Tree implementation]&lt;br /&gt;
* [http://www.cs.princeton.edu/~rwerneck/papers/Wer06-dissertation.pdf R. Werneck {{---}} Design and Analysis of Data Structures for Dynamic Trees]&lt;br /&gt;
* G. L. Miller, J. H. Reif {{---}} Parallel Tree Contraction, Journal of Advances in Computer Research Volume 5, 1989&lt;br /&gt;
* Umit A. Acar, Guy E. Blelloch, Jorge L. Vittes {{---}} An Experimental Analysis of Change Propagation in Dynamic Trees, 1-2005&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Задача о наименьшем общем предке]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</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%A1%D0%B0%D0%BC%D0%BD%D0%B5%D1%80%D0%B0_%E2%80%94_%D0%9B%D0%B0%D1%81_%D0%92%D0%B5%D1%80%D0%B3%D0%BD%D0%B0%D1%81%D0%B0&amp;diff=82977</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%A1%D0%B0%D0%BC%D0%BD%D0%B5%D1%80%D0%B0_%E2%80%94_%D0%9B%D0%B0%D1%81_%D0%92%D0%B5%D1%80%D0%B3%D0%BD%D0%B0%D1%81%D0%B0&amp;diff=82977"/>
				<updated>2022-09-01T03:59:51Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Теорема Самнера — Лас Вергнаса''' даёт достаточное условие для существования совершенного паросочетания в графах чётного порядка.&lt;br /&gt;
&lt;br /&gt;
==Подготовка к доказательству==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Смежными листами''' (англ. ''coincident endpoints'') в неориентрированном графе называется такая пара вершин &amp;lt;tex&amp;gt;x, y&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;\operatorname{deg}x = 1, \operatorname{deg}y = 1&amp;lt;/tex&amp;gt;, причём обе вершины имеют общую смежную вершину (другими словами, расстояние между этими вершинами &amp;lt;tex&amp;gt;\rho(x, y) = 2&amp;lt;/tex&amp;gt;). &lt;br /&gt;
}}&lt;br /&gt;
Для доказательства основной теоремы потребуется доказать вспомогательную лемму:&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; — связный граф, состоящий из &amp;lt;tex&amp;gt;n \geq 3&amp;lt;/tex&amp;gt; вершин и не содержащий ''смежных листов'', то найдутся такие две '''смежные''' вершины &amp;lt;tex&amp;gt;x, y&amp;lt;/tex&amp;gt;, что граф &amp;lt;tex&amp;gt;G \backslash \{x, y\}&amp;lt;/tex&amp;gt; также будет связен.&lt;br /&gt;
|proof=&lt;br /&gt;
:Лемма, очевидно выполняется для полных графов &amp;lt;tex&amp;gt;K_n&amp;lt;/tex&amp;gt;. Таким образом, будем считать далее, что диаметр графа &amp;lt;tex&amp;gt;d \geq 2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
:Пусть &amp;lt;tex&amp;gt;a, y&amp;lt;/tex&amp;gt; — вершины графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, находящиеся на расстоянии &amp;lt;tex&amp;gt;\rho(a, y) = d&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;D = a \dots xy&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;x&amp;lt;/tex&amp;gt; могут совпадать).&lt;br /&gt;
:Предположим, что &amp;lt;tex&amp;gt;G^* = G \backslash \{x, y\}&amp;lt;/tex&amp;gt; не связен. Обозначим за &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; компоненту связности &amp;lt;tex&amp;gt;G^*&amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;a \in A&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; является диаметром графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, то все вершины графа &amp;lt;tex&amp;gt;G^* \backslash A&amp;lt;/tex&amp;gt; смежны с &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; (иначе мы бы нашли пару вершин, расстояние между которыми было бы больше, чем &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;). После этого возможны несколько случаев:&lt;br /&gt;
:# Граф &amp;lt;tex&amp;gt;G^* \backslash A&amp;lt;/tex&amp;gt; содержит компоненту &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; размера &amp;lt;tex&amp;gt;m \geq 2&amp;lt;/tex&amp;gt;. Тогда для &amp;lt;tex&amp;gt;\forall b, c \in B&amp;lt;/tex&amp;gt;, которые в &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; являются смежными, в &amp;lt;tex&amp;gt;G \backslash \{b, c\}&amp;lt;/tex&amp;gt; будет существовать путь из каждой вершины до &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, а значит, &amp;lt;tex&amp;gt;G \backslash \{b, c\}&amp;lt;/tex&amp;gt; связен.&lt;br /&gt;
:# Граф &amp;lt;tex&amp;gt;G^* \backslash A&amp;lt;/tex&amp;gt; содержит вершину &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;, смежную с &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда по аналогичным причинам граф &amp;lt;tex&amp;gt;G \backslash \{e, y\}&amp;lt;/tex&amp;gt; связен.&lt;br /&gt;
:# Граф &amp;lt;tex&amp;gt;G^* \backslash A&amp;lt;/tex&amp;gt; не содержит компонент размера &amp;lt;tex&amp;gt;m \geq 2&amp;lt;/tex&amp;gt; (случай 1), а значит он содержит только изолированные вершины. Тогда все вершины &amp;lt;tex&amp;gt;G^* \backslash A&amp;lt;/tex&amp;gt; связаны только с &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; в исходном графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; (они могли быть связаны максимум с еще одной вершиной &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;, а это было рассмотрено в случае 2). Но, так как граф не содержит смежных листов, то &amp;lt;tex&amp;gt;G^* \backslash A&amp;lt;/tex&amp;gt; состоит из единственной вершины &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;\operatorname{deg}y = 1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;f&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;A&amp;lt;/tex&amp;gt;. Следовательно, &amp;lt;tex&amp;gt;G \backslash \{f, x\}&amp;lt;/tex&amp;gt; связен.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Теорема==&lt;br /&gt;
Докажем оригинальную версию теоремы, доказанную независимо Самнером (''Sumner'', 1974) и Лас Вергнасом (''Las Vergnas'', 1975). Напомним, что индуцированный подграф &amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt; это граф, образованный из подмножества вершин графа вместе со всеми рёбрами, соединяющими пары вершин из этого подмножества.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about= &lt;br /&gt;
Самнера — Лас Вергнаса&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; — связный граф четного порядка &amp;lt;tex&amp;gt;2n \geq 3&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt; такое число, что любой индуцированный связный подграф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; четного порядка &amp;lt;tex&amp;gt;2k&amp;lt;/tex&amp;gt; содержит совершенное паросочетание (&amp;lt;tex&amp;gt;1 &amp;lt; k \leq n&amp;lt;/tex&amp;gt;). Тогда &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; также содержит совершенное паросочетание.&lt;br /&gt;
|proof=&lt;br /&gt;
:Докажем теорему по индукции.&lt;br /&gt;
:Теорема довольно просто проверяется для случаев &amp;lt;tex&amp;gt;n = 2, 3&amp;lt;/tex&amp;gt;. Предположим, что теорема выполняется для &amp;lt;tex&amp;gt;n - 1&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;n \geq 4&amp;lt;/tex&amp;gt;). Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; — связный граф порядка &amp;lt;tex&amp;gt;2n&amp;lt;/tex&amp;gt; и предположим, что &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt; это такое число, что любой индуцированный связный подграф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; четного порядка &amp;lt;tex&amp;gt;2k&amp;lt;/tex&amp;gt; содержит совершенное паросочетание.&lt;br /&gt;
:Случай &amp;lt;tex&amp;gt;k = n&amp;lt;/tex&amp;gt; очевиден, поэтому можно считать, что &amp;lt;tex&amp;gt;k \leq n - 1&amp;lt;/tex&amp;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;G&amp;lt;/tex&amp;gt; четного порядка &amp;lt;tex&amp;gt;2k&amp;lt;/tex&amp;gt;, содержащий эти вершины. Тогда хотя бы одна из вершин &amp;lt;tex&amp;gt;a, b&amp;lt;/tex&amp;gt; будет не покрыта паросочетанием.&lt;br /&gt;
:Таким образом, граф &amp;lt;tex&amp;gt;G&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;G \backslash \{x, y\}&amp;lt;/tex&amp;gt; связен. &lt;br /&gt;
:По нашему индукционному предположению, граф &amp;lt;tex&amp;gt;G \backslash \{x, y\}&amp;lt;/tex&amp;gt; содержит совершенное паросочетание, а значит, добавив ребро &amp;lt;tex&amp;gt;xy&amp;lt;/tex&amp;gt;, мы получим совершенное паросочетание для &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Также можно доказать более слабое, но полезное утверждение про графы без лап (индуцированных подграфов &amp;lt;tex&amp;gt;K_{1,3}&amp;lt;/tex&amp;gt;).&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|about=следствие из теоремы&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; — связный граф чётного порядка &amp;lt;tex&amp;gt;2n&amp;lt;/tex&amp;gt;, не содержащий лап. Тогда &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; содержит совершенное паросочетание.&lt;br /&gt;
|proof=&lt;br /&gt;
:Единственный связный граф порядка &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;, который не содержит совершенного паросочетания — это &amp;lt;tex&amp;gt;K_{1,3}&amp;lt;/tex&amp;gt;. Таким образом, это утверждение является частным случаем теоремы Самнера — Лас Вергнаса при &amp;lt;tex&amp;gt;k = 2&amp;lt;/tex&amp;gt;, за исключением тривиального случая &amp;lt;tex&amp;gt;n = 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
[[Файл:all_connected_graphs_4_vertices.png|thumb|550px|center|Все связные неориентированные графы, состоящие из 4 вершин, с точностью до изоморфизма]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
* [[ Паросочетания: основные определения, теорема о максимальном паросочетании и дополняющих цепях ]]&lt;br /&gt;
* [[ Теорема Татта о существовании полного паросочетания ]]&lt;br /&gt;
* [[Лапы и минимальные по включению барьеры в графе]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [[wikipedia:en:Claw-free_graph#Matchings | Википедия {{---}} Claw-free graph]]&lt;br /&gt;
* [[wikipedia:ru:Граф_без_клешней#Паросочетания | Википедия {{---}} Граф без клешней]]&lt;br /&gt;
* ''David P. Sumner''. Graphs with 1-factors. — 1974. — Т. 42, вып. 1. — стр. 8—12&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Задача о паросочетании]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A7%D0%B8%D1%81%D0%BB%D0%B0_%D0%9A%D0%B0%D1%82%D0%B0%D0%BB%D0%B0%D0%BD%D0%B0&amp;diff=82976</id>
		<title>Числа Каталана</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%9A%D0%B0%D1%82%D0%B0%D0%BB%D0%B0%D0%BD%D0%B0&amp;diff=82976"/>
				<updated>2022-09-01T03:59:43Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Числа Каталана==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id = def1&lt;br /&gt;
|definition ='''Числа Каталана''' {{---}} последовательность чисел, выражающих:&lt;br /&gt;
*количество [[Дерево_поиска,_наивная_реализация|не изоморфных упорядоченных бинарных деревьев]] с корнем и &amp;lt;tex dpi = 120&amp;gt; n + 1 &amp;lt;/tex&amp;gt; листьями&lt;br /&gt;
*количество способов соединения &amp;lt;tex dpi = 120&amp;gt; 2n &amp;lt;/tex&amp;gt; точек на окружности &amp;lt;tex dpi = 120&amp;gt; n &amp;lt;/tex&amp;gt; не пересекающимися хордами&lt;br /&gt;
*количество [[Триангуляция_полигонов_(ушная_%2B_монотонная)|триангуляций выпуклого &amp;lt;tex dpi = 120&amp;gt; n &amp;lt;/tex&amp;gt;-угольника]]&lt;br /&gt;
*количество способов полностью разделить скобками &amp;lt;tex dpi = 120&amp;gt; n + 1 &amp;lt;/tex&amp;gt; множитель&lt;br /&gt;
*количество [[Правильные_скобочные_последовательности|корректных скобочных последовательностей, состоящих из &amp;lt;tex dpi = 120&amp;gt; n &amp;lt;/tex&amp;gt; открывающих и &amp;lt;tex dpi = 120&amp;gt; n &amp;lt;/tex&amp;gt; закрывающих скобок]]&lt;br /&gt;
*количество таблиц Юнга размером &amp;lt;tex dpi = 120&amp;gt;2n&amp;lt;/tex&amp;gt;&lt;br /&gt;
*количество монотонных путей в квадрате размером &amp;lt;tex dpi = 120&amp;gt;n \times n&amp;lt;/tex&amp;gt;, не пересекающих диагональ&lt;br /&gt;
*количество способов расставить скобки в произведении &amp;lt;tex dpi = 120&amp;gt;n&amp;lt;/tex&amp;gt; множителей&lt;br /&gt;
*количество способов заполнить лестницу ширины и высоты &amp;lt;tex dpi = 120&amp;gt;n&amp;lt;/tex&amp;gt; прямоугольниками&lt;br /&gt;
и так далее}}&lt;br /&gt;
&lt;br /&gt;
Первые несколько чисел Каталана: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex dpi = 120&amp;gt; 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, \ldots &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Формулы вычисления чисел Каталана==&lt;br /&gt;
&lt;br /&gt;
===Рекуррентная формула===&lt;br /&gt;
&amp;lt;tex dpi = 150&amp;gt;C_n = \sum\limits_{i = 0}^{n - 1} C_i C_{n - 1 - i} &amp;lt;/tex&amp;gt;&lt;br /&gt;
====Доказательство====&lt;br /&gt;
Рекуррентную формулу легко вывести из задачи о правильных скобочных последовательностях.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex dpi = 120&amp;gt;X&amp;lt;/tex&amp;gt; — произвольная правильная скобочная последовательность длины &amp;lt;tex dpi = 120&amp;gt;2n&amp;lt;/tex&amp;gt;. Она начинается с открывающейся скобки. Найдем парную ей закрывающуюся скобку и представим последовательность &amp;lt;tex dpi = 120&amp;gt;X&amp;lt;/tex&amp;gt; в виде: &amp;lt;tex dpi = 120&amp;gt;X = (A)B&amp;lt;/tex&amp;gt;, где &amp;lt;tex dpi = 120&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex dpi = 120&amp;gt;B&amp;lt;/tex&amp;gt; — тоже правильные скобочные последовательности. Если длина последовательности &amp;lt;tex dpi = 120&amp;gt;A&amp;lt;/tex&amp;gt; равна &amp;lt;tex dpi = 120&amp;gt;2k&amp;lt;/tex&amp;gt;, то последовательность &amp;lt;tex dpi = 120&amp;gt;A&amp;lt;/tex&amp;gt; можно составить &amp;lt;tex dpi = 120&amp;gt;C_k&amp;lt;/tex&amp;gt; способами. Тогда длина последовательности &amp;lt;tex dpi = 120&amp;gt;B&amp;lt;/tex&amp;gt; равна &amp;lt;tex dpi = 120&amp;gt;2(n - k - 1)&amp;lt;/tex&amp;gt; и последовательность &amp;lt;tex dpi =120&amp;gt;B&amp;lt;/tex&amp;gt; можно составить &amp;lt;tex dpi = 120&amp;gt;C_{n - k - 1}&amp;lt;/tex&amp;gt; способами. Комбинация любого способа составить последовательность &amp;lt;tex dpi = 120&amp;gt;A&amp;lt;/tex&amp;gt; с любым способом составить последовательность &amp;lt;tex dpi = 120&amp;gt;B&amp;lt;/tex&amp;gt; даст новую последовательность &amp;lt;tex dpi = 120&amp;gt;X&amp;lt;/tex&amp;gt;, а величина &amp;lt;tex dpi = 120&amp;gt;k&amp;lt;/tex&amp;gt; может меняться от &amp;lt;tex dpi = 120&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex dpi = 120&amp;gt;n - 1&amp;lt;/tex&amp;gt;. Получили рекуррентное соотношение: &amp;lt;tex dpi = 120&amp;gt;C_n = C_0 C_{n-1} + C_1 C_{n-2} + \ldots + C_{n-1} C_0 &amp;lt;/tex&amp;gt;. Так как &amp;lt;tex dpi = 120&amp;gt;C_0 = 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; C_n = \dfrac{1}{n+1} \dbinom {2n} {n} &amp;lt;/tex&amp;gt;&lt;br /&gt;
====Доказательство====&lt;br /&gt;
&lt;br /&gt;
Правильной скобочной структуре из &amp;lt;tex dpi = 120&amp;gt;n&amp;lt;/tex&amp;gt; открывающих и &amp;lt;tex dpi = 120&amp;gt;n&amp;lt;/tex&amp;gt; закрывающих скобок мы поставим в соответствие путь в квадрате &amp;lt;tex dpi = 120&amp;gt;[0, n]×[0, n]&amp;lt;/tex&amp;gt;. Путь начинается в точке &amp;lt;tex dpi = 120&amp;gt;(0,0)&amp;lt;/tex&amp;gt; и заканчивается в точке &amp;lt;tex dpi = 120&amp;gt;(n, n)&amp;lt;/tex&amp;gt;. Открывающей скобке мы сопоставляем горизонтальный отрезок длины &amp;lt;tex dpi = 120&amp;gt;1&amp;lt;/tex&amp;gt;, а закрывающей — вертикальный.&lt;br /&gt;
Если путь сопоставлен правильной структуре, то ни одна его точка не может лежать выше главной диагонали квадрата. Обратно, такому пути (&amp;quot;правильному пути&amp;quot;) сопоставляется правильная скобочная структура.&lt;br /&gt;
Геометрическое представление правильных скобочных структур позволяет найти выражение для чисел Каталана.&lt;br /&gt;
&lt;br /&gt;
Сместим правильный путь на одну клетку вниз. Теперь правильный путь начинается в точке&lt;br /&gt;
&amp;lt;tex dpi = 120&amp;gt; (0, -1) &amp;lt;/tex&amp;gt;, заканчивается в точке &amp;lt;tex dpi = 120&amp;gt; (n, n-1) &amp;lt;/tex&amp;gt; и не имеет общих точек с прямой &amp;lt;tex dpi = 120&amp;gt; y = x &amp;lt;/tex&amp;gt; — биссектрисой первого квадранта. Нам нужно найти количество правильных путей. Для этого мы найдем количество неправильных, и из общего числа путей вычтем количество неправильных. Мы рассматриваем пути из точки &amp;lt;tex fpi = 120&amp;gt; (0, -1) &amp;lt;/tex&amp;gt; в точку &amp;lt;tex dpi = 120&amp;gt; (n, n-1) &amp;lt;/tex&amp;gt;. Длина такого пути равна &amp;lt;tex dpi = 120&amp;gt;2n&amp;lt;/tex&amp;gt; и он содержит &amp;lt;tex dpi = 120&amp;gt;n&amp;lt;/tex&amp;gt; вертикальных сегментов и &amp;lt;tex dpi = 120&amp;gt;n&amp;lt;/tex&amp;gt; горизонтальных. Количество всех таких путей равно числу способов выбрать &amp;lt;tex dpi = 120&amp;gt;n&amp;lt;/tex&amp;gt; вертикальных сегментов из общего числа &amp;lt;tex dpi = 120&amp;gt;2n&amp;lt;/tex&amp;gt; сегментов, т.е. равно &amp;lt;tex dpi = 135&amp;gt; \dbinom {2n}{n} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим неправильный путь и его первую точку на прямой &amp;lt;tex dpi = 120&amp;gt; y = x &amp;lt;/tex&amp;gt; (точка &amp;lt;tex dpi = 120&amp;gt;A&amp;lt;/tex&amp;gt;). Отрезок пути от точки &amp;lt;tex dpi = 120&amp;gt;(0, -1)&amp;lt;/tex&amp;gt; до точки &amp;lt;tex dpi = 120&amp;gt;A&amp;lt;/tex&amp;gt; заменим симметричным относительно прямой &amp;lt;tex dpi = 120&amp;gt;y = x&amp;lt;/tex&amp;gt;. Мы получим путь длины &amp;lt;tex dpi = 120&amp;gt;2n&amp;lt;/tex&amp;gt;, идущий из точки &amp;lt;tex dpi = 120&amp;gt;(-1, 0)&amp;lt;/tex&amp;gt; в точку &amp;lt;tex dpi = 120&amp;gt;(n, n-1)&amp;lt;/tex&amp;gt; (Смотри рис.).&lt;br /&gt;
[[Файл:Каталан2.PNG|right]]&lt;br /&gt;
Такой путь обязательно пересекает прямую &amp;lt;tex dpi = 120&amp;gt; y = x &amp;lt;/tex&amp;gt;. Обратно, пусть нам дан путь длины &amp;lt;tex dpi = 120&amp;gt; 2n &amp;lt;/tex&amp;gt; из точки &amp;lt;tex dpi = 120&amp;gt;(-1, 0)&amp;lt;/tex&amp;gt; в точку &amp;lt;tex dpi = 120&amp;gt;(n, n-1)&amp;lt;/tex&amp;gt; и пусть &amp;lt;tex dpi = 120&amp;gt; A &amp;lt;/tex&amp;gt; — первая точка этого пути, лежащая на прямой &amp;lt;tex dpi = 120&amp;gt;y = x&amp;lt;/tex&amp;gt;. Заменив участок пути от точки &amp;lt;tex dpi = 120&amp;gt;(-1, 0)&amp;lt;/tex&amp;gt; до точки &amp;lt;tex dpi = 120&amp;gt;A&amp;lt;/tex&amp;gt; на симметричный относительно прямой &amp;lt;tex dpi = 120&amp;gt;y = x&amp;lt;/tex&amp;gt;, мы получим неправильный путь из точки &amp;lt;tex dpi = 120&amp;gt;(0, -1)&amp;lt;/tex&amp;gt; в точку &amp;lt;tex dpi = 120&amp;gt;(n, n-1)&amp;lt;/tex&amp;gt;. Следовательно, неправильных путей из точки &amp;lt;tex dpi = 120&amp;gt;(0, -1)&amp;lt;/tex&amp;gt; в точку &amp;lt;tex dpi = 120&amp;gt;(n, n-1)&amp;lt;/tex&amp;gt; столько же, сколько путей из точки &amp;lt;tex dpi = 120&amp;gt;(-1, 0)&amp;lt;/tex&amp;gt; в&lt;br /&gt;
точку &amp;lt;tex dpi = 120&amp;gt;(n, n-1)&amp;lt;/tex&amp;gt;. Такой путь длины &amp;lt;tex dpi = 120&amp;gt;2n&amp;lt;/tex&amp;gt; содержит &amp;lt;tex dpi = 120&amp;gt;n+1&amp;lt;/tex&amp;gt; горизонтальных и &amp;lt;tex dpi = 120&amp;gt;n-1&amp;lt;/tex&amp;gt; вертикальных участков. Поэтому, количество таких путей равно &amp;lt;tex dpi = 135&amp;gt; \dbinom {2n}{n-1} &amp;lt;/tex&amp;gt;. Значит, количество правильных путей (т.е. число Каталана &amp;lt;tex dpi = 120&amp;gt;C_n&amp;lt;/tex&amp;gt;) равно&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; C_n = \dbinom {2n} {n} - \dbinom {2n} {n-1} = \dfrac{2n!}{n!n!} - \dfrac{2n!}{(n-1)!(n+1)!} = \dfrac{2n!}{n!} (\dfrac{1}{n!} - \dfrac{1}{(n-1)! (n+1)}) = \dfrac{2n!}{n!n!(n+1)} = \dfrac{1}{n+1} \dbinom {2n} {n} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Задача разбиения выпуклого &amp;lt;tex dpi = 155 &amp;gt; n &amp;lt;/tex&amp;gt;—угольника на треугольники не пересекающимися диагоналями==&lt;br /&gt;
&lt;br /&gt;
===Доказательство===&lt;br /&gt;
[[Файл:Vectorpaint.png|145px|right]]&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex dpi = 120&amp;gt;t_n&amp;lt;/tex&amp;gt; — число триангуляций выпуклого &amp;lt;tex dpi = 120&amp;gt; (n + 2) &amp;lt;/tex&amp;gt;-угольника при &amp;lt;tex dpi = 120&amp;gt; n \geqslant 1 &amp;lt;/tex&amp;gt;. Положим &amp;lt;tex dpi = 120&amp;gt; t_0 = 1 &amp;lt;/tex&amp;gt;. Пронумеруем вершины многоугольника, начиная с произвольной против часовой стрелки. Рассмотрим произвольную триангуляцию и выделим треугольник, примыкающий к стороне &amp;lt;tex dpi = 120&amp;gt;01&amp;lt;/tex&amp;gt; (см. рис.).&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex dpi = 120&amp;gt;k&amp;lt;/tex&amp;gt; — номер третьей вершины этого треугольника. Выделенный треугольник разбивает &amp;lt;tex dpi = 120&amp;gt;(n + 2)&amp;lt;/tex&amp;gt; — угольник на &amp;lt;tex dpi = 120&amp;gt;k&amp;lt;/tex&amp;gt; — угольник и &amp;lt;tex dpi = 120&amp;gt;(n-k+3)&amp;lt;/tex&amp;gt; — угольник, каждый из которых триангулирован диагоналями. Перенумеруем вершины этих многоугольников против часовой стрелки так, чтобы нумерация вершин в каждом из них начиналась с 0. В результате получим пару триангуляций &amp;lt;tex dpi = 120&amp;gt;k&amp;lt;/tex&amp;gt;-угольника и &amp;lt;tex dpi = 120&amp;gt;(n-k+3)&amp;lt;/tex&amp;gt; — угольника. Наоборот, каждая пара триангуляций &amp;lt;tex dpi = 120&amp;gt;k&amp;lt;/tex&amp;gt; — угольника и &amp;lt;tex dpi = 120&amp;gt;(n-k+3)&amp;lt;/tex&amp;gt; — угольника&lt;br /&gt;
определяет триангуляцию исходного многоугольника. Поэтому&lt;br /&gt;
&amp;lt;tex dpi = 120&amp;gt;t_{n+1} = t_0 t_n + t_1 t_{n-1} + \ldots + t_n t_0 &amp;lt;/tex&amp;gt;&lt;br /&gt;
и поскольку &amp;lt;tex dpi = 120&amp;gt;t_0 = 1&amp;lt;/tex&amp;gt;, последовательность чисел &amp;lt;tex dpi = 120&amp;gt;t_n&amp;lt;/tex&amp;gt; совпадает с последовательностью Каталана.&lt;br /&gt;
&lt;br /&gt;
===Пример===&lt;br /&gt;
[[Файл:Каталан.PNG|315px|thumb|right|Разбиение выпуклого шестиугольника]]&lt;br /&gt;
Ответ на задачу при &amp;lt;tex dpi = 120&amp;gt; n = 3 &amp;lt;/tex&amp;gt; тривиален: никаких&lt;br /&gt;
диагоналей проводить не надо. В четырёхугольнике можно провести любую из&lt;br /&gt;
двух диагоналей, так что способов два. В пятиугольнике — из любой вершины две&lt;br /&gt;
диагонали, &amp;lt;tex dpi = 120&amp;gt; 5 &amp;lt;/tex&amp;gt; способов. При &amp;lt;tex dpi = 120&amp;gt; n = 6 &amp;lt;/tex&amp;gt; — первый не вполне очевидный ответ: &amp;lt;tex dpi = 120&amp;gt; 14 &amp;lt;/tex&amp;gt; способов (см. рис.); чтобы&lt;br /&gt;
не запутаться, сторона BC выделена и отдельно нарисованы разрезания, в которых&lt;br /&gt;
к ней примыкают соответственно треугольники &amp;lt;tex dpi = 120&amp;gt; BCA, BCF, BCE &amp;lt;/tex&amp;gt; и &amp;lt;tex dpi = 120&amp;gt; BCD &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для семиугольника можно выделить одну из сторон и расклассифицировать разрезания в зависимости от того, какой треугольник к этой стороне примыкает. Имеем &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt; разных случаев. В первом и последнем из них количество разбиений равно &amp;lt;tex&amp;gt;14&amp;lt;/tex&amp;gt;,&lt;br /&gt;
ибо после отрезания треугольника остаётся шестиугольник. Во втором и четвёртом&lt;br /&gt;
случаях при вырезании треугольника семиугольник распадается на треугольник и&lt;br /&gt;
пятиугольник. В третьем случае семиугольник распадается на два четырёхугольника. Поскольку каждый из них можно разбить двумя способами, получаем &lt;br /&gt;
&amp;lt;tex dpi = 120&amp;gt;2 \cdot 2 = 4&amp;lt;/tex&amp;gt;&lt;br /&gt;
варианта. Итак, семиугольник можно разбить всего&lt;br /&gt;
&amp;lt;tex dpi = 120&amp;gt; 14 + 5 + 2 \cdot 2 + 5 + 14 = 42 &amp;lt;/tex&amp;gt;&lt;br /&gt;
способами. Рассматривая восьмиугольник, аналогично получаем&lt;br /&gt;
&amp;lt;tex dpi = 120&amp;gt; 42 + 14 + 2 \cdot 5 + 5 \cdot 2 + 14 + 42 = 132 &amp;lt;/tex&amp;gt;&lt;br /&gt;
способа.Такие вычисления можно проводить и дальше.&lt;br /&gt;
&lt;br /&gt;
==Подсчет чисел Каталана==&lt;br /&gt;
Числа Каталана просто посчитать с помощью рекуррентной формулы. Для этого понадобится &amp;lt;tex dpi = 120&amp;gt;O(n)&amp;lt;/tex&amp;gt; памяти и &amp;lt;tex dpi = 120&amp;gt;O(n^2)&amp;lt;/tex&amp;gt; времени. За &amp;lt;tex dpi = 120&amp;gt;O(n)&amp;lt;/tex&amp;gt; времени их можно посчитать, если использовать аналитическую формулу. Также из аналитической формулы можно выразить простую реккурентную формулу:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex dpi = 135&amp;gt; C_n = \dfrac{4n-2}{n+1} C_{n-1} &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=&amp;lt;tex&amp;gt;\dbinom{\frac{1}{2}}{k} = \dfrac{(-1)^{k - 1}}{(2k - 1) \cdot 4^k} \cdot \dbinom{2k}{k} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\dbinom{\frac{1}{2}}{k} = \dfrac{\dfrac{1}{2} \cdot (\dfrac{1}{2} - 1) \cdot (\dfrac{1}{2} - 2) \cdots (\dfrac{1}{2} - k + 1)}{k!} = &lt;br /&gt;
\dfrac{1 \cdot (1 - 2) \cdot (1 - 4) \cdots (1 - 2k + 2)}{2^k \cdot k!} = \dfrac{1 \cdot (-1) \cdot (-3) \cdots (-2k + 3)}{2^k \cdot k!}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; = \dfrac{(-1)^{k - 1}}{2k - 1} \cdot \dfrac{1 \cdot 3 \cdot (2k - 3) \cdot (2k - 1)}{2^k \cdot k!} = \dfrac{(-1)^{k - 1}}{2k - 1} \cdot \dfrac{1 \cdot 2 \cdot 3 \cdots (2k - 3) \cdot (2k - 2) \cdot (2k - 1) \cdot 2k}{2 \cdot 4 \cdots (2k - 2) \cdot 2k \cdot 2^k \cdot k!}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;= \dfrac{(-1)^{k - 1}}{2k - 1} \cdot \dfrac{(2k)!}{(2 \cdot 1) \cdot (2 \cdot 2) \cdots (2 \cdot (2k - 1)) \cdot (2 \cdot k) \cdot 2^k \cdot k!} = \dfrac{(-1)^{k - 1}}{2k - 1} \cdot \dfrac{(2k)!}{2^k \cdot (1 \cdot 2 \cdots (k - 1) \cdot k) \cdot 2^k\cdot k!} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; = \dfrac{(-1)^{k - 1}}{2k - 1} \cdot \dfrac{(2k)!}{2^k \cdot k! \cdot 2^k\cdot k!} = \dfrac{(-1)^{k - 1}}{(2k - 1) \cdot 2^k \cdot 2^k} \cdot \dfrac{(2k)!}{k! \cdot k!}= \dfrac{(-1)^{k - 1}}{(2k - 1) \cdot 4^k} \dbinom{2k}{k}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition = Вычислить производящую функцию чисел Каталана&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Пусть мы имеем последовательность чисел Каталана &amp;lt;tex&amp;gt;(C_0, C_1, C_2, \ldots)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Будем искать её производящую функцию в виде &amp;lt;tex&amp;gt;G(z) = \sum\limits_{n = 0}^{\infty} C_n \cdot z^n&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как известно, рекуррентное соотношение для чисел Каталана имеет вид&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C_n=&lt;br /&gt;
\begin{cases}&lt;br /&gt;
1,&amp;amp;\text{если $n = 0$;}\\&lt;br /&gt;
\sum\limits_{k = 0}^{n - 1}C_k C_{n - k - 1},&amp;amp;\text{если $n &amp;gt; 0$.}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Домножаем &amp;lt;tex&amp;gt;C_n&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;z^n&amp;lt;/tex&amp;gt;, получая&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
z^n \cdot C_n=&lt;br /&gt;
\begin{cases}&lt;br /&gt;
z^0 = 1,&amp;amp;\text{если $n = 0$;}\\&lt;br /&gt;
z^n \sum\limits_{k = 0}^{n - 1}C_k C_{n - k - 1},&amp;amp;\text{если $n &amp;gt; 0$.}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Суммируя &amp;lt;tex&amp;gt;C_n z^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;\infty&amp;lt;/tex&amp;gt;, получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;G(z) = \sum\limits_{n = 0}^{\infty} C_n z^n = C_0 z^0 + \sum\limits_{n = 1}^{\infty}z^n \sum\limits_{k = 0}^{n - 1} C_k C_{n - k - 1} =&lt;br /&gt;
C_0 + \sum\limits_{n = 1}^{\infty}z^n \sum\limits_{k = 0}^{n - 1} C_k C_{n - k - 1} = 1 + \sum\limits_{n = 1}^{\infty}z^n \sum\limits_{k = 0}^{n - 1} C_k C_{n - k - 1}&amp;lt;/tex&amp;gt; (так как &amp;lt;tex&amp;gt;C_0 = 1&amp;lt;/tex&amp;gt; по определению чисел Каталана). &lt;br /&gt;
&lt;br /&gt;
Получили, что &amp;lt;tex&amp;gt;G(z) = 1 + \sum\limits_{n = 1}^{\infty}z^n \sum\limits_{k = 0}^{n - 1} C_k C_{n - k - 1}~~~~~  \textbf{(1)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Распишем произведение &amp;lt;tex&amp;gt;G(z) \cdot G(z)&amp;lt;/tex&amp;gt; по определению [[Арифметические действия с формальными степенными рядами#def_mul | произведения формальных степенных рядов]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;G(z) \cdot G(z) = (\sum\limits_{n = 0}^{\infty} C_n z^n) \cdot (\sum\limits_{n = 0}^{\infty} C_n z^n) = \sum\limits_{n = 0}^{\infty}z^n \sum\limits_{k = 0}^{n} C_k C_{n - k}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В последнем выражении выполним сдвиг индексации, положив &amp;lt;tex&amp;gt;n' = n + 1&amp;lt;/tex&amp;gt;. Тогда имеем: &amp;lt;tex&amp;gt;n = n' - 1, n = 0 \Rightarrow n' = 1&amp;lt;/tex&amp;gt;. Кроме того, &amp;lt;tex&amp;gt;z^n = z^{n' - 1}&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;n - k&amp;lt;/tex&amp;gt; преобразуется в &amp;lt;tex&amp;gt;n' - 1 - k&amp;lt;/tex&amp;gt; (так как &amp;lt;tex&amp;gt;n' - 1 = n&amp;lt;/tex&amp;gt;). Тогда, преобразуя предыдущее выражение, получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;G(z) \cdot G(z) = \sum\limits_{n = 0}^{\infty}z^n \sum\limits_{k = 0}^{n} C_k C_{n - k} = \sum\limits_{n' = 1}^{\infty}z^{n' - 1} \sum\limits_{k = 0}^{n' - 1} C_k C_{n' - k - 1}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Домножая это произведение на &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt;, получаем&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;z \cdot G^2(z) = z \cdot \sum\limits_{n' = 1}^{\infty}z^{n' - 1} \sum\limits_{k = 0}^{n' - 1} C_k C_{n' - k - 1} = \sum\limits_{n' = 1}^{\infty}z^{n'} \sum\limits_{k = 0}^{n' - 1} C_k C_{n' - k - 1}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;z \cdot G^2(z) = \sum\limits_{n = 1}^{\infty}z^{n} \sum\limits_{k = 0}^{n - 1} C_k C_{n - k - 1} ~~~~ \textbf{(2)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Из &amp;lt;tex&amp;gt; \textbf{(1)}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\textbf{(2)}&amp;lt;/tex&amp;gt; получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;G(z) = 1 + z \cdot G^2(z)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Преобразуя, получаем квадратное уравнение на &amp;lt;tex&amp;gt;G(z) :&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;z \cdot G^2(z) - G(z) + 1 = 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Из этого квадратного уравнения находим два варианта &amp;lt;tex&amp;gt;G(z) :&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;G(z) = \dfrac{1 \pm \sqrt{1-4z}}{2z}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выберем из двух корней тот, который удовлетворяет определению &amp;lt;tex&amp;gt;G(z)&amp;lt;/tex&amp;gt; как производящей функции чисел Каталана.&lt;br /&gt;
&lt;br /&gt;
Домножая обе части на &amp;lt;tex&amp;gt;2z&amp;lt;/tex&amp;gt;, получаем &amp;lt;tex&amp;gt;G(z) \cdot 2z = 1 \pm \sqrt{1-4z} ~~~~~\textbf{(3)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выберем нужный из двух корней, посчитав значение обеих частей при &amp;lt;tex&amp;gt;z = 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Из определения производящей функции для чисел Каталана известно, что &amp;lt;tex&amp;gt;G(z) = C_0 + C_1 \cdot x + \ldots + C_n \cdot x^n + \ldots&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;G(0) = C_0 = 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;tex&amp;gt;z = 0&amp;lt;/tex&amp;gt; выражение &amp;lt;tex&amp;gt;\textbf{(3)}&amp;lt;/tex&amp;gt; принимает вид &amp;lt;tex&amp;gt;G(0) \cdot 2 \cdot 0 = 1 \pm \sqrt{1-4 \cdot 0}&amp;lt;/tex&amp;gt;, или &amp;lt;tex&amp;gt;0 = 1 \pm 1&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;z = 0&amp;lt;/tex&amp;gt; левая и правая части были равны.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;G(z) = \dfrac{1 - \sqrt{1-4z}}{2z}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверим, что &amp;lt;tex&amp;gt;G(z)&amp;lt;/tex&amp;gt; действительно является производящей функцией чисел Каталана. Для этого разложим &amp;lt;tex&amp;gt;G(z)&amp;lt;/tex&amp;gt; в ряд.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;G(z) = \dfrac{1 - \sqrt{1-4z}}{2z} = \dfrac{1}{2z} - \dfrac{\sqrt{1-4z}}{2z} = \dfrac{1}{2z} - \dfrac{1}{2z} \cdot \sqrt{1 - 4z} = \dfrac{1}{2z} - \dfrac{1}{2z} \cdot (1 - 4z)^{\frac{1}{2}} = \dfrac{1}{2z} - \dfrac{1}{2z} \cdot \sum\limits_{n = 0}^{\infty} ((-4z)^n \cdot \dbinom{\frac{1}{2}}{n})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; = \dfrac{1}{2z} - \dfrac{1}{2z} \cdot \sum\limits_{n = 0}^{\infty} ((-4z)^n \cdot \dfrac{(-1)^{n - 1}}{(2n - 1) \cdot 4^n} \cdot \dbinom{2n}{n}) = \dfrac{1}{2z} - \dfrac{1}{2z} \cdot \sum\limits_{n = 0}^{\infty} (\dfrac{(-1)^n \cdot 4^n \cdot z^n \cdot (-1)^{n - 1}}{(2n - 1) \cdot 4^n} \cdot \dbinom{2n}{n}) = \dfrac{1}{2z} - \dfrac{1}{2z} \cdot \sum\limits_{n = 0}^{\infty} (\dfrac{(-1)^{2n - 1} \cdot 4^n \cdot z^n}{(2n - 1) \cdot 4^n} \cdot \dbinom{2n}{n})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; = \dfrac{1}{2z} - \dfrac{1}{2z} \cdot \sum\limits_{n = 0}^{\infty} (\dfrac{-z^n}{(2n - 1)} \cdot \dbinom{2n}{n}) = \dfrac{1}{2z} - \dfrac{1}{2z} \cdot \dfrac{-z^0}{2 \cdot 0 - 1} \cdot \dbinom{2 \cdot 0}{0} - \dfrac{1}{2z} \cdot \sum\limits_{n = 1}^{\infty} (\dfrac{-z^n}{(2n - 1)} \cdot \dbinom{2n}{n})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;= \dfrac{1}{2z} - \dfrac{1}{2z} \cdot \dfrac{-1}{-1} \cdot 1- \dfrac{1}{2z} \cdot \sum\limits_{n = 1}^{\infty} (\dfrac{-z^n}{(2n - 1)} \cdot \dbinom{2n}{n}) = \dfrac{1}{2z} - \dfrac{1}{2z} - \dfrac{1}{2z} \cdot \sum\limits_{n = 1}^{\infty} (\dfrac{-z^n}{(2n - 1)} \cdot \dbinom{2n}{n}) = \dfrac{1}{2z} \cdot \sum\limits_{n = 1}^{\infty} (\dfrac{z^n}{(2n - 1)} \cdot \dbinom{2n}{n})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; = \sum\limits_{n = 1}^{\infty} (\dfrac{z^{n - 1}}{(4n - 2)} \cdot \dbinom{2n}{n})  = \sum\limits_{n = 0}^{\infty} (\dfrac{z^{n}}{(4n + 2)} \cdot \dbinom{2n + 2}{n + 1}) = \sum\limits_{n = 0}^{\infty} (\dfrac{z^{n}}{(4n + 2)} \cdot \dbinom{2n + 2}{n + 1}) = \sum\limits_{n = 0}^{\infty} (\dfrac{z^{n}}{(4n + 2)} \cdot \dfrac{(2n + 2)!}{(n + 1)! \cdot (n + 1)!}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; = \sum\limits_{n = 0}^{\infty} (\dfrac{z^{n}}{(4n + 2)} \cdot \dfrac{(2n)! \cdot (2n + 1) \cdot 2 \cdot (n + 1)}{(n)! \cdot (n)! \cdot (n + 1) \cdot (n + 1)}) = \sum\limits_{n = 0}^{\infty} (\dfrac{z^{n}}{(4n + 2)} \cdot \dfrac{2 \cdot (2n + 1)}{n + 1} \cdot \dbinom{2n}{n}) = \sum\limits_{n = 0}^{\infty} (\dfrac{z^{n}}{(4n + 2)} \cdot \dfrac{(4n + 2)}{n + 1} \cdot \dbinom{2n}{n})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;= \sum\limits_{n = 0}^{\infty} (\dfrac{z^{n}}{(4n + 2)} \cdot \dfrac{2 \cdot (2n + 1)}{n + 1} \cdot \dbinom{2n}{n}) = \sum\limits_{n = 0}^{\infty} (z^n \cdot \dfrac{1}{n + 1} \cdot \dbinom{2n}{n})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда коэффициент при &amp;lt;tex&amp;gt;z^n&amp;lt;/tex&amp;gt; в разложении &amp;lt;tex&amp;gt;G(z)&amp;lt;/tex&amp;gt; равен &amp;lt;tex&amp;gt;\dfrac{1}{n + 1} \cdot \dbinom{2n}{n}&amp;lt;/tex&amp;gt;, что совпадает с аналитической формулой для чисел Каталана. (&amp;lt;tex&amp;gt;C_n = \dfrac{1}{n + 1} \cdot \dbinom{2n}{n}&amp;lt;/tex&amp;gt;) Поэтому &amp;lt;tex&amp;gt;G(z) = \sum\limits_{n = 0}^{\infty} z^n \cdot C_n&amp;lt;/tex&amp;gt;, поэтому &amp;lt;tex&amp;gt;G(z) = \dfrac{1 - \sqrt{1-4z}}{2z}&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;
*[[Числа_Эйлера_I_и_II_рода|Числа Эйлера первого и второго рода]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
*[http://e-maxx.ru/algo/catalan_numbers MAXimal :: algo :: Числа Каталана]&lt;br /&gt;
&lt;br /&gt;
*[http://habrahabr.ru/post/165295/ Числа Каталана / Хабрахабр]&lt;br /&gt;
&lt;br /&gt;
*[https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%B0_%D0%9A%D0%B0%D1%82%D0%B0%D0%BB%D0%B0%D0%BD%D0%B0 Википедия — Числа Каталана]&lt;br /&gt;
&lt;br /&gt;
*[http://kvant.mccme.ru/1978/07/chisla_katalana.htm Журнал &amp;quot;Квант&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
*[http://desolt.ru/karimova.html Глава 5. Комбинаторика]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Комбинаторика ]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D1%80%D0%B5%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%B8&amp;diff=82975</id>
		<title>Обучение в реальном времени</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D1%80%D0%B5%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%B8&amp;diff=82975"/>
				<updated>2022-09-01T03:59:37Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Обучение в реальном времени, онлайн-обучение''' (англ. ''online machine learning'') {{---}} вид машинного обучения, при котором данные поступают в последовательном порядке и используются для обновления лучшего предсказания на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
[[Файл:BatchVsOnline.PNG|420px|thumb|right|Разница между пакетным и онлайн-обучением]]&lt;br /&gt;
&lt;br /&gt;
== Общая информация ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:OnlineLearningTaxonomy.PNG|420px|thumb|right|Классификация методов онлайн-обучения]]&lt;br /&gt;
&lt;br /&gt;
Алгоритмы пакетного обучения обладают рядом критических недостатков из-за необходимости обучать модель с нуля при получении новых данных: низкая эффективность по времени и памяти, плохая масштабируемость для крупных систем. Онлайн-обучение решает эти проблемы, поскольку модель обновляется на основе поступающих в каждый момент времени данных. Благодаря этому алгоритмы онлайн-обучения гораздо более эффективны в приложениях, где данные не только имеют большой размер, но и поступают с высокой скоростью.&lt;br /&gt;
&lt;br /&gt;
При онлайн-обучении для построения модели необходим один проход по данным, что позволяет не сохранять их для последующего доступа в процессе обучения и использовать меньший объем памяти. Обработка одного объекта за раз также значительно упрощает реализацию алгоритма онлайн-обучения. Однако изменение вида входных данных, выход сервера из строя и многие другие причины могут привести к некорректной работе системы. Оценить качество работы системы при онлайн-обучении сложнее, чем при пакетном: нет возможности получить репрезентативный тестовый набор данных.&lt;br /&gt;
&lt;br /&gt;
В зависимости от типа обратной связи существующие методы онлайн-обучения можно разделить на три группы:&lt;br /&gt;
&lt;br /&gt;
* Онлайн-обучение с учителем (англ. ''supervised online learning'')&lt;br /&gt;
* Онлайн-обучение с частичным привлечением учителя (англ. ''online learning with limited feedback'')&lt;br /&gt;
* Онлайн-обучение без учителя (англ. ''unsupervised online learning'')&lt;br /&gt;
&lt;br /&gt;
== Математическая основа ==&lt;br /&gt;
&lt;br /&gt;
=== Функция ожидаемого риска (англ. Expected Risk Function) ===&lt;br /&gt;
&lt;br /&gt;
Цель системы обучения состоит в поиске минимума функции &amp;lt;tex&amp;gt;J(w)&amp;lt;/tex&amp;gt;, называемой функцией ожидаемого риска. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;J(w) \stackrel{\triangle}{=} E_z\ Q(z,w) \stackrel{\triangle}{=}  \int Q(z,w)\,\mathrm{d}P(z) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переменная минимизации &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; предназначена для представления части системы обучения, которая должна быть адаптирована в качестве реакции на наблюдение событий &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt;, происходящих в реальном мире. Функция потерь &amp;lt;tex&amp;gt;Q(z, w)&amp;lt;/tex&amp;gt; измеряет производительность системы обучения с параметром &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; при обстоятельствах, описанных событием &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
События &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt; моделируются как случайные независимые наблюдения, взятые из неизвестного распределения вероятности &amp;lt;tex&amp;gt;\mathrm{d}P(z)&amp;lt;/tex&amp;gt;. Функция риска &amp;lt;tex&amp;gt;J(w)&amp;lt;/tex&amp;gt; - это ожидание функции потерь &amp;lt;tex&amp;gt;Q(z, w)&amp;lt;/tex&amp;gt; для фиксированного значения параметра &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Функция ожидаемого риска &amp;lt;tex&amp;gt;J(w)&amp;lt;/tex&amp;gt; не может быть минимизирована напрямую, потому что распределение &amp;lt;tex&amp;gt;\mathrm{d}P(z)&amp;lt;/tex&amp;gt; неизвестно. Однако возможно вычислить приближение &amp;lt;tex&amp;gt;J(w)&amp;lt;/tex&amp;gt;, используя конечный обучающий набор независимых наблюдений &amp;lt;tex&amp;gt;z_1, ... , z_L&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; J (w) \thickapprox \hat{J_L}(w)   \stackrel{\triangle}{=} \frac{1}{L} \sum_{n=1}^L Q(z_n,w) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Пакетный градиентный спуск (англ. Batch Gradient Descent) === &lt;br /&gt;
&lt;br /&gt;
[[Файл:BatchGradientDescent.PNG|420px|thumb|right|Пакетный градиентный спуск]]&lt;br /&gt;
&lt;br /&gt;
Минимизировать эмпирический риск &amp;lt;tex&amp;gt;\hat{J_L}(w)&amp;lt;/tex&amp;gt; можно с помощью алгоритма пакетного градиентного спуска. Последовательные оценки &amp;lt;tex&amp;gt;w_t&amp;lt;/tex&amp;gt; оптимального параметра вычисляются по следующей формуле, где &amp;lt;tex&amp;gt;\gamma_t&amp;lt;/tex&amp;gt; - положительное число:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; w_{t+1} = w_t -  \gamma_t \bigtriangledown_w  \hat{J_L}(w_t) = w_t - \gamma_t\ \frac{1}{L} \sum_{i=1}^L \bigtriangledown_w\ Q(z_i,w_t)\ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Когда скорость обучения &amp;lt;tex&amp;gt;\gamma_t&amp;lt;/tex&amp;gt; достаточно мала, алгоритм сходится к локальному минимуму эмпирического риска &amp;lt;tex&amp;gt;\hat{J_L}(w)&amp;lt;/tex&amp;gt;. Значительное ускорение сходимости может быть достигнуто путем замены скорости обучения &amp;lt;tex&amp;gt;\gamma_t&amp;lt;/tex&amp;gt; подходящей положительно определенной матрицей.&lt;br /&gt;
&lt;br /&gt;
Каждая итерация алгоритма пакетного градиентного спуска включает в себя вычисление среднего значения градиентов функции потерь &amp;lt;tex&amp;gt;\bigtriangledown_w Q(z_n,w)&amp;lt;/tex&amp;gt; по всей обучающей выборке. Для хранения достаточно большой обучающей выборки и вычисления этого среднего должны быть выделены значительные вычислительные ресурсы и память.&lt;br /&gt;
&lt;br /&gt;
=== Градиентный спуск в реальном времени (англ. Online Gradient Descent) ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:OnlineGradientDescent.PNG|420px|thumb|right|Градиентный спуск в реальном времени]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм градиентного спуска в реальном времени получается при удалении операции усреднения в алгоритме пакетного градиентного спуска. Вместо усреднения градиента потерь по всей обучающей выборке каждая итерация градиентного спуска в реальном времени состоит из случайного выбора примера &amp;lt;tex&amp;gt;z_t&amp;lt;/tex&amp;gt; и обновления параметра &amp;lt;tex&amp;gt;w_t&amp;lt;/tex&amp;gt; в соответствии со следующей формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; w_{t+1} = w_t -  \gamma_t  \bigtriangledown_w Q(z_t, w_t) \ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Усреднение этого обновления по всем возможным вариантам обучающего примера &amp;lt;tex&amp;gt;z_t&amp;lt;/tex&amp;gt; позволяет восстановить алгоритм пакетного градиентного спуска. Упрощение градиентного спуска в реальном времени основано на предположении, что случайный шум, вносимый этой процедурой, не будет мешать усредненному поведению алгоритма. Эмпирические данные подтверждают это предположение.&lt;br /&gt;
&lt;br /&gt;
Градиентный спуск в реальном времени также может быть описан без использования обучающей выборки, используя события из реального мира напрямую. Такая формулировка подходит для описания адаптивных алгоритмов, обрабатывающих поступающее наблюдение и одновременно обучающихся работать лучше. Такие адаптивные алгоритмы наиболее полезны для отслеживания явлений, развивающихся во времени.&lt;br /&gt;
&lt;br /&gt;
Общий алгоритм градиентного спуска в реальном времени используется для минимизации следующей функции стоимости &amp;lt;tex&amp;gt;C(w)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; C(w) \stackrel{\triangle}{=} E_z Q(z,w) \stackrel{\triangle}{=}  \int Q(z, w)\,\mathrm{d}P(z)\  &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждая итерация этого алгоритма состоит из извлечения события &amp;lt;tex&amp;gt;z_t&amp;lt;/tex&amp;gt; из распределения &amp;lt;tex&amp;gt;\mathrm{d}P(z)&amp;lt;/tex&amp;gt; и применения следующей формулы обновления, где &amp;lt;tex&amp;gt;\gamma_t&amp;lt;/tex&amp;gt; - либо положительное число, либо положительно определенная матрица:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; w_{t+1} = w_t -  \gamma_t H(z_t, w_t) \ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;H(z, w)&amp;lt;/tex&amp;gt; удовлетворяет следующему условию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; E_z   H(z, w) = \bigtriangledown_w C(w)  \ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Примеры ==&lt;br /&gt;
&lt;br /&gt;
=== Adaline ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Adaline.PNG|420px|thumb|right|Adaline]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм обучения Adaline подбирает параметры одного порогового элемента. Входные данные &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; распознаются как класс &amp;lt;tex&amp;gt;y = +1&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;y = −1&amp;lt;/tex&amp;gt; в зависимости от знака &amp;lt;tex&amp;gt;w' x + \beta&amp;lt;/tex&amp;gt;. Целесообразно рассмотреть расширенный набор входных данных &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, содержащий дополнительный постоянный коэффициент, равный 1. Смещение &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt; тогда представляется как дополнительный коэффициент в векторе параметров &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;. Тогда вывод порогового элемента имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\hat{y_w}(x) \stackrel{\triangle}{=} sign(w' x) =  sign  \sum_{i} w_i x_i \ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; корректируется после использования дельта-правила:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w_{t+1} = w_t\ + \gamma_t(y_t - w'_t x_t) x_t \ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Дельта-правило - это итерация алгоритма градиентного спуска в реальном времени со следующей функцией потерь, где &amp;lt;tex&amp;gt;z = (x, y)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Q_{adaline}(z, w)  \stackrel{\triangle}{=} (y - w'x)^2\ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Многослойные сети (англ. Multi-Layer Networks)===&lt;br /&gt;
&lt;br /&gt;
Многослойные сети были разработаны для преодоления вычислительных ограничений пороговых элементов. Произвольные двоичные отображения могут быть реализованы путем объединения нескольких слоев пороговых элементов, при этом каждый слой использует выходные данные элементов предыдущих слоев в качестве входных данных.&lt;br /&gt;
&lt;br /&gt;
Разрыв порогового элемента может быть представлен плавным нелинейным приближением:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;sign(w'x) \thickapprox tanh (w' x) \ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование таких сигмоидальных элементов не уменьшает вычислительные возможности многослойной сети.&lt;br /&gt;
&lt;br /&gt;
Многослойная сеть сигмоидальных элементов реализует дифференцируемую функцию &amp;lt;tex&amp;gt;f(x, w)&amp;lt;/tex&amp;gt; от входных данных &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и параметров &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;. Алгоритм обратного распространения ошибки обеспечивает эффективный способ вычисления градиентов функции среднего квадрата потерь.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Q_{mse}(z, w)  =  \frac{1}{2}(y - f(x, w))^2 \ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== K-Means ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:KMeansOnline.PNG|420px|thumb|right|K-Means]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм K-Means можно получить, выполнив градиентный спуск в реальном времени со следующей функцией потерь:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Q_{kmeans}(x, w)  \stackrel{\triangle}{=} \stackrel{K}{\min_{k = 1}}(x - w(k))^2\ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта функция потерь измеряет ошибку в положении точки &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, когда мы заменяем ее ближайшим центроидом, и удовлетворяет следующему условию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \forall z, \forall \upsilon \in \vartheta (w),  \mid  Q(z, \upsilon) - Q(z, w)\mid  \le  \mid w - \upsilon \mid \Phi(z, w)  \ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поэтому можно игнорировать недифференцируемые точки и применять алгоритм градиентного спуска в реальном времени.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; w_{t+1}^- = w_t^-  +  \gamma_t(x_t - w_t) \ &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;
* [https://arxiv.org/pdf/1802.02871.pdf Steven C. H. Hoi, Doyen Sahoo, Jing Lu, and Peilin Zhao. Online Learning: A Comprehensive Survey. 2018]&lt;br /&gt;
* [https://leon.bottou.org/publications/pdf/online-1998.pdf Leon Bottou. Online Learning and Stochastic Approximations. 1998]&lt;br /&gt;
* [https://www.analyticsvidhya.com/blog/2015/01/introduction-online-machine-learning-simplified-2/ Introduction to Online Machine Learning: Simplified]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Виды обучения]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BE%D0%BD%D1%81%D0%B5%D0%BD%D1%81%D1%83%D1%81_%D0%B2_%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0%D1%85&amp;diff=82974</id>
		<title>Консенсус в синхронных системах</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BE%D0%BD%D1%81%D0%B5%D0%BD%D1%81%D1%83%D1%81_%D0%B2_%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0%D1%85&amp;diff=82974"/>
				<updated>2022-09-01T03:59:32Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Параллельное программирование]]&lt;br /&gt;
Как известно из [[Теорема Фишера-Линча-Патерсона (FLP)|FLP]], при всех требованиях консенсус невозможен. Уберем требование асинхронности (любое сообщение доходит за некоторое конечное время).&lt;br /&gt;
&lt;br /&gt;
Пусть в системе имеется ''n'' узлов, каждому задано начальное число.&lt;br /&gt;
Пусть из них максимум ''f'' могут в любой момент упасть навсегда (crash), &amp;quot;воскрешения&amp;quot; не разрешены.&lt;br /&gt;
Тогда [[Консенсус в распределённой системе#Решение при отсутствии отказов|базовый алгоритм]] всё ещё не работает, хотя мы и можем &amp;quot;дождаться всех сообщений&amp;quot;:&lt;br /&gt;
узел может отказать в процессе рассылки предложений: кому-то послал, а кому-то не успел.&lt;br /&gt;
&lt;br /&gt;
Но можно решить задачу консенсуса за ''f+1'' фазу (секция 15.4.1 на странице 240 в Garg):&lt;br /&gt;
&lt;br /&gt;
*Делаем в каждом узле множество из ''n'' значений (своё записываем, остальные пока неизвестны)&lt;br /&gt;
*В каждом раунде каждый узел посылает каждому все свои числа (или только те, которые не посылал ранее - без разницы)&lt;br /&gt;
*Процессы записывают пришедшие числа в свой вектор&lt;br /&gt;
*После ''f+1'' - го раунда выбираем минимум из известных чисел.&lt;br /&gt;
&lt;br /&gt;
Докажем, что в конце у всех неотказавших процессов будут одинаковые множества значений.&lt;br /&gt;
Если мы на каждом шаге рассылаем вообще всё множество, то это просто: у нас по принципу Дирихле есть раунд без ошибок, в нём все друг другу всё рассказали, а дальше множества уже не меняются.&lt;br /&gt;
&lt;br /&gt;
А если рассылаем только новые данные, то интереснее (см. Garg; на лекции вроде не было).&lt;br /&gt;
Пусть у неотказавшего процесса $P_i$ после раунда $f+1$ есть значение $x$.&lt;br /&gt;
Тогда если он его получил в раунде $f$ или меньшем, то в раунде $f+1$ он разошлёт его всем остальным и все неотказавшие его успешно получат.&lt;br /&gt;
Более интересный случай: процесс $P_i$ получил значение $x$ только в раунде $f+1$, а в предыдущих $f$ не получал.&lt;br /&gt;
Предположим, что есть процесс $P_j$, который так и не получил значение $x$ к раунду $f+1$.&lt;br /&gt;
Тогда у нас имеется $f+1$ процесс, которые по очереди отказывали на предыдущих шагах, успевая передать друг другу $x$, но не успевая передать их $P_i$ или $P_j$.&lt;br /&gt;
И только $(f+1)$-й отказавший процессор смог передать $P_i$, но не $P_j$.&lt;br /&gt;
Но у нас всего максимум $f$ отказов, противоречие.&lt;br /&gt;
&lt;br /&gt;
Итого нам требуется $O((f + 1)N^2)$ сообщений на консенсус.&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B4%D0%B5%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=82973</id>
		<title>Недетерминированные вычисления</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B4%D0%B5%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=82973"/>
				<updated>2022-09-01T03:59:26Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''Недетерминированная машина Тьюринга''' (НМТ) — машина Тьюринга, управляющее устройство которой представляет собой [[Недетерминированные_конечные_автоматы | недетерминированный конечный автомат]], то есть из каждого состояния может быть несколько переходов по одному и тому же символу на входной ленте.&lt;br /&gt;
}}&lt;br /&gt;
Такая машина допускает слово, если существует последовательность переходов, переводящая машину в допускающее состояние. В связи с этим есть несколько вариантов представления работы НМТ:&lt;br /&gt;
#Можно считать, что машина «очень удачлива», то есть если есть способ попасть в допускающее состояние, то машина всегда делает верный выбор пути.&lt;br /&gt;
#Если есть несколько вариантов пути, то машина делится на копии, каждая из которых следует по одному из возможных переходов. Слово считается допущенным, если его допускает хотя бы одна из копий.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для записи недетерминированных программ используется специальный оператор. &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Оператор &amp;lt;tex&amp;gt;\leftarrow?&amp;lt;/tex&amp;gt; — '''недетерминированный выбор (недетерминированное присваивание)'''. Запись &amp;lt;tex&amp;gt;x\leftarrow?A&amp;lt;/tex&amp;gt; означает, что переменной &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; недетерминированно присваивается некоторое значение из множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Не следует связывать недетерминированный выбор с вероятностями. Программа как бы присваивает переменной все возможные значения одновременно.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''Недетерминированная программа''' — программа, в которой допускается использование недетерминированного выбора.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''Язык недетерминированной программы''' — множество слов, для которых существует такая последовательность недетерминированных выборов, что программа допустит это слово.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Классы NTIME и NSPACE ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&amp;lt;tex&amp;gt;\mathrm{NTIME}(f(n))&amp;lt;/tex&amp;gt; — множество языков, для которых существует недетерминированная распознающая программа, время работы которой на входе длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;O(f(n))&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{NSPACE}(f(n))&amp;lt;/tex&amp;gt; — множество языков, для которых существует такая недетерминированная распознающая программа, что на любом входе длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; ей требуется &amp;lt;tex&amp;gt;O(f(n))&amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Классы NP и Σ₁]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D0%B0_%D0%A3%D0%B8%D1%82%D0%BD%D0%B8&amp;diff=82972</id>
		<title>Формула Уитни</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D0%B0_%D0%A3%D0%B8%D1%82%D0%BD%D0%B8&amp;diff=82972"/>
				<updated>2022-09-01T03:59:20Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
Уитни&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; — обыкновенный &amp;lt;tex&amp;gt;(n, m)&amp;lt;/tex&amp;gt;-граф. Тогда коэффициент при &amp;lt;tex&amp;gt;x^i&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;1\leqslant i\leqslant n&amp;lt;/tex&amp;gt; в [[Хроматический многочлен|хроматическом многочлене]] &amp;lt;tex&amp;gt;P(G, x)&amp;lt;/tex&amp;gt; равен &amp;lt;tex&amp;gt;\sum \limits_{j=0}^{m}{(-1)^jN(i, j)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;N(i, j)&amp;lt;/tex&amp;gt; — число остовных подграфов графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, имеющих &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; компонент связности и &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; рёбер, т.е. &amp;lt;tex&amp;gt;P(G, x) = \sum \limits_{i=1}^{n}{\bigg(\sum \limits_{j=0}^{m}{(-1)^jN(i, j)\bigg)x^i}}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; — некоторый набор из &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; красок. Отображение &amp;lt;tex&amp;gt;\varphi&amp;lt;/tex&amp;gt; из множества вершин  &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;, не являющееся раскраской графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, будем называть его ''несобственной'' раскраской. То есть, для того, чтобы отображение было несобственной раскраской, цвет концов хотя бы одного ребра должен совпадать. ''Собственной'' раскраской будем называть раскраску графа. Всего собственных и несобственных &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;-раскрасок графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; — &amp;lt;tex&amp;gt;x^n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возьмём некоторую собственную или несобственную раскраску графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Удалим из графа каждое ребро, концы которого раскрашены в разный цвет. Получим остовный подграф &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;, в котором каждое ребро соединяет вершины одинакового цвета. Исходную собственную или несобственную раскраску будем называть ''строго несобственной'' раскраской остовного подграфа &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;. Каждой компоненте связности графа &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; соответствует точно один цвет — цвет её вершин. Если остовный подграф &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; имеет &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; компонент связности, то существует &amp;lt;tex&amp;gt;x^i&amp;lt;/tex&amp;gt; различных строго несобственных раскрасок, отвечающих остовному подграфу &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;Каждая собственная или несобственная раскраска графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; является строго несобственной раскраской его остовного подграфа. Собственным раскраскам графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; отвечает нулевой остовный подграф.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;N(i, j)&amp;lt;/tex&amp;gt; — число остовных подграфов графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, имеющих &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; компонент связности и &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; рёбер.&lt;br /&gt;
&lt;br /&gt;
Из общего числа &amp;lt;tex&amp;gt;x^n&amp;lt;/tex&amp;gt; собственных и несобственных раскрасок вычтем число строго несобственных раскрасок остовных подграфов, имеющих ровно одно ребро. Если мы вычтем сумму &amp;lt;tex&amp;gt; \sum \limits_{i}{N(i, 1)x^i} &amp;lt;/tex&amp;gt;, то мы вычтем помимо указанного числа ещё и некоторую избыточную величину. Действительно, рассмотрим два различных ребра графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;e_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e_2&amp;lt;/tex&amp;gt;. В число строго несобственных раскрасок остовного подграфа, содержащего только ребро &amp;lt;tex&amp;gt;e_1&amp;lt;/tex&amp;gt; попадут раскраски, у которых концы &amp;lt;tex&amp;gt;e_2&amp;lt;/tex&amp;gt; имеют одинаковый цвет. То же самое верно и для остовного подграфа, содержащего только ребро &amp;lt;tex&amp;gt;e_2&amp;lt;/tex&amp;gt;. Получается, что мы дважды вычтем число строго несобственных раскрасок для остовного подграфа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, содержащего два ребра: &amp;lt;tex&amp;gt;e_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e_2&amp;lt;/tex&amp;gt;. Аналогично будет вычтено число строго несобственных раскрасок остовных подграфов с большим числом ребер.&lt;br /&gt;
&lt;br /&gt;
Попытаемся скомпенсировать двукратное вычитание добавлением &amp;lt;tex&amp;gt;\sum \limits_{i}{N(i, 2)x^i}&amp;lt;/tex&amp;gt;, однако при этом добавится излишек строго несобственных раскрасок для остовных подграфов с тремя, четырьмя и более ребрами. &lt;br /&gt;
Подобную конструкцию можно рассчитать по [[Формула включения-исключения|формуле включения-исключения]].   &lt;br /&gt;
Воспользуемся формулой и получим число собственных раскрасок графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Оно равно &amp;lt;tex&amp;gt;x^n - \sum \limits_{i}{N(i, 1)x^i} + \sum \limits_{i}{N(i, 2)x^i} - \sum \limits_{i}{N(i, 3)x^i} + ...&amp;lt;/tex&amp;gt;&amp;lt;br&amp;gt;Так как &amp;lt;tex&amp;gt;N(n, 0) = 1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;P(G, x) = \sum \limits_{j=0}^{m}{\sum \limits_{i=1}^{n}{(-1)^jN(i, j)x^i}} = \sum \limits_{i=1}^{n}{\sum \limits_{j=0}^{m}{(-1)^jN(i, j)x^i}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Формула Зыкова]]&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* Асанов М. О., Баранский В. А., Расин В. В. - Дискретная математика: Графы, матроиды, алгоритмы: Учебное пособие. 2-е изд., испр. и доп. - СПб.: Издательство &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>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D0%B4%D0%B5%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%85%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;diff=82971</id>
		<title>Идеальное хеширование</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D0%B4%D0%B5%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%85%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;diff=82971"/>
				<updated>2022-09-01T03:59:04Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Идеальная хеш-функция''' (англ. ''perfect hash function'') — [[Хеш-таблица#Хеширование|хеш-функция]], которая без [[Разрешение коллизий|коллизий]] отображает различные элементы из множества объектов на множество ключей за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; времени в худшем случае.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Основная идея ==&lt;br /&gt;
Идеальное хеширование используется в задачах со статическим множеством ключей (т.е. после того, как все ключи сохранены в таблице, их множество никогда не изменяется) для обеспечения хорошей асимптотики даже в худшем случае. При этом мы можем дополнительно хотеть, чтобы размер таблицы зависел от количества ключей линейно.&lt;br /&gt;
&lt;br /&gt;
В таком хешировании для доступа к данным потребуется лишь вычисление хеш-функций (одной или нескольких), что делает данный подход наибыстрейшим для доступа к статическим данным. Данная технология применяется в различных словарях и базах данных, в алгоритмах со статической (известной заранее) информацией.&lt;br /&gt;
&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;m&amp;lt;/tex&amp;gt; ячеек с использованием хеш-функции &amp;lt;tex&amp;gt;h(k) = ((a\cdot k+b) \bmod p) \bmod m&amp;lt;/tex&amp;gt;, случайно выбранной из [[Универсальное_семейство_хеш-функций | семейства универсальных хеш-функций]] &amp;lt;tex&amp;gt;H_{p,m}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; — простое число, превышающее &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Второй уровень ===&lt;br /&gt;
На данном уровне вместо создания списка ключей будем использовать вторичную хеш-таблицу &amp;lt;tex&amp;gt;S_j&amp;lt;/tex&amp;gt;, хранящую все ключи, хешированные функцией &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; в ячейку &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;, со своей функцией &amp;lt;tex&amp;gt;h_j(k)=((a_j\cdot k + b_j) \bmod p) \bmod m_j&amp;lt;/tex&amp;gt;, выбранной из множества &amp;lt;tex&amp;gt;H_{p,m_j}&amp;lt;/tex&amp;gt;. Путем точного выбора хеш-функции &amp;lt;tex&amp;gt;h_j&amp;lt;/tex&amp;gt; мы можем гарантировать отсутствие коллизий на этом уровне. Для этого требуется, чтобы размер &amp;lt;tex&amp;gt;m_j&amp;lt;/tex&amp;gt; хеш-таблицы &amp;lt;tex&amp;gt;S_j&amp;lt;/tex&amp;gt; был равен квадрату числа &amp;lt;tex&amp;gt;n_j&amp;lt;/tex&amp;gt; ключей, хешированных функцией &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; в ячейку &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Несмотря на квадратичную зависимость, ниже будет показано, что при корректном выборе хеш-функции первого уровня количество требуемой для хеш-таблицы памяти будет &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Теоретическое обоснование ==&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; ключей сохраняются в хеш-таблице размером &amp;lt;tex&amp;gt;m=n^2&amp;lt;/tex&amp;gt; c использованием хеш-функции &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;, случайно выбранной из [[Универсальное_семейство_хеш-функций | универсального множества хеш-функций]], то [[Математическое_ожидание_случайной_величины | математическое ожидание]] числа коллизий не превышает  &amp;lt;tex dpi=&amp;quot;180&amp;quot;&amp;gt;{1 \over 2}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Всего имеется &amp;lt;tex&amp;gt;\dbinom{n}{2}&amp;lt;/tex&amp;gt; пар ключей, которые могут вызвать коллизию. Если хеш-функция выбрана случайным образом из [[Универсальное_семейство_хеш-функций | универсального семейства хеш-функций]] &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;, то для каждой пары вероятность возникновения коллизии равна &amp;lt;tex dpi=&amp;quot;180&amp;quot;&amp;gt;{1 \over m}&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; — [[Дискретная_случайная_величина |случайная величина]], которая подсчитывает количество коллизий. Если &amp;lt;tex&amp;gt;m = n^2&amp;lt;/tex&amp;gt;, то [[Математическое_ожидание_случайной_величины | математическое ожидание]] числа коллизий равно&lt;br /&gt;
&amp;lt;tex&amp;gt;E[X] = &amp;lt;/tex&amp;gt; &amp;lt;tex dpi=&amp;quot;180&amp;quot;&amp;gt; \binom{n}{2} \cdot {1 \over n^2} = {n^2-n \over 2} \cdot {1 \over n^2} &amp;lt; {1 \over 2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Это является очень хорошим результатом, если хотя бы вспомнить на примере [[Хеш-таблица#Введение | парадокса дней рождения]] о том, что вероятность коллизий растет крайне быстро по сравнению с размером хеш-таблицы.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если мы сохраняем &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; ключей в хеш-таблице размеров &amp;lt;tex&amp;gt;m=n&amp;lt;/tex&amp;gt; c использованием хеш-функции &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;, выбираемой случайным образом из универсального множества хеш-функций, то &amp;lt;tex&amp;gt;E\left[\displaystyle \sum_{j=0}^{m-1} n_j^2 \right] &amp;lt; 2n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n_j&amp;lt;/tex&amp;gt; — количество ключей, хешированных в ячейку &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;E\left[\displaystyle \sum_{j=0}^{m-1} n_j^2 \right] =&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; E\left[ \displaystyle \sum_{j=0}^{m-1} (n_j + 2 \dbinom{n_j}{2})\right] = &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; E\left[ \displaystyle \sum_{j=0}^{m-1} n_j\right] + 2E\left[\displaystyle \sum_{j=0}^{m-1} \dbinom{n_j}{2}\right] = &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; E\left[n\right] + 2E\left[\displaystyle \sum_{j=0}^{m-1} \dbinom{n_j}{2}\right] = n + 2E\left[\displaystyle \sum_{j=0}^{m-1} \dbinom{n_j}{2} \right]&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первый переход в равенстве мы совершили благодаря формуле &amp;lt;tex&amp;gt;a^2 = a + 2\cdot\dbinom{a}{2}&amp;lt;/tex&amp;gt;. Далее мы воспользовались свойствами [[Математическое_ожидание_случайной_величины | математического ожидания]], в частности - линейности.&lt;br /&gt;
&lt;br /&gt;
Очевидно, что &amp;lt;tex&amp;gt;\displaystyle \sum_{j=0}^{m-1} \dbinom{n_j}{2}&amp;lt;/tex&amp;gt; - просто общее количество коллизий, поэтому по свойству универсального хеширования математическое ожидание значения этой суммы не превышает&lt;br /&gt;
&amp;lt;tex dpi=&amp;quot;180&amp;quot;&amp;gt;\binom{n}{2}{1 \over m} = {n(n-1) \over 2m} = {n-1 \over 2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
А так как &amp;lt;tex&amp;gt;m = n&amp;lt;/tex&amp;gt;, то&lt;br /&gt;
&amp;lt;tex&amp;gt;E\left[\displaystyle \sum_{j=0}^{m-1} n_j^2 \right] \leqslant &amp;lt;/tex&amp;gt; &amp;lt;tex dpi=&amp;quot;150&amp;quot;&amp;gt; n + 2 \cdot {n-1 \over 2} = 2n - 1 &amp;lt; 2n&amp;lt;/tex&amp;gt;, ч.т.д.&lt;br /&gt;
}}&lt;br /&gt;
Теперь выведем 2 следствия из этой теоремы.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если мы сохраняем &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; ключей в хеш-таблице размером &amp;lt;tex&amp;gt;m=n&amp;lt;/tex&amp;gt; с использованием хеш-функции &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;, выбираемой случайным образом из [[Универсальное_семейство_хеш-функций | универсального множества хеш-функций]], и устанавливаем размер каждой вторичной хеш-таблицы равным &amp;lt;tex&amp;gt;m_j=n_j^2&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(j=0,1,...,m-1)&amp;lt;/tex&amp;gt;, то математическое ожидание количества необходимой для вторичных хеш-таблиц в схеме идеального хеширования памяти не превышает &amp;lt;tex&amp;gt;2n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Поскольку &amp;lt;tex&amp;gt;m_j=n_j^2&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;j=0,1,...,m-1&amp;lt;/tex&amp;gt;, согласно предыдущей теореме:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E\left[\displaystyle \sum_{j=0}^{m-1} m_j \right] = E\left[\displaystyle \sum_{j=0}^{m-1} n_j^2 \right] &amp;lt; 2n&amp;lt;/tex&amp;gt;, ч.т.д.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если мы сохраняем &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; ключей в хеш-таблице размером &amp;lt;tex&amp;gt;m=n&amp;lt;/tex&amp;gt; с использованием хеш-функции &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;, выбираемой случайным образом из [[Универсальное_семейство_хеш-функций | универсального множества хеш-функций]], и устанавливаем размер каждой вторичной хеш-таблицы равным &amp;lt;tex&amp;gt;m_j=n_j^2&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(j=0,1,...,m-1)&amp;lt;/tex&amp;gt;, то вероятность того, что общее количество необходимой для вторичных хеш-таблиц памяти не менее &amp;lt;tex&amp;gt;4n&amp;lt;/tex&amp;gt;, меньше чем &amp;lt;tex dpi=&amp;quot;180&amp;quot;&amp;gt;{1 \over 2}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Применим [[Неравенство Маркова| неравенство Маркова]] &amp;lt;tex&amp;gt;P(X \geqslant t) \leqslant E[X]/t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;X=\displaystyle \sum_{j=0}^{m-1} m_j&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t=4n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;P \left \{\displaystyle \sum_{j=0}^{m-1} m_j \geqslant 4n \right \} \leqslant E\left[\displaystyle\sum_{j=0}^{m-1} mj\right]&amp;lt;/tex&amp;gt; &amp;lt;tex dpi=&amp;quot;150&amp;quot;&amp;gt; {1 \over 4n} &amp;lt; &amp;lt;/tex&amp;gt; &amp;lt;tex dpi=&amp;quot;150&amp;quot;&amp;gt;{2n \over 4n} = {1 \over 2}&amp;lt;/tex&amp;gt;, ч.т.д.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
* [[Хеширование]]&lt;br /&gt;
* [[Хеширование_кукушки|Хеширование кукушки]]&lt;br /&gt;
* [[Разрешение коллизий]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* Т. Кормен. «Алгоритмы. Построение и анализ» второе издание, Глава 11.5, стр. 308&lt;br /&gt;
* Д.Э. Кнут. «Искусство программирования: Сортировка и поиск&amp;quot; Том 3, Глава 6.4, стр. 563&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Perfect_hash_function Wikipedia — Perfect hash function]&lt;br /&gt;
* [http://www.cs.cmu.edu/afs/cs/academic/class/15451-s07/www/lecture_notes/lect0215.pdf Universal and Perfect Hashing]&lt;br /&gt;
* [http://nord.org.ua/static/course/algo_2009/lecture8.pdf Универсальное хэширование. Идеальное хэширование]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]] &lt;br /&gt;
[[Категория:Хеширование]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D1%86%D0%B5%D0%BD%D0%BA%D0%B0_%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B3%D0%B8%D0%BF%D0%B5%D1%80%D0%BE%D0%B1%D1%8A%D0%B5%D0%BC%D0%B0&amp;diff=82970</id>
		<title>Оценка сложности вычисления гиперобъема</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D1%86%D0%B5%D0%BD%D0%BA%D0%B0_%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B3%D0%B8%D0%BF%D0%B5%D1%80%D0%BE%D0%B1%D1%8A%D0%B5%D0%BC%D0%B0&amp;diff=82970"/>
				<updated>2022-09-01T03:58:58Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&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;d&amp;lt;/tex&amp;gt;-мерного пространства является [http://en.wikipedia.org/wiki/Sharp-P #P-трудной задачей], однако допускает эффективную аппроксимацию, а именно может быть аппроксимировано за&lt;br /&gt;
*полином от количества параметров,&lt;br /&gt;
*полином от количества решений,&lt;br /&gt;
*полином от качества аппроксимации.&lt;br /&gt;
&lt;br /&gt;
== #P-трудность задачи вычисления гиперобъема ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Задача #MON-CNF (Satisfability problem for monotone boolean formulas) — задача вычисления количества удовлетворяющих подстановок для монотонной булевой формулы, записанной в [[КНФ]] &amp;lt;tex&amp;gt;f = \bigwedge  \limits _{k=1}^n \bigvee_{i \in C_k} x_i&amp;lt;/tex&amp;gt;,&lt;br /&gt;
где все дизъюнкты &amp;lt;tex&amp;gt; C_k \subseteq {1,...,d}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement= Задача вычисления гиперобъема принадлежит классу #P-трудных задач&lt;br /&gt;
|proof= Суть доказательства состоит в сведении задачи #MON-CNF к задаче вычисления значения гиперобъема. Так как доказано&lt;br /&gt;
&amp;lt;ref&amp;gt;&lt;br /&gt;
 Roth D. On the hardness of approximate reasoning, Artif. Intell., 82: 273–302, 1996, http://cogcomp.cs.illinois.edu/papers/hardJ.pdf&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
, что #MON-CNF является #P-трудной, то это докажет теорему.&lt;br /&gt;
&lt;br /&gt;
Количество удовлетворяющих подстановок функции&lt;br /&gt;
&amp;lt;tex&amp;gt;f = \bigwedge  \limits _{k=1}^n \bigvee_{i \in C_k} x_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
меньше &amp;lt;tex&amp;gt;2^d&amp;lt;/tex&amp;gt; на количество удовлетворяющих подстановок ее отрицания&lt;br /&gt;
&amp;lt;tex&amp;gt; \overline{f} = \bigvee  \limits _{k=1}^n \bigwedge_{i \in C_k} \neg x_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
. Для упрощения вычислений далее будем работать с &amp;lt;tex&amp;gt;\overline{f}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого конъюнкта &amp;lt;tex&amp;gt;\bigwedge_{i \in C_k} \neg x_i&amp;lt;/tex&amp;gt; построим соответствующий ему гиперпараллелепипед&lt;br /&gt;
&amp;lt;tex&amp;gt;A_k = [0,a^k_1]\times...\times[0,a^k_d]&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
a^k_i = \begin{cases} &lt;br /&gt;
 1 &amp;amp; \text{if } i \in C_k \\&lt;br /&gt;
 2 &amp;amp; \text{otherwise}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим теперь &amp;lt;tex&amp;gt;A = \bigcup \limits _{k=1}^n A_k&amp;lt;/tex&amp;gt;. Заметим, что так как все вершины гиперпараллелепипедов &amp;lt;tex&amp;gt;A_i&amp;lt;/tex&amp;gt; лежат в точках с целочисленными координатами 0,1 или 2, то и &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; можно разбить на гиперкубы вида &amp;lt;tex&amp;gt;B_{x_1,...,x_d} = [x_1,x_1 + 1]\times ... \times [x_d, x_d + 1]&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;x_i \in \{0,1\}, i \in [d]&amp;lt;/tex&amp;gt; (то есть на гиперкубы со сторонами 1 с координатами ближайшей к началу координат вершины 0 или 1).&lt;br /&gt;
&lt;br /&gt;
Более того, из-за целочисленности вершин &amp;lt;tex&amp;gt;A_i&amp;lt;/tex&amp;gt;, каждый из этих гиперкубов лежит в хотя бы одном из &amp;lt;tex&amp;gt;A_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; B_{x_1,...,x_d} \subset \bigcup \limits _{k = 1}^n A_k \iff B_{x_1,...,x_d} \subset A_k \iff&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А значит из определения &amp;lt;tex&amp;gt;A_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \iff\exists a^k_i \geq x_i + 1 : i \in d  \iff&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\iff \forall i :  x_i = 1 \to  a^k_i = 2  \iff \forall i : x_i = 1 \to i \notin C_k  \iff (x_1,...,x_d) &amp;lt;/tex&amp;gt; удовлетворяет &amp;lt;tex&amp;gt;\bigwedge_{i \in C_k} \neg x_i&amp;lt;/tex&amp;gt; для некоторого &amp;lt;tex&amp;gt;k \iff (x_1,...,x_d)&amp;lt;/tex&amp;gt; удовлетворяет &amp;lt;tex&amp;gt;\overline{f}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что так как &amp;lt;tex&amp;gt;\mu (B_{x_1,...,x_d}) = 1 \to \mu (\bigcup \limits _{k=1}^n A_k )  = |\{(x_1,...,x_d) \in \{0,1\}^d| (x_1,...,x_d)&amp;lt;/tex&amp;gt; удовлетворяет &amp;lt;tex&amp;gt;\overline{f} \}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом произвели сведение, в значит задача вычисления гиперобъема принадлежит классу #P&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Эффективная аппроксимация нахождения значения гиперобъема==&lt;br /&gt;
Приведем псевдокод алгоритма для аппроксимации гиперобъема объединения тел. В алгоритме, приведенном в &lt;br /&gt;
&amp;lt;ref&amp;gt;&lt;br /&gt;
Bringmann K., Friedrich T. Approximating the volume of unions and intersections of high-dimensional geometric objects, ISAAC'2008, http://www.mpi-inf.mpg.de/~kbringma/paper/2008ISAAC_Volume.pdf&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
используются три оракула: &amp;lt;tt&amp;gt;PointQuery&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;VolumeQuery&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;SampleQuery&amp;lt;/tt&amp;gt;, каждый из которых ошибается с вероятностью &amp;lt;tex&amp;gt;\epsilon_p, \epsilon_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\epsilon_s&amp;lt;/tex&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Оракул&lt;br /&gt;
*&amp;lt;tt&amp;gt;PointQuery(x,B)&amp;lt;/tt&amp;gt; возвращает true, если точка &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; лежит внутри &amp;lt;tex&amp;gt; B&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tt&amp;gt;VolumeQuery(B)&amp;lt;/tt&amp;gt; возвращает объем заданного тела &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SampleQuery(B)&amp;lt;/tt&amp;gt; для заданного тела &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; возвращает произвольную его точку &amp;lt;tex&amp;gt;x \in B&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для данного алгоритма допускаются следующие ослабления этих оракулов:&lt;br /&gt;
*&amp;lt;tt&amp;gt;PointQuery(x,B)&amp;lt;/tt&amp;gt; возвращает true для всех точек из некоторого тела &amp;lt;tex&amp;gt; B' : \mu ((B' \backslash B) \cup (B \backslash B'))\leq \epsilon_p \mu(B)&amp;lt;/tex&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;VolumeQuery(B)&amp;lt;/tt&amp;gt; возвращает значение &amp;lt;tex&amp;gt;V' : (1-\epsilon_v)\mu(B) \leq V' \leq (1+\epsilon_v)\mu(B)&amp;lt;/tex&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;SampleQuery(B)&amp;lt;/tt&amp;gt; возвращает произвольную точку из тела &amp;lt;tex&amp;gt;B' : |f(x) - 1/\mu(B')| &amp;lt; \epsilon_s &amp;lt;/tex&amp;gt;&lt;br /&gt;
 M := 0; C := 0;&lt;br /&gt;
 &amp;lt;tex&amp;gt; \overline \epsilon := \frac{\epsilon - \epsilon_v}{1+ \epsilon_v} &amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt; \overline C := \frac{(1+\epsilon_s)(1+\epsilon_v)(1+\epsilon_p)}{(1-\epsilon_v)(1-\epsilon_p)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt; T := \frac{24 ln (2) (1 + \overline \epsilon) n}{\overline \epsilon^2 - 8 (\overline C - 1) n}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 for all &amp;lt;tex&amp;gt;B_i \in S&amp;lt;/tex&amp;gt; do&lt;br /&gt;
  compute &amp;lt;tex&amp;gt;V'_i&amp;lt;/tex&amp;gt; := VolumeQuery(&amp;lt;tex&amp;gt;B_i&amp;lt;/tex&amp;gt;)&lt;br /&gt;
 od&lt;br /&gt;
 &amp;lt;tex&amp;gt; V' := \sum\limits_{i = 1}^n V'_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
 while &amp;lt;tex&amp;gt;C \leq T&amp;lt;/tex&amp;gt; do&lt;br /&gt;
  choose &amp;lt;tex&amp;gt;i \in [n] &amp;lt;/tex&amp;gt; with probability &amp;lt;tex&amp;gt;\frac{V'_i}{V'}&amp;lt;/tex&amp;gt;&lt;br /&gt;
  x := SampleQuery(&amp;lt;tex&amp;gt;B_i&amp;lt;/tex&amp;gt;)&lt;br /&gt;
  repeat &lt;br /&gt;
   if (C &amp;gt; T) then return &amp;lt;tex&amp;gt;\frac {TV'}{nM} &amp;lt;/tex&amp;gt;&lt;br /&gt;
   choose random &amp;lt;tex&amp;gt;j \in [n]&amp;lt;/tex&amp;gt; uniformly&lt;br /&gt;
   C := C + 1&lt;br /&gt;
  until PointQuery (x, &amp;lt;tex&amp;gt;B_j&amp;lt;/tex&amp;gt;)&lt;br /&gt;
  M := M + 1&lt;br /&gt;
 od&lt;br /&gt;
 return &amp;lt;tex&amp;gt;\frac{TV'}{nM}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;O(n V(d)+M S(d)+ TP(d)) = O(n V(d) + T(S(d)+P(d)) )&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;V(d)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;S(d)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;P(d)&amp;lt;/tex&amp;gt; это оценка времени работы оракулов &amp;lt;tt&amp;gt;VolumeQuery&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;SampleQuery&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;PointQuery&amp;lt;/tt&amp;gt;, соответственно.&lt;br /&gt;
&lt;br /&gt;
Выберем &amp;lt;tex&amp;gt;\epsilon : \epsilon_s, \epsilon_p, \epsilon_v \leq \frac{\epsilon^2}{47n}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если все используемые тела являются гиперпараллелепипедами, то время работы каждого из оракулов составляет в точности &amp;lt;tex&amp;gt;O(d)&amp;lt;/tex&amp;gt;, таким образом алгоритм позволяет построить &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;-аппроксимацию гиперобъема с вероятностью &amp;lt;tex&amp;gt;\geq 3/4&amp;lt;/tex&amp;gt; за время &amp;lt;tex&amp;gt;O(\frac{nd}{\epsilon^2})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Qqqq&amp;diff=82969</id>
		<title>Qqqq</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Qqqq&amp;diff=82969"/>
				<updated>2022-09-01T03:58:52Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Удалить ==&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB%D1%8B_%D0%B0%D1%83%D1%82%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=82968</id>
		<title>Протоколы аутентификации</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB%D1%8B_%D0%B0%D1%83%D1%82%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=82968"/>
				<updated>2022-09-01T03:58:47Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Аутентификация''' — это метод, с помощью которого процесс удостоверяется в том, что его собеседник является именно тем, за кого он себя выдает.&lt;br /&gt;
&lt;br /&gt;
=Аутентификация, основанная на общем секретном ключе=&lt;br /&gt;
В нашем первом протоколе аутентификации мы предположим, что у Алисы и Боба есть общий секретный ключ &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;. Об этом секретном ключе можно договориться при личной встрече или по телефону, но в любом случае не по (незащищенной) сети.&lt;br /&gt;
&lt;br /&gt;
===Обозначения===&lt;br /&gt;
* &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; - Алиса&lt;br /&gt;
* &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; - Боб&lt;br /&gt;
* &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; - Труди&lt;br /&gt;
* &amp;lt;tex&amp;gt;R_i&amp;lt;/tex&amp;gt; - отклик &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Пример плохого алгоритма==&lt;br /&gt;
# Алиса посылает Бобу &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;R_A&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Боб услышал Алису и посылает ей &amp;lt;tex&amp;gt;R_B&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;K(R_A)&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Алиса посылает Бобу &amp;lt;tex&amp;gt;K(R_B)&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Алиса проверяет, что ответ Боба &amp;lt;tex&amp;gt;K(R_A)&amp;lt;/tex&amp;gt;, а Боб - ответ Алисы&lt;br /&gt;
&lt;br /&gt;
===Зеркальная атака===&lt;br /&gt;
Данный алгоритм уязвим к так называемой зеркальной атаке.&lt;br /&gt;
&lt;br /&gt;
# Труди пытается выдать себя за Алису посылает Бобу &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;R_T'&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Боб услышал Труди и посылает ей &amp;lt;tex&amp;gt;R_B&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;K(R_T')&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Труди нужно узнать &amp;lt;tex&amp;gt;K(R_B)&amp;lt;/tex&amp;gt;, но она не знает &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;. Для этого она создаёт второй сеанс и посылает Бобу &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;R_T = R_B&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Боб отвечает второму сеансу, отправив &amp;lt;tex&amp;gt;K(R_T)&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Теперь Труди знает &amp;lt;tex&amp;gt;K(R_B)&amp;lt;/tex&amp;gt;, так как &amp;lt;tex&amp;gt;R_T = R_B&amp;lt;/tex&amp;gt;, а значит &amp;lt;tex&amp;gt;K(R_T) = K(R_B)&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Труди закрывает второй сеанс и в первом отправляет Бобу в ответ &amp;lt;tex&amp;gt;K(R_B)&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Теперь Боб думает, что Труди это Алиса, так как она знает &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Пример хорошего алгоритма==&lt;br /&gt;
Читайте в Таненбауме (пятое издание) страница 876&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%83%D0%BC%D0%BC%D0%B0_%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D1%85_%D0%BA_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%8B%D0%BC&amp;diff=82967</id>
		<title>Сумма обратных к простым</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%83%D0%BC%D0%BC%D0%B0_%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D1%85_%D0%BA_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%8B%D0%BC&amp;diff=82967"/>
				<updated>2022-09-01T03:58:28Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{В разработке}}&lt;br /&gt;
&lt;br /&gt;
== Преобразование Абеля для &amp;lt;tex&amp;gt; \sum \limits_{i = 1}^{n} a_i b_i &amp;lt;/tex&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
== Теорема о &amp;lt;tex&amp;gt; \sum \frac {1}{p} = \log \log p + c + o(1) &amp;lt;/tex&amp;gt; ==&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D0%B8%D1%82%D0%BE%D0%B2%D1%8B%D0%B5_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=82966</id>
		<title>Битовые операции</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D0%B8%D1%82%D0%BE%D0%B2%D1%8B%D0%B5_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=82966"/>
				<updated>2022-09-01T03:58:22Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Это вводный текст, он довольно забавный, но зато понятен всем!&lt;br /&gt;
== Вводная часть ==&lt;br /&gt;
faafafdafd Владик и Адвокат были здесь&lt;br /&gt;
&lt;br /&gt;
== Базовые операции ==&lt;br /&gt;
dsfsdfsdfdsf&lt;br /&gt;
== Битовые трюки в алгоритмах ==&lt;br /&gt;
sdfsdfsfdsfds&lt;br /&gt;
==ссылки==&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D0%BE%D0%BC%D0%BE%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC_%D0%B3%D1%80%D1%83%D0%BF%D0%BF&amp;diff=82965</id>
		<title>Гомоморфизм групп</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D0%BE%D0%BC%D0%BE%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC_%D0%B3%D1%80%D1%83%D0%BF%D0%BF&amp;diff=82965"/>
				<updated>2022-09-01T03:58:12Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Отображение &amp;lt;tex&amp;gt;\phi:G_1 \rightarrow G_2&amp;lt;/tex&amp;gt; [[группа|группы]] &amp;lt;tex&amp;gt;\langle G_1, \cdot\rangle&amp;lt;/tex&amp;gt; в группу &amp;lt;tex&amp;gt;\langle G_2,\times\rangle&amp;lt;/tex&amp;gt; называется '''гомоморфизмом''', если оно сохраняет групповую структуру:&lt;br /&gt;
:&amp;lt;tex&amp;gt;\forall a,b\in G_1 : \phi(a\cdot b) = \phi(a)\times \phi(b)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
'''Обозначения:'''&lt;br /&gt;
&amp;lt;tex&amp;gt;e(G_i)&amp;lt;/tex&amp;gt; единица в &amp;lt;tex&amp;gt;G_i&amp;lt;/tex&amp;gt;-ой группе.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;\textrm{ker}\phi=\{x\in G_1\vert\phi(x)=e(G_2)\}&amp;lt;/tex&amp;gt; —  '''ядро гомоморфизма''' &amp;lt;tex&amp;gt;\phi:G_1\rightarrow G_2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;\textrm{im}\phi=\{y\in G_2\vert\exists x\in G_1:\phi(x)=y\}&amp;lt;/tex&amp;gt; — '''образ гомоморфизма''' &amp;lt;tex&amp;gt;\phi:G_1\rightarrow G_2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Примеры ==&lt;br /&gt;
* Возьмём отображение &amp;lt;tex&amp;gt; h \colon \mathbb{Z} \rightarrow \mathbb{Z}/3\mathbb{Z}&amp;lt;/tex&amp;gt;, определённое следующим образом: &amp;lt;tex&amp;gt; h(x) = x \bmod 3 &amp;lt;/tex&amp;gt;, {{---}} а в качестве бинарной операции возьмём сложение. Ядром такого гомоморфизма будут числа, кратные трём.&lt;br /&gt;
&lt;br /&gt;
== Свойства гомоморфизмов групп ==&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Гомоморфизм переводит нейтральный элемент в нейтральный (&amp;lt;tex&amp;gt;e_1\in G_1&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;e_2 \in G_2&amp;lt;/tex&amp;gt;).&lt;br /&gt;
|proof=&lt;br /&gt;
По определению гомоморфизма имеем:&lt;br /&gt;
:&amp;lt;tex&amp;gt;\phi(e_1)\times\phi(e_1) = \phi(e_1\cdot e_1)=\phi(e_1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Умножая с обеих сторон на обратный к &amp;lt;tex&amp;gt;\phi(e_1)&amp;lt;/tex&amp;gt; элемент, получим:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\phi(e_1) \times \phi(e_1) \times (\phi(e_1))^{-1} = \phi(e_1) \times (\phi(e_1))^{-1}&amp;lt;/tex&amp;gt;&lt;br /&gt;
:&amp;lt;tex&amp;gt;\phi(e_1) \times e_2 = \phi(e_1) = e_2&amp;lt;/tex&amp;gt;, что и требовалось доказать.&lt;br /&gt;
&lt;br /&gt;
Заметим, что доказательство опирается на существование обратного элемента, для [[Моноид | моноидов]] аналогичное утверждение неверно.&lt;br /&gt;
}}&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Гомоморфизм переводит обратный элемент в обратный: &amp;lt;tex&amp;gt;\phi(x)^{-1}=\phi(x^{-1})&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\phi(x)\times\phi(x^{-1})=\phi(x\cdot x^{-1})=e_2=\phi(x^{-1}\cdot x)=\phi(x^{-1})\times\phi(x)&amp;lt;/tex&amp;gt;&lt;br /&gt;
что вместе с единственностью обратного к &amp;lt;tex&amp;gt;\phi(x)&amp;lt;/tex&amp;gt; элемента означает &amp;lt;tex&amp;gt;\phi(x)^{-1}=\phi(x^{-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;
* [[wikipedia:Group_homomorphism | Wikipedia {{---}} Group homomorphism]]&lt;br /&gt;
* [http://www.millersville.edu/~bikenaga/abstract-algebra-1/group-maps/group-maps.html Homomorphism examples]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория групп]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=C%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_RMHC_%D0%B8_%D0%B3%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%BD%D0%B0_Royal_Road_Function&amp;diff=82964</id>
		<title>Cравнение RMHC и генетического алгоритма на Royal Road Function</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=C%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_RMHC_%D0%B8_%D0%B3%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%BD%D0%B0_Royal_Road_Function&amp;diff=82964"/>
				<updated>2022-09-01T03:57:59Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&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;
В данной статье рассмотрим вопрос о производительности двух алгоритмов: Random-mutation hill-climbing и генетического алгоритма. Для этого решим задачу поиска оптимальной строки для Royal Road Function. Проведем оценку времени работы каждого алгоритма и проверим полученные результаты экспериментально.&lt;br /&gt;
&lt;br /&gt;
== Royal Road Function ==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''Схема''' — частично определенная битовая строка &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, где '&amp;lt;tex&amp;gt;*&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;
''Порядок схемы'' &amp;lt;tex&amp;gt;c_i&amp;lt;/tex&amp;gt; — число определенных битов в схеме &amp;lt;tex&amp;gt;s_i&amp;lt;/tex&amp;gt;. &lt;br /&gt;
''Блок'' — подсхема. Набор блоков одинаковый длины формируют схему.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''Royal Road function''' &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — список схем &amp;lt;tex&amp;gt;(s_1, s_2,..,s_t)&amp;lt;/tex&amp;gt; одинаковой длины.&lt;br /&gt;
''Уровень'' — набор схем Royal Road function с одинаковым порядком.&lt;br /&gt;
''Экземпляр схемы'' — битовая строка &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, биты которой совпадает с определенными битами схемы &amp;lt;tex&amp;gt;s_i&amp;lt;/tex&amp;gt; в соответствующих позициях. Говорят, что &amp;lt;tex&amp;gt;x \in s_i &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''Функция приспособленности &amp;lt;tex&amp;gt;R(x)&amp;lt;/tex&amp;gt;''' &lt;br /&gt;
&amp;lt;tex&amp;gt;=\sum_{i=t}^{t} c_i \delta_i(x)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\delta_i(x)=\begin{cases}&lt;br /&gt;
1,&amp;amp;x \in s_i;\\&lt;br /&gt;
0,&amp;amp;x \notin s_i.\end{cases}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Пример Royal Road Function &amp;lt;tex&amp;gt;R_1&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;s_1=&amp;lt;/tex&amp;gt; 11111111******************************************************** ; &amp;lt;tex&amp;gt;c_1 = 8&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;s_2=&amp;lt;/tex&amp;gt; ********11111111************************************************ ; &amp;lt;tex&amp;gt;c_2 = 8&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;s_3=&amp;lt;/tex&amp;gt; ****************11111111**************************************** ; &amp;lt;tex&amp;gt;c_3 = 8&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;s_4=&amp;lt;/tex&amp;gt; ************************11111111******************************** ; &amp;lt;tex&amp;gt;c_4 = 8&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;s_5=&amp;lt;/tex&amp;gt; ********************************11111111************************ ; &amp;lt;tex&amp;gt;c_5 = 8&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;s_6=&amp;lt;/tex&amp;gt; ****************************************11111111**************** ; &amp;lt;tex&amp;gt;c_6 = 8&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;s_7=&amp;lt;/tex&amp;gt; ************************************************11111111******** ; &amp;lt;tex&amp;gt;c_7 = 8&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;s_8=&amp;lt;/tex&amp;gt; ********************************************************11111111 ; &amp;lt;tex&amp;gt;c_8 = 8&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;s_{opt}=&amp;lt;/tex&amp;gt; 11111111111111111111111111111111111111111111111111111111111111111 ;&lt;br /&gt;
&lt;br /&gt;
== Анализ RMHC и IGA ==&lt;br /&gt;
&lt;br /&gt;
=== The Building Block Hypothesis ===&lt;br /&gt;
&lt;br /&gt;
Согласно ''The Building Block Hypothesis''&amp;lt;ref&amp;gt; ''Holland J.'' [http://mitpress.mit.edu/journals/EVCO/Holland.pdf Building block, cohort genetic algorithms and hyperplane-defined functions. Evolutionary Computation.] &amp;lt;/ref&amp;gt; генетический алгоритм, скрещивающий экземпляры блоков в среднем выполняет поиск быстрее, чем алгоритм, скрещивающий экземпляры самих схем.&lt;br /&gt;
&lt;br /&gt;
=== Постановка задачи ===&lt;br /&gt;
&lt;br /&gt;
Оценим время поиска оптимальной строки для некоторой заданной Royal Road function &amp;lt;tex&amp;gt; R&amp;lt;/tex&amp;gt; со схемами, разложенными в &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; блоков длины &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;. Длина строки должна составлять &amp;lt;tex&amp;gt;L = NK&amp;lt;/tex&amp;gt;. Для поиска воспользуемся алгоритмами RMHC и IGA.&lt;br /&gt;
&lt;br /&gt;
=== RMHC (Random-mutation hill-climbing) ===&lt;br /&gt;
&lt;br /&gt;
==== Алгоритм ====&lt;br /&gt;
  1. Выбирается случайная строка и сохраняется как лучшая.&lt;br /&gt;
  2. Если строка является оптимум или если был достигнут установленный максимум для числа вычислений функции приспособленности — &lt;br /&gt;
  возвращается лучшая строка. В противном случае выполняется переход к следующему шагу.&lt;br /&gt;
  3. Выбирается бит для случайной мутации. Если мутация приводит к большему либо равному значению функции приспособленности, &lt;br /&gt;
  то полученная строка выбирается, как лучшая и выполняется переход к шагу 2.&lt;br /&gt;
&lt;br /&gt;
==== Оценка для RMHC  ====&lt;br /&gt;
&lt;br /&gt;
Обозначим время нахождения первого блока за &amp;lt;tex&amp;gt;E(K, 1)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;E(K, 1) \approx 2^K &amp;lt;/tex&amp;gt;&amp;lt;ref&amp;gt;&lt;br /&gt;
''Mitchell M., Holland J., Forrest S.''. [http://web.cecs.pdx.edu/~mm/nips93.pdf When Will a Genetic Algorithm Outperform Hill Climbing?]&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Время для обнаружения второго блока длиннее, так как тратиться время на тестирование мутаций как в первом,&lt;br /&gt;
так и во втором блоке. Число мутаций, которые происходят вне первого блока: &amp;lt;tex&amp;gt;(KN - K)&amp;lt;/tex&amp;gt;, значит время нахождения первого и второго блока: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(K, 2)=E(K, 1) + E(K, 1)[KN/(KN-K)]&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ожидаемое время поиска:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(K, N)=E(K, 1)+E(K, 1)\frac{N}{N-1}+...+E(K, 1)\frac{N}{N-(N-1)}=E(K, 1)N[1 + \frac{1}{2} + \frac{1}{3} + ... + \frac{1}{N}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(K, N) = E(K, 1) N (\log N + \gamma)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt; — [http://ru.wikipedia.org/wiki/Постоянная_Эйлера_—_Маскерони постоянная Эйлера]&lt;br /&gt;
&lt;br /&gt;
Таким образом, можно получить оценку: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(K, N) = O(2^K N \log N)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== IGA (Idealized Genetic Algorithm) ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим ''идеализированный'' генетический алгоритм. Используется допущение о том, что IGA знает, экземплярами каких схем является полученная на каждой итерации строка.  &lt;br /&gt;
&lt;br /&gt;
==== Алгоритм ====&lt;br /&gt;
&lt;br /&gt;
  1. Выбирается случайная строка и сохраняется, как лучшая.&lt;br /&gt;
  2. Выбирается случайная строка, проводится проверка, является ли строка экземпляром хотя бы одной из требуемых схем. &lt;br /&gt;
  Если строка является экземпляром еще не обнаруженных ранее схем, выполняется скрещивание с лучшей строкой таким образом, &lt;br /&gt;
  чтобы получить строку, являющейся экземпляром для всех обнаруженных схем. Полученная строка сохраняется как лучшая.&lt;br /&gt;
  3. Если лучшая строка является экземпляром для всех искомых схем или если был достигнут установленный максимум для числа итераций —      &lt;br /&gt;
  возвращается лучшая строка. В противном случае выполняется переход к шагу 2.&lt;br /&gt;
&lt;br /&gt;
==== Оценка для IGA  ====&lt;br /&gt;
&lt;br /&gt;
Вероятность нахождения требуемого блока &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в случайной строке &amp;lt;tex&amp;gt;p=1/2^k&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;1-(1-p)^t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вероятность нахождения всех требуемых &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; блоков за время &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;P_{N}(t)=(1-(1-p)^t)^N&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вероятность нахождения требуемых блоков точно в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;P_{N}(t)=(1-(1-p)^t)^N - (1-(1-p)^{t-1})^N&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ожидаемое время поиска: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(K, N)=\sum_1^\infty t [ (1-(1-p)^t)^N - (1-(1-p)^{t-1})^N ]&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Воспользовавшись приближением &amp;lt;tex&amp;gt;(1-p)^n \approx 1-np&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;E(K, N) \approx (1/p) \sum_{n=1}^N \frac{1}{N} \approx 2^K(\log N + \gamma)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, оценка для ожидаемого времени поиска:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(K, N) = O (2^K \log N)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== IGA и Real GA ===&lt;br /&gt;
Выделим ряд особенностей IGA, которые можно соблюсти в реальном генетическом алгоритме:&lt;br /&gt;
# Независимые выборки: размер популяции должен быть достаточно большой, процесс отбора должен быть достаточно медленным, и частота мутаций должна быть достаточной, чтобы убедиться, что ни один бит не фиксируется в одном значении в большинстве строк в популяции.&lt;br /&gt;
# Мгновенный кроссовер: скорость кроссовера должна быть такой, что время для скрещивания двух искомых схем мало по отношению ко времени их нахождения.&lt;br /&gt;
# Превосходство в скорости: оценка скорости для RMHC: &amp;lt;tex&amp;gt;E(K, N) = O( 2^K N \log N )&amp;lt;/tex&amp;gt;, для IGA: &amp;lt;tex&amp;gt;E(K, N) =  O( 2^K \log N )&amp;lt;/tex&amp;gt;. Длина строки должна быть достаточно большой, чтобы фактор &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; давал превосходство в скорости для алгоритма IGA.&lt;br /&gt;
&lt;br /&gt;
== Результаты сравнения ==&lt;br /&gt;
&lt;br /&gt;
Были получены следующие экспериментальные результаты:&lt;br /&gt;
&lt;br /&gt;
Сравнение осуществлялось между RMHC и GA на Royal Road Function &amp;lt;tex&amp;gt;R_4&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Рассматривался вопрос о достижении уровней &amp;lt;tex&amp;gt;R_4&amp;lt;/tex&amp;gt; — то есть, являлась ли полученная лучшая строка экземпляром для всех схем рассматриваемого уровня. &lt;br /&gt;
&lt;br /&gt;
Royal Road Function &amp;lt;tex&amp;gt;R_4&amp;lt;/tex&amp;gt;:&lt;br /&gt;
: Уровень 1: &amp;lt;tex&amp;gt;s_1 s_2 s_3 s_4 s_5 s_6 s_7 s_8 s_9 s_{10} s_{11} s_{12} s_{13} s_{14} s_{15} s_{16}&amp;lt;/tex&amp;gt;&lt;br /&gt;
: Уровень 2: &amp;lt;tex&amp;gt;(s_1 s_2) (s_3 s_4) (s_5 s_6) (s_7 s_8) (s_9 s_{10}) (s_{11} s_{12}) (s_{13} s_{14}) (s_{15} s_{16})&amp;lt;/tex&amp;gt;&lt;br /&gt;
: Уровень 3: &amp;lt;tex&amp;gt;(s_1 s_2 s_3 s_4) (s_5 s_6 s_7 s_8) (s_9 s_{10} s_{11} s_{12}) (s_{13} s_{14} s_{15} s_{16})&amp;lt;/tex&amp;gt;&lt;br /&gt;
: Уровень 4: &amp;lt;tex&amp;gt;(s_1 s_2 s_3 s_4 s_5 s_6 s_7 s_8) (s_9 s_{10} s_{11} s_{12} s_{13} s_{14} s_{15} s_{16})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Экспериментальные результаты ===&lt;br /&gt;
&lt;br /&gt;
В таблице указаны среднее число вычислений функции приспособленности для достижения первого, второго и третьего уровней. Четвертый уровень не был достигнут ни одним алгоритмом за выбранный максимум &amp;lt;tex&amp;gt;10^6&amp;lt;/tex&amp;gt; для числа вычислений функции приспособленности. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Таблица&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
| Уровень 1&lt;br /&gt;
| Уровень 2&lt;br /&gt;
| Уровень 3&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| GA&lt;br /&gt;
| число вычислений&lt;br /&gt;
| 500&lt;br /&gt;
| 4486&lt;br /&gt;
| 86078&lt;br /&gt;
|-&lt;br /&gt;
| % запусков&lt;br /&gt;
| 100&lt;br /&gt;
| 100&lt;br /&gt;
| 86&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| RMHC&lt;br /&gt;
| число вычислений&lt;br /&gt;
| 230&lt;br /&gt;
| 8619&lt;br /&gt;
| 95027&lt;br /&gt;
|-&lt;br /&gt;
| % запусков&lt;br /&gt;
| 100&lt;br /&gt;
| 100&lt;br /&gt;
| 41&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&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;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;diff=82963</id>
		<title>Арифметическое кодирование</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;diff=82963"/>
				<updated>2022-09-01T03:57:52Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
'''Арифметическое кодирование''' (англ. ''Arithmetic coding'') {{---}} алгоритм сжатия информации без потерь, который при кодировании ставит в соответствие тексту вещественное число из отрезка &amp;lt;tex&amp;gt;[0; 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;a&amp;lt;/tex&amp;gt; с вероятностью появления &amp;lt;tex&amp;gt;p(a)&amp;lt;/tex&amp;gt; допустимо ставить в соответствие код длины &amp;lt;tex&amp;gt;-\log_2 p(a)&amp;lt;/tex&amp;gt;, следовательно, при кодировании алгоритмом Хаффмана это достигается только с вероятностями, равными обратным степеням двойки).&lt;br /&gt;
=== Кодирование ===&lt;br /&gt;
На вход алгоритму передаются текст для кодирования и список частот встречаемости символов.&lt;br /&gt;
# Рассмотрим отрезок &amp;lt;tex&amp;gt;[0; 1)&amp;lt;/tex&amp;gt; на координатной прямой. &lt;br /&gt;
# Поставим каждому символу текста в соответствие отрезок, длина которого равна частоте его появления.&lt;br /&gt;
# Считаем символ из входного потока и рассмотрим отрезок, соответствующий этому символу. Разделим этот отрезок на части, пропорциональные частотам встречаемости символов.&lt;br /&gt;
# Повторим пункт &amp;lt;tex&amp;gt;(3)&amp;lt;/tex&amp;gt; до конца входного потока.&lt;br /&gt;
# Выберем любое число из получившегося отрезка, которое и будет результатом арифметического кодирования.&lt;br /&gt;
&lt;br /&gt;
=== Псевдокод ===&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\mathtt{s}\,&amp;lt;/math&amp;gt; {{---}} текст, подаваемый на вход;&lt;br /&gt;
*&amp;lt;math&amp;gt;\mathtt{n}\,&amp;lt;/math&amp;gt; {{---}} длина исходного текста;&lt;br /&gt;
*&amp;lt;math&amp;gt;\mathtt{m}\,&amp;lt;/math&amp;gt; {{---}} мощность алфавита исходного текста;&lt;br /&gt;
*&amp;lt;math&amp;gt;\mathtt{letters[m]}\,&amp;lt;/math&amp;gt; {{---}} массив символов, составляющих алфавит исходного текста;&lt;br /&gt;
*&amp;lt;math&amp;gt;\mathtt{probability[m]}\,&amp;lt;/math&amp;gt; {{---}} массив вероятностей обнаружения символа в тексте; &lt;br /&gt;
*&amp;lt;math&amp;gt;\mathtt{Segment}\,&amp;lt;/math&amp;gt; {{---}} структура, задающая подотрезок отрезка &amp;lt;tex&amp;gt;[0; 1)&amp;lt;/tex&amp;gt;, соответствующего конкретному символу на основе частотного анализа. Имеет поля:&lt;br /&gt;
**&amp;lt;math&amp;gt;\mathtt{left}\,&amp;lt;/math&amp;gt; {{---}} левая граница подотрезка;&lt;br /&gt;
**&amp;lt;math&amp;gt;\mathtt{right}\,&amp;lt;/math&amp;gt; {{---}} правая граница подотрезка;&lt;br /&gt;
*&amp;lt;math&amp;gt;\mathtt{left}\,&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\mathtt{right}\,&amp;lt;/math&amp;gt; {{---}} границы отрезка, содержащего возможный результат арифметического кодирования.&lt;br /&gt;
&lt;br /&gt;
 '''struct''' Segment:&lt;br /&gt;
     '''double''' left&lt;br /&gt;
     '''double''' right&lt;br /&gt;
&lt;br /&gt;
 '''Segment'''[m] defineSegments(letters: '''char'''[m], probability: '''double'''[m]):&lt;br /&gt;
    '''Segment'''[m] segment&lt;br /&gt;
    '''double''' l = 0&lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
        segment[letters[i]].left = l&lt;br /&gt;
        segment[letters[i]].right = l + probability[i]&lt;br /&gt;
        l = segment[letters[i]].right&lt;br /&gt;
    '''return''' segment&lt;br /&gt;
&lt;br /&gt;
 '''double''' arithmeticCoding(letters: '''char'''[m], probability: '''double'''[m], s: '''char'''[n]):&lt;br /&gt;
     '''Segment'''[m] segment = defineSegments(letters, probability)&lt;br /&gt;
     '''double''' left = 0&lt;br /&gt;
     '''double''' right = 1&lt;br /&gt;
     '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
         '''char''' symb = s[i]&lt;br /&gt;
         '''double''' newRight = left + (right - left) * segment[symb].right&lt;br /&gt;
         '''double''' newLeft = left + (right - left) * segment[symb].left&lt;br /&gt;
         left = newLeft&lt;br /&gt;
         right = newRight&lt;br /&gt;
     '''return''' (left + right) / 2&lt;br /&gt;
&lt;br /&gt;
'''Замечание:''' для оптимизации размера кода можно выбрать из полученного на последнем шаге диапазона &amp;lt;tex&amp;gt;[left; right]&amp;lt;/tex&amp;gt; число, содержащее наименьшее количество знаков в двоичной записи.&lt;br /&gt;
&lt;br /&gt;
=== Декодирование ===&lt;br /&gt;
Алгоритм по вещественному числу восстанавливает исходный текст.&lt;br /&gt;
# Выберем на отрезке &amp;lt;tex&amp;gt;[0; 1)&amp;lt;/tex&amp;gt;, разделенном на части, длины которых равны вероятностям появления символов в тексте, подотрезок, содержащий входное вещественное число. Символ, соответствующий этому подотрезку, дописываем в ответ.&lt;br /&gt;
# Нормируем подотрезок и вещественное число.&lt;br /&gt;
# Повторим пункты &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;{{---}}&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; до тех пор, пока не получим ответ.&lt;br /&gt;
&lt;br /&gt;
=== Псевдокод ===&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\mathtt{code}\,&amp;lt;/math&amp;gt; {{---}} вещественное число, подаваемое на вход;&lt;br /&gt;
*&amp;lt;math&amp;gt;\mathtt{n}\,&amp;lt;/math&amp;gt; {{---}} длина восстанавливаемого текста;&lt;br /&gt;
*&amp;lt;math&amp;gt;\mathtt{m}\,&amp;lt;/math&amp;gt; {{---}} мощность алфавита исходного текста;&lt;br /&gt;
*&amp;lt;math&amp;gt;\mathtt{letters[m]}\,&amp;lt;/math&amp;gt; {{---}} массив символов, составляющих алфавит исходного текста;&lt;br /&gt;
*&amp;lt;math&amp;gt;\mathtt{probability[m]}\,&amp;lt;/math&amp;gt; {{---}} массив вероятностей обнаружения символа в тексте; &lt;br /&gt;
*&amp;lt;math&amp;gt;\mathtt{segment}\,&amp;lt;/math&amp;gt; {{---}} структура, задающая подотрезок отрезка &amp;lt;tex&amp;gt;[0; 1)&amp;lt;/tex&amp;gt;, соответствующего конкретному символу на основе частотного анализа. Имеет поля:&lt;br /&gt;
** &amp;lt;math&amp;gt;\mathtt{left}\,&amp;lt;/math&amp;gt; {{---}} левая граница подотрезка;&lt;br /&gt;
** &amp;lt;math&amp;gt;\mathtt{right}\,&amp;lt;/math&amp;gt; {{---}} правая граница подотрезка;&lt;br /&gt;
** &amp;lt;math&amp;gt;\mathtt{character}\,&amp;lt;/math&amp;gt; {{---}} значение символа.&lt;br /&gt;
&lt;br /&gt;
 '''struct''' Segment:&lt;br /&gt;
     '''double''' left&lt;br /&gt;
     '''double''' right&lt;br /&gt;
     '''char''' character&lt;br /&gt;
&lt;br /&gt;
 '''Segment'''[m] defineSegments(letters: '''char'''[n], probability: '''double'''[n]):&lt;br /&gt;
    '''Segment'''[m] segment&lt;br /&gt;
    '''double''' l = 0&lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
        segment[i].left = l&lt;br /&gt;
        segment[i].right = l + probability[i]&lt;br /&gt;
        segment[i].character = letters[i]&lt;br /&gt;
        l = segment[i].right&lt;br /&gt;
    '''return''' segment&lt;br /&gt;
&lt;br /&gt;
 '''string''' arithmeticDecoding(letters: '''char'''[m], probability: '''double'''[m], code: '''double''', n: '''int'''):&lt;br /&gt;
     '''Segment'''[m] segment = defineSegments(letters, probability) &lt;br /&gt;
     '''string''' s = &amp;quot;&amp;quot;&lt;br /&gt;
     '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
         '''for''' j = 0 '''to''' m - 1&lt;br /&gt;
             '''if''' code&amp;lt;tex&amp;gt;\small{~\geqslant~}&amp;lt;/tex&amp;gt;segment[j].left '''and''' code &amp;lt; segment[j].right&lt;br /&gt;
                 s += segment[j].character&lt;br /&gt;
                 code = (code – segment[j].left) / (segment[j].right – segment[j].left)&lt;br /&gt;
                 '''break'''&lt;br /&gt;
     '''return''' s&lt;br /&gt;
&lt;br /&gt;
'''Замечание:''' кодировщику и декодировщику должно быть известно, когда завершать работу. Для этого можно передавать в качестве аргумента длину текста или символ конца файла, после которого процесс должен быть остановлен.&lt;br /&gt;
&lt;br /&gt;
'''Замечание:''' Несмотря на преимущества арифметического кодирования, существует проблема при его практическом применении из-за несовершенства представления чисел с плавающей точкой в памяти компьютера {{---}} поскольку некоторые дробные числа не могут быть точно представлены в двоичном коде, используемом современными процессорами (например, &amp;lt;tex&amp;gt;\dfrac{1}{3}&amp;lt;/tex&amp;gt;), границы символов будут округлены, что может повлечь за собой неверную работу алгоритма при больших объёмах данных. В общем случае, алгоритм можно модифицировать так, чтобы результатом было дробное число. В такой реализации вероятность встречи символа представляется в виде рационального числа. Поскольку в каждой итерации будет переход из текущего отрезка в один из его &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; подотрезков, кратных по длине &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, а всего итераций &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, в конечном результате знаменатель дроби не превысит &amp;lt;tex&amp;gt;n^{n}&amp;lt;/tex&amp;gt;, а поскольку сумма всех вероятностей встречи символов равна &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, полученная дробь будет находиться в промежутке &amp;lt;tex&amp;gt;[0; 1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Пример работы ==&lt;br /&gt;
Рассмотрим в качестве примера строку &amp;lt;tex&amp;gt;abacaba&amp;lt;/tex&amp;gt;:&lt;br /&gt;
=== Кодирование ===&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Символ||Частота появления&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.571429&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.285714&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.142857&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
[[Файл:Code_png.png|thumb|right|200px|Пример работы кодировщика ]]&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Считанный символ||Левая граница отрезка||Правая граница отрезка&lt;br /&gt;
|-&lt;br /&gt;
|||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.571429&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.326531&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.489796&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.326531&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.419825&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.406497&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.419825&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.406497&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.414113&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.410849&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.413025&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.410849&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.412093&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Код: &amp;lt;tex&amp;gt;0.411471&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Декодирование ===&lt;br /&gt;
Код: &amp;lt;tex&amp;gt;0.411471&amp;lt;/tex&amp;gt;&lt;br /&gt;
[[Файл:decode1_png.png|thumb|right|200px|Пример работы декодировщика ]]&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Декодируемый символ||Код&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.411471&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.720074&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.520259&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.910454&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.373178&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.653061&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.285714&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Замечание:''' при декодировании текста можно не только нормализовывать рабочий отрезок и текущий код, но и уменьшать рабочий отрезок (аналогично кодированию), не изменяя значение кода.&lt;br /&gt;
=== Декодирование (второй способ)===&lt;br /&gt;
Код: &amp;lt;tex&amp;gt;0.411471&amp;lt;/tex&amp;gt;&lt;br /&gt;
[[Файл:decode2_png.png|thumb|right|200px|Пример работы декодировщика (второй способ) ]]&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Декодируемый символ||colspan=&amp;quot;4&amp;quot; |Границы отрезка&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.571429&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.857143&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.326531&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.489796 &amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.571429&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.326531 &amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.419825 &amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.466472 &amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.489796 &amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.326531&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.379842&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.406497&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.419825&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.406497&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.414113&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.417921 &amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.419825&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.406497&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.410849&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.413025&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.414113&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.410849&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.412093&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.412714&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;||&amp;lt;p style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;tex&amp;gt;0.413025&amp;lt;/tex&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
== Оценка длины кодового слова ==&lt;br /&gt;
{{Теорема &lt;br /&gt;
|statement=При арифметическом кодировании длина кодового слова не превышает энтропии Шеннона случайного источника с частотами, равными долям вхождения символа в строку, умноженной на длину строки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
||proof=Условные обозначения:&lt;br /&gt;
*&amp;lt;tex&amp;gt;A(s)&amp;lt;/tex&amp;gt; {{---}} размер кодового слова &amp;lt;tex&amp;gt;s&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&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&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;A(s)&amp;lt;/tex&amp;gt; {{---}} размер кодового слова &amp;lt;tex&amp;gt;s&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;f_i&amp;lt;/tex&amp;gt; {{---}} частота встречаемости символа,&lt;br /&gt;
*&amp;lt;tex&amp;gt;p_i = \dfrac{f i}{l}&amp;lt;/tex&amp;gt; {{---}} вероятность вхождения символа,&lt;br /&gt;
*&amp;lt;tex&amp;gt;H(p_1 \ldots p_n)&amp;lt;/tex&amp;gt; {{---}} энтропия случайного источника с частотами &amp;lt;tex&amp;gt;(p_1 \ldots p_n)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть в результате арифметического кодирования мы получили число &amp;lt;tex&amp;gt;\dfrac{x}{2^q}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; {{---}} количество бит в кодовом слове, т.е. &amp;lt;tex&amp;gt;q = A(s)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Из алгоритма арифметического кодирования &amp;lt;tex&amp;gt; L = \prod\limits_{i=1}^l p_{fi} = \prod\limits_{i=1}^n p_{i}^{f_{i}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;A(s) = q  \leq  -\log_2 L = -\log_2 \prod\limits_{i=1}^n p_{i}^{f_{i}} = -\sum\limits_{i=1}^n f_i\cdot \log_2 p_i =  -l \cdot \sum\limits_{i=1}^n p_i\cdot \log_2 p_i &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Энтропия источника вычисляется по следующей формуле &amp;lt;tex&amp;gt;H(p_1 \ldots p_n) = -\sum\limits_{i=1}^n p_i\cdot \log_2 p_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Следовательно, &amp;lt;tex&amp;gt;A(s) \leq l \cdot H(p_1 \ldots p_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;
На вход алгоритму передаётся последовательность символов и алфавит. Каждому символу алфавита &amp;lt;tex&amp;gt;\alpha \in \sum&amp;lt;/tex&amp;gt; сопоставляется его вес  &amp;lt;tex&amp;gt;w_\alpha&amp;lt;/tex&amp;gt;. В начале работы алгоритма все веса символов равны &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Вероятность каждого символа &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; {{---}} &amp;lt;tex&amp;gt;p(\alpha)&amp;lt;/tex&amp;gt; устанавливется равной его весу, делённому на суммарный вес всех символов: &amp;lt;tex dpi=&amp;quot;180&amp;quot;&amp;gt;p(\alpha) = \dfrac{w_\alpha}{\sum_{i=1}^n w_i}&amp;lt;/tex&amp;gt;. После получения очередного символа и построения нужного интервала, вес символа увеличивается на &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Когда все символы последовательности будут обработаны, необходимо либо записать маркер конца последовательности, либо запомнить её длину, чтобы позже передать декодировщику. После получения нужных границ &amp;lt;tex&amp;gt;[l, r]&amp;lt;/tex&amp;gt;, в котором будет лежать код, необходмо выбрать число &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, описывающее кодирование:&lt;br /&gt;
&amp;lt;tex&amp;gt;x \in [l, r]&amp;lt;/tex&amp;gt;. Выбор числа &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; производится также, как и в неадаптивном алгоритме. Выбирается число вида &amp;lt;tex&amp;gt;\dfrac{x}{2^p}: x,p \in \mathbb N&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Псевдокод алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{in}&amp;lt;/tex&amp;gt; {{---}} текст, подаваемый на вход&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; {{---}} длина исходного текста &lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{Segment}&amp;lt;/tex&amp;gt; {{---}} структура, задающая подотрезок отрезка &amp;lt;tex&amp;gt;[0, 1)&amp;lt;/tex&amp;gt;, соответствующая конкретному символу. Имеет следующие поля:&lt;br /&gt;
** &amp;lt;tex&amp;gt; \mathtt{left} &amp;lt;/tex&amp;gt; {{---}} левая граница подотрезка&lt;br /&gt;
** &amp;lt;tex&amp;gt; \mathtt{right} &amp;lt;/tex&amp;gt; {{---}} правая граница подотрезка&lt;br /&gt;
* &amp;lt;tex&amp;gt; \mathtt{m} &amp;lt;/tex&amp;gt; {{---}} мощность алфавита&lt;br /&gt;
* &amp;lt;tex&amp;gt; \mathtt{weight} &amp;lt;/tex&amp;gt; {{---}} веса символов алфавита&lt;br /&gt;
* &amp;lt;tex&amp;gt; \mathtt{segments} &amp;lt;/tex&amp;gt; {{---}} набор подотрезков, соответствующих символам алфавита&lt;br /&gt;
* &amp;lt;tex&amp;gt; \mathtt{left, right} &amp;lt;/tex&amp;gt; {{---}} границы отрезка, содержащие возможный результат арифметического кодирования&lt;br /&gt;
* &amp;lt;tex&amp;gt; \mathtt{getAlphabet(in : char[n])}&amp;lt;/tex&amp;gt; {{---}}  функция возвращает множество различных символов в тексте &amp;lt;tex&amp;gt; \mathtt{in} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Подотрезок ====&lt;br /&gt;
&lt;br /&gt;
 '''struct''' Segment:&lt;br /&gt;
     '''double''' left;&lt;br /&gt;
     '''double''' right;&lt;br /&gt;
&lt;br /&gt;
==== Определение начальных границ подотрезков ====&lt;br /&gt;
&lt;br /&gt;
 '''map&amp;lt;char,''' '''Segment'''&amp;gt; defineSegments'''('''set&amp;lt;char&amp;gt;''' alphabet):&lt;br /&gt;
     &amp;lt;font color=green&amp;gt;// определяем размер подотрезков &amp;lt;/font&amp;gt;&lt;br /&gt;
     double p = 1 / alphabet.size()    &lt;br /&gt;
     '''Segments'''[m] segments&lt;br /&gt;
     &amp;lt;font color=green&amp;gt;// задаём левую и правую границы каждого из отрезков &amp;lt;/font&amp;gt;&lt;br /&gt;
     '''double''' curLeft = 0  &lt;br /&gt;
     '''double''' curRight = p&lt;br /&gt;
     &amp;lt;font color=green&amp;gt;// разбиваем отрезок [0,1) на подотрезки, соответсвующие символам алфавита &amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' i = 0 '''to''' m - 1 &lt;br /&gt;
         segments[i].left = curLeft&lt;br /&gt;
         segments[i].right = curRight&lt;br /&gt;
         curLeft = curRight&lt;br /&gt;
         curRight = curRight + p&lt;br /&gt;
     '''return''' segments&lt;br /&gt;
&lt;br /&gt;
==== Перестройка подотрезков ====&lt;br /&gt;
 '''map&amp;lt;char''', '''Segment'''&amp;gt; '''resizeSegments'''(alphabet : '''char'''[m], weight : '''map&amp;lt;char''', '''int&amp;gt;''', segments : '''map&amp;lt;char''', '''Segment&amp;gt;''')&lt;br /&gt;
    &amp;lt;font color=green&amp;gt;// новая левая граница подотрезка&amp;lt;/font&amp;gt;&lt;br /&gt;
    '''double''' l = 0    &lt;br /&gt;
    &amp;lt;font color=green&amp;gt;// сумма весов символов алфавита&amp;lt;/font&amp;gt;&lt;br /&gt;
    '''int''' sum = 0    &lt;br /&gt;
    &amp;lt;font color=green&amp;gt;//  подсчет суммы весов символов алфавита&amp;lt;/font&amp;gt;&lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1  &lt;br /&gt;
        sum = sum + weight[i] &lt;br /&gt;
    &amp;lt;font color=green&amp;gt;// перестроение подотрезков, для символов алфавита&amp;lt;/font&amp;gt;&lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1   &lt;br /&gt;
        '''char''' c = alphabet[i]&lt;br /&gt;
        segments[c].left = l&lt;br /&gt;
        segments[c].right = l + (weight[c] / sum)&lt;br /&gt;
        l = segments[c].right;&lt;br /&gt;
    '''return''' segments&lt;br /&gt;
&lt;br /&gt;
==== Определение начальных весов символов алфавита ====&lt;br /&gt;
 '''map&amp;lt;char''', '''int&amp;gt; defineWeights'''(alphabet : '''set&amp;lt;char&amp;gt;'''):&lt;br /&gt;
    '''map&amp;lt;char''', '''int&amp;gt;''' weight&lt;br /&gt;
    &amp;lt;font color=green&amp;gt;// проход по всем символам алфавита и установка начального веса&amp;lt;/font&amp;gt;&lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
        '''char''' c = alphabet[i]&lt;br /&gt;
        weight[c] = 1&lt;br /&gt;
    '''return''' weight&lt;br /&gt;
&lt;br /&gt;
==== Кодирование строки ====&lt;br /&gt;
 '''double''' '''adaptiveCoding'''(in : '''char'''[n], alphabet : '''set&amp;lt;char&amp;gt;'''):&lt;br /&gt;
    '''int'''[m] weight = defineWeights(alphabet)&lt;br /&gt;
    '''int'''[m] segments = defineSegments(alphabet)&lt;br /&gt;
    &amp;lt;font color=green&amp;gt;// начальные границы отрезка&amp;lt;/font&amp;gt;&lt;br /&gt;
    '''double''' left = 0      &lt;br /&gt;
    '''double''' right = 1&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
        '''char''' c = in[i]&lt;br /&gt;
        &amp;lt;font color=green&amp;gt;// увеличение веса символа строки&amp;lt;/font&amp;gt;&lt;br /&gt;
        weight[c]++  &lt;br /&gt;
        &amp;lt;font color=green&amp;gt;// определение новых границ диапазона с искомым кодом, с учётом полученного символа c&amp;lt;/font&amp;gt;&lt;br /&gt;
        '''double''' newRight = left + (right - left) * segments[c].right &lt;br /&gt;
        '''double''' newLeft = left + (right - left) * segments[c].left&lt;br /&gt;
        left = newLeft&lt;br /&gt;
        right = newRight&lt;br /&gt;
        resizeSegments(alphabet, weight, segments)&lt;br /&gt;
    '''return''' (left + right) / 2;&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм декодирования ===&lt;br /&gt;
При декодировании последовательности символов также используется множество весов &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; символов алфавита &amp;lt;tex&amp;gt;\sum&amp;lt;/tex&amp;gt;. В начале работы алгоритма все веса символов равны &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.  На каждом шаге определяется интевал, содержащий данный код, по интервалу находится символ, который потом записывается в выходную последовательность. Вес полученного символа &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; увеличивается на &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Отрезки, соответствующие символам алфавита, перестраиваются в зависимости от изменённых весов символов и размера текущего подотрезка. При получении символа конца последовательности или обработки нужного числа символов алгоритм завершает работу.&lt;br /&gt;
&lt;br /&gt;
==== Декодирование ====&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{code}&amp;lt;/tex&amp;gt; {{---}} вещественное число, подаваемое на вход;&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; {{---}} длина декодируемой строки;&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{m}&amp;lt;/tex&amp;gt; {{---}} мощность алфавита;&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{weight}&amp;lt;/tex&amp;gt; {{---}} веса символов алфавита;&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{segments}&amp;lt;/tex&amp;gt; {{---}} веса символов алфавита;&lt;br /&gt;
&lt;br /&gt;
 '''string''' '''decode('''code : '''double''', alphabet : '''set&amp;lt;char&amp;gt;''', '''int''' len):&lt;br /&gt;
    '''map&amp;lt;char, int&amp;gt;''' weight = '''defineWeights('''alphabet''')'''&lt;br /&gt;
    '''map&amp;lt;char, Segment&amp;gt;''' segments = '''defineSegments('''alphabet''')'''&lt;br /&gt;
    '''string''' ans = &amp;quot;&amp;quot;&lt;br /&gt;
    &amp;lt;font color=green&amp;gt;// декодирование строки&amp;lt;/font&amp;gt;&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1:&lt;br /&gt;
        &amp;lt;font color=green&amp;gt;// поиск нужного символа исходной строки по текущему значению кода&amp;lt;/font&amp;gt;&lt;br /&gt;
        '''for''' j = 0 '''to''' m - 1:&lt;br /&gt;
            '''char''' c  = alphabet[j]&lt;br /&gt;
            '''if''' code &amp;gt;= segments[c].left '''and''' code &amp;lt; segments[c].right&lt;br /&gt;
                ans = ans + c&lt;br /&gt;
                weight[c]++&lt;br /&gt;
                &amp;lt;font color=green&amp;gt;// вычисление следующего значения кода, с учетом декодированного символа c&amp;lt;/font&amp;gt;&lt;br /&gt;
                code = (code - segments[c].left) / segments[c].right - segments[c].left)&lt;br /&gt;
                &amp;lt;font color=green&amp;gt;// перестроение подотрезков, с учётом декодированного символа c &amp;lt;/font&amp;gt;&lt;br /&gt;
                resizeSegments(alphabet, weight, segments)&lt;br /&gt;
                '''break;'''&lt;br /&gt;
    '''return''' ans&lt;br /&gt;
&lt;br /&gt;
=== Оценка минимальной и максимальной длины кода ===&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id = th1. &lt;br /&gt;
|statement= При адаптивном арифметическом кодировании строки длины &amp;lt;tex&amp;gt;\mathtt{l}&amp;lt;/tex&amp;gt;, символы которой принадлежат алфавиту мощности &amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt;, полученный код будет лежать в диапазоне &amp;lt;tex&amp;gt;[\dfrac{(n-1)!}{(n+l-1)!}, \dfrac{l!(n-1)!}{(n+l-1)!}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Во время кодирования строки алгоритм выбирает необходимый подотрезок, увеличивает вес символа и перестраивает подотрезки.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; {{---}} результат кодирования строки длины &amp;lt;tex&amp;gt;l&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;k=1, 2, \dots, l&amp;lt;/tex&amp;gt;&lt;br /&gt;
он изменяется в &amp;lt;tex&amp;gt;\dfrac{w_{\alpha_k}}{n+k-1}&amp;lt;/tex&amp;gt; раз. На каждом шаге &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-й символ &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; будет иметь вес &amp;lt;tex&amp;gt;\alpha_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;1&amp;lt;/tex&amp;gt;, т.е. на шаге &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; суммарный вес символов будет равен &amp;lt;tex&amp;gt;n+k-1&amp;lt;/tex&amp;gt;&lt;br /&gt;
Во время перестроения подотрезков, по алгоритму, каждому символу ствавится в соответствие подотрезок длины &amp;lt;tex&amp;gt;\dfrac{w_{\alpha_k}}{n+k-1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В общем виде его можно представить так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
L = \prod_{i=1}^l \dfrac{w_{\alpha_i}}{n+i-1}&lt;br /&gt;
&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;
Этого можно достичь, если передать на вход алгоритму строку, состоящую из неповторяющихся символов.&lt;br /&gt;
В таком случае вес каждого из полученных символов будет равен &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, а значение кода на каждом из шагов &amp;lt;tex&amp;gt;k=1, 2, \dots, l&amp;lt;/tex&amp;gt; будет изменяться в &amp;lt;tex&amp;gt;\dfrac{1}{n+k-1}&amp;lt;/tex&amp;gt; раз.&lt;br /&gt;
&lt;br /&gt;
Соответственно, формула примет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
L_{min} = \prod_{i=1}^l \dfrac{1}{n+i-1} = \dfrac{1}{\dfrac{(n+l-1)!}{(n-1)!}} = \dfrac{(n-1)!}{(n+l-1)!}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно записать, используя формулы комбинаторики:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
L_{min} = \dfrac{1}{{\binom{l}{n+l-1}}l!} = \dfrac{1}{C_{n+l-1}^{l}l!}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
==== Верхняя граница ====&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы максимизировать произведение, необходимо увеличить числитель каждого члена произведения. Этого можно достичь, если передать на вход алгоритму строку, состоящую из одинаковых символов. В таком случае, на каждом из шагов &amp;lt;tex&amp;gt;k=1, 2, \dots, l&amp;lt;/tex&amp;gt; вес символа будет равен k, а значение кода будет изменяться в &amp;lt;tex&amp;gt;\dfrac{k}{n+k-1}&amp;lt;/tex&amp;gt; раз.&lt;br /&gt;
&lt;br /&gt;
Соответственно, формула будет иметь следующий вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
L_{max} = \prod_{i=1}^l \dfrac{i}{n+i-1} = \dfrac{l!(n-1)!}{(n+l-1)!}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно записать, используя формулы комбинаторики:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
L_{max} = \dfrac{1}{\binom{n+l-1}{l}} = \dfrac{1}{C_{n+l-1}^{l}}&lt;br /&gt;
&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;
|statement=При адаптивном арифметическом кодировании строки длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt;, символы которой принадлежат алфавиту мощности &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, количество бит, необходимых для кодирования сообщения будет лежать в диапазоне &amp;lt;tex&amp;gt;[-\sum_{i=1}^{l} log_2{\dfrac{1}{n+i-1}}, -\sum_{i=0}^{l-1}log_2\dfrac{i+1}{n+i}]&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Произведём оценку количества бит, необходимых для записи кода $L$ в общем случае:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
log_2 L = -\sum_{i=1}^{l} log_2 \frac{w_{\alpha_i}}{n+i-1}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все коды лежат в диапазоне &amp;lt;tex&amp;gt;[0, 1)&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;&lt;br /&gt;
log_2 L_{min} = -\sum_{i=1}^{l} log_2 \frac{1}{n+i-1}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Минимальное число бит будет затрачено в случае записи кода максимального размера:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
log_2 L_{max} = -\sum_{i=0}^{l-1} log_2 \frac{i+1}{n+i}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Алгоритм_Хаффмана | Алгоритм Хаффмана]]&lt;br /&gt;
* [[Алгоритмы_LZ77_и_LZ78 | Алгоритмы LZ77 и LZ78]]&lt;br /&gt;
* [[Энтропия_случайного_источника | Энтропия случайного источника]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/%D0%90%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5 Википедия {{---}} Арифметическое кодирование]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Arithmetic_coding Wikipedia {{---}} Arithmetic coding]&lt;br /&gt;
* [http://www.sernam.ru/cod_3.php Арифметическое кодирование]&lt;br /&gt;
* [http://rain.ifmo.ru/cat/view.php/vis/data-compression/arithmetic-coding-2006 Визуализатор арифметического кодирования]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория вероятности]]&lt;br /&gt;
[[Категория: Алгоритмы сжатия]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</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=82962</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=82962"/>
				<updated>2022-09-01T03:57:41Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&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\ldots000} \oplus a_{100\ldots0} x_1 \oplus a_{010\ldots0}  x_2 \oplus \ldots \oplus a_{00\ldots01}  x_n \oplus a_{110\ldots0} x_1 x_2 \oplus \ldots \oplus a_{00\ldots011} x_{n-1} x_n \oplus \ldots \oplus a_{11\ldots1} x_1 x_2 \ldots 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;\ldots&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;\ldots&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;\ldots&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;\ldots&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;|[[Полные_системы_функций._Теорема_Поста_о_полной_системе_функций#.D0.97.D0.B0.D0.BC.D0.BA.D0.BD.D1.83.D1.82.D1.8B.D0.B5_.D0.BA.D0.BB.D0.B0.D1.81.D1.81.D1.8B_.D0.B1.D1.83.D0.BB.D0.B5.D0.B2.D1.8B.D1.85_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B9|Сохраняет 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;|[[Полные_системы_функций._Теорема_Поста_о_полной_системе_функций#.D0.97.D0.B0.D0.BC.D0.BA.D0.BD.D1.83.D1.82.D1.8B.D0.B5_.D0.BA.D0.BB.D0.B0.D1.81.D1.81.D1.8B_.D0.B1.D1.83.D0.BB.D0.B5.D0.B2.D1.8B.D1.85_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B9|Сохраняет 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;|[[Полные_системы_функций._Теорема_Поста_о_полной_системе_функций#.D0.97.D0.B0.D0.BC.D0.BA.D0.BD.D1.83.D1.82.D1.8B.D0.B5_.D0.BA.D0.BB.D0.B0.D1.81.D1.81.D1.8B_.D0.B1.D1.83.D0.BB.D0.B5.D0.B2.D1.8B.D1.85_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B9|Самодвойственная]]&lt;br /&gt;
|&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;|[[Полные_системы_функций._Теорема_Поста_о_полной_системе_функций#.D0.97.D0.B0.D0.BC.D0.BA.D0.BD.D1.83.D1.82.D1.8B.D0.B5_.D0.BA.D0.BB.D0.B0.D1.81.D1.81.D1.8B_.D0.B1.D1.83.D0.BB.D0.B5.D0.B2.D1.8B.D1.85_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B9|Монотонная]]&lt;br /&gt;
|&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;|[[Полные_системы_функций._Теорема_Поста_о_полной_системе_функций#.D0.97.D0.B0.D0.BC.D0.BA.D0.BD.D1.83.D1.82.D1.8B.D0.B5_.D0.BA.D0.BB.D0.B0.D1.81.D1.81.D1.8B_.D0.B1.D1.83.D0.BB.D0.B5.D0.B2.D1.8B.D1.85_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B9|Линейная]]&lt;br /&gt;
|&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,\ldots,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,&amp;lt;/tex&amp;gt; следовательно &amp;lt;tex&amp;gt;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,&amp;lt;/tex&amp;gt; следовательно &amp;lt;tex&amp;gt;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,&amp;lt;/tex&amp;gt; следовательно &amp;lt;tex&amp;gt; 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,&amp;lt;/tex&amp;gt; следовательно &amp;lt;tex&amp;gt; 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,&amp;lt;/tex&amp;gt; следовательно &amp;lt;tex&amp;gt; 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_{0010} \oplus a_{1010} = 0, &amp;lt;/tex&amp;gt; следовательно &amp;lt;tex&amp;gt; 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_{0001} \oplus a_{1001} = 0, &amp;lt;/tex&amp;gt; следовательно &amp;lt;tex&amp;gt; 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, &amp;lt;/tex&amp;gt; следовательно &amp;lt;tex&amp;gt; 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, &amp;lt;/tex&amp;gt; следовательно &amp;lt;tex&amp;gt; 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, &amp;lt;/tex&amp;gt; следовательно &amp;lt;tex&amp;gt; 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, &amp;lt;/tex&amp;gt; следовательно &amp;lt;tex&amp;gt; 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, &amp;lt;/tex&amp;gt; следовательно &amp;lt;tex&amp;gt; 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, &amp;lt;/tex&amp;gt; следовательно &amp;lt;tex&amp;gt; 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, &amp;lt;/tex&amp;gt; следовательно &amp;lt;tex&amp;gt; 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, &amp;lt;/tex&amp;gt; следовательно &amp;lt;tex&amp;gt; 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\ldots00&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;111\ldots11&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,0,1) \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, \ldots 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;\ldots&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, \ldots 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;\ldots&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;\ldots&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;
* [[Полные_системы_функций._Теорема_Поста_о_полной_системе_функций|Полные системы функций, теорема Поста]]&lt;br /&gt;
* [[СДНФ|ДНФ]]&lt;br /&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>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BE%D1%84%D1%84%D0%BB%D0%B0%D0%B9%D0%BD&amp;diff=82961</id>
		<title>Задача о динамической связности оффлайн</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BE%D1%84%D1%84%D0%BB%D0%B0%D0%B9%D0%BD&amp;diff=82961"/>
				<updated>2022-09-01T03:57:26Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition = Имеется [[Основные_определения:_граф,_ребро,_вершина,_степень,_петля,_путь,_цикл#Неориентированные_графы|неориентированный граф]] из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершин, изначально не содержащий рёбер. Требуется обработать &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; запросов трёх типов:&lt;br /&gt;
* добавить ребро между вершинами &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;,&lt;br /&gt;
* удалить ребро между вершинами &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;,&lt;br /&gt;
* проверить, лежат ли вершины &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; в одной компоненте связности.&lt;br /&gt;
В графе могут быть кратные рёбра и петли.&lt;br /&gt;
}}&lt;br /&gt;
В этой статье приведено решение задачи в offline, то есть ответы на все запросы будут получены после обработки всех запросов, а не по мере их поступления.&lt;br /&gt;
&lt;br /&gt;
== Решение упрощённой задачи ==&lt;br /&gt;
Если нет удалений рёбер, задачу можно решить при помощи [[СНМ (реализация с помощью леса корневых деревьев)|системы непересекающихся множеств]]. Каждая компонента связности {{---}} одно множество в СНМ, и при добавлении рёбер они объединяются.&lt;br /&gt;
&lt;br /&gt;
Время работы такого решения: &amp;lt;tex&amp;gt;O(m \cdot \alpha (n))&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\alpha&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;k&amp;lt;/tex&amp;gt; рёбер, &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-е соединяет вершины &amp;lt;tex&amp;gt;v_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;u_i&amp;lt;/tex&amp;gt;, было добавлено запросом &amp;lt;tex&amp;gt;L_i&amp;lt;/tex&amp;gt; и удалено запросом &amp;lt;tex&amp;gt;R_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построим на массиве запросов [[Дерево отрезков. Построение|дерево отрезков]], в каждой его вершине будем хранить список пар. &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-е рёбро графа нужно добавить на отрезок &amp;lt;tex&amp;gt;[L_i,R_i]&amp;lt;/tex&amp;gt;. Это делается аналогично тому, как в дереве отрезков происходит добавление на отрезке (процесс описан в статье &amp;quot;[[Несогласованные поддеревья. Реализация массового обновления]]&amp;quot;), но без &amp;lt;tex&amp;gt;push&amp;lt;/tex&amp;gt;: нужно спуститься по дереву от корня и записать пару &amp;lt;tex&amp;gt;u_i,v_i&amp;lt;/tex&amp;gt; в вершины дерева отрезков.&lt;br /&gt;
&lt;br /&gt;
Теперь чтобы узнать, какие рёбра существуют во время выполнения &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го запроса, достаточно посмотреть на путь от корня дерева отрезков до листа, который соответствует этому запросу {{---}} рёбра, записанные в вершинах этого пути, существуют во время выполнения запроса.&lt;br /&gt;
&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;
Нужно заметить, что эвристику сжатия путей в этом случае применять не следует. Эта эвристика улучшает асимптотическое время работы, но это время работы не истинное, а амортизированное. Из-за наличия откатов к предыдущим состояниям эта эвристика не даст выигрыша. СНМ с ранговой эвристикой же работает за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; на запрос истинно.&lt;br /&gt;
&lt;br /&gt;
Запоминание изменений и откаты не влияют на время работы, если оно истинное, а не амортизированное. Действительно: пусть в СНМ произошло &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; изменений. Каждое из них будет один раз занесено в массив и один раз отменено. Значит, запись в массив и откаты работают за &amp;lt;tex&amp;gt;\Theta(r)&amp;lt;/tex&amp;gt;. Но и сами изменения заняли &amp;lt;tex&amp;gt;\Theta(r)&amp;lt;/tex&amp;gt; времени, значит, откаты не увеличили асимптотическое время работы.&lt;br /&gt;
&lt;br /&gt;
Вместо описанного способа откатывания состояния СНМ можно использовать [[Персистентные структуры данных|персистентный]] СНМ, но этот вариант сложнее и имеет меньшую эффективность. &amp;lt;!-- Я не уверен, бывает ли персистентный СНМ, работающий за log. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Время работы ==&lt;br /&gt;
Каждое из &amp;lt;tex&amp;gt;O(m)&amp;lt;/tex&amp;gt; рёбер записывается в &amp;lt;tex&amp;gt;O(\log m)&amp;lt;/tex&amp;gt; вершин дерева отрезков. Поэтому операций &amp;lt;tex&amp;gt;\mathrm{union}&amp;lt;/tex&amp;gt; в СНМ будет &amp;lt;tex&amp;gt;O(m \log m)&amp;lt;/tex&amp;gt;. Каждая выполняется за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; (СНМ с ранговой эвристикой). Откаты не влияют на время работы.&lt;br /&gt;
&lt;br /&gt;
Можно считать, что &amp;lt;tex&amp;gt;n = O(m)&amp;lt;/tex&amp;gt;, так как в запросах используется не более &amp;lt;tex&amp;gt;2m&amp;lt;/tex&amp;gt; вершин.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;tex&amp;gt;O(m \log m \log n) = O(m \log^2 m)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Реализация на C++ ==&lt;br /&gt;
 '''#include''' &amp;lt;bits/stdc++.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 '''using''' '''namespace''' std;&lt;br /&gt;
 '''typedef''' pair &amp;lt; '''int''' , '''int''' &amp;gt; ipair;&lt;br /&gt;
 '''const''' '''int''' N = 100321;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// СНМ&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''int''' dsuP[N], dsuR[N];&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// В этот массив записываются все изменения СНМ, чтобы их можно откатить&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// При изменении какого-то значения в СНМ в hist записывается пара &amp;lt; указатель, старое значение &amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 vector &amp;lt; pair &amp;lt; '''int'''*, '''int''' &amp;gt; &amp;gt; hist;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Для элемента из СНМ возвращает корень дерева, в котором он находится&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''int''' dsuRoot('''int''' v)&lt;br /&gt;
 {&lt;br /&gt;
     '''while''' (dsuP[v] != -1)&lt;br /&gt;
         v = dsuP[v];&lt;br /&gt;
     '''return''' v;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Объединяет два множества. Используется ранговая эвристика.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// При любом изменении содержимого массивов dsuP и dsuR&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// в hist записывается адрес и старое значение&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''void''' dsuMerge('''int''' a, '''int''' b)&lt;br /&gt;
 {&lt;br /&gt;
     a = dsuRoot(a);&lt;br /&gt;
     b = dsuRoot(b);&lt;br /&gt;
     '''if''' (a == b)&lt;br /&gt;
         '''return''';&lt;br /&gt;
     '''if''' (dsuR[a] &amp;gt; dsuR[b])&lt;br /&gt;
     {&lt;br /&gt;
         hist.emplace_back(&amp;amp;dsuP[b], dsuP[b]);&lt;br /&gt;
         dsuP[b] = a;&lt;br /&gt;
     } '''else''' '''if''' (dsuR[a] &amp;lt; dsuR[b])&lt;br /&gt;
     {&lt;br /&gt;
         hist.emplace_back(&amp;amp;dsuP[a], dsuP[a]);&lt;br /&gt;
         dsuP[a] = b;&lt;br /&gt;
     } '''else'''&lt;br /&gt;
     {&lt;br /&gt;
         hist.emplace_back(&amp;amp;dsuP[a], dsuP[a]);&lt;br /&gt;
         hist.emplace_back(&amp;amp;dsuR[b], dsuR[b]);&lt;br /&gt;
         dsuP[a] = b;&lt;br /&gt;
         ++dsuR[b];&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 '''struct''' Query&lt;br /&gt;
 {&lt;br /&gt;
     '''int''' t, u, v;&lt;br /&gt;
     bool answer;&lt;br /&gt;
 };&lt;br /&gt;
 '''int''' n, m;&lt;br /&gt;
 Query q[N];&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Дерево отрезков, в каждой вершине которого хранится список рёбер&amp;lt;/font&amp;gt;&lt;br /&gt;
 vector &amp;lt; ipair &amp;gt; t[N*4];&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Эта функция добавляет ребро на отрезок&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// [l r] - отрезок, на который добавляется ребро&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// uv - ребро, c - текущая вершина дерева отрезков,&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// [cl cr] - отрезок текущей вершины дерева отрезков&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''void''' addEdge('''int''' l, '''int''' r, ipair uv, '''int''' c, '''int''' cl, '''int''' cr)&lt;br /&gt;
 {&lt;br /&gt;
     '''if''' (l &amp;gt; cr || r &amp;lt; cl)&lt;br /&gt;
         '''return''';&lt;br /&gt;
     '''if''' (l &amp;lt;= cl &amp;amp;&amp;amp; cr &amp;lt;= r)&lt;br /&gt;
     {&lt;br /&gt;
         t[c].push_back(uv);&lt;br /&gt;
         '''return''';&lt;br /&gt;
     }&lt;br /&gt;
     '''int''' mid = (cl + cr) / 2;&lt;br /&gt;
     addEdge(l, r, uv, c*2+1, cl, mid);&lt;br /&gt;
     addEdge(l, r, uv, c*2+2, mid+1, cr);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Обход дерева отрезков в глубину&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''void''' go('''int''' c, '''int''' cl, '''int''' cr)&lt;br /&gt;
 {&lt;br /&gt;
     '''int''' startSize = hist.size();&lt;br /&gt;
     &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Добавляем рёбра при входе в вершину&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' (ipair uv : t[c])&lt;br /&gt;
         dsuMerge(uv.first, uv.second);&lt;br /&gt;
 &lt;br /&gt;
     '''if''' (cl == cr)&lt;br /&gt;
     {&lt;br /&gt;
         &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Если эта вершина - лист, то отвечаем на запрос&amp;lt;/font&amp;gt;&lt;br /&gt;
         '''if''' (q[cl].t == 3)&lt;br /&gt;
             q[cl].answer = (dsuRoot(q[cl].u) == dsuRoot(q[cl].v));&lt;br /&gt;
     } '''else''' {&lt;br /&gt;
         '''int''' mid = (cl + cr) / 2;&lt;br /&gt;
         go(c*2+1, cl, mid);&lt;br /&gt;
         go(c*2+2, mid+1, cr);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Откатываем изменения СНМ&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''while''' (('''int''')hist.size() &amp;gt; startSize)&lt;br /&gt;
     {&lt;br /&gt;
         *hist.back().first = hist.back().second;&lt;br /&gt;
         hist.pop_back();&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 '''int''' main()&lt;br /&gt;
 {&lt;br /&gt;
     ios::sync_with_stdio('''false''');&lt;br /&gt;
     &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Формат входных данных:&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// n и m, затем в m строках запросы: по три числа t, u, v&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// t - тип (1 - добавить ребро, 2 - удалить, 3 - принадлежат ли одной компоненте)&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Нумерация вершин с нуля&amp;lt;/font&amp;gt;&lt;br /&gt;
     cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m;&lt;br /&gt;
     '''for''' ('''int''' i = 0; i &amp;lt; n; ++i) &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Инициализация СНМ&amp;lt;/font&amp;gt;&lt;br /&gt;
         dsuP[i] = -1;&lt;br /&gt;
     &lt;br /&gt;
     &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// В этом массиве для каждого ещё не удалённого ребра хранится&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// на каком запросе оно было создано&amp;lt;/font&amp;gt;&lt;br /&gt;
     set &amp;lt; pair &amp;lt; ipair, '''int''' &amp;gt; &amp;gt; edges;&lt;br /&gt;
     '''for''' ('''int''' i = 0; i &amp;lt; m; ++i)&lt;br /&gt;
     {&lt;br /&gt;
         cin &amp;gt;&amp;gt; q[i].t &amp;gt;&amp;gt; q[i].u &amp;gt;&amp;gt; q[i].v;&lt;br /&gt;
         &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Поскольку рёбра неориентированные, u v должно означать то же самое, что и v u&amp;lt;/font&amp;gt;&lt;br /&gt;
         '''if''' (q[i].u &amp;gt; q[i].v) swap(q[i].u, q[i].v);&lt;br /&gt;
         &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// При добавлении ребра кладём его в set&amp;lt;/font&amp;gt;&lt;br /&gt;
         '''if''' (q[i].t == 1)&lt;br /&gt;
             edges.emplace(ipair(q[i].u, q[i].v), i);&lt;br /&gt;
         &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// При удалении ребра берём из set время его добавления - так мы узнаём отрезок заросов,&amp;lt;/font&amp;gt;&lt;br /&gt;
         &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// на котором оно существует. Если есть несколько одинаковых рёбер, можно брать любое.&amp;lt;/font&amp;gt;&lt;br /&gt;
         '''else''' '''if''' (q[i].t == 2)&lt;br /&gt;
         {&lt;br /&gt;
             '''auto''' iter = edges.lower_bound(make_pair(ipair(q[i].u, q[i].v), 0));&lt;br /&gt;
             addEdge(iter-&amp;gt;second, i, iter-&amp;gt;first, 0, 0, m - 1);&lt;br /&gt;
             edges.erase(iter);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Обрабатываем рёбра, которые не были удалены&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' ('''auto''' e : edges)&lt;br /&gt;
         addEdge(e.second, m - 1, e.first, 0, 0, m - 1);&lt;br /&gt;
     &lt;br /&gt;
     &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Запускаем dfs по дереву отрезков&amp;lt;/font&amp;gt;&lt;br /&gt;
     go(0, 0, m - 1);&lt;br /&gt;
     &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Выводим ответ.&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// При обходе дерева отрезков запросы обрабатываются в том же порядке, в котором они даны,&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// поэтому ответ можно выводить прямо в go без заполнения answer&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' ('''int''' i = 0; i &amp;lt; m; ++i)&lt;br /&gt;
         '''if''' (q[i].t == 3)&lt;br /&gt;
         {&lt;br /&gt;
             '''if''' (q[i].answer)&lt;br /&gt;
                 cout &amp;lt;&amp;lt; &amp;quot;YES\n&amp;quot;;&lt;br /&gt;
             '''else'''&lt;br /&gt;
                 cout &amp;lt;&amp;lt; &amp;quot;NO\n&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
     '''return''' 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Замечания ==&lt;br /&gt;
* Дерево отрезков можно строить не на всех запросах, а только на запросах третьего типа. Это даст выигрыш по скорости и памяти, особенно если таких запросов немного по сравнению с общим числом запросов.&lt;br /&gt;
* Помимо проверки, лежат ли две вершины в одной компоненте связности, можно получать и другую информацию, которую можно получить из СНМ, напрмер:&lt;br /&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;O(w)&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; {{---}} максимальный вес), а удалять нельзя. Аналогично тому, как в dynamic connectivity offline добавляются и удаляются рёбра, можно удалять элементы из рюкзака.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[СНМ (реализация с помощью леса корневых деревьев)|Система непересекающихся множеств]]&lt;br /&gt;
* [[Дерево отрезков. Построение|Дерево отрезков]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Связность в графах]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%B2_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B5&amp;diff=82960</id>
		<title>Поиск в матрице</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%B2_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B5&amp;diff=82960"/>
				<updated>2022-09-01T03:57:20Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition = Задана отсортированная двумерная матрица (матрица, для которой выполнено следующее условие: &amp;lt;tex&amp;gt; a[row][col] \leqslant a[row + 1][col], a[row][col] \leqslant a[row][col + 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; столбцов. Необходимо найти расположение указанного элемента в матрице или определить, что данный элемент в матрице отсутствует. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Файл:sorted_matrix_example.png|320px|thumb|right|Пример отсортированной матрицы]]&lt;br /&gt;
&lt;br /&gt;
== Решение за O(n&amp;lt;tex&amp;gt;\cdot&amp;lt;/tex&amp;gt;m) ==&lt;br /&gt;
Для начала рассмотрим наивный алгоритм поиска элемента. В каждой строке исходной матрицы запускаем линейный поиск, если находим элемент, то возвращаем его координаты &amp;lt;tex&amp;gt;(row, col)&amp;lt;/tex&amp;gt;. Время работы — &amp;lt;tex&amp;gt;O(n \cdot m)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Решение за O(n&amp;lt;tex&amp;gt;\cdot&amp;lt;/tex&amp;gt;log(m)) ==&lt;br /&gt;
Данный способ решения использует наивное решение за &amp;lt;math&amp;gt;n \cdot m&amp;lt;/math&amp;gt;, улучшенное с помощью [[Целочисленный двоичный поиск|двоичного поиска]]. Для этого в каждой строке запускается двоичный поиск. Время работы — &amp;lt;tex&amp;gt;O(n \cdot \log(m))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Замечание'''&lt;br /&gt;
&lt;br /&gt;
Время работы может быть улучшено до &amp;lt;tex&amp;gt;O(\min(n, m) \cdot \log(\max(n \cdot m))&amp;lt;/tex&amp;gt;. Для этого необходимо модифицировать алгоритм так, чтобы в том случае, если столбцов больше чем строк, он бы запускал двоичный поиск по строкам, если строк больше — наоборот.&lt;br /&gt;
&lt;br /&gt;
Существует еще один способ оптимизации. Рассмотрим случай, когда используется двоичный поиск по строке. Достаточно очевидно, что искомое число может находится только в тех строках, где первый элемент меньше искомого, а последний — больше. Перед началом поиска можно исключить два прямоугольных участка матрицы: первый состоит из строк, у которых последний элемент меньше искомого; второй состоит из строк, у которых первый элемент больше искомого. Используя двоичный поиск, можно найти границы этих участков за &amp;lt;tex&amp;gt;O(\log(n))&amp;lt;/tex&amp;gt; для столбцов и за &amp;lt;tex&amp;gt;O(\log(m))&amp;lt;/tex&amp;gt; строк.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:find13.png|320px|thumb|right|Пример поиска числа 13 в матрице]]&lt;br /&gt;
&lt;br /&gt;
== Решение за O(n + m) ==&lt;br /&gt;
В данном решении мы начинаем поиск из правого верхнего угла и движемся к искомому элементу. Идея алгоритма в том, что если текущий элемент меньше необходимого, то мы сдвигаемся на одну строку вниз. Если он больше, то мы сдвигаемся на одну колонку влево.&lt;br /&gt;
&lt;br /&gt;
=== Доказательство корректности ===&lt;br /&gt;
&lt;br /&gt;
Докажем, что каждый ход в соседнюю ячейку отсекает только те столбцы или строки, которые точно не содержат искомый элемент. Назовем ход корректным, если он отсекает только те строки или колонки, в которых точно нет искомого элемента. Пусть первый ход (в правую верхнюю ячейку) корректный (он не отсек ни одной строки или столбца). &lt;br /&gt;
&lt;br /&gt;
Пусть предыдущий ход был корректным. Докажем, что следующий ход, выполненный по правилам, будет корректным.&lt;br /&gt;
Если текущий элемент меньше искомого, то все ячейки левее и выше меньше, чем искомый (по определению отсортированной матрицы, все элементы левее в строке меньше текущего, а текущий меньше искомого).&lt;br /&gt;
Если текущий элемент больше искомого, то очевидно, что все ячейки правее и ниже больше, чем искомый (по определению отсортированной матрицы, все элементы ниже в столбце больше текущего, а текущий больше искомого). Значит, их можно отсечь.&lt;br /&gt;
&lt;br /&gt;
В определенный момент времени алгоритм либо найдет ячейку с искомым элементом (значит, элемент найден), либо в матрице не останется тех элементов, которые не были отсечены (значит, элемента в матрице нет).&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
  '''Pair'''&amp;lt;'''int''', '''int'''&amp;gt; matrixFind('''int'''[N][M] a, '''int''' target):&lt;br /&gt;
    '''if''' (target &amp;lt; a[0][0] '''or''' target &amp;gt; a[N-1][M-1]) &lt;br /&gt;
      '''return''' (-1, -1)&lt;br /&gt;
    row = 0&lt;br /&gt;
    col = M - 1&lt;br /&gt;
    '''while''' (row &amp;lt;= N-1 '''and''' col &amp;gt;= 0) &lt;br /&gt;
      '''if''' (a[row][col] &amp;lt; target) &lt;br /&gt;
        row++&lt;br /&gt;
      '''else if''' (a[row][col] &amp;gt; target)&lt;br /&gt;
        col--&lt;br /&gt;
      '''else'''&lt;br /&gt;
        '''return''' (row, col)&lt;br /&gt;
    '''return''' (-1, -1)&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;m&amp;lt;/tex&amp;gt; столбцов. В этом случае время работы составляет &amp;lt;tex&amp;gt;O(n + m)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Целочисленный_двоичный_поиск|Целочисленный двоичный поиск]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://articles.leetcode.com/2010/10/searching-2d-sorted-matrix.html| Searching a 2D Sorted Matrix часть 1 на Leetcode]&lt;br /&gt;
* [http://articles.leetcode.com/2010/10/searching-2d-sorted-matrix-part-ii.html| Searching a 2D Sorted Matrix часть 2 на Leetcode]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Алгоритмы поиска]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81_%D0%BE%D1%80%D0%B0%D0%BA%D1%83%D0%BB%D0%BE%D0%BC&amp;diff=82959</id>
		<title>Вычисления с оракулом</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81_%D0%BE%D1%80%D0%B0%D0%BA%D1%83%D0%BB%D0%BE%D0%BC&amp;diff=82959"/>
				<updated>2022-09-01T03:56:53Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
В теории вычислений и теории сложности &amp;quot;машиной с оракулом&amp;quot; называют абстрактную машину, предназначенную для решения какой-либо проблемы разрешимости. Такая машина может быть представлена как машина Тьюринга, дополненная оракулом с неизвестным внутренним устройством. Постулируется, что оракул способен решить определенные проблемы разрешимости за один такт машины Тьюринга. Машина Тьюринга взаимодействует с оракулом путем записи на свою ленту входных данных для оракула и затем его запуском на исполнение. За один шаг оракул вычисляет функцию, стирает входные данные и пишет выходные данные на ленту. Иногда машина Тьюринга описывается как имеющая две ленты, одна предназначена для входных данных оракула, другая — для выходных.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Оракул — абстракция, вычисляющая за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; времени, верно ли, что &amp;lt;tex&amp;gt;x&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;\mathrm{C}&amp;lt;/tex&amp;gt; с оракулом для языка &amp;lt;tex&amp;gt;\mathrm{A}&amp;lt;/tex&amp;gt;, обозначают &amp;lt;tex&amp;gt;\mathrm{C^A}&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Если &amp;lt;tex&amp;gt;\mathrm{A}&amp;lt;/tex&amp;gt; — множество языков, то &amp;lt;tex&amp;gt;\mathrm{C^A} =\bigcup\limits_{D \in A}\mathrm{C^D}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Сведение по Тьюрингу ==&lt;br /&gt;
&lt;br /&gt;
В теории вычислимости сведение по Тьюрингу задачи A к задаче B — это сведение, которое решает A, предполагая, что B уже известно. Это можно понимать как алгоритм, который может быть использован для решения A, если в его распоряжении имеются подпрограммы для решения B. Более формально, сведение по Тьюрингу является функцией, вычислимой машиной с оракулом для В.&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;A&amp;lt;/tex&amp;gt; сводится по Тьюрингу к &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;A \leq_{T} 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;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;-вычислимым.&lt;br /&gt;
}}&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0_%D0%B8%D0%BD%D1%86%D0%B8%D0%B4%D0%B5%D0%BD%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%B3%D1%80%D0%B0%D1%84%D0%B0&amp;diff=82958</id>
		<title>Матрица инцидентности графа</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0_%D0%B8%D0%BD%D1%86%D0%B8%D0%B4%D0%B5%D0%BD%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%B3%D1%80%D0%B0%D1%84%D0%B0&amp;diff=82958"/>
				<updated>2022-09-01T03:56:45Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Определения для ориентированного и неориентированного графов ==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Матрицей инцидентности''' (инциденций) ''(англ. Incidence matrix)'' неориентированного графа называется матрица &amp;lt;tex&amp;gt;I (|V| \times |E|)&amp;lt;/tex&amp;gt;, для которой &amp;lt;tex&amp;gt;I_{i,j} = 1&amp;lt;/tex&amp;gt;, если вершина &amp;lt;tex&amp;gt;v_i&amp;lt;/tex&amp;gt; инцидентна ребру &amp;lt;tex&amp;gt;e_j&amp;lt;/tex&amp;gt;, в противном случае &amp;lt;tex&amp;gt;I_{i,j} = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Матрицей инцидентности''' (инциденций) ''(англ. Incidence matrix)'' ориентированного графа называется матрица &amp;lt;tex&amp;gt;I (|V| \times |E|)&amp;lt;/tex&amp;gt;, для которой &amp;lt;tex&amp;gt;I_{i,j} = 1&amp;lt;/tex&amp;gt;, если вершина &amp;lt;tex&amp;gt;v_i&amp;lt;/tex&amp;gt; является началом дуги &amp;lt;tex&amp;gt;e_j&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;I_{i,j} = -1&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;v_i&amp;lt;/tex&amp;gt; является концом дуги &amp;lt;tex&amp;gt;e_j&amp;lt;/tex&amp;gt;, в остальных случаях &amp;lt;tex&amp;gt;I_{i,j} = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Для неориентированных графов без петель и кратных рёбер матрица инцидентности бинарна (состоит из нулей и единиц).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Для ориентированных графов без петель и кратных рёбер матрица инцидентности состоит из нулей, единиц и &amp;lt;tex&amp;gt;-1&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;i&amp;lt;/tex&amp;gt;-й строки равна &amp;lt;tex&amp;gt;deg \; v_i&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;i&amp;lt;/tex&amp;gt;-й строки равна &amp;lt;tex&amp;gt;deg^+ v_i - deg^- v_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#f2f2f2&amp;quot;|Граф&lt;br /&gt;
!style=&amp;quot;background:#f2f2f2&amp;quot;|Матрица инцидентности&lt;br /&gt;
!style=&amp;quot;background:#f2f2f2&amp;quot;|Ориентированный граф&lt;br /&gt;
!style=&amp;quot;background:#f2f2f2&amp;quot;|Матрица инцидентности&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#f9f9f9&amp;quot;|[[Файл:incidence_matrix_undirected_graph.png|200px]]&lt;br /&gt;
|style=&amp;quot;background:#f9f9f9&amp;quot;|&amp;lt;tex&amp;gt;\begin{pmatrix}&lt;br /&gt;
1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0\\&lt;br /&gt;
1 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0\\&lt;br /&gt;
0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1\\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1\\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0\\&lt;br /&gt;
\end{pmatrix}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#f9f9f9&amp;quot;|[[Файл:incidence_matrix_directed_graph.png|200px]]&lt;br /&gt;
|style=&amp;quot;background:#f9f9f9&amp;quot;|&amp;lt;tex&amp;gt;\begin{pmatrix}&lt;br /&gt;
-1 &amp;amp; 1 &amp;amp; -1 &amp;amp; 0 &amp;amp; -1 &amp;amp; 0\\&lt;br /&gt;
1 &amp;amp; 0 &amp;amp; 0 &amp;amp; -1 &amp;amp; 0 &amp;amp; 0\\&lt;br /&gt;
0 &amp;amp; -1 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1\\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0 &amp;amp; -1\\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0\\&lt;br /&gt;
\end{pmatrix}&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;
* Харари Фрэнк :'''Теория графов'''. Под ред. Л. Б. Штейнпресс. Изд. 2-е. — М.: Мир, 1973. — 180 с. — ISBN 5-354-00301-6&lt;br /&gt;
* Асанов М. О., Баранский В. А., Расин В. В.: '''Дискретная математика: графы, матроиды, алгоритмы''' — НИЦ РХД, 2001. — 288 с. — ISBN 5-93972-076-5&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Incidence_matrix Википедия {{---}} Incidence matrix]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Основные определения теории графов]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%B5_%D0%BF%D1%83%D1%82%D0%B5%D0%B9_%D0%B2_%D0%B0%D1%86%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=82957</id>
		<title>Задача о числе путей в ациклическом графе</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%B5_%D0%BF%D1%83%D1%82%D0%B5%D0%B9_%D0%B2_%D0%B0%D1%86%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=82957"/>
				<updated>2022-09-01T03:56:40Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition = Задан [[Основные определения теории графов|ациклический граф]] &amp;lt;tex&amp;gt;G&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&amp;lt;/tex&amp;gt; в вершину &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; по рёбрам графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{#if: {{{neat|}}}|&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #fcfcfc; float:left;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #ddd;&amp;quot;&amp;gt;'''Задача:'''&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px dashed #2f6fab; padding: 8px; font-style: italic;&amp;quot;&amp;gt;{{{definition}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;|&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color: #ddd&amp;quot;&amp;gt;'''Задача:'''&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border:1px dashed #2f6fab; padding: 8px; background-color: #fcfcfc; font-style: italic;&amp;quot;&amp;gt;{{{definition}}}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;}}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Решение задачи ==&lt;br /&gt;
&lt;br /&gt;
=== Перебор всех возможных путей ===&lt;br /&gt;
&lt;br /&gt;
Небольшая модификация алгоритма [[Обход в глубину, цвета вершин|обхода в глубину]]. Запустим обход в глубину от вершины &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. При каждом посещении вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; проверим, не является ли она искомой вершиной &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. Если это так, то ответ увеличивается на единицу и обход прекращается. В противном случае производится запуск обхода в глубину для всех вершин, в которые есть ребро из &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, причем он производится независимо от того, были эти вершины посещены ранее, или нет.&lt;br /&gt;
&lt;br /&gt;
Функция &amp;lt;tex&amp;gt;\mathrm{countPaths(g, s, t)}&amp;lt;/tex&amp;gt; принимает граф &amp;lt;tex&amp;gt;g&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;
&lt;br /&gt;
 '''countPaths'''(g, v, t)&lt;br /&gt;
     '''if''' v == t&lt;br /&gt;
         '''return''' 1&lt;br /&gt;
     '''else'''&lt;br /&gt;
         s = 0&lt;br /&gt;
         '''for''' to '''in''' g[v]&lt;br /&gt;
             s += '''countPaths'''(g, to, t)&lt;br /&gt;
         '''return''' s&lt;br /&gt;
&lt;br /&gt;
Время работы данного алгоритма в худшем случае &amp;lt;tex&amp;gt;O(Ans)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;Ans&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(2^{n/2})&amp;lt;/tex&amp;gt;. Если же использовать метод динамического программирования, речь о котором пойдет ниже, то асимптотику можно улучшить до &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Dp-countpaths-example.png‎|600px| Пример графа, на котором алгоритм имеет время работы &amp;lt;tex&amp;gt;O(2^{n/2})&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
=== Метод динамического программирования ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;P(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;.&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;P(v)&amp;lt;/tex&amp;gt; зависит только от вершин, ребра из которых входят в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;P(v) = \sum\limits_{c}P(c)&amp;lt;/tex&amp;gt; таких &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt;, что есть ребро из &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Мы свели нашу задачу к меньшим подзадачам, причем мы также знаем, что &amp;lt;tex&amp;gt;P(s) = 1&amp;lt;/tex&amp;gt;. Это позволяет решить задачу методом динамического программирования.&lt;br /&gt;
&lt;br /&gt;
=== Псевдокод ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; — стартовая вершина, а &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; — конечная, для нее и посчитаем ответ. Будем поддерживать массив &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;d[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;w&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;w[v] = true&amp;lt;/tex&amp;gt;, если ответ для вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; уже посчитан, и &amp;lt;tex&amp;gt;w[v] = false&amp;lt;/tex&amp;gt; в противном случае. Изначально &amp;lt;tex&amp;gt;w[i] = false&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;d[s] = 1&amp;lt;/tex&amp;gt;. Функция &amp;lt;tex&amp;gt;\mathrm{count(v)}&amp;lt;/tex&amp;gt; будет возвращать ответ для вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Удобнее всего это реализовать в виде рекурсивной функции с запоминанием. В этом случае значения массива &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; будут вычисляться по мере необходимости и не будут считаться лишний раз: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; count(v) = \left \{ &lt;br /&gt;
\begin{array}{ll}&lt;br /&gt;
 d[v], &amp;amp; w[v]=true \\&lt;br /&gt;
 \sum\limits_{c|cv \in E}count(c), &amp;amp; w[v]=false&lt;br /&gt;
 \end{array}&lt;br /&gt;
 \right.&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 '''count'''(g, v)&lt;br /&gt;
     '''if''' w[v]&lt;br /&gt;
         return d[v]&lt;br /&gt;
     '''else'''&lt;br /&gt;
         sum = 0&lt;br /&gt;
         w[v] = ''true''&lt;br /&gt;
         '''for''' c '''in''' g[v]&lt;br /&gt;
             sum += '''count'''(g, c)&lt;br /&gt;
         d[v] = sum&lt;br /&gt;
         '''return''' sum&lt;br /&gt;
 &lt;br /&gt;
 '''countPaths'''(g, s, t)&lt;br /&gt;
     d[s] = 1&lt;br /&gt;
     w[s] = ''true''&lt;br /&gt;
     answer = '''count'''(t)&lt;br /&gt;
     '''return''' answer&lt;br /&gt;
&lt;br /&gt;
Значение функции &amp;lt;tex&amp;gt;\mathrm{count(v)}&amp;lt;/tex&amp;gt; считается для каждой вершины один раз, а внутри нее рассматриваются все такие ребра &amp;lt;tex&amp;gt;\{e\ |\ end(e) = v\}&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;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; — число вершин графа, &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; — число ребер.&lt;br /&gt;
&lt;br /&gt;
== Пример работы ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим пример работы алгоритма на следующем графе:&lt;br /&gt;
&lt;br /&gt;
[[Файл: count-path-graph-example.png|thumb|300px ]]&lt;br /&gt;
&lt;br /&gt;
Изначально массивы &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; инициализированы следующим образом:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;4&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''вершина''' || S || 1 || 2 || 3 || 4 || T&lt;br /&gt;
|-&lt;br /&gt;
| '''w''' || true || false || false || false || false || false&lt;br /&gt;
|-&lt;br /&gt;
| '''d''' || 1 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|}&lt;br /&gt;
Сначала функция &amp;lt;tex&amp;gt;\mathrm{count}&amp;lt;/tex&amp;gt; будет вызвана от вершины &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;. Ответ для нее еще не посчитан (&amp;lt;tex&amp;gt;w[T] = false&amp;lt;/tex&amp;gt;), следовательно &amp;lt;tex&amp;gt;\mathrm{count}&amp;lt;/tex&amp;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;3&amp;lt;/tex&amp;gt; ответ также не посчитан (&amp;lt;tex&amp;gt;w[3] = false&amp;lt;/tex&amp;gt;), следовательно &amp;lt;tex&amp;gt;\mathrm{count}&amp;lt;/tex&amp;gt; будет вызвана уже для вершин &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;. А вот для них ответ мы уже можем узнать: для &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; он равен &amp;lt;tex&amp;gt;d[S]&amp;lt;/tex&amp;gt;, так как это &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; — единственная вершина, ребро из которой входит в нее. Непосредственно для &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; ответ нам также известен. На текущий момент таблица будет выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;4&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''вершина''' || S || 1 || 2 || 3 || 4 || T&lt;br /&gt;
|-&lt;br /&gt;
| '''w''' || true || false || '''true''' || false || false || false&lt;br /&gt;
|-&lt;br /&gt;
| '''d''' || 1 || 0 || '''1''' || 0 || 0 || 0&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;S&amp;lt;/tex&amp;gt;, что позволяет вычислить &amp;lt;tex&amp;gt;d[3] = d[2] + d[S] = 2&amp;lt;/tex&amp;gt;. Также обновим значения в массиве &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;w[3] = true&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;4&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''вершина''' || S || 1 || 2 || 3 || 4 || T&lt;br /&gt;
|-&lt;br /&gt;
| '''w''' || true || false || true || '''true''' || false || false&lt;br /&gt;
|-&lt;br /&gt;
| '''d''' || 1 || 0 || 1 || '''2''' || 0 || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
В самом начале для вычисления &amp;lt;tex&amp;gt;d[T]&amp;lt;/tex&amp;gt; нам требовались значения &amp;lt;tex&amp;gt;d[3]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d[4]&amp;lt;/tex&amp;gt;. Теперь нам известно значение &amp;lt;tex&amp;gt;d[3]&amp;lt;/tex&amp;gt;, поэтому проследим за тем, как будет вычисляться &amp;lt;tex&amp;gt;d[4]&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;\mathrm{d[4] = count(3) + count(2) + count(1)}&amp;lt;/tex&amp;gt;, но &amp;lt;tex&amp;gt;w[3] = true, w[2] = true&amp;lt;/tex&amp;gt;, следовательно значения &amp;lt;tex&amp;gt;d[3]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d[2]&amp;lt;/tex&amp;gt; мы уже знаем, и нам необходимо вызвать &amp;lt;tex&amp;gt;\mathrm{count(1)}&amp;lt;/tex&amp;gt;. Ответ для этой вершины равен &amp;lt;tex&amp;gt;d[S]&amp;lt;/tex&amp;gt;, так как это единственная вершина, ребро из которой входит в &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Обновим соответствующие значения массивов &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;4&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''вершина''' || S || 1 || 2 || 3 || 4 || T&lt;br /&gt;
|-&lt;br /&gt;
| '''w''' || true || '''true''' || true || true || false || false&lt;br /&gt;
|-&lt;br /&gt;
| '''d''' || 1 || '''1''' || 1 || 2 || 0 || 0&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;d[4] = d[3] + d[2] + d[1] = 2 + 1 + 1 = 4&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;4&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''вершина''' || S || 1 || 2 || 3 || 4 || T&lt;br /&gt;
|-&lt;br /&gt;
| '''w''' || true || true || true || true || '''true''' || false&lt;br /&gt;
|-&lt;br /&gt;
| '''d''' || 1 || 1 || 1 || 2 || '''4''' || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Наконец, вычислим &amp;lt;tex&amp;gt;d[T] = d[3] + d[4] = 2 + 4 = 6&amp;lt;/tex&amp;gt; и обновим таблицы &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;4&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''вершина''' || S || 1 || 2 || 3 || 4 || T&lt;br /&gt;
|-&lt;br /&gt;
| '''w''' || true || true || true || true || true || '''true'''&lt;br /&gt;
|-&lt;br /&gt;
| '''d''' || 1 || 1 || 1 || 2 || 4 || '''6'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Этот алгоритм позволяет вычислить количество путей от какой-либо вершины &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; не только до &amp;lt;tex&amp;gt;T&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;d&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;
* Акулич И.Л. Глава 4. Задачи динамического программирования // Математическое программирование в примерах и задачах. — М.: Высшая школа, 1986. — 319 с. — ISBN 5-06-002663-9..&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Динамическое программирование]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=LZSS&amp;diff=82956</id>
		<title>LZSS</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=LZSS&amp;diff=82956"/>
				<updated>2022-09-01T03:56:34Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BE%D0%B4%D1%8B_%D0%93%D1%80%D0%B5%D1%8F&amp;diff=82955</id>
		<title>Коды Грея</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BE%D0%B4%D1%8B_%D0%93%D1%80%D0%B5%D1%8F&amp;diff=82955"/>
				<updated>2022-09-01T03:56:14Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Код Грея''' (англ. ''Gray code'') {{---}} такое упорядочение &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-ичных (обычно двоичных) векторов, что соседние вектора отличаются только в одном разряде.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Код назван в честь Фрэнка Грея, который в 1947-ом году получил патент на &amp;quot;отражённый двоичный код&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм построения == &lt;br /&gt;
&lt;br /&gt;
[[Файл:Gray_Code_Building.png|300px|thumb|right|Получение зеркального двоичного кода Грея.]]&lt;br /&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;n&amp;lt;/tex&amp;gt; шагов. На первом шаге код имеет длину &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; и состоит из двух векторов &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&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;. С каждым шагом длина векторов увеличивается на &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, а их количество {{---}} вдвое. &lt;br /&gt;
Таким образом, количество векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; равно &amp;lt;tex&amp;gt;2^n.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Псевдокод === &lt;br /&gt;
{| border=&amp;quot;0&amp;quot; &lt;br /&gt;
|align=&amp;quot;left&amp;quot; colspan=&amp;quot;4&amp;quot;|&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{GrayCode}&amp;lt;/tex&amp;gt; {{---}} двумерный массив типа '''boolean''', в котором &amp;lt;tex&amp;gt;\mathtt{GrayCode[a, 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;-ом коде Грея,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{p}&amp;lt;/tex&amp;gt; {{---}} Счетчик количества уже имеющихся кодов,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{t}&amp;lt;/tex&amp;gt; {{---}} Показывает количество кодов в &amp;lt;tex&amp;gt;(a-1)&amp;lt;/tex&amp;gt;-м коде Грея.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 buildCode(n):&lt;br /&gt;
    GrayCode[1, n] = ''false''&lt;br /&gt;
    GrayCode[2, n] = ''true''                 &amp;lt;font color=green&amp;gt; // Построение кода длины 1 &amp;lt;/font&amp;gt;&lt;br /&gt;
    p = 2&lt;br /&gt;
    '''for''' i = 2 '''to''' n&lt;br /&gt;
       t = p&lt;br /&gt;
       p = p * 2&lt;br /&gt;
       '''for''' k = (p / 2 + 1) '''to''' p&lt;br /&gt;
          GrayCode[k] = GrayCode[t]       &amp;lt;font color=green&amp;gt; // Отражение имеющихся кодов &amp;lt;/font&amp;gt;&lt;br /&gt;
          GrayCode[t, n + 1 - i] = ''false''&lt;br /&gt;
          GrayCode[k, n + 1 - i] = ''true''   &amp;lt;font color=green&amp;gt; // Добавление 0 и 1 в начало &amp;lt;/font&amp;gt;&lt;br /&gt;
          t--&lt;br /&gt;
    '''return''' GrayCode &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Доказательство правильности работы алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По индукции: &lt;br /&gt;
&lt;br /&gt;
* на первом шаге код отвечает условиям &lt;br /&gt;
* предположим, что код, получившийся на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ом шаге, является кодом Грея&lt;br /&gt;
* тогда на шаге &amp;lt;tex&amp;gt;i + 1&amp;lt;/tex&amp;gt;: первая половина кода будет корректна, так как она совпадает с кодом с шага &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; за исключением добавленного последнего бита &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;. Вторая половина тоже соответствует условиям, так как она является зеркальным отражением первой половины, только добавлен везде бит &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. На стыке: первые &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; бит совпадают в силу зеркальности, последние различны по построению. &lt;br /&gt;
Таким образом, этот код {{---}} код Грея. Индукционное предположение доказано, алгоритм работает верно. &lt;br /&gt;
&lt;br /&gt;
Этот алгоритм можно обобщить и для &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-ичных векторов. Также известен алгоритм преобразования двоичного кода в код Грея. &lt;br /&gt;
&lt;br /&gt;
Существует ещё несколько видов кода Грея {{---}}  сбалансированный код Грея, код Баркера-Грея, одноколейный код Грея.&amp;lt;ref&amp;gt;[http://en.wikipedia.org/wiki/Gray_code#Special_types_of_Gray_codes Wikipedia {{---}} Special types of Gray codes]&amp;lt;/ref&amp;gt; Кроме того, коды Грея используются для [[:Коды_Грея_для_перестановок|упорядочения перестановок.]]&lt;br /&gt;
&lt;br /&gt;
== Явная формула для получения зеркального двоичного кода Грея ==&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id = th1. &lt;br /&gt;
|statement =&lt;br /&gt;
В двоичном зеркальном коде Грея &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ый код может быть получен по формуле &amp;lt;tex&amp;gt;G_i = i \oplus (\lfloor i / 2 \rfloor)&amp;lt;/tex&amp;gt; при нумерации кодов с нуля.&lt;br /&gt;
|proof =&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;M&amp;lt;/tex&amp;gt; длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, для которого выполнено, что для любого &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; выполняется &amp;lt;tex&amp;gt;\enspace M_i = i \oplus (\lfloor i / 2 \rfloor)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим за &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; код длины &amp;lt;tex&amp;gt;n + 1&amp;lt;/tex&amp;gt;, полученный из &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; описанным выше алгоритмом. Тогда:&lt;br /&gt;
&lt;br /&gt;
Для любого &amp;lt;tex&amp;gt;x &amp;lt; 2^n&amp;lt;/tex&amp;gt; выполняется &amp;lt;tex&amp;gt;\enspace L_x = 0M_x&amp;lt;/tex&amp;gt; и, по условию, равно&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;L_x = 0(x_{n-1}x_{n-2}  \dots x_{0} \oplus 0x_{n-1}x_{n-2}  \dots x_{1})&amp;lt;/tex&amp;gt; раскрыв скобки, получим новое выражение &amp;lt;tex&amp;gt;L_x&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;= 0x_{n-1}x_{n-2}  \dots x_{0} \oplus 00x_{n-1}x_{n-2}  \dots x_{1}&amp;lt;/tex&amp;gt; что равно (второе слагаемое равно первому, побитово сдвинутого вправо.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;= x \oplus (\lfloor x / 2 \rfloor)&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Для любого &amp;lt;tex&amp;gt;x \geqslant 2^n&amp;lt;/tex&amp;gt; выполняется  &amp;lt;tex&amp;gt;\enspace L_x = 1&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;M_y&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;y = 2^{n+1} - 1 - x = \neg x&amp;lt;/tex&amp;gt;, то есть &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;L_x = 1(\overline {x_{n-1} x_{n-2}  \dots x_{0}} \oplus 0 \overline {x_{n-1} x_{n-2}  \dots x_{1}})&amp;lt;/tex&amp;gt; что по свойству '''xor''' (&amp;lt;tex&amp;gt;\neg x \oplus \neg y = x \oplus y&amp;lt;/tex&amp;gt;) равно&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;= 1(\overline {x_{n-1}}x_{n-2}  \dots x_{0} \oplus 0x_{n-1}x_{n-2}  \dots x_{1})&amp;lt;/tex&amp;gt; или (все по тому же свойству)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;= 1(x_{n-1}x_{n-2}  \dots x_{0} \oplus 1x_{n-1}x_{n-2}  \dots x_{1})&amp;lt;/tex&amp;gt; раскрыв скобки, получим&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;= 1x_{n-1}x_{n-2}  \dots x_{0} \oplus 01x_{n-1}x_{n-2}  \dots x_{1}&amp;lt;/tex&amp;gt; откуда получаем, зная из условия, что старший разряд &amp;lt;tex&amp;gt;L_x&amp;lt;/tex&amp;gt; равен &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;= x_{n}x_{n-1}x_{n-2}  \dots x_{0} \oplus 0x_{n}x_{n-1}x_{n-2}  \dots x_{1}&amp;lt;/tex&amp;gt; что, аналогично первому пункту, равно&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;= x \oplus (\lfloor x / 2 \rfloor)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, шаг индукции доказан, следовательно, теорема верна.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Файл:single_track.png|50px|thumb|right|Пример однодорожечного кода грея.]]&lt;br /&gt;
&lt;br /&gt;
=== Сбалансированный код Грея ===&lt;br /&gt;
Несмотря на то, что зеркальный двоичный код Грея полезен во многих случаях, он не является оптимальным в некоторых ситуациях из-за отсутствия &amp;quot;однородности&amp;quot;. В сбалансированном коде Грея, количество изменений в различных координатных позициях сделаны максимально приближенными настолько, насколько это возможно. &lt;br /&gt;
&lt;br /&gt;
Чтобы показать это точнее, пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; {{---}} это &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt;-ичный полный цикл Грея, имеющий последовательность перехода &amp;lt;tex&amp;gt;(\delta_k)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\delta_k = i&amp;lt;/tex&amp;gt;, для &amp;lt;tex&amp;gt;k = 0 \dots n&amp;lt;/tex&amp;gt; если в коде Грея &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й и &amp;lt;tex&amp;gt;(i+1)&amp;lt;/tex&amp;gt; биты различны и &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} кол-во таких различий; отсчёты переходов (спектры) &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; являются наборами целых чисел, определенных как &amp;lt;tex&amp;gt;\lambda_k = |\{ j \in \mathbb{Z}_{R^n} : \delta_j = k \}| \,&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt; k \in \mathbb{Z}_R&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Код Грея является однородным или равномерно сбалансированным, если все его отсчёты переходов равны, и в этом случае у нас есть &amp;lt;tex&amp;gt;\lambda_k = R^n / n&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Ясно, что при &amp;lt;tex&amp;gt;R = 2&amp;lt;/tex&amp;gt;, такие коды существуют только при &amp;lt;tex&amp;gt;n = 2&amp;lt;/tex&amp;gt;. В противном случае, если &amp;lt;tex&amp;gt;R^n&amp;lt;/tex&amp;gt; не делится на &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; равномерно, то можно построить сбалансированные коды Грея, где каждый отсчёт перехода либо &amp;lt;tex&amp;gt;\lfloor R^n / n \rfloor &amp;lt;/tex&amp;gt; либо &amp;lt;tex&amp;gt; \lceil R^n / n \rceil&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;n&amp;lt;/tex&amp;gt; так, что два последовательных слова отличаются ровно в одной позиции, и когда список рассматривается как &amp;lt;tex&amp;gt;P_{xn}&amp;lt;/tex&amp;gt; матрица, каждая колонка {{---}} это циклический сдвиг первого столбца. Название происходит от их использования датчиками вращения, где количество дорожек в настоящее время измеряется с помощью контактов, в результате для каждой дорожки на выход подаётся &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Чтобы снизить уровнень шума различных контактов не переключаясь в тот же момент времени, один датчик предпочтительно устанавливает дорожки так, что выход данных от контактов находится в коде Грея. Чтобы получить высокую угловую точность, нужно много контактов; для достижения точности хотя бы в &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; градус нужно, по крайней мере, &amp;lt;tex&amp;gt;360&amp;lt;/tex&amp;gt; различных позиций на оборот, который требует минимум &amp;lt;tex&amp;gt;9&amp;lt;/tex&amp;gt; бит данных, и тем самым такое же количество контактов.&lt;br /&gt;
&lt;br /&gt;
'''Не путать''' с [[:Цепные_коды|цепными кодами]], получаемых циклическим сдвигом.&lt;br /&gt;
&lt;br /&gt;
== Применение ==&lt;br /&gt;
&lt;br /&gt;
Фрэнк Грей изобрел метод для преобразования аналоговых сигналов в отраженные двоичные кодовые группы с использованием аппарата на основе вакуумной трубки. Способ и устройство были запатентованы в 1953 году, а код получил название код Грея. &amp;quot;PCM трубка&amp;quot; {{---}} аппарат, запатентованный Греем, был сделан Раймондом У. Сирсом из (англ.) Bell Labs, работая с Греем и Уильямом М. Гудоллом.&lt;br /&gt;
&lt;br /&gt;
* В технике коды Грея используются для минимизации ошибок при преобразовании аналоговых сигналов в цифровые (например, в датчиках-энкодерах &amp;lt;ref&amp;gt;[http://ru.wikipedia.org/wiki/%D0%AD%D0%BD%D0%BA%D0%BE%D0%B4%D0%B5%D1%80 Википедия {{---}} Датчик угла поворота]&amp;lt;/ref&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
В частности, коды Грея и были открыты в связи с этим применением. (Код Грея — это код преобразования бинарных символов в &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt;-арные, такие, что двоичные последовательности, соответствующие соседним символам (сдвигам фаз), отличаются только одним битом. Обычная бинарная кодировка сравнивается с кодировкой Грея. При появлении ошибки в &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt;-арном символе наиболее вероятными являются ближайшие соседние символы, отличающиеся от переданного лишь одним битом, если используется кодировка Грея. &lt;br /&gt;
&lt;br /&gt;
Таким образом, высока вероятность того, что при кодировании с помощью кода Грея в случае возникновения ошибки ошибочным будет только один из &amp;lt;tex&amp;gt;k = \log_2 M&amp;lt;/tex&amp;gt; переданных битов.) &lt;br /&gt;
&lt;br /&gt;
* Коды Грея используются для кодирования номера дорожек в жёстких дисках.&lt;br /&gt;
&lt;br /&gt;
* Коды Грея широко применяются в теории генетических алгоритмов &amp;lt;ref&amp;gt;[http://ru.wikipedia.org/wiki/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC Википедия {{---}} Генетический алгоритм]&amp;lt;/ref&amp;gt; для кодирования генетических признаков, представленных целыми числами.&lt;br /&gt;
&lt;br /&gt;
* Коды Грея используются в Картах Карно&amp;lt;ref&amp;gt;[http://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D1%80%D1%82%D1%8B_%D0%9A%D0%B0%D1%80%D0%BD%D0%BE Википедия {{---}} Карта Карно]&amp;lt;/ref&amp;gt; (при передаче в карту переменные сортируются в код Грея).&lt;br /&gt;
&lt;br /&gt;
* Алгоритм модуляции 2B1Q (англ. ''2 Binary 1 Quandary'') &amp;lt;ref&amp;gt;[http://en.wikipedia.org/wiki/2B1Q Wikipedia {{---}} 2B1Q]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Код Грея можно использовать также и для решения следующей задачи&amp;lt;ref&amp;gt;[http://ru.wikipedia.org/wiki/%D0%A5%D0%B0%D0%BD%D0%BE%D0%B9%D1%81%D0%BA%D0%B8%D0%B5_%D0%B1%D0%B0%D1%88%D0%BD%D0%B8 Википедия {{---}} Ханойская Башня]&amp;lt;/ref&amp;gt;: &lt;br /&gt;
=== Задача о Ханойских башнях ===&lt;br /&gt;
&lt;br /&gt;
{{задача&lt;br /&gt;
|definition =&lt;br /&gt;
Даны три стержня, на один из которых нанизаны восемь колец, причем кольца отличаются размером и лежат меньшее на большем. Задача состоит в том, чтобы перенести пирамиду из восьми колец за наименьшее число ходов на другой стержень. За один раз разрешается переносить только одно кольцо, причём нельзя класть большее кольцо на меньшее.&lt;br /&gt;
}}&lt;br /&gt;
'''Решение:'''&lt;br /&gt;
&lt;br /&gt;
Пусть &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;G(0)&amp;lt;/tex&amp;gt;), и будем двигаться по кодам Грея (от &amp;lt;tex&amp;gt;G(i)&amp;lt;/tex&amp;gt; переходить к &amp;lt;tex&amp;gt;G(i+1)&amp;lt;/tex&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Поставим в соответствие каждому &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ому биту текущего кода Грея &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ый диск (причём самому младшему биту соответствует наименьший по размеру диск, а самому старшему биту — наибольший). Поскольку на каждом шаге изменяется ровно один бит, то мы можем понимать изменение бита &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; как перемещение &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го диска. То есть, будем понимать переход от последовательности &amp;lt;tex&amp;gt;101&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;100&amp;lt;/tex&amp;gt; как перемещение &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;-го диска на свободное место, а от &amp;lt;tex&amp;gt;010&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;110&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;n&amp;lt;/tex&amp;gt; нечётно, то последовательность перемещений наименьшего диска имеет вид &amp;lt;tex&amp;gt;r_{1} \rightarrow r_{3} \rightarrow r_{2} \rightarrow r_{1} \rightarrow r_{3} \rightarrow r_{2} \rightarrow \ldots .&amp;lt;/tex&amp;gt;(где &amp;lt;tex&amp;gt;r_{1}&amp;lt;/tex&amp;gt; — стартовый стержень, &amp;lt;tex&amp;gt;r_{3}&amp;lt;/tex&amp;gt; — финальный стержень, &amp;lt;tex&amp;gt;r_{2}&amp;lt;/tex&amp;gt; — оставшийся стержень), а если &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; чётно, то &amp;lt;tex&amp;gt;r_{1} \rightarrow r_{2} \rightarrow r_{3} \rightarrow r_{1} \rightarrow r_{2} \rightarrow r_{3} \rightarrow \ldots.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выбор обусловлен тем, на каком стержне окажется в конце пирамидка, решение с помощью кода Грея является следствием классического нерекурсивного решения&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Tower_of_Hanoi#Non-recursive_solution Wikipedia {{---}} Tower of Hanoi Non-recursive solution]&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;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Gray_code Wikipedia {{---}} Gray code]&lt;br /&gt;
&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/код_Грея Википедия {{---}} Код Грея]&lt;br /&gt;
&lt;br /&gt;
* [http://www.jucs.org/jucs_13_11/the_gray_code/jucs_13_11_1573_1597_doran.pdf Robert W. Doran The Gray Code, Journal of Universal Computer Science, vol. 13, no. 11 (2007).]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D1%80%D0%B0%D0%B7%D0%B1%D0%B8%D0%B5%D0%BD%D0%B8%D0%B9_%D1%87%D0%B8%D1%81%D0%BB%D0%B0_%D0%BD%D0%B0_%D1%81%D0%BB%D0%B0%D0%B3%D0%B0%D0%B5%D0%BC%D1%8B%D0%B5&amp;diff=82954</id>
		<title>Нахождение количества разбиений числа на слагаемые</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D1%80%D0%B0%D0%B7%D0%B1%D0%B8%D0%B5%D0%BD%D0%B8%D0%B9_%D1%87%D0%B8%D1%81%D0%BB%D0%B0_%D0%BD%D0%B0_%D1%81%D0%BB%D0%B0%D0%B3%D0%B0%D0%B5%D0%BC%D1%8B%D0%B5&amp;diff=82954"/>
				<updated>2022-09-01T03:56:04Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition =&lt;br /&gt;
 По заданному числу &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; найти количество его различных разбиений на положительные слагаемые&amp;lt;ref name=&amp;quot;amount&amp;quot; /&amp;gt; &amp;lt;tex&amp;gt; m_0 + m_1 + m_2 + \ldots + m_k = n &amp;lt;/tex&amp;gt; так, что при всех &amp;lt;tex&amp;gt; i\colon m_i \leqslant m_{i+1} &amp;lt;/tex&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Алгоритм за O(N&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;)==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;P(n, m, k)&amp;lt;/tex&amp;gt; — количество разбиений числа &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; слагаемых, каждое из которых не превосходит &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Имеет место следующее рекуррентное соотношение:&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;tex dpi = &amp;quot;145&amp;quot;&amp;gt;P(n, m, k) = &lt;br /&gt;
\left \{\begin{array}{ll}P(n, m, k - 1) + P(n - k, m - 1, k), &amp;amp; 0 &amp;lt; m \leqslant n, 0 &amp;lt; k \leqslant n \\&lt;br /&gt;
P(n, m, n), &amp;amp; k &amp;gt; n \\&lt;br /&gt;
1, &amp;amp; n = 0, m = 0 \\&lt;br /&gt;
0, &amp;amp; \text{otherwise} \end{array} \right. &lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рассмотрим множество разбиений числа &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; слагаемых, каждое из которых не больше &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Разделим его на две непересекающиеся группы — в первой будут все&lt;br /&gt;
разбиения, которые не содержат в качестве старшего слагаемого &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Таких разбиений &amp;lt;tex&amp;gt;P(n, m, k - 1)&amp;lt;/tex&amp;gt;. Во второй — все разбиения со старшим слагаемым &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Их столько же, сколько разбиений числа &amp;lt;tex&amp;gt;n - k&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;m - 1&amp;lt;/tex&amp;gt; слагаемое, каждое из которых не больше &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;P(n - k, m - 1, k)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Количество всех разбиений числа равно &amp;lt;tex&amp;gt;\sum\limits_{i=0}^nP(n, i, n)&amp;lt;/tex&amp;gt;.  Реализация данного алгоритма методом [[Динамическое программирование|динамического программирования]] с меморизацией будет иметь асимптотику &amp;lt;tex&amp;gt;O(n^{3})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм за O(N&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) ==&lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt;P(n,k)&amp;lt;/tex&amp;gt; — количество разбиений числа &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; на слагаемые, каждое из которых не превосходит &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Оно удовлетворяет следующей рекурентной формуле:&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;tex dpi=&amp;quot;145&amp;quot;&amp;gt;P(n,k) = \left \{  &lt;br /&gt;
\begin{array}{ll}  P(n,k - 1) + P(n - k, k), &amp;amp; 0 &amp;lt; k \leqslant n \\  &lt;br /&gt;
P(n, n), &amp;amp; k &amp;gt; n \\&lt;br /&gt;
1, &amp;amp; n = 0, k = 0 \\&lt;br /&gt;
0, &amp;amp; n \neq 0 , k = 0  \end{array}  \right.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что нам не нужно считать количество слагаемых &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; в разбиении. Достаточно посчитать &amp;lt;tex&amp;gt;P(n, k)&amp;lt;/tex&amp;gt; — количество разбиений числа &amp;lt;tex&amp;gt;n&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;P(n, k - 1)&amp;lt;/tex&amp;gt;. Во второй группе — те разбиения, в которые слагаемое &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; вошло. Их количество совпадает с количеством разбиений числа &amp;lt;tex&amp;gt;n - k&amp;lt;/tex&amp;gt; на слагаемые, каждое из которых не превосходит &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, и равно &amp;lt;tex&amp;gt;P(n - k, k)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Количество всех разбиений числа &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; равно &amp;lt;tex&amp;gt;P(n,n)&amp;lt;/tex&amp;gt;. Асимптотика &amp;lt;tex&amp;gt;O(n^{2})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм за O(N&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;) ==&lt;br /&gt;
Рассмотрим алгоритм нахождения количества разбиений числа &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; на слагаемые, который работает за &amp;lt;tex&amp;gt; O(n \sqrt{n}) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Итак, обозначим количество таких разбиений за &amp;lt;tex&amp;gt; p(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим следующее бесконечное произведение:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; (1 + x + x^2 + \dots)(1 + x^2 + x^4 + \dots) \dots (1 + x^k + x^{2k} + \dots) \dots &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После раскрытия скобок каждый член произведения получается в результате умножения мономов (одночленов), взятых по одному из каждой скобки. Если в первой скобке взять &amp;lt;tex dpi = &amp;quot;145&amp;quot;&amp;gt;x^{m_1}&amp;lt;/tex&amp;gt;, во второй — &amp;lt;tex dpi = &amp;quot;145&amp;quot;&amp;gt;x^{2m_2}&amp;lt;/tex&amp;gt; и т.д., то их произведение будет равно &amp;lt;tex dpi = &amp;quot;145&amp;quot;&amp;gt;x^{m_1 + 2m_2 + 3m_3 + \dots}.&amp;lt;/tex&amp;gt; Значит, после раскрытия скобок получится сумма мономов вида &amp;lt;tex dpi = &amp;quot;145&amp;quot;&amp;gt;x^{m_1 + 2m_2 + 3m_3 + \dots}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Можно увидеть, что &amp;lt;tex&amp;gt; x^n &amp;lt;/tex&amp;gt; встретится в полученной бесконечной сумме столько раз, сколькими способами можно представить &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; как сумму &amp;lt;tex&amp;gt;m_1 + 2m_2 + 3m_3 + ...&amp;lt;/tex&amp;gt; Каждому такому представлению отвечает разбиение числа &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;m_1&amp;lt;/tex&amp;gt; единиц, &amp;lt;tex&amp;gt;m_2&amp;lt;/tex&amp;gt; двоек и т.д. Таким образом, очевидно, получаются все разбиения, так как из первой скобки мы можем взять любое &amp;lt;tex&amp;gt;x^{m_i}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m_i \in [0 \dots \infty),&amp;lt;/tex&amp;gt; то есть произвольное количество единиц в нашем разбиении. Аналогично, мы можем взять произвольное количество двоек и т.д. Но при раскрытии скобок мы находим произведения всех возможных комбинации множителей из разных скобок. Поэтому коэффициент при &amp;lt;tex&amp;gt;x^n&amp;lt;/tex&amp;gt; равен числу разбиений &amp;lt;tex&amp;gt;p(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Посмотрим теперь на выражения в скобках. Каждое из них — бесконечная геометрическая прогрессия. Полагая &amp;lt;tex&amp;gt;0 \leqslant x &amp;lt; 1&amp;lt;/tex&amp;gt;, по формуле ее суммирования:&lt;br /&gt;
: &amp;lt;tex dpi = &amp;quot;145&amp;quot;&amp;gt;1 + x + x^2 + x^3 + \dots = \frac{1}{1 - x}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
: &amp;lt;tex dpi = &amp;quot;145&amp;quot;&amp;gt;1 + x^2 + x^4 + x^6 + \dots = \frac{1}{1-x^2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
: &amp;lt;tex&amp;gt;\dots&amp;lt;/tex&amp;gt;&lt;br /&gt;
: &amp;lt;tex dpi = &amp;quot;145&amp;quot;&amp;gt;1 + x^k + x^{2k} + x^{3k} + \dots = \frac{1}{1-x^k}&amp;lt;/tex&amp;gt;&lt;br /&gt;
: &amp;lt;tex&amp;gt;\dots&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запишем теперь [[Производящая функция|производящую функцию]] последовательности &amp;lt;tex&amp;gt;p(n)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
: &amp;lt;tex dpi = &amp;quot;145&amp;quot;&amp;gt;p(0) + p(1) x + p(2) x^2 + p(3) x^3 + \dots = \frac{1}{(1-x)(1-x^2)(1-x^3)\dots}&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рассмотрим произведение &amp;lt;tex&amp;gt;(1-x)(1-x^2)(1-x^3)...&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 - x)(1 - x^2)(1 - x^3) ... = 1 - x - x^2 + x^5 + x^7 - x^{12} - x^{15} + x^{22} + x^{26} - x^{35} - x^{40} + ...&amp;lt;/tex&amp;gt;&lt;br /&gt;
Показатели степеней в правой части — пятиугольные числа&amp;lt;ref name=&amp;quot;pentagon&amp;quot; /&amp;gt;, т.е. числа вида &amp;lt;tex&amp;gt;(3q^2 \pm q)/2&amp;lt;/tex&amp;gt;, а знаки при соответствующих мономах равны &amp;lt;tex&amp;gt;(-1)^q&amp;lt;/tex&amp;gt;. Исходя из этого наблюдения, Эйлер предположил, что должна быть верна следующая теорема, впоследствии названная его именем.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
| about =&lt;br /&gt;
Пентагональная теорема Эйлера&lt;br /&gt;
| statement = &lt;br /&gt;
&amp;lt;tex dpi=&amp;quot;145&amp;quot;&amp;gt; \prod\limits_{k=1}^\infty \left(1-x^k \right) = \sum\limits_{q=-\infty}^\infty (-1)^q x^{\frac{3q^2+q}{2}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
| proof =&lt;br /&gt;
&amp;lt;tex&amp;gt;A = (1-x)(1-x^2)(1-x^3)...(1-x^n)...&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Раскроем в этом произведении первые &amp;lt;tex&amp;gt;22&amp;lt;/tex&amp;gt; скобки. Мы получим выражение &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A = [1-x-x^2+x^5+x^7-x^{12}-x^{15}+x^{22}+...]\times(1-x^{23})(1-x^{24})...(1-x^n)...&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где в квадратной скобке точками обозначены слагаемые, содержащие &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; в более высокой степени, чем &amp;lt;tex&amp;gt;22&amp;lt;/tex&amp;gt;. Не будем выписывать эти члены, так как после умножения квадратной скобки на &amp;lt;tex&amp;gt;1-x^{23}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;1-x^{24}&amp;lt;/tex&amp;gt; и т.д. они изменятся. Выписанные же члены больше меняться не будут. Поэтому, если раскрыть все скобки, то получится бесконечный ряд, первые члены которого имеют вид&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A=1-x-x^2+x^5+x^7-x^{12}-x^{15}+x^{22}+...&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Анализируя этот ряд, Эйлер пришел к выводу, что, если превратить бесконечное произведение &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A = (1-x)(1-x^2)(1-x^3)...(1-x^n)...&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в ряд, то в этом ряду отличны от нуля лишь слагаемые, вида &amp;lt;tex dpi=&amp;quot;145&amp;quot;&amp;gt;(-1)^q x^{\frac{3q^2+q}{2}}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; — натуральное число.&lt;br /&gt;
&lt;br /&gt;
При раскрытии скобок в исходном произведении слагаемое &amp;lt;tex&amp;gt;\pm x^N&amp;lt;/tex&amp;gt; встретится столько раз, сколькими способами можно разбить число &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; на различные слагаемые. При этом, если число слагаемых четно, то появляется &amp;lt;tex&amp;gt;x^N&amp;lt;/tex&amp;gt;, а если это число нечетно, то появляется &amp;lt;tex&amp;gt;-x^N&amp;lt;/tex&amp;gt;. Например, разбиению &amp;lt;tex&amp;gt;12=5+4+2+1&amp;lt;/tex&amp;gt; соответствует слагаемое &amp;lt;tex&amp;gt;(-x^5)(-x^4)(-x^2)(-x^1)=x^{12},&amp;lt;/tex&amp;gt; а разбиению &amp;lt;tex&amp;gt;12=5+4+3&amp;lt;/tex&amp;gt; — слагаемое &amp;lt;tex&amp;gt;(-x^5)(-x^4)(-x^3)=-x^{12}&amp;lt;/tex&amp;gt;. Таким образом, коэффициент при &amp;lt;tex&amp;gt;x^N&amp;lt;/tex&amp;gt; в разложении &amp;lt;tex&amp;gt;A&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; на нечетное число различных слагаемых. Тогда теорему можно переформулировать следующим образом:&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
| about = &lt;br /&gt;
Переформулировка пентагональной теоремы&lt;br /&gt;
| statement = &lt;br /&gt;
Если число &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; не может быть представлено в виде &amp;lt;tex dpi=&amp;quot;145&amp;quot;&amp;gt;N =\frac{3q^2+q}{2}&amp;lt;/tex&amp;gt;, то оно имеет одинаковое количество разбиений на четное и на нечетное число различных слагаемых. А для чисел вида &amp;lt;tex dpi=&amp;quot;145&amp;quot;&amp;gt;N =\frac{3q^2+q}{2}&amp;lt;/tex&amp;gt; разность между этими количествами равна &amp;lt;tex&amp;gt;(-1)^q&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Иными словами, если &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; четно, то на одно больше разбиений на четное число слагаемых, а если &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; нечетно, то на одно больше разбиений на нечетное число слагаемых. Докажем эту теорему с помощью диаграмм Юнга&amp;lt;ref name=&amp;quot;young&amp;quot; /&amp;gt;. Покажем несколько способов превращения диаграммы с четным числом строк  диаграмму из стольких же точек с нечетным числом строк и обратно.&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем лишь разбиения на различные слагаемые, то диаграммы таких разбиений состоят из нескольких трапеций, поставленных друг на друга. Обозначим число точек в верхней строке диаграммы через &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;, а число строк нижней трапеции через &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; (на рис. 1 слева   изображена диаграмма, для которой &amp;lt;tex&amp;gt;m=2&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;n=3&amp;lt;/tex&amp;gt;).&lt;br /&gt;
[[Файл:Diagramma_2_3.jpg|thumb|right|500px|Рис. 1. &amp;lt;tex&amp;gt;m = 2, n = 3&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
'''Преобразование 1.''' Предположим, что диаграмма содержит не менее двух трапеций, причем &amp;lt;tex&amp;gt;m \leqslant n&amp;lt;/tex&amp;gt;. В этом случае отбросим первую строку из &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; точек, но удлиним последние &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; строк нижней трапеции на одну точку (рис. 1). После этого общее число точек не изменится, все строки окажутся различной длины, но четность числа строк изменится.&lt;br /&gt;
&lt;br /&gt;
Точно такое же преобразование можно сделать, если диаграмма состоит из одной  трапеции, но &amp;lt;tex&amp;gt;n \geqslant m+1&amp;lt;/tex&amp;gt;. Стираем верхнюю строку и к нижним &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; строчкам приписываем &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; точек.&lt;br /&gt;
&lt;br /&gt;
'''Преобразование 2.'''Пусть теперь диаграмма опять содержит не менее двух трапеций, но &amp;lt;tex&amp;gt;m &amp;gt; n&amp;lt;/tex&amp;gt;. Тогда от каждой строки последней трапеции возьмем по одной точке и составим из них первую строку (из &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; точек) новой диаграммы. Это можно сделать, так как &amp;lt;tex&amp;gt;m &amp;gt; n&amp;lt;/tex&amp;gt;, и поэтому составленная строка короче первой строки исходной диаграммы. Кроме того, так как мы взяли все строки будут иметь различную длину. Наконец, новая диаграмма содержит столько же точек, что и исходная, но четность числа строк изменилась - новая диаграмма содержит еще одну строку.&lt;br /&gt;
&lt;br /&gt;
Преобразование 2 допускают и диаграммы, состоящие из одной трапеции, если &amp;lt;tex&amp;gt;n \leqslant m - 2&amp;lt;/tex&amp;gt; (появляющаяся первая строка состоит из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; точек, она должна быть короче бывшей первой строки, уменьшившейся до &amp;lt;tex&amp;gt;m-1&amp;lt;/tex&amp;gt; точки).&lt;br /&gt;
&lt;br /&gt;
Легко видеть, что описанные преобразования взаимно обратны - если сначала сделать одно из них, а потом второе, то снова получим исходную диаграмму. Кроме того, для каждой диаграммы может быть допустимо лишь одно из этих преобразований. Таким образом, диаграммы разбиений числа &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, допускающие одно из этих преобразований, распадаются на пары диаграмм с четным и нечетным числом строк, поэтому их одинаковое число.&lt;br /&gt;
&lt;br /&gt;
Осталось выяснить, какие же диаграммы не допускают ни одного из описанных преобразований. Ясно, что эти диаграммы состоят из одной трапеции, причем для них либо &amp;lt;tex&amp;gt;m=n&amp;lt;/tex&amp;gt;, либо &amp;lt;tex&amp;gt;m=n+1&amp;lt;/tex&amp;gt;. В первом случае диаграмма содержит&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex dpi=&amp;quot;145&amp;quot;&amp;gt;n+(n+1)+(n+2)+\dots+(2n-1)=\frac{3n^2-n}{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
точек, а во втором - на &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; точек больше, т.е. &amp;lt;tex dpi=&amp;quot;145&amp;quot;&amp;gt;\frac{3n^2+n}{2}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведенные рассуждения показывают, что если &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; не является числом вида &amp;lt;tex dpi=&amp;quot;145&amp;quot;&amp;gt;\frac{3n^2 \pm n}{2}&amp;lt;/tex&amp;gt;, то оно имеет поровну разбиений на четное и нечетное число различных слагаемых.&lt;br /&gt;
&lt;br /&gt;
Очевидно также, что равенства &amp;lt;tex dpi=&amp;quot;145&amp;quot;&amp;gt;N=\frac{3n^2+n}{2}&amp;lt;/tex&amp;gt; и &amp;lt;tex dpi=&amp;quot;145&amp;quot;&amp;gt;N=\frac{3l^2-l}{2}&amp;lt;/tex&amp;gt; одновременно выполняться не могут, поэтому если &amp;lt;tex dpi =&amp;quot;145&amp;quot;&amp;gt;N=\frac{3n^2\pm n}{2}&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;n&amp;lt;/tex&amp;gt; - четное число, то разбиений на четное число слагаемых окажется на &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&amp;lt;/tex&amp;gt; больше будет разбиений на нечетное число слагаемых. Теорема доказана.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Умножим обе части равенства &amp;lt;tex&amp;gt;(1)&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;\prod\limits_{k=1}^\infty \left(1-x^k \right) &amp;lt;/tex&amp;gt; и воспользуемся пентагональной теоремой:&lt;br /&gt;
: &amp;lt;tex&amp;gt; ( p(0) + p(1) x + p(2) x^2 + \dots)(1 - x - x^2 + x^5 + x^7 - x^{12} - x^{15} + \dots) = 1 &amp;lt;/tex&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;(2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Начнем раскрывать скобки, для наглядности мономы с одинаковыми степенями &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; пишем друг под другом:&lt;br /&gt;
: &amp;lt;tex&amp;gt; p(0) + p(1)x + p(2) x^2 + p(3) x^3 + p(4) x^4 + p(5) x^5 + p(6) x^6 + \dots &amp;lt;/tex&amp;gt;&lt;br /&gt;
::&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt; - p(0)x - p(1) x^2 - p(2) x^3 - p(3) x^4 - p(4) x^5 - p(5) x^6 - \dots &amp;lt;/tex&amp;gt;&lt;br /&gt;
::::&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;lt;tex&amp;gt;  - p(0) x^2 - p(1) x^3 - p(2) x^4 - p(3) x^5 - p(4) x^6 - \dots &amp;lt;/tex&amp;gt;&lt;br /&gt;
::::::::::::: &amp;amp;nbsp;&amp;lt;tex&amp;gt;+ p(0) x^5 + p(1) x^6 + \dots &amp;lt;/tex&amp;gt;     &lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;p(0) = 1&amp;lt;/tex&amp;gt;, то оно сокращается с единицей справа. Так что, чтобы выражение &amp;lt;tex&amp;gt;(2)&amp;lt;/tex&amp;gt; было удовлетворено при любом &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, все коэффициенты должны быть равны &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;. Поэтому:&lt;br /&gt;
: &amp;lt;tex&amp;gt; p(1) = p(0) &amp;lt;/tex&amp;gt;&lt;br /&gt;
: &amp;lt;tex&amp;gt; p(2) = p(1) + p(0) &amp;lt;/tex&amp;gt;&lt;br /&gt;
: &amp;lt;tex&amp;gt; p(3) = p(2) + p(1) &amp;lt;/tex&amp;gt;&lt;br /&gt;
: &amp;lt;tex&amp;gt; p(4) = p(3) + p(2) &amp;lt;/tex&amp;gt;&lt;br /&gt;
: &amp;lt;tex&amp;gt; p(5) = p(4) + p(3) - p(0) &amp;lt;/tex&amp;gt;&lt;br /&gt;
: &amp;lt;tex&amp;gt;...&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Получаем формулу Эйлера, позволяющую последовательно находить числа &amp;lt;tex&amp;gt;p(n)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
: &amp;lt;tex dpi=&amp;quot;145&amp;quot;&amp;gt; p(n) = p(n-1) + p(n-2)+ ... + (-1)^{q+1} (p\left(n - \frac{3q^2 - q}{2}\right) + p\left(n - \frac{3q^2 + q}{2}\right)) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Асимптотика &amp;lt;tex&amp;gt; O(n \sqrt{n}) &amp;lt;/tex&amp;gt; получается следующим образом. Так как &amp;lt;tex dpi=&amp;quot;145&amp;quot;&amp;gt; n - \frac{3q^2 + q}{2} \geqslant 0 &amp;lt;/tex&amp;gt; , то получаем &amp;lt;tex&amp;gt; q &amp;lt;/tex&amp;gt; порядка &amp;lt;tex&amp;gt; \sqrt{n} &amp;lt;/tex&amp;gt;, а так как находим &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;-е число, то получаем &amp;lt;tex&amp;gt; O(n \sqrt{n}) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;amount&amp;quot;&amp;gt;[http://oeis.org/A000041 Последовательность 000041 на OEIS]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;pentagon&amp;quot;&amp;gt;[http://ru.wikipedia.org/wiki/%D0%A4%D0%B8%D0%B3%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%B0#.D0.9F.D1.8F.D1.82.D0.B8.D1.83.D0.B3.D0.BE.D0.BB.D1.8C.D0.BD.D1.8B.D0.B5_.D1.87.D0.B8.D1.81.D0.BB.D0.B0 Википедия {{---}} Пятиугольные числа]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;young&amp;quot;&amp;gt;[http://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D0%B5%D0%BD%D0%B8%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%B0#.D0.94.D0.B8.D0.B0.D0.B3.D1.80.D0.B0.D0.BC.D0.BC.D1.8B_.D0.AE.D0.BD.D0.B3.D0.B0 Википедия {{---}} Диаграммы Юнга]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
* [[Числа Стирлинга первого рода]]&lt;br /&gt;
* [[Числа Стирлинга второго рода]]&lt;br /&gt;
* [[Производящая функция]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Pentagonal_number_theorem Wikipedia {{---}} Pentagonal number theorem]&lt;br /&gt;
* [http://kvant.mirror1.mccme.ru/1988/11/razbienie_chisel.htm Вайнштейн Ф., Разбиение чисел. Журнал &amp;quot;Квант&amp;quot; № 11, 1988 год]&lt;br /&gt;
* Н.Я. Виленкин &amp;quot;Комбинаторика&amp;quot;, 2007. стр. 138-141.&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=CAP_%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0&amp;diff=82953</id>
		<title>CAP теорема</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=CAP_%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0&amp;diff=82953"/>
				<updated>2022-09-01T03:55:51Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Категория: Параллельное программирование]]&lt;br /&gt;
'''CAP-теорема''' — утверждение о том, что в распределённых системах нельзя одновременно добиться трёх свойств:&lt;br /&gt;
* '''C'''onsistency — на всех ''не отказавших'' узлах одинаковые (с точки зрения пользователя) данные&lt;br /&gt;
* '''A'''vailability — запросы ко всем ''не отказавшим'' узлам возвращают ответ&lt;br /&gt;
* '''P'''artition tolerance — даже если связь в системе стала нестабильной (вплоть до разделения системы на куски), но узлы работают, то система в целом продолжает работать&lt;br /&gt;
&lt;br /&gt;
Формально мы это не формулировали и не доказывали.&lt;br /&gt;
Оригинальная формулировка — Brewer's Conjecture (2000), а формализовано в работе Gilbert &amp;amp; Lynch (2004).&lt;br /&gt;
Там есть много тонкостей с тем, что такое &amp;quot;не отказавший узел&amp;quot;, &amp;quot;одинаковые данные&amp;quot;, &amp;quot;разрыв связи&amp;quot;, &amp;quot;система продолжает работать&amp;quot;, &amp;quot;когда система всё-таки окончательно ломается и считается недоступной&amp;quot; и тому подобное.&lt;br /&gt;
&lt;br /&gt;
Для общей эрудиции выглядят неплохо статьи&amp;lt;ref&amp;gt;http://blog.thislongrun.com/2015/04/the-unclear-cp-vs-ca-case-in-cap.html&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;https://habr.com/ru/post/322276/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Классификация алгоритмов ==&lt;br /&gt;
А вот алгоритмы, которые удовлетворяют хотя бы двум свойствам, можно нарисовать на диаграмма Венна:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Distributed-cap.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Дальше идут объяснения с лекции, они отличаются в разных источниках (например, где-то 2PC идёт вместе с Paxos в CP, а не в CA&amp;lt;ref&amp;gt;http://www.cedanet.com.au/ceda/fallacies/cap-theorem.php&amp;lt;/ref&amp;gt;), а где-то совпадают с лекцией&amp;lt;ref&amp;gt;http://book.mixu.net/distsys/single-page.html#the-cap-theorem&amp;lt;/ref&amp;gt;, а где-то считают, что не-partition tolerance не нужно&amp;lt;ref&amp;gt;https://codahale.com/you-cant-sacrifice-partition-tolerance/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Если мы хотим согласованность и доступность, то используем [[2 Phase Commit|протокол двухфазного коммита]]: он гарантирует нам согласованное состояние глобально во всей системе и мы всегда можем обслуживать запросы (если только не упал узел с соответствующими данными). Но если потерялась связь (а узлы не упали), то какие-то запросы нельзя обработать, потому что часть данных может быть в одной половине, а часть в другой. Каждый кусок всё ещё будет работать по отдельности, но глобальные транзакции выполнять мы не сможем.&lt;br /&gt;
* Иногда нам не так важна согласованность и мы согласны на простую eventual consistency — это когда информация может быть доступна не сразу везде, а только через какое-то время, если система здорова. Сюда идут [[gossip-протоколы]].&lt;br /&gt;
* Если мы хотим согласованность и толерантность к разделению, то надо жертвовать доступностью. Например, при помощи Paxos мы можем хранить все данные сразу на всех узлах, но тогда узлы, оказавшиеся в меньшинстве, ничего сделать не могут.&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D0%B0%D0%B1%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D1%8A%D1%8E%D0%BD%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%B5%D0%B4%D0%B8%D0%BA%D0%B0%D1%82&amp;diff=82952</id>
		<title>Слабый конъюнктивный предикат</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D0%B0%D0%B1%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D1%8A%D1%8E%D0%BD%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%B5%D0%B4%D0%B8%D0%BA%D0%B0%D1%82&amp;diff=82952"/>
				<updated>2022-09-01T03:55:40Z</updated>
		
		<summary type="html">&lt;p&gt;185.220.101.2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;color: red; background-color: black; font-size: 56px; width: 800px;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|'''НЕТ ВОЙНЕ'''&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.&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;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.&lt;br /&gt;
|-style=&amp;quot;font-size: 16px;&amp;quot;&lt;br /&gt;
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Категория: Параллельное программирование]]&lt;br /&gt;
'''Слабый конъюнктивный предикат (WCP)''' – предикат, удовлетворяющий двум условиям:&lt;br /&gt;
* имеет вид конъюнкции локальных предикатов над состоянием каждого процесса; &lt;br /&gt;
* его истинность есть истинность хотя бы на одном согласованном срезе.&lt;br /&gt;
&lt;br /&gt;
'''Локальный предикат''' – предикат по состоянию одного процесса. Например, если у процесса есть состояние (переменная) x, то локальным предикатом может быть (x &amp;lt; 0).&lt;br /&gt;
&lt;br /&gt;
Пример WCP предиката: “в системе нет координатора”, причем локальное условие – “я не координатор”.&lt;/div&gt;</summary>
		<author><name>185.220.101.2</name></author>	</entry>

	</feed>