<?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=188.162.65.12&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=188.162.65.12&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/188.162.65.12"/>
		<updated>2026-07-03T03:52:43Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A6%D0%B5%D0%BF%D0%BD%D1%8B%D0%B5_%D0%BA%D0%BE%D0%B4%D1%8B&amp;diff=50039</id>
		<title>Цепные коды</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A6%D0%B5%D0%BF%D0%BD%D1%8B%D0%B5_%D0%BA%D0%BE%D0%B4%D1%8B&amp;diff=50039"/>
				<updated>2015-11-26T07:20:35Z</updated>
		
		<summary type="html">&lt;p&gt;188.162.65.12: /* а2...0 короче чем а1...0. Очевидно имелся ввиду а2...00 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Chain4.png|right]]&lt;br /&gt;
'''Цепной код''' (англ. ''chain code'') — это такое упорядочивание двоичных векторов одной длины, каждый следующий столбец которого (можно рассматривать как таблицу из &amp;lt;tex&amp;gt;2^n \times 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;n&amp;lt;/tex&amp;gt; нулей. Чтобы получить следующий вектор, берём последний добавленный вектор, пусть &amp;lt;tex&amp;gt;a_1\dots a_n&amp;lt;/tex&amp;gt;. Если в коде до этого не встречался вектор &amp;lt;tex&amp;gt;a_2\dots a_n 1&amp;lt;/tex&amp;gt;, то добавляем его. Иначе проверяем на наличие в коде вектора &amp;lt;tex&amp;gt;a_2\dots a_n 0&amp;lt;/tex&amp;gt;. Если такой не встречался, добавляем его. Если вектор уже встречался, значит, генерация кода закончена.&lt;br /&gt;
&lt;br /&gt;
При таком построении видно, что элементы таблицы &amp;lt;tex&amp;gt; a_1^i\dots a_1^{i+n}&amp;lt;/tex&amp;gt; равны элементам &amp;lt;tex&amp;gt; a_1^i\dots a_n^i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Псевдокод алгоритма ==&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt {current}&amp;lt;/tex&amp;gt; — последний добавленный битовый вектор&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt {result}&amp;lt;/tex&amp;gt; — список битовых векторов&lt;br /&gt;
&lt;br /&gt;
 '''string[]''' chain_code('''int''' n):&lt;br /&gt;
   current = '0' * n&lt;br /&gt;
   result = [current]&lt;br /&gt;
   '''while''' ''true''&lt;br /&gt;
     prefix = current[2..n]&lt;br /&gt;
     '''if''' prefix + '1' '''not in''' result&lt;br /&gt;
       current = prefix + '1'&lt;br /&gt;
     '''else''' prefix + '0' '''not in''' result&lt;br /&gt;
       current = prefix + '0'&lt;br /&gt;
     '''else'''&lt;br /&gt;
       '''break'''&lt;br /&gt;
     result.append(current)&lt;br /&gt;
   '''return''' result&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;
&lt;br /&gt;
===Доказательство первого пункта===&lt;br /&gt;
Покажем, что единственная ситуация, когда требуется сгенерировать новый вектор, а оба возможных варианта (добавление нуля или единицы) уже добавлены — сгенерирован вектор из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; нулей. Рассмотрим первое такое противоречие: последним добавлен вектор &amp;lt;tex&amp;gt;a_1 a_2 \dots a_n&amp;lt;/tex&amp;gt;, вектора &amp;lt;tex&amp;gt;a_2 \dots 1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;a_2 \dots a_n 0&amp;lt;/tex&amp;gt; уже присутствуют в коде.&lt;br /&gt;
&lt;br /&gt;
Далее есть две возможных ситуации: вектор &amp;lt;tex&amp;gt;a_2 \dots a_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;a_2 \dots a_n 1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;a_2 \dots a_n 0&amp;lt;/tex&amp;gt; предшествовали некоторые вектора в коде, пусть &amp;lt;tex&amp;gt;B_1 = b_1 a_2 \dots a_n&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B_2 = b_2 a_2 \dots a_n&amp;lt;/tex&amp;gt;. Так как мы рассматриваем первое противоречие, то &amp;lt;tex&amp;gt;b_1 \neq b_2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Но в таком случае вектор &amp;lt;tex&amp;gt;a_1 a_2 \dots a_n&amp;lt;/tex&amp;gt; совпадает с одним из векторов &amp;lt;tex&amp;gt;B_1&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;B_2&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;Z&amp;lt;/tex&amp;gt;, которые не были сгенерированы алгоритмом и оканчиваются на ноль.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;a_1 a_2 \dots a_{n - 1} 0 \in Z&amp;lt;/tex&amp;gt;. Докажем, что &amp;lt;tex&amp;gt;a_2 \dots a_{n - 1} 0 0 \in Z&amp;lt;/tex&amp;gt;. От противного, пусть вектор &amp;lt;tex&amp;gt;a_2 \dots a_{n - 1} 0 0 &amp;lt;/tex&amp;gt; был сгенерирован. Тогда ему предшествовал вектор &amp;lt;tex&amp;gt;b_1 a_2 \dots a_{n - 1} 0&amp;lt;/tex&amp;gt;. Так как по предположению &amp;lt;tex&amp;gt;b_1 \neq a_1&amp;lt;/tex&amp;gt;, то в коде может быть только один вектор такого вида, а в таком случае алгоритм может сгенерировать только &amp;lt;tex&amp;gt;a_2 \dots a_{n - 1} 0 1&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;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;a_1 \dots a_{n - 1} 0&amp;lt;/tex&amp;gt;. Ему предшествовал некоторый вектор &amp;lt;tex&amp;gt;b_1 a_1 \dots a_{n - 1}&amp;lt;/tex&amp;gt;. Так как алгоритм сначала пытается поместить в код вектор &amp;lt;tex&amp;gt;a_1 \dots a_{n - 1} 1&amp;lt;/tex&amp;gt;, то на этом шаге вектор &amp;lt;tex&amp;gt;a_1 \dots a_{n - 1} 1&amp;lt;/tex&amp;gt; уже присутсовал в коде. Предыдущее рассуждение показывает, что всякий вектор вида &amp;lt;tex&amp;gt;a_1 \dots a_{n - 1} 0&amp;lt;/tex&amp;gt; был добавлен в код, а значит, и вектор вида &amp;lt;tex&amp;gt;a_1 \dots a_{n - 1} 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;
*[http://en.wikipedia.org/wiki/Chain_code Wikipedia  {{---}} Chain code]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Комбинаторика ]]&lt;/div&gt;</summary>
		<author><name>188.162.65.12</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Iloskutov&amp;diff=49150</id>
		<title>Участник:Iloskutov</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Iloskutov&amp;diff=49150"/>
				<updated>2015-09-02T16:00:08Z</updated>
		
		<summary type="html">&lt;p&gt;188.162.65.12: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Игнат Лоскутов, гр. M3338&lt;/div&gt;</summary>
		<author><name>188.162.65.12</name></author>	</entry>

	</feed>