<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://vscripts.ru/w/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>https://vscripts.ru/w/index.php?feed=atom&amp;namespace=0&amp;title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F%3A%D0%9D%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B</id>
		<title>Модулярная арифметика - Новые страницы [ru]</title>
		<link rel="self" type="application/atom+xml" href="https://vscripts.ru/w/index.php?feed=atom&amp;namespace=0&amp;title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F%3A%D0%9D%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B"/>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%9D%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B"/>
		<updated>2026-05-21T02:52:09Z</updated>
		<subtitle>Материал из Модулярная арифметики</subtitle>
		<generator>MediaWiki 1.23.17</generator>

	<entry>
		<id>https://vscripts.ru/w/%D0%90%D0%BF%D0%BF%D0%B0%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%B5_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%81%D1%83%D0%BC%D0%BC%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%B8_%D1%83%D0%BC%D0%BD%D0%BE%D0%B6%D0%B8%D1%82%D0%B5%D0%BB%D0%B5%D0%B9_%D0%BD%D0%B0_%D0%B1%D0%B0%D0%B7%D0%B5_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B9_%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B_%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8</id>
		<title>Аппаратные реализации модулярных сумматоров и умножителей на базе минимизированной таблицы истинности</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%90%D0%BF%D0%BF%D0%B0%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%B5_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%81%D1%83%D0%BC%D0%BC%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%B8_%D1%83%D0%BC%D0%BD%D0%BE%D0%B6%D0%B8%D1%82%D0%B5%D0%BB%D0%B5%D0%B9_%D0%BD%D0%B0_%D0%B1%D0%B0%D0%B7%D0%B5_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B9_%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B_%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8"/>
				<updated>2015-12-21T10:18:35Z</updated>
		
		<summary type="html">&lt;p&gt;Turbo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В данной статье приведен метод реализации модулярных сумматоров и умножителей на базе таблиц истинности, минимизированных с помощью [[Алгоритм Espresso|Espresso]].&lt;br /&gt;
&lt;br /&gt;
== Описание ==&lt;br /&gt;
&lt;br /&gt;
Модулярные сумматоры и умножители в силу своей малой размерности могут быть реализованы как произвольная логическая функция и описана в виде таблицы истинности. Если размерность модуля &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; равна &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; бит, то таблица истинности будет иметь &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt; входных столбцов и &amp;lt;math&amp;gt;2^{2k}&amp;lt;/math&amp;gt; строк. Для выходов будет соответственно &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; столбцов. Так как в модулярных устройствах размерность модуля небольшая, то и размерность таблицы истинности обычно приемлемых размеров. Получив таблицу истинности её можно минимизировать и записать для каждого выхода выражение как ДНФ. &lt;br /&gt;
&lt;br /&gt;
== Пример Verilog файла ==&lt;br /&gt;
&lt;br /&gt;
* Пример для умножителя по модулю 5.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module mul_modulo_5 (A, B, X);&lt;br /&gt;
    input [2:0] A;&lt;br /&gt;
    input [2:0] B;&lt;br /&gt;
    output[2:0] X;&lt;br /&gt;
&lt;br /&gt;
    assign X[0] = (A[0]&amp;amp;B[0]&amp;amp;~B[1]) | (~A[0]&amp;amp;A[1]&amp;amp;B[0]&amp;amp;B[1]) | (A[0]&amp;amp;~A[1]&amp;amp;B[0]) | (A[0]&amp;amp;A[1]&amp;amp;~B[0]&amp;amp;B[1]) | (A[2]&amp;amp;B[2]) | (A[2]&amp;amp;~B[0]&amp;amp;B[1]) | (~A[0]&amp;amp;A[1]&amp;amp;B[2]);&lt;br /&gt;
    assign X[1] = (A[0]&amp;amp;~A[1]&amp;amp;B[1]) | (A[1]&amp;amp;B[0]&amp;amp;~B[1]) | (A[1]&amp;amp;B[2]) | (A[2]&amp;amp;B[1]);&lt;br /&gt;
    assign X[2] = (A[0]&amp;amp;~A[1]&amp;amp;B[2]) | (~A[0]&amp;amp;A[1]&amp;amp;~B[0]&amp;amp;B[1]) | (A[0]&amp;amp;A[1]&amp;amp;B[0]&amp;amp;B[1]) | (A[2]&amp;amp;B[0]&amp;amp;~B[1]);&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки на файлы ==&lt;br /&gt;
&lt;br /&gt;
Модулярные сумматоры и умножители были синтезированы для всех модулей от 2 до 255 включительно. Скачать Verilog файлы можно ниже:&lt;br /&gt;
* [http://vscripts.ru/res/2015/sum_mod3-255_espr.7z Модулярные сумматоры (.7z ~3MB)]&lt;br /&gt;
* [http://vscripts.ru/res/2015/mul_mod3-255_espr.7z Модулярные умножители (.7z ~40MB)]&lt;/div&gt;</summary>
		<author><name>Turbo</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%9F%D1%80%D0%BE%D1%81%D1%82%D0%BE%D0%B9_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D1%82%D0%B8%D0%BF_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D1%80%D0%B0_%D1%81_%D0%BA%D0%BE%D1%80%D1%80%D0%B5%D0%BA%D1%86%D0%B8%D0%B5%D0%B9_%D1%81%D0%B1%D0%BE%D0%B5%D0%B2</id>
		<title>Простой прототип модулярного процессора с коррекцией сбоев</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%9F%D1%80%D0%BE%D1%81%D1%82%D0%BE%D0%B9_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D1%82%D0%B8%D0%BF_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D1%80%D0%B0_%D1%81_%D0%BA%D0%BE%D1%80%D1%80%D0%B5%D0%BA%D1%86%D0%B8%D0%B5%D0%B9_%D1%81%D0%B1%D0%BE%D0%B5%D0%B2"/>
				<updated>2015-12-07T09:20:45Z</updated>
		
		<summary type="html">&lt;p&gt;Turbo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
'''Базис полный (78 бит):''' &lt;br /&gt;
&lt;br /&gt;
3 5 7 11 13 17 23 29 31 37 41 43 47 53 59 61 64 (Динамический диапазон: 197538326500053845866560 или 78 бит)&lt;br /&gt;
&lt;br /&gt;
'''Рабочие модули (66 бит):'''&lt;br /&gt;
&lt;br /&gt;
3 5 7 11 13 17 23 29 31 37 41 43 47 53 59 (Динамический диапазон: 50598956583005595765 или 66 бит)&lt;br /&gt;
&lt;br /&gt;
'''Проверочные модули:''' &lt;br /&gt;
&lt;br /&gt;
61 64&lt;br /&gt;
&lt;br /&gt;
Указанный базис включает 8-битные модули (значения для модуля 64, тоже укладываются в 8 бит). Особенность модулярной арифметики не позволяет без существенных затрат определять факт переполнения, поэтому за переполнением диапазона должен следить программист.&lt;br /&gt;
&lt;br /&gt;
== Состав памяти ==&lt;br /&gt;
# Регистр позиционный 78-битный для ввода / вывода RPOS&lt;br /&gt;
# Регистры модулярные AMOD, BMOD, CMOD и DMOD для операций&lt;br /&gt;
# Регистры U0, U1, U2, U3 - 12-битные для условных переходов.&lt;br /&gt;
# Регистр флагов F1 - F16 (F1 - флаг наличия ошибки)&lt;br /&gt;
# Программное ПЗУ - здесь хранится программа предварительно записанная в память устройства. Она не будет меняться до момента перепрошивки. Указатель текущей команды стоит в нулевой позиции перед запуском программы.&lt;br /&gt;
# Модулярное ОЗУ - размер 4096 строк по модулям (см. &amp;quot;Базис полный&amp;quot;)&lt;br /&gt;
# Модулярное ОЗУ - размер 64 строки для хранения позиционных данных&lt;br /&gt;
&lt;br /&gt;
== Таблица микрокоманд ==&lt;br /&gt;
&amp;lt;table border=1 cellpadding=5 cellspacing=0&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;&amp;lt;b&amp;gt;Код команды (5 бит)&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;&amp;lt;b&amp;gt;Параметр 1 (кол-во бит)&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;&amp;lt;b&amp;gt;Параметр 2 (кол-во бит)&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;&amp;lt;b&amp;gt;Параметр 3 (кол-во бит)&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;&amp;lt;b&amp;gt;Описание команды&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=7&amp;gt;&amp;lt;b&amp;gt;Обмен данными:&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;---&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=4 &amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Взять число с внешнего устройства и положить в RPOS&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Код регистра (2 бита)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Код регистра U (2 бита)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=3 &amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Отправить число из модулярного регистра (AMOD, ... DMOD) в модулярное ОЗУ по указанному адресу (адрес указан в U)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;2&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Код регистра (2 бита)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Код регистра U (2 бита)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=3 &amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Отправить число из ОЗУ по указанному адресу (адрес указан в U) в модулярный регистр (AMOD, ... DMOD)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;3&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Адрес в позиционном ОЗУ (8 бит)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=4 &amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Отправить число из позиционного регистра (RPOS) в позиционное ОЗУ по указанному адресу&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;4&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Адрес в позиционном ОЗУ (8 бит)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=4 &amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Отправить число из позиционное ОЗУ по указанному адресу в позиционный регистр (RPOS)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;5&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Код регистра (2 бита)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Код регистра (2 бита)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=3 &amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Скопировать данные из одного регистра в другой (первые 4 бита модулярные, вторые 4 бита U)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=7&amp;gt;&amp;lt;b&amp;gt;Преобразования между системами счисления:&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;8&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Код регистра (2 бита)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=4 &amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Преобразовать число в RPOS в модулярный вид и переложить в один из&lt;br /&gt;
  регистров (AMOD, ....)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;9&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Код регистра (2 бита)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=4 &amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Преобразовать число из модулярного регистра (AMOD, ... DMOD) в позиционный вид и положить в RPOS (в случае наличия ошибки, регистр F1 будет содержать 1)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
   &amp;lt;td colspan=7&amp;gt;&amp;lt;b&amp;gt;Арифметические операции:&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;11&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Код регистра (2 бита)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Код регистра (2 бита)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=3 &amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Сложить числа из заданных модулярных регистров и положить результат в первый регистр (без контроля переполнения, за переполнением следит программист)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;12&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Код регистра (2 бита)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Код регистра (2 бита)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=3 &amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Умножить числа из заданных модулярных регистров и положить результат в первый регистр (без контроля переполнения, за переполнением следит программист)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;13&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Код регистра (2 бита)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=4 &amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Обнулить заданный модулярный регистр (AMOD-DMOD)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;14&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;---&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=4 &amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Обнулить RPOS&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;15&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Код регистра (2 бита)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Код канала (5 бит)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Значение для модуля (8 бит)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=2 &amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Положить в модулярный регистр (AMOD-DMOD) модулярный канал номер N заданное значение K (меньше N)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=7&amp;gt;&amp;lt;b&amp;gt;Проверка на ошибки:&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;16&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Код регистра (2 бита)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Позиция в стеке команд (14 бит)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=3 &amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Проверить есть ли ошибка в указаном регистре (за счет двух проверочных модулей) в случае отсутствия ошибки перейти по указанному адресу&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;17&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Код регистра (2 бита)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=4 &amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Исправить однократную ошибку в указанном регистре (дольше чем проверка)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=7&amp;gt;&amp;lt;b&amp;gt;Условные переходы:&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;18&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Код регистра U (2 бита)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Адрес в позиционном ОЗУ (8 бит)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=3 &amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Установить значение регистра U0, U1, U2 или U3 значение взятое из ячейки позиционного ОЗУ&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;19&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Код регистра U (2 бита)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Значение (14 бит)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=3 &amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Установить значение регистра U0, U1, U2 или U3 значение переданное в команде&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;20&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Код регистра U (2 бита)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=4 &amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Установить значение регистра U0, U1, U2 или U3 значение 0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;21&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Код регистра U (2 бита)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=4 &amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Вычесть из значения регистра U0, U1, U2 или U3 единицу&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;22&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Код регистра U (2 бита)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=4 &amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Прибавть к регистру U0, U1, U2 или U3 единицу&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td &amp;gt;23&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Код регистра U (2 бита)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Позиция в стеке команд (14 бит)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td colspan=3 &amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Переход к команде в позиции X (в стеке команд) если в регистре U0, U1, U2 или U3 значение равно 0.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Пример решаемой задачи ==&lt;br /&gt;
Написать программу, которая выполняет скалярное произведение произвольного числа 32-х битных элементов менее чем 1024 в формате - сначала подается число элементов вектора (N), затем последовательно сначала элемент вектора 1, потом элемент вектора 2 и.т.д. Всего 2*N значений. Финальный результат проверяется на ошибки, в случае наличия ошибки в рассчетах выполняется пересчет.&lt;br /&gt;
&lt;br /&gt;
== Текстовое описание программы ==&lt;br /&gt;
Описание приводится с использованием команд, которые поддерживает процессорное ядро.&lt;br /&gt;
&lt;br /&gt;
* 0: Обнулить CMOD&lt;br /&gt;
* 1: Обнулить U1&lt;br /&gt;
* 2: Взять число с внешнего устройства - положить в RPOS&lt;br /&gt;
* 3: Отправить число из позиционного регистра (RPOS) в позиционное ОЗУ по адресу 0&lt;br /&gt;
* 4: Установить регистр U0 в значение взятое из ячейки позиционного ОЗУ по адресу 0&lt;br /&gt;
* 5: Перейти к команде 18 программы если в U0 находится 0&lt;br /&gt;
* 6: Взять число с внешнего устройства и положить в RPOS&lt;br /&gt;
* 7: Преобразовать число в RPOS в модулярный вид и переложить в AMOD&lt;br /&gt;
* 8: Взять число с внешнего устройства и положить в RPOS&lt;br /&gt;
* 9: Преобразовать число в RPOS в модулярный вид и переложить в BMOD&lt;br /&gt;
* 10: Умножить числа из AMOD и BMOD и положить результат в AMOD&lt;br /&gt;
* 11: Сложить числа из CMOD и AMOD - результат в CMOD&lt;br /&gt;
* 12: Положить число из AMOD в ОЗУ с адресом из U1&lt;br /&gt;
* 13: Прибавить к U1 единицу&lt;br /&gt;
* 14: Положить число из BMOD в ОЗУ с адресом из U1&lt;br /&gt;
* 15: Прибавить к U1 единицу&lt;br /&gt;
* 16: Вычесть из U0 единицу&lt;br /&gt;
* 17: Перейти к позиции 5 в стеке команд&lt;br /&gt;
* 18: Проверить есть ли ошибка в регистре CMOD. В случае отсутствия ошибки перейти к команде 32.&lt;br /&gt;
* 19: Установить регистр U0 значение взятое из регистра U1&lt;br /&gt;
* 20: Обнулить U1&lt;br /&gt;
* 21: Обнулить CMOD&lt;br /&gt;
* 22: Перейти к команде 31 программы если в U0 находится 0&lt;br /&gt;
* 23: Отправить число из ОЗУ по адресу указанному в U1 в модулярный регистр AMOD&lt;br /&gt;
* 24: Прибавить к U1 единицу&lt;br /&gt;
* 25: Отправить число из ОЗУ по адресу указанному в U1 в модулярный регистр BMOD&lt;br /&gt;
* 26: Прибавить к U1 единицу&lt;br /&gt;
* 27: Умножить числа из AMOD и BMOD и положить результат в AMOD&lt;br /&gt;
* 28: Сложить числа из CMOD и AMOD - результат в CMOD&lt;br /&gt;
* 29: Вычесть из U0 единицу&lt;br /&gt;
* 30: Перейти к позиции 22 в стеке команд&lt;br /&gt;
* 31: Перейти к команде 18 в стеке команд&lt;br /&gt;
* 32: Завершить работу программы&lt;br /&gt;
&lt;br /&gt;
== Программа в машинных кодах ==&lt;br /&gt;
&lt;br /&gt;
* 0: 01101 10&lt;br /&gt;
* 1: 10100 01&lt;br /&gt;
* 2: 00000&lt;br /&gt;
* 3: 00011 00000000&lt;br /&gt;
* 4: 10010 00 00000000&lt;br /&gt;
* 5: 10111 00 00000000010010&lt;br /&gt;
* 6: 00000&lt;br /&gt;
* 7: 01000 00&lt;br /&gt;
* 8: 00000&lt;br /&gt;
* 9: 01000 01&lt;br /&gt;
* 10: 01100 00 01&lt;br /&gt;
* 11: 01011 10 00&lt;br /&gt;
* 12: 00001 00 01&lt;br /&gt;
* 13: 10110 01&lt;br /&gt;
* 14: 00001 01 01&lt;br /&gt;
* 15: 10110 01&lt;br /&gt;
* 16: 10101 00&lt;br /&gt;
* 17: 10111 10 00000000000101&lt;br /&gt;
* 18: 10000 10 00000000100000&lt;br /&gt;
* 19: 00101 0100 0101&lt;br /&gt;
* 20: 10100 01&lt;br /&gt;
* 21: 01101 10&lt;br /&gt;
* 22: 10111 00 00000000011111&lt;br /&gt;
* 23: 00010 01 00&lt;br /&gt;
* 24: 10110 01&lt;br /&gt;
* 25: 00010 01 01&lt;br /&gt;
* 26: 10110 01&lt;br /&gt;
* 27: 01100 00 01&lt;br /&gt;
* 28: 01011 10 00&lt;br /&gt;
* 29: 10101 00&lt;br /&gt;
* 30: 10111 10 00000000010110&lt;br /&gt;
* 31: 10111 10 00000000010010&lt;br /&gt;
* 32: EOP&lt;/div&gt;</summary>
		<author><name>Turbo</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%B1%D1%83%D0%BB%D0%B5%D0%B2%D0%BE%D0%B9_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%BC_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%BC_%D0%BF%D0%BE%D0%BB%D0%B8%D0%BD%D0%BE%D0%BC%D0%BE%D0%BC_(PHP)</id>
		<title>Программа для проверки представимости булевой функции линейным арифметическим полиномом (PHP)</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%B1%D1%83%D0%BB%D0%B5%D0%B2%D0%BE%D0%B9_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%BC_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%BC_%D0%BF%D0%BE%D0%BB%D0%B8%D0%BD%D0%BE%D0%BC%D0%BE%D0%BC_(PHP)"/>
				<updated>2015-11-26T22:07:46Z</updated>
		
		<summary type="html">&lt;p&gt;Turbo: Новая страница: «== Описание ==  Программа проверяет можно ли заданную булеву функцию представить линейным…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание ==&lt;br /&gt;
&lt;br /&gt;
Программа проверяет можно ли заданную булеву функцию представить линейным арифметическим полиномом. Используются материалы из статьи &amp;quot;В. П. Шмерко, Теоремы Малюгина: новое понимание в логическом управлении, проектировании сбис и структурах данных для новых технологий, Автомат. и телемех., 2004, выпуск 6, 61–83&amp;quot; [http://www.mathnet.ru/php/archive.phtml?wshow=paper&amp;amp;jrnid=at&amp;amp;paperid=1589&amp;amp;option_lang=rus '''Статья''']&lt;br /&gt;
&lt;br /&gt;
== Входные данные ==&lt;br /&gt;
&lt;br /&gt;
На вход программы подается таблица истинности в виде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
4 3&lt;br /&gt;
0 0 0 0 0 0 0&lt;br /&gt;
0 0 0 1 0 0 1&lt;br /&gt;
0 0 1 0 0 1 0&lt;br /&gt;
0 0 1 1 0 1 1&lt;br /&gt;
0 1 0 0 0 0 1&lt;br /&gt;
0 1 0 1 0 1 0&lt;br /&gt;
0 1 1 0 0 1 1&lt;br /&gt;
0 1 1 1 1 0 0&lt;br /&gt;
1 0 0 0 0 1 0&lt;br /&gt;
1 0 0 1 0 1 1&lt;br /&gt;
1 0 1 0 1 0 0&lt;br /&gt;
1 0 1 1 1 0 1&lt;br /&gt;
1 1 0 0 0 1 1&lt;br /&gt;
1 1 0 1 1 0 0&lt;br /&gt;
1 1 1 0 1 0 1&lt;br /&gt;
1 1 1 1 1 1 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь первые два числа количество входных N и выходных K переменных соответственно. Далее следуют 2&amp;lt;sup&amp;gt;N&amp;lt;/sup&amp;gt; строк, в каждой N + K чисел &amp;quot;0&amp;quot; или &amp;quot;1&amp;quot;. Первые N чисел - логические значения входов, следующие K чисел логические значения выходов.&lt;br /&gt;
&lt;br /&gt;
== Исходник на PHP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; line&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
	set_time_limit(3600);&lt;br /&gt;
	&lt;br /&gt;
	function kronecker_product($a1, $a2) {&lt;br /&gt;
		$x1 = count($a1);&lt;br /&gt;
		$y1 = count($a1[0]);&lt;br /&gt;
		$x2 = count($a2);&lt;br /&gt;
		$y2 = count($a2[0]);&lt;br /&gt;
		&lt;br /&gt;
		$ret = array();&lt;br /&gt;
		for ($i1 = 0; $i1 &amp;lt; $x1; $i1++) {&lt;br /&gt;
			for ($i2 = 0; $i2 &amp;lt; $x2; $i2++) {&lt;br /&gt;
				for ($j1 = 0; $j1 &amp;lt; $y1; $j1++) {&lt;br /&gt;
					for ($j2 = 0; $j2 &amp;lt; $y2; $j2++) {&lt;br /&gt;
						$ret[$i1*$x2+$i2][$j1*$y2+$j2] = $a1[$i1][$j1]*$a2[$i2][$j2];&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return $ret;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function get_conversion_matrix($num) {&lt;br /&gt;
		$arr[0][0] = 1;&lt;br /&gt;
		$arr[0][1] = 0;&lt;br /&gt;
		$arr[1][0] = -1;&lt;br /&gt;
		$arr[1][1] = 1;&lt;br /&gt;
		if ($num == 1) {&lt;br /&gt;
			return $arr;&lt;br /&gt;
		}&lt;br /&gt;
		$narr = $arr;&lt;br /&gt;
		for ($i = 1; $i &amp;lt; $num; $i++) {&lt;br /&gt;
			$narr = kronecker_product($narr, $arr);&lt;br /&gt;
		}&lt;br /&gt;
		return $narr;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function gen_polinom_koeffs($kron, $f) {&lt;br /&gt;
		$len1 = count($f);&lt;br /&gt;
		$len2 = count($kron);&lt;br /&gt;
		if ($len1 != $len2) {&lt;br /&gt;
			echo &amp;quot;Something strange ($len1 != $len2)&amp;quot;;&lt;br /&gt;
			exit;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		$res = array();&lt;br /&gt;
		for ($i = 0; $i &amp;lt; $len1; $i++) {&lt;br /&gt;
			$res[$i] = 0;&lt;br /&gt;
			for ($j = 0; $j &amp;lt; $len1; $j++) {&lt;br /&gt;
				$res[$i] += $kron[$i][$j]*$f[$j];&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return $res;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function print_2d_matrix($arr) {&lt;br /&gt;
		$x = count($arr);&lt;br /&gt;
		$y = count($arr[0]);&lt;br /&gt;
		&lt;br /&gt;
		for ($i = 0; $i &amp;lt; $x; $i++) {&lt;br /&gt;
			for ($j = 0; $j &amp;lt; $y; $j++) {&lt;br /&gt;
				echo $arr[$i][$j].&amp;quot; &amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			echo &amp;quot;\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		echo &amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function print_polinom($res) {&lt;br /&gt;
		$alpha = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l');&lt;br /&gt;
		$len = count($res);&lt;br /&gt;
		echo &amp;quot;Polinom: &amp;quot;;&lt;br /&gt;
		for ($i = 0; $i &amp;lt; $len; $i++) {&lt;br /&gt;
			if ($res[$i] != 0) {&lt;br /&gt;
				if ($res[$i] &amp;gt; 0)&lt;br /&gt;
					echo &amp;quot;+&amp;quot;;&lt;br /&gt;
				echo $res[$i];&lt;br /&gt;
				&lt;br /&gt;
				$pos = 0;&lt;br /&gt;
				$cur = $i;&lt;br /&gt;
				while ($cur) {&lt;br /&gt;
					if ($cur &amp;amp; 1)&lt;br /&gt;
						echo $alpha[$pos];&lt;br /&gt;
					$pos++;&lt;br /&gt;
					$cur = $cur &amp;gt;&amp;gt; 1;&lt;br /&gt;
				}&lt;br /&gt;
				echo &amp;quot;&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		echo &amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function count_ones($val) {&lt;br /&gt;
		$c = 0;&lt;br /&gt;
		while ($val) {&lt;br /&gt;
			if ($val &amp;amp; 1)&lt;br /&gt;
				$c++;&lt;br /&gt;
			$val = $val &amp;gt;&amp;gt; 1;&lt;br /&gt;
		}&lt;br /&gt;
		return $c;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function check_polinom_linearity($res) {&lt;br /&gt;
		$len = count($res);&lt;br /&gt;
		for ($i = 1; $i &amp;lt; $len; $i++) {&lt;br /&gt;
			if (count_ones($i) &amp;gt; 1) {&lt;br /&gt;
				if ($res[$i] != 0)&lt;br /&gt;
					return false;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function get_bit($j, $num) {&lt;br /&gt;
		return ($j &amp;gt;&amp;gt; $num) &amp;amp; 1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function if_pow_2($j) {&lt;br /&gt;
		if ($j == 0)&lt;br /&gt;
			return true;&lt;br /&gt;
		for ($i = 0; $i &amp;lt; 32; $i++) {&lt;br /&gt;
			if ($j == (1 &amp;lt;&amp;lt; $i))&lt;br /&gt;
				return true;&lt;br /&gt;
		}&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function swap(&amp;amp;$arr, $i, $j) {&lt;br /&gt;
		$temp = $arr[$i];&lt;br /&gt;
		$arr[$i] = $arr[$j];&lt;br /&gt;
		$arr[$j] = $temp;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function gen_permute($arr, $i, $n) {&lt;br /&gt;
		global $permutations;&lt;br /&gt;
		if ($i == $n) {&lt;br /&gt;
			$permutations[] = $arr;&lt;br /&gt;
		} else {&lt;br /&gt;
			for ($j = $i; $j &amp;lt; $n; $j++) {&lt;br /&gt;
				swap($arr, $i, $j);&lt;br /&gt;
				gen_permute($arr, $i+1, $n);&lt;br /&gt;
				swap($arr, $i, $j);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function check_linearization_possibility_for_permutation_based_on_kroneker($f, $inum) {&lt;br /&gt;
		$kron = get_conversion_matrix($inum);&lt;br /&gt;
		$koefs = gen_polinom_koeffs($kron, $f);&lt;br /&gt;
		$result = check_polinom_linearity($koefs);&lt;br /&gt;
		if ($result == true || 1) {&lt;br /&gt;
			print_polinom($koefs);&lt;br /&gt;
		}&lt;br /&gt;
		return $result;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function check_linearization_possibility_for_permutation($f, $in, $out, $inum, $onum, $number) {&lt;br /&gt;
		&lt;br /&gt;
		for ($j = 0; $j &amp;lt; (1 &amp;lt;&amp;lt; $inum); $j++) {&lt;br /&gt;
			if (if_pow_2($j))&lt;br /&gt;
				continue;&lt;br /&gt;
			&lt;br /&gt;
			// Считаем значение функции в точке j&lt;br /&gt;
			$sum = 0;&lt;br /&gt;
			for ($i = 0; $i &amp;lt; $inum; $i++) {&lt;br /&gt;
				$jni = get_bit($j, $inum-1-$i);&lt;br /&gt;
				$f2i = $f[1 &amp;lt;&amp;lt; $i];&lt;br /&gt;
				$sum += $jni*$f2i;&lt;br /&gt;
			}&lt;br /&gt;
			$calc = 0;&lt;br /&gt;
			for ($i = 0; $i &amp;lt; $inum; $i++) {&lt;br /&gt;
				$jni = get_bit($j, $i);&lt;br /&gt;
				$calc += $jni;&lt;br /&gt;
			}&lt;br /&gt;
			$sum = $sum + $f[0]*(1 - $calc);&lt;br /&gt;
			if ($sum != $f[$j]) {&lt;br /&gt;
				echo &amp;quot;$sum != &amp;quot;.$f[$j].&amp;quot; for J = $j\n&amp;quot;;&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function check_linearization_possibility($in, $out) {&lt;br /&gt;
		global $permutations;&lt;br /&gt;
		$inum = count($in[0]);&lt;br /&gt;
		$onum = count($out[0]);&lt;br /&gt;
		$number = count($in);&lt;br /&gt;
		&lt;br /&gt;
		if ($onum &amp;gt; 10) {&lt;br /&gt;
			echo &amp;quot;It's not possible to check all permuatations for $onum number of outputs!\n&amp;quot;;&lt;br /&gt;
			exit;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		$permutations = array();&lt;br /&gt;
		for ($j = 0; $j &amp;lt; $onum; $j++) {&lt;br /&gt;
			$arr[$j] = $j;&lt;br /&gt;
		}&lt;br /&gt;
		gen_permute($arr,0,count($arr));&lt;br /&gt;
		&lt;br /&gt;
		foreach ($permutations as $perm) {&lt;br /&gt;
			echo &amp;quot;Check permuation of outputs:&amp;quot;;&lt;br /&gt;
			for ($j = 0; $j &amp;lt; $onum; $j++) {&lt;br /&gt;
				echo &amp;quot; &amp;quot;.$perm[$j];&lt;br /&gt;
			}&lt;br /&gt;
			echo &amp;quot;\n&amp;quot;;&lt;br /&gt;
			&lt;br /&gt;
			// Получаем вектор f для выхода&lt;br /&gt;
			for ($i = 0; $i &amp;lt; $number; $i++) {&lt;br /&gt;
				$f[$i] = 0;&lt;br /&gt;
				for ($j = 0; $j &amp;lt; $onum; $j++) {&lt;br /&gt;
					$f[$i] += ($out[$i][$j] &amp;lt;&amp;lt; $perm[$j]);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			if (check_linearization_possibility_for_permutation_based_on_kroneker($f, $inum)) {&lt;br /&gt;
				return true;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function read_tt($file, &amp;amp;$in, &amp;amp;$out) {&lt;br /&gt;
		$lines = explode(&amp;quot;\n&amp;quot;, $file);&lt;br /&gt;
		$arr = explode(&amp;quot; &amp;quot;, $lines[0]);&lt;br /&gt;
		$inum = $arr[0];&lt;br /&gt;
		$onum = $arr[1];&lt;br /&gt;
		&lt;br /&gt;
		$ci = 0;&lt;br /&gt;
		for ($i = 1; $i &amp;lt; count($lines); $i++) {&lt;br /&gt;
			$l = trim($lines[$i]);&lt;br /&gt;
			if ($l == '')&lt;br /&gt;
				continue;&lt;br /&gt;
			$l = preg_replace(&amp;quot;/[^0-9]/i&amp;quot;, &amp;quot; &amp;quot;, $l);&lt;br /&gt;
			$l = preg_replace(&amp;quot;/[[:blank:]]+/i&amp;quot;, &amp;quot; &amp;quot;, $l);&lt;br /&gt;
			$l = trim($l);&lt;br /&gt;
			$arr = explode(&amp;quot; &amp;quot;, $l);&lt;br /&gt;
			if (count($arr) != ($inum + $onum)) {&lt;br /&gt;
				echo &amp;quot;Some problem at line $i: &amp;quot;.$lines[$i].&amp;quot; (&amp;quot;.count($arr).&amp;quot; != &amp;quot;.$inum.&amp;quot; + &amp;quot;.$onum.&amp;quot;)\n&amp;quot;;&lt;br /&gt;
				print_r($arr);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
			for ($j = 0; $j &amp;lt; $inum; $j++) {&lt;br /&gt;
				$in[$ci][$j] = $arr[$j];&lt;br /&gt;
			}&lt;br /&gt;
			for ($j = 0; $j &amp;lt; $onum; $j++) {&lt;br /&gt;
				$out[$ci][$j] = $arr[($j+$inum)];&lt;br /&gt;
			}&lt;br /&gt;
			$ci++;&lt;br /&gt;
		}&lt;br /&gt;
		if (count($in) != 1 &amp;lt;&amp;lt; $inum) {&lt;br /&gt;
			echo &amp;quot;Check number of lines in truth table (&amp;quot;.count($in).&amp;quot; != &amp;quot;.(1 &amp;lt;&amp;lt; $inum).&amp;quot;)\n&amp;quot;;&lt;br /&gt;
			exit;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function gen_random_truth_table($inum, $onum, &amp;amp;$in, &amp;amp;$out) {&lt;br /&gt;
		$number = (1 &amp;lt;&amp;lt; $inum);&lt;br /&gt;
		&lt;br /&gt;
		for ($i = 0; $i &amp;lt; $number; $i++) {&lt;br /&gt;
			for ($j = 0; $j &amp;lt; $inum; $j++) {&lt;br /&gt;
				$in[$i][$j] = get_bit($i, $j);&lt;br /&gt;
			}&lt;br /&gt;
			for ($j = 0; $j &amp;lt; $onum; $j++) {&lt;br /&gt;
				$out[$i][$j] = mt_rand(0, 1);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		// print_r($in);&lt;br /&gt;
		// print_r($out);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function print_table_to_file($file, $in, $out) {&lt;br /&gt;
		$inum = count($in[0]);&lt;br /&gt;
		$onum = count($out[0]);&lt;br /&gt;
		$number = count($in);&lt;br /&gt;
		$o = fopen($file, &amp;quot;w&amp;quot;);&lt;br /&gt;
		fprintf($o, &amp;quot;%d %d\n&amp;quot;, $inum, $onum);&lt;br /&gt;
		for ($i = 0; $i &amp;lt; $number; $i++) {&lt;br /&gt;
			fprintf($o, &amp;quot;%d&amp;quot;, $in[$i][0]);&lt;br /&gt;
			for ($j = 1; $j &amp;lt; $inum; $j++) {&lt;br /&gt;
				fprintf($o, &amp;quot; %d&amp;quot;, $in[$i][$j]);&lt;br /&gt;
			}&lt;br /&gt;
			for ($j = 0; $j &amp;lt; $onum; $j++) {&lt;br /&gt;
				fprintf($o, &amp;quot; %d&amp;quot;, $out[$i][$j]);&lt;br /&gt;
			}&lt;br /&gt;
			fprintf($o, &amp;quot;\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		fclose($o);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function simple_test() {&lt;br /&gt;
		$kron = get_conversion_matrix(3);&lt;br /&gt;
		$f = array(0, 2, 6, 4, 7, 5, 1, 2);&lt;br /&gt;
		$ret = gen_polinom_koeffs($kron, $f);&lt;br /&gt;
		print_2d_matrix($kron);&lt;br /&gt;
		print_r($ret);&lt;br /&gt;
		print_polinom($ret);&lt;br /&gt;
		check_polinom_linearity($ret);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function check_truth_table_linearity($in_file) {&lt;br /&gt;
		$file = file_get_contents($in_file);&lt;br /&gt;
		read_tt($file, $in, $out);&lt;br /&gt;
		if (check_linearization_possibility($in, $out)) {&lt;br /&gt;
			echo &amp;quot;Possible !!!!\n&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			echo &amp;quot;Not possible\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function try_to_find_linear_truth_table($out_file, $inum, $onum) {&lt;br /&gt;
		for ($i = 0; $i &amp;lt; 100000; $i++) {&lt;br /&gt;
			unset($in);&lt;br /&gt;
			unset($out);&lt;br /&gt;
			gen_random_truth_table($inum, $onum, $in, $out);&lt;br /&gt;
&lt;br /&gt;
			if (check_linearization_possibility($in, $out)) {&lt;br /&gt;
				print_table_to_file($out_file, $in, $out);&lt;br /&gt;
				echo &amp;quot;Possible !!!!\n&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
			} else {&lt;br /&gt;
				echo &amp;quot;Not possible\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		echo &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	check_truth_table_linearity(&amp;quot;example.txt&amp;quot;);&lt;br /&gt;
	// try_to_find_linear_truth_table(&amp;quot;tt.txt&amp;quot;, 3, 2);&lt;br /&gt;
	&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Примеры логических функций ==&lt;br /&gt;
&lt;br /&gt;
=== Представимы линейным полиномом ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3 4&lt;br /&gt;
0 0 0  0 1 1 1&lt;br /&gt;
0 0 1  0 0 1 1&lt;br /&gt;
0 1 0  1 0 0 0&lt;br /&gt;
0 1 1  0 1 0 0&lt;br /&gt;
1 0 0  1 1 1 0&lt;br /&gt;
1 0 1  1 0 1 0&lt;br /&gt;
1 1 0  1 1 1 1&lt;br /&gt;
1 1 1  1 0 1 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Непредставимы линейным полиномом ===&lt;br /&gt;
&lt;br /&gt;
ISCAS85 C17:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
5 2&lt;br /&gt;
(0, 0, 0, 0, 0) | (0, 0)&lt;br /&gt;
(0, 0, 0, 0, 1) | (0, 1)&lt;br /&gt;
(0, 0, 0, 1, 0) | (0, 0)&lt;br /&gt;
(0, 0, 0, 1, 1) | (0, 1)&lt;br /&gt;
(0, 0, 1, 0, 0) | (0, 0)&lt;br /&gt;
(0, 0, 1, 0, 1) | (0, 1)&lt;br /&gt;
(0, 0, 1, 1, 0) | (0, 0)&lt;br /&gt;
(0, 0, 1, 1, 1) | (0, 0)&lt;br /&gt;
(0, 1, 0, 0, 0) | (1, 1)&lt;br /&gt;
(0, 1, 0, 0, 1) | (1, 1)&lt;br /&gt;
(0, 1, 0, 1, 0) | (1, 1)&lt;br /&gt;
(0, 1, 0, 1, 1) | (1, 1)&lt;br /&gt;
(0, 1, 1, 0, 0) | (1, 1)&lt;br /&gt;
(0, 1, 1, 0, 1) | (1, 1)&lt;br /&gt;
(0, 1, 1, 1, 0) | (0, 0)&lt;br /&gt;
(0, 1, 1, 1, 1) | (0, 0)&lt;br /&gt;
(1, 0, 0, 0, 0) | (0, 0)&lt;br /&gt;
(1, 0, 0, 0, 1) | (0, 1)&lt;br /&gt;
(1, 0, 0, 1, 0) | (0, 0)&lt;br /&gt;
(1, 0, 0, 1, 1) | (0, 1)&lt;br /&gt;
(1, 0, 1, 0, 0) | (1, 0)&lt;br /&gt;
(1, 0, 1, 0, 1) | (1, 1)&lt;br /&gt;
(1, 0, 1, 1, 0) | (1, 0)&lt;br /&gt;
(1, 0, 1, 1, 1) | (1, 0)&lt;br /&gt;
(1, 1, 0, 0, 0) | (1, 1)&lt;br /&gt;
(1, 1, 0, 0, 1) | (1, 1)&lt;br /&gt;
(1, 1, 0, 1, 0) | (1, 1)&lt;br /&gt;
(1, 1, 0, 1, 1) | (1, 1)&lt;br /&gt;
(1, 1, 1, 0, 0) | (1, 1)&lt;br /&gt;
(1, 1, 1, 0, 1) | (1, 1)&lt;br /&gt;
(1, 1, 1, 1, 0) | (1, 0)&lt;br /&gt;
(1, 1, 1, 1, 1) | (1, 0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Turbo</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8</id>
		<title>Модульные операции</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8"/>
				<updated>2015-02-18T09:05:38Z</updated>
		
		<summary type="html">&lt;p&gt;Isaeva: Новая страница: «Возможность применения СОК в вычислительных алгоритмах обусловлено наличием определён…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Возможность применения СОК в вычислительных алгоритмах обусловлено наличием определённого изоморфизма между математическими операциями над целыми числами и соответствующими операциями над системой целых неотрицательных остатков по отдельным модулям. Сложение, умножение, возведение в целую положительную степень любых целых положительных чисел идентичны соответствующим операциям, выполняемым над системой остатков.&lt;br /&gt;
&lt;br /&gt;
Пусть операнды &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, а также результаты операций сложения и умножения &amp;lt;math&amp;gt;A+B&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A \cdot B&amp;lt;/math&amp;gt; представлены соответственно остатками  &amp;lt;math&amp;gt;{\alpha}_i, {\beta}_i, {\gamma}_i, {\delta}_i&amp;lt;/math&amp;gt; по основаниям &amp;lt;math&amp;gt;p_i (i=1, \ldots, n)&amp;lt;/math&amp;gt;, причём оба числа и результаты находятся в диапазоне &amp;lt;math&amp;gt;[0, P)&amp;lt;/math&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A=({\alpha}_1, {\alpha}_2, \ldots, {\alpha}_n)&amp;lt;/math&amp;gt;,&lt;br /&gt;
:&amp;lt;math&amp;gt;A=({\beta}_1, {\beta}_2, \ldots, {\beta}_n)&amp;lt;/math&amp;gt;,&lt;br /&gt;
:&amp;lt;math&amp;gt;A=({\gamma}_1, {\gamma}_2, \ldots, {\gamma}_n)&amp;lt;/math&amp;gt;,&lt;br /&gt;
:&amp;lt;math&amp;gt;A=({\delta}_1, {\delta}_2, \ldots, {\delta}_n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;0 \le A &amp;lt;P, 0 \le B &amp;lt;P, 0 \le A+B &amp;lt;P, 0 \le A\cdot B &amp;lt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;to be continued&amp;gt;&lt;/div&gt;</summary>
		<author><name>Isaeva</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/Matlab_residue_library</id>
		<title>Matlab residue library</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/Matlab_residue_library"/>
				<updated>2015-02-11T14:04:04Z</updated>
		
		<summary type="html">&lt;p&gt;Turbo: Новая страница: «Состав  * [http://vscripts.ru/res/2015/matlab/residue_lib.mdl residue_lib.mdl] - библотека модулярных умножителей, сумат…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Состав&lt;br /&gt;
&lt;br /&gt;
* [http://vscripts.ru/res/2015/matlab/residue_lib.mdl residue_lib.mdl] - библотека модулярных умножителей, суматоров, преобразователей и т.д.&lt;br /&gt;
* [http://vscripts.ru/res/2015/matlab/module_convolution.mdl module_convolution.mdl] - основная схема с параметризируемыми подблоками и схемами, в разных вариациях&lt;br /&gt;
* [http://vscripts.ru/res/2015/matlab/module_basic.mdl module_basic.mdl] - вспомогательная схема проверки основных операций сложения и умножения.&lt;/div&gt;</summary>
		<author><name>Turbo</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%BE_%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B8_%D1%81_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%BE%D0%BC._%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%95%D0%B2%D0%BA%D0%BB%D0%B8%D0%B4%D0%B0</id>
		<title>Теорема о делении с остатком. Алгоритм Евклида</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%BE_%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B8_%D1%81_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%BE%D0%BC._%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%95%D0%B2%D0%BA%D0%BB%D0%B8%D0%B4%D0%B0"/>
				<updated>2014-12-10T09:07:53Z</updated>
		
		<summary type="html">&lt;p&gt;Isaeva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Напомним теорему о делении с остатком:&lt;br /&gt;
&lt;br /&gt;
'''Теорема о делении с остатком'''&lt;br /&gt;
&lt;br /&gt;
Для любых целых &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b \not= 0&amp;lt;/math&amp;gt;, существует единственный набор целых чисел &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;a = bq + r&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;0 \le r &amp;lt; |b|&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|b|&amp;lt;/math&amp;gt; — модуль числа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Легко доказывается, что для любых целых чисел &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b \not= 0&amp;lt;/math&amp;gt; деление с остатком возможно и числа &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&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;math&amp;gt;p = 6&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда имеем шесть классов разбиения множества целых чисел по модулю 6:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;K_0 = \left\{\ldots,-18,-12,-6,0,6,12,18,\ldots \right\}, r=0&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;K_1 = \left\{\ldots,-17,-11,-5,1,7,13,19,\ldots \right\}, r=1&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;K_2 = \left\{\ldots,-16,-10,-4,2,8,14,20,\ldots \right\}, r=2&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;K_3 = \left\{\ldots,-15,-9,-3,3,9,15,21,\ldots \right\}, r=3&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;K_4 = \left\{\ldots,-14,-8,-2,4,10,16,22,\ldots \right\}, r=4&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;K_5 = \left\{\ldots,-13,-7,-1,5,11,17,23,\ldots \right\}, r=5&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где через &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; обозначен остаток от деления целого числа на 6.&lt;br /&gt;
&lt;br /&gt;
В данном примере полная система наименьших неотрицательных вычетов есть множество &amp;lt;math&amp;gt;\left\{0, 1, 2, 3, 4, 5 \right\}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
полная система наименьших положительных вычетов – множество &amp;lt;math&amp;gt;\left\{1, 2, 3, 4, 5, 6 \right\}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
полная система наименьших по абсолютной величине вычетов – множество &amp;lt;math&amp;gt;\left\{-2,-1, 0, 1, 2, 3 \right\}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
приведённая система вычетов – множество &amp;lt;math&amp;gt;\left\{1,5 \right\}&amp;lt;/math&amp;gt;, так как &amp;lt;math&amp;gt;\varphi(6) = 6\,\left(1-\frac{1}{2}\right)\left(1-\frac{1}{3}\right) = 2&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
фактор-множество &amp;lt;math&amp;gt;Z{|{\equiv}_6} = \left\{K_0, K_1, K_2, K_3, K_4, K_5 \right\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Один из методов выполнения арифметических операций над целыми числами основан на простых положениях теории чисел. Идея этого метода состоит в том, что целые числа представляются в одной из непозиционных систем – в системе остаточных классов. А именно: вместо операций над целыми числами оперируют с остатками от деления этих чисел на заранее выбранные числа – модули &amp;lt;math&amp;gt;p_1, p_2, \ldots, p_n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Чаще всего модули &amp;lt;math&amp;gt;p_1, p_2, \ldots, p_n&amp;lt;/math&amp;gt; выбирают из множества простых чисел.&lt;br /&gt;
&lt;br /&gt;
Пусть&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;A \equiv {\alpha}_1 \pmod{p_1}&amp;lt;/math&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;A \equiv {\alpha}_2 \pmod{p_2}&amp;lt;/math&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;\ldots&amp;lt;/math&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;A \equiv {\alpha}_n \pmod{p_n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как в кольце целых чисел имеет место теорема о делении с остатком, т. е. &amp;lt;math&amp;gt;\forall a \in Z, \forall b \in Z, b\not= 0 \, \exist q \in Z, \exist r \in Z (0 \le r &amp;lt;b):\, a=bq+r &amp;lt;/math&amp;gt;, то кольцо Z, по определению, является евклидовым. Таким образом, в качестве чисел &amp;lt;math&amp;gt; {\alpha}_i, i=0,\ldots,n &amp;lt;/math&amp;gt; можно выбрать остатки от деления числа &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;p_i&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим гомоморфное отображение: &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;Z \to Z{|{\equiv}_{p_1}} \times Z{|{\equiv}_{p_2}} \times \ldots \times Z{|{\equiv}_{p_n}} &amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
Тогда каждому целому числу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно поставить в соответствие кортеж &amp;lt;math&amp;gt;\left\{{\alpha}_1, {\alpha}_2, \ldots, {\alpha}_n \right\}&amp;lt;/math&amp;gt; наименьших неотрицательных вычетов по одному из соответствующих классов. &lt;br /&gt;
&lt;br /&gt;
Важно отметить, что при преобразовании числа нет потери информации, если выполнено условие &amp;lt;math&amp;gt;A &amp;lt; p_1 \cdot p_2 \cdot \ldots \cdot p_n&amp;lt;/math&amp;gt;, поскольку всегда, зная &amp;lt;math&amp;gt;\left({\alpha}_1, {\alpha}_2, \ldots, {\alpha}_n \right)&amp;lt;/math&amp;gt; можно восстановить само число &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Поэтому кортеж  можно рассматривать как один из способов представления целого числа &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – модулярное представление, или представление в системе остаточных классов (СОК).&lt;br /&gt;
&lt;br /&gt;
Для дальнейшего используем расширенный алгоритм Евклида или его аналог – алгоритм нахождения линейного представления наибольшего общего делителя целых чисел: если числа а и b одновременно не равны нулю, то существуют целые числа &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, такие, что &amp;lt;math&amp;gt;a \cdot b = a \cdot x + b \cdot y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Действительно, пусть &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; – наименьшее целое положительное число вида &amp;lt;math&amp;gt;a \cdot x + b \cdot y&amp;lt;/math&amp;gt;, например, &amp;lt;math&amp;gt;d = a \cdot x_0 + b \cdot y_0&amp;lt;/math&amp;gt;, где числа &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_0&amp;lt;/math&amp;gt; не обязательно определены однозначно. Существование числа &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; следует только из принципа полной упорядоченности. Очевидно, что &amp;lt;math&amp;gt;d &amp;gt; 0&amp;lt;/math&amp;gt;. Остаётся показать, что &amp;lt;math&amp;gt;d = (a,b)&amp;lt;/math&amp;gt;. Для этого надо проверить выполнение двух условий: а) &amp;lt;math&amp;gt;d|a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;d|b&amp;lt;/math&amp;gt; б) если &amp;lt;math&amp;gt;c|a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c|b&amp;lt;/math&amp;gt;&lt;br /&gt;
то &amp;lt;math&amp;gt;c|d&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От противного: допустим, что свойство а) не выполняется, для определенности положим, что не выполнено &amp;lt;math&amp;gt;d|b&amp;lt;/math&amp;gt;. Тогда по теореме о делении с остатком &amp;lt;math&amp;gt;a = dq + r&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;0 \le r &amp;lt; |d|&amp;lt;/math&amp;gt;, и, следовательно, &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;r=b-dq = b-(ax_0+by_0)q = a(-qx_0)+b(1-qy_0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
что противоречит минимальности &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выполнение свойства б) проверяется непосредственно: &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;c|a \Rightarrow \left(\exist q_1 \in Z\right)\left(a = q_1\, c\right)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;c|b \Rightarrow \left(\exist q_2 \in Z\right)\left(a = q_2\, c\right)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;d=ax_0 + by_0 \Rightarrow d = q_1 c x_0 + q_2 c y_0 \Rightarrow d = \left(q_1 x_0 + q_2 y_0\right) c|d &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Алгоритм Евклида для целых чисел'''&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — целые числа, не равные одновременно нулю, и последовательность чисел&lt;br /&gt;
: &amp;lt;math&amp;gt; a &amp;gt; b &amp;gt; r_1 &amp;gt; r_2 &amp;gt; r_3 &amp;gt; r_4 &amp;gt; \cdots &amp;gt;r_n&amp;lt;/math&amp;gt;&lt;br /&gt;
определена тем, что каждое &amp;lt;math&amp;gt;r_k&amp;lt;/math&amp;gt; — это остаток от деления предпредыдущего числа на предыдущее, а предпоследнее делится на последнее нацело, то есть&lt;br /&gt;
: &amp;lt;math&amp;gt;a = bq_0 + r_1&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;b = r_1q_1 + r_2&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;r_1 = r_2q_2 + r_3&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\cdots&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;r_{k-2} = r_{k-1} q_{k-1} + r_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\cdots&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;r_{n-2} = r_{n-1}q_{n-1}+ r_n&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;r_{n-1} = r_n q_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда '''НОД''' &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt;, наибольший общий делитель &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, равен&lt;br /&gt;
&amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt;, последнему ненулевому члену этой последовательности.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Существование''' таких &amp;lt;math&amp;gt;r_1, r_2, ...&amp;lt;/math&amp;gt;, то есть возможность деления с остатком &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; для любого целого &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и целого &amp;lt;math&amp;gt;b\ne 0&amp;lt;/math&amp;gt;, доказывается индукцией.&lt;br /&gt;
&lt;br /&gt;
'''Корректность''' этого алгоритма вытекает из следующих двух утверждений:&lt;br /&gt;
&lt;br /&gt;
* Пусть &amp;lt;math&amp;gt;a = bq + r&amp;lt;/math&amp;gt;, тогда '''НОД''' &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt; = '''НОД''' &amp;lt;math&amp;gt;(b,r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* '''НОД''' &amp;lt;math&amp;gt;(0,r)&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; для любого ненулевого &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; (так как 0 делится на любое целое число, кроме нуля).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Расширенный алгоритм Евклида для целых чисел'''&lt;br /&gt;
&lt;br /&gt;
Рассмотрим расширенный алгоритм Евклида для нахождения линейного представления наибольшего общего делителя &amp;lt;math&amp;gt;(a,b) = ax + by &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; вычисляются в серии шагов, в каждом из которых мы выражаем &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; (вычисленное в процессе работы алгоритма Евклида) в форме &amp;lt;math&amp;gt;a x_i + b y_i &amp;lt;/math&amp;gt;. А именно, рассмотрим последовательность&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;a_0 = a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_0 = a x_0 + b y_0&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;a_1 = b&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_1 = a x_1 + b y_1&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;a_2 = a_0 - a_1 q_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_2 = a x_2 + b y_2&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;a_3 = a_1 - a_2 q_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_3 = a x_3 + b y_3&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\cdots&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;a_i = a_{i-2} - a_{i-1} q_{i-1}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_i = a x_i + b y_i&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\cdots&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;a_k = a_{k-2} - a_{k-1} q_{k-1}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_k = a x_k + b y_k&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;0 = a_{k-1} - a_k q_k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;0 = a x_{k+1} + b y_{k+1}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В левом столбце алгоритма записана последовательность делений, которая получается в результате работы алгоритма Евклида и которая разрешена относительно остатков. Согласно теореме Ламе (1844 г.) число делений, которое необходимо выполнить для нахождения &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt;, не превосходит числа цифр в меньшем из чисел &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, умноженного на 5 (оценка наихудшего случая для алгоритма Евклида). Теорема Ламе доказывается на основе последовательности Фибоначчи.&lt;br /&gt;
&lt;br /&gt;
В правом столбце алгоритма каждый остаток выражен через &amp;lt;math&amp;gt;a x_i + b y_i&amp;lt;/math&amp;gt;. Надо вычислить &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;. Очевидно, что &amp;lt;math&amp;gt;x_0 = 1, y_0 = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_1 = 0, y_1 = 1&amp;lt;/math&amp;gt;. Сравнивая обе части на ''i''-м шаге, получим &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;a_i = a x_i + b y_i = a_{i-2} - a_{i-1} q_{i-1} = \left(a x_{i-2} + b y_{i-2} \right) - \left(a x_{i-1} + b y_{i-1} \right) q_{i-1} =&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt; \left(a x_{i-2} - x_{i-1} q_{i-1} \right) + \left(b y_{i-2} - y_{i-1} q_{i-1} \right)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
откуда получается следующая индуктивная процедура вычисления &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;q_{i-1} = \left \lfloor \frac{a_{i-2}}{a_{i-1}} \right \rfloor&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;a_i = a_{i-2} - a_{i-1} q_{i-1}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x_i = x_{i-2} - x_{i-1} q_{i-1}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = y_{i-2} - y_{i-1} q_{i-1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Пример (Расширенный алгоритм Евклида)'''. &lt;br /&gt;
&lt;br /&gt;
Применим расширенный алгоритм Евклида к числам &amp;lt;math&amp;gt;a = 342, b = 612&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Весь алгоритм представим в виде следующей таблицы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{array}{|c|r|r|r|r|r|r|r|} \hline Iteration &amp;amp; q &amp;amp; a_0 &amp;amp; a_1 &amp;amp; x_0 &amp;amp; x_1 &amp;amp; y_0 &amp;amp; y_1 &lt;br /&gt;
\\ \hline 0 &amp;amp; - &amp;amp; 342 &amp;amp; 612 &amp;amp;  1 &amp;amp;   0 &amp;amp;  0 &amp;amp;  1&lt;br /&gt;
\\ \hline 1 &amp;amp; 0 &amp;amp; 612 &amp;amp; 342 &amp;amp;  0 &amp;amp;   1 &amp;amp;  1 &amp;amp;  0&lt;br /&gt;
\\ \hline 2 &amp;amp; 1 &amp;amp; 342 &amp;amp; 270 &amp;amp;  1 &amp;amp;  -1 &amp;amp;  0 &amp;amp;  1&lt;br /&gt;
\\ \hline 3 &amp;amp; 1 &amp;amp; 270 &amp;amp;  72 &amp;amp; -1 &amp;amp;   2 &amp;amp;  1 &amp;amp; -1&lt;br /&gt;
\\ \hline 4 &amp;amp; 3 &amp;amp;  72 &amp;amp;  54 &amp;amp;  2 &amp;amp;  -7 &amp;amp; -1 &amp;amp;  4&lt;br /&gt;
\\ \hline 5 &amp;amp; 1 &amp;amp;  54 &amp;amp;  18 &amp;amp; -7 &amp;amp;   9 &amp;amp;  4 &amp;amp; -5&lt;br /&gt;
\\ \hline 6 &amp;amp; 3 &amp;amp;  18 &amp;amp;   0 &amp;amp;  9 &amp;amp; -34 &amp;amp; -5 &amp;amp; 19&lt;br /&gt;
&lt;br /&gt;
\\ \hline \end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Заметим, что равенство &amp;lt;math&amp;gt;a_0 = a x_0 + b y_0&amp;lt;/math&amp;gt; выполняется на каждом шаге итерации. Алгоритм выдаёт &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;d = 18, x = 9, y = -5&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
и тогда &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;18=342 \cdot 9 + 612 \cdot (-5)&amp;lt;/math&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Isaeva</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%D0%B0_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%87%D0%B8%D1%81%D0%B5%D0%BB</id>
		<title>Расширение диапазона представления чисел</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%D0%B0_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%87%D0%B8%D1%81%D0%B5%D0%BB"/>
				<updated>2014-12-03T13:31:36Z</updated>
		
		<summary type="html">&lt;p&gt;Isaeva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Расширение системы оснований является одной из основных немодульных операций в СОК. Выполнение этой операции бывает необходимо при выполнении операции деления чисел, при вычислении позиционных характеристик, при обнаружении переполнения при выполнении сложения или умножения чисел.&lt;br /&gt;
Задачу расширения системы оснований можно сформулировать следующим образом: найти остаточное представление числа по новому основанию (новым основаниям), если известно представление числа по другим основаниям остатки от деления на другие числа.&lt;br /&gt;
Один из путей расширения системы оснований состоит в переводе числа в позиционную систему счисления и вычисления остатка от деления на новый модуль. Этот путь не является рациональным с точки зрения числа операций.&lt;br /&gt;
Другой метод расширения системы оснований позволяет определить цифру числа по новому основанию, базируясь на таких позиционных характеристиках числа, как ранг числа, след числа. Пусть вновь задана система оснований &amp;lt;math&amp;gt;p_1, p_2, \ldots, p_n&amp;lt;/math&amp;gt; с диапазоном &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, ортогональными базисами &amp;lt;math&amp;gt;B_1, B_2, \ldots, B_n&amp;lt;/math&amp;gt;, веса которых &amp;lt;math&amp;gt;m_1, m_2, \ldots, m_n&amp;lt;/math&amp;gt;. По определению, &amp;lt;math&amp;gt;B_i = m_i \cdot \frac{P}{p_i}, i=1, \ldots, n&amp;lt;/math&amp;gt;. Пусть в этой системе задано число &amp;lt;math&amp;gt;A = ({\alpha}_1, {\alpha}_2, \ldots, {\alpha}_n)&amp;lt;/math&amp;gt;. Расширим систему оснований, добавляя основание &amp;lt;math&amp;gt;p_{n+1}&amp;lt;/math&amp;gt;, тогда диапазон системы станет &amp;lt;math&amp;gt;P' = p_{n+1} \cdot P&amp;lt;/math&amp;gt;, ортогональные базисы системы &amp;lt;math&amp;gt;{B_1}', {B_2}', \ldots, {B_n}', {B_{n+1}}'&amp;lt;/math&amp;gt;, их веса &amp;lt;math&amp;gt;{m_1}', {m_2}', \ldots, {m_n}', {m_{n+1}}'&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;{B_i}' = {m_i} \cdot \frac{p_{n+1} \cdot P}{p_i}, i=1, \ldots, n+1&amp;lt;/math&amp;gt;. Задача состоит в определении цифры &amp;lt;math&amp;gt;{\alpha}_{n+1})&amp;lt;/math&amp;gt; числа &amp;lt;math&amp;gt;A = ({\alpha}_1, {\alpha}_2, \ldots, {\alpha}_n)&amp;lt;/math&amp;gt; по основанию &amp;lt;math&amp;gt;p_{n+1}&amp;lt;/math&amp;gt;. Минимальным следом числа называют цифру &amp;lt;math&amp;gt;{S^*}_A&amp;lt;/math&amp;gt;, при которой число &amp;lt;math&amp;gt;A^* = ({\alpha}_1, {\alpha}_2, \ldots, {\alpha}_n), {S^*}_A&amp;lt;/math&amp;gt; находится в интервале &amp;lt;math&amp;gt; \left[0,\frac{P'}{p_{n+1}}\right]&amp;lt;/math&amp;gt;, и число &amp;lt;math&amp;gt;A \in \left[0,P\right)&amp;lt;/math&amp;gt;. Определение цифры по основанию &amp;lt;math&amp;gt;p_{n+1}&amp;lt;/math&amp;gt; сводится тогда к определению минимального следа числа &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в расширенной системе оснований.&lt;/div&gt;</summary>
		<author><name>Isaeva</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D0%BF%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B0</id>
		<title>Интервальные методы перевода</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D0%BF%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B0"/>
				<updated>2014-10-22T13:55:56Z</updated>
		
		<summary type="html">&lt;p&gt;Isaeva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Достаточно эффективными методами перевода чисел из СОК в ПСС являются интервальные методы, основанные на интервальных характеристиках чисел. Одна из таких характеристик – номер интервала.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим СОК, заданную системой оснований &amp;lt;math&amp;gt;p_1, p_2, \ldots, p_n&amp;lt;/math&amp;gt; с объёмом диапазона &amp;lt;math&amp;gt;P = p_1\cdot p_2\cdot \ldots \cdot p_n&amp;lt;/math&amp;gt;. Выберем дробящий модуль &amp;lt;math&amp;gt;p_i&amp;lt;/math&amp;gt; и проведём дробление заданного диапазона на интервалы путём деления &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; на модуль &amp;lt;math&amp;gt;p_i&amp;lt;/math&amp;gt;. Тогда количество интервалов &amp;lt;math&amp;gt;m = P_i = \frac {P}{p_i}&amp;lt;/math&amp;gt;, а длина интервала определяется величиной модуля. &lt;br /&gt;
&lt;br /&gt;
В результате величину любого числа &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, заданного в СОК по выбранным основаниям, можно определить по номеру интервала:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;l_A = \left [\frac {A}{p_i}\right ]&amp;lt;/math&amp;gt; (1), &lt;br /&gt;
&lt;br /&gt;
в котором находится число &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и по цифре &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt; числа &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в СОК по модулю &amp;lt;math&amp;gt;p_i&amp;lt;/math&amp;gt;, т.е.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A = p_i \cdot l_A + {\alpha}_i&amp;lt;/math&amp;gt; (2).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;math&amp;gt;(p_i, P_i) = 1&amp;lt;/math&amp;gt;, то по теореме Эйлера:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;{P_i}^{\varphi(p_i)} \equiv 1\pmod {p_i}&amp;lt;/math&amp;gt; (3),&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\varphi(p_i)&amp;lt;/math&amp;gt; - – функция Эйлера. &lt;br /&gt;
Причём если &amp;lt;math&amp;gt;p_i&amp;lt;/math&amp;gt; – простое число, то &amp;lt;math&amp;gt;\varphi(p_i) = p_i - 1&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Число &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно представить в виде &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A = \left| \sum _{i = 1}^{n} {P_i}^{\varphi(p_i)} \cdot \alpha_i \right| \pmod P&amp;lt;/math&amp;gt; (4).&lt;br /&gt;
&lt;br /&gt;
Для определения номера интервала &amp;lt;math&amp;gt;l_A&amp;lt;/math&amp;gt;, подставим выражение (4) в (1):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;l_A = \left [\frac {A}{p_i}\right ]&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Isaeva</name></author>	</entry>

	</feed>