<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=GKormakov</id>
	<title>Алговики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=GKormakov"/>
	<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/ru/%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/GKormakov"/>
	<updated>2026-10-22T18:03:02Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%92%D0%B8%D0%B4%D0%B5%D0%BC%D0%B0%D0%BD%D0%B0-%D0%9A%D0%BE%D0%BF%D0%BF%D0%B5%D1%80%D1%81%D0%BC%D0%B8%D1%82%D0%B0&amp;diff=27566</id>
		<title>Метод Видемана-Копперсмита</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%92%D0%B8%D0%B4%D0%B5%D0%BC%D0%B0%D0%BD%D0%B0-%D0%9A%D0%BE%D0%BF%D0%BF%D0%B5%D1%80%D1%81%D0%BC%D0%B8%D1%82%D0%B0&amp;diff=27566"/>
		<updated>2019-11-19T20:34:42Z</updated>

		<summary type="html">&lt;p&gt;GKormakov: /* Алгоритм Видемана-Копперсмита */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{Автор - Участник:GKormakov}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Видемана-Копперсмита&#039;&#039;&#039; был предложен Дугласом Видеманом в статье 1986 года &amp;lt;ref&amp;gt;Wiedemann D.H. Solving sparce linear equations over finite fields (англ.). — 1986. — Январь (т. 32, № 1). — С. 54—62.&amp;lt;/ref&amp;gt;. Алгоритм позволял получить решение системы линейных уравнений &amp;lt;math&amp;gt;Ax = b &amp;lt;/math&amp;gt; над полем GF(2) (в общем случае, над конечным полем GF(q)) в случае, когда матрица A являлась разреженной. В частности, совместный алгоритм Видемана-Копперсмита решал задачу поиска нетривиальных векторов из ядра матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, т.е. нетривиальные решения уравнения  &amp;lt;math&amp;gt;Ax = 0 &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; A^T A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Статья обосновывала корректность алгоритма, оценивала сложность вычислений, рассматривала разложения многочленов на множители и вычисление матричных полиномов. После выхода статьи сам метод не получил широкого применения, однако теоретические оценки и вспомогательные алгоритмы получили признание.&lt;br /&gt;
&lt;br /&gt;
В рамках вычислений алгоритм является улучшенной версией алгоритма Копперсмита и алгоритма Монтгомери. В отличии от алгоритма Монтгомери имеет более эффективную реализацию на параллельных вычислительных системах - одним из главных отличий является меньший обмен данными между вычислительными узлами. &lt;br /&gt;
&lt;br /&gt;
Алгоритм получил широкое применение в алгоритмах криптографии, в том числе, в алгоритме факторизации, использующего факторные базы&amp;lt;ref&amp;gt;Замарашкин, Николай Леонидович.&lt;br /&gt;
Алгоритмы для разряженных систем линейных уравнений в GF(2) [Текст] : учебное пособие для студентов высших учебных заведений, обучающихся по направлениям ВПО 010400 &amp;quot;Прикладная математика и информатика&amp;quot; и 010300 &amp;quot;Фундаментальная информатика и информационные технологии&amp;quot; / Н. Л. Замарашкин ; Московский гос. ун-т им. М. В. Ломоносова. - Москва : Изд-во Московского ун-та, 2013. - 128, [2] с. : ил., табл.; 21 см. - (Серия: Суперкомпьютерное образование / Суперкомпьютерный консорциум ун-тов России).; ISBN 978-5-211-06483-6&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование стандартных методов Крылова (например, метода Ланцоша) не могли гарантировать условий на матрицу в GF(2), которые гарантировали сходимость, в связи с этим и были предложены перечисленные выше методы.&lt;br /&gt;
&lt;br /&gt;
===Математическое описание алгоритма===&lt;br /&gt;
====Метод Видемана====&lt;br /&gt;
=====Невырожденный случай=====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Ax = b, A\in\mathbb{F}_2^{n \times n}, b\in \mathbb{F}_2^n&amp;lt;/math&amp;gt; - согласованная СЛАУ с квадратной невырожденной матрицей. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
f(\lambda) = 1 + \sum_{i=1}^n f_i \lambda^i&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; - характеристический полином матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с коэффициентами &amp;lt;math&amp;gt;f_i\in\mathbb{F}_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По теореме Гамильтона-Кэли &amp;lt;math&amp;gt;f(A) = 0&amp;lt;/math&amp;gt;, следовательно, &amp;lt;math&amp;gt;f(A)b = 0&amp;lt;/math&amp;gt;. И, учитывая вид характеристической функции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
b = \sum_{i=1}^n f_i A^i b = A(\sum_{i=1}^{n-1} f_{i+1}A^i b )&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, если коэффициенты характеристического полинома известны, то единственное решение исследуемой системы можно найти как линейную комбинацию векторов Крылова: &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
x = \sum_{i=1}^{n-1} f_{i+1}A^i b&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Но как искать эти коэффициенты? Для случая СЛАУ с разреженной матрицей Видеман предложил следующую идею:&lt;br /&gt;
Выбрать случайный вектор &amp;lt;math&amp;gt;y \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;, тогда для &amp;lt;math&amp;gt;j = 0...n&amp;lt;/math&amp;gt; верны следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
y^Tf(A)A^jb = y^T(\sum_{i=0}^{n} f_iA^i)A^jb = \sum_{i=0}^{n}(y^TA^{i+j}b)f_i = 0&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt; \alpha_i = y^T A^ib \in \mathbb{F}_2, \forall i=0...n&amp;lt;/math&amp;gt;, тогда верхняя система преобразуется в однородную СЛАУ: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\sum_{i=0}^{n}\alpha_{i+j}f_i = 0 , j = 0...n&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
с матрицей &amp;lt;math&amp;gt;H_{ij}=\alpha_{i+j}&amp;lt;/math&amp;gt; порядка n + 1, имеющую ганкелеву структуру, что позволяет проще (за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; - алгоритм Тренча) решать СЛАУ, поскольку матрица задаётся 2n + 1 параметрами. Если переставить строки матрицы &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в обратном порядке, то матрица станет теплицевой. Над GF(2) также известны быстрые алгоритмы решения СЛАУ (алгоритм Берлекампа - Масси)&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;
Поскольку &amp;lt;math&amp;gt; A&amp;lt;/math&amp;gt; теперь вырожденная, то характеристический полином будет выглядеть иначе (занулятся младшие коэффициенты):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
f(\lambda) = \lambda^s(\sum_{i=0}^{n-s} f_{i+s} \lambda^i), причём f_s \neq 0&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
В этом случае выбираем произвольный вектор &amp;lt;math&amp;gt; x\in\mathbb{F}_2^n&amp;lt;/math&amp;gt;  и находим вектор &amp;lt;math&amp;gt; \omega \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\omega = (\sum_{i=0}^{n-s} f_{i+s} A^i)x&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Т.к. размерность ядра матрицы &amp;lt;math&amp;gt;\sum_{i=0}^{n-s} f_{i+s} A^i&amp;lt;/math&amp;gt; не может быть больше n - 1, а размерность пространства &amp;lt;math&amp;gt;\mathbb{F} &amp;lt;/math&amp;gt; равна n, то с вероятностью 1/2 &amp;lt;math&amp;gt;\omega \neq 0&amp;lt;/math&amp;gt;. Если же он равен 0, то выбираем другой x и ищем степень матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A^\delta \omega \neq 0, а A^{\delta + 1} \omega = 0&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;A^\delta \omega&amp;lt;/math&amp;gt; - искомый вектор из ядра.&lt;br /&gt;
&lt;br /&gt;
Перепишем итоговый алгоритм Видемана для нахождения вектора из ядра A:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1.&#039;&#039;&#039; Выбираем случайные векторы &amp;lt;math&amp;gt;x, y \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2.&#039;&#039;&#039; &amp;lt;math&amp;gt;\forall s = 0, ... 2n&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;\alpha_s = y^TA^sx&amp;lt;/math&amp;gt; и строим полином &amp;lt;math&amp;gt;a(x) = \sum\alpha_ix^i \textit{формальной}&amp;lt;/math&amp;gt; степени 2n&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3.&#039;&#039;&#039; Характеристическому полиному &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; ставим в соответствие полином &amp;lt;math&amp;gt;\widetilde{f(x)} = x^n f(\frac{1}{x}), тогда f_i = \widetilde{f(x)}_{n-i}&amp;lt;/math&amp;gt; и &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i=0}^n\alpha_{i+j}f_i = \sum_{i=0}^n\alpha_{i+j}\widetilde{f(x)}_{n-i} = 0,  j=0...n&amp;lt;/math&amp;gt;,  т.е. все коэффициенты в &amp;lt;math&amp;gt;a(x)\widetilde{f(x)}&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;x^n, x^{n+1}, ..., x^{2n}&amp;lt;/math&amp;gt; будут равны &lt;br /&gt;
&lt;br /&gt;
Т.е. &amp;lt;math&amp;gt;a(x)\widetilde{f(x)} = g(x) mod \,x^{2n + 1}, где\, deg(g) &amp;lt; n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом построили полином &amp;lt;math&amp;gt;\widetilde{f(x)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4.&#039;&#039;&#039; Получаем решение &amp;lt;math&amp;gt;\omega = A^\delta \sum_if_iA^ix : A\omega = 0&amp;lt;/math&amp;gt; алгоритмом, описанным выше&lt;br /&gt;
&lt;br /&gt;
====Алгоритм Видемана-Копперсмита====&lt;br /&gt;
Алгоритм Видемана по поиску вектора из ядра матрицы A сводился к решению СЛАУ с генкелевой или теплицевой матрицей, что ускоряло алгоритм, однако алгоритм Видемана является последовательным алгоритмом (коэффициенты полинома &amp;lt;math&amp;gt;a(x)&amp;lt;/math&amp;gt; вычисляются последовательно), т.е. он не имеет выигрыша по скорости перед методом Монтгомери при распараллеливании на несколько узлов. Поэтому Копперсмит добавил в алгоритм Видемана работу с блочными матрицами.&lt;br /&gt;
&lt;br /&gt;
Пусть также задана однородная СЛАУ &amp;lt;math&amp;gt;Ax = 0\, , A\in\mathbb{F}_2^{n\times n}&amp;lt;/math&amp;gt;, так же требуется найти нетривиальное решение. Опишем предложения Копперсмита:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1.&#039;&#039;&#039; Рассмотрим два случайных блока &amp;lt;math&amp;gt;Z\in \mathbb{F}_2^{n\times m_b}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y\in \mathbb{F}_2^{n\times n_b}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m_b \neq n_b&amp;lt;/math&amp;gt;. Тогда столбцы матрицы &amp;lt;math&amp;gt;AZ = X\in \mathbb{F}_2^{n\times m_b}&amp;lt;/math&amp;gt; будут принадлежать линейной оболочке столбцов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. На практике числа &amp;lt;math&amp;gt;m_b, n_b&amp;lt;/math&amp;gt; кратны размеру машинного слова, это будет использовано при параллельной реализации.&lt;br /&gt;
&lt;br /&gt;
Далее вычисляются матрицы &amp;lt;math&amp;gt;a_i = Y^TA^iX \in \mathbb{F}_2^{n_b\times m_b} \forall\, i=0...L&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;L = \frac{n}{n_b} + \frac{n}{m_b} + \Delta&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt; - небольшое натуральное число, например, 10.&lt;br /&gt;
С помощью этих матриц определяем полином &amp;lt;math&amp;gt;a(x) = \sum_{i=0}^La_ix^i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Определение&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;Степенью матричного полинома&#039;&#039; назовём степень полинома максимальной степени.&lt;br /&gt;
&lt;br /&gt;
Однако на практике оказывается более важным смотреть на &#039;&#039;формальную степень&#039;&#039;. Работая с ними можно использовать следующие правила: 1) Формальная степень суммы полиномов равна максимуму из формальных степеней каждого слагаемого; 2) Умножение полинома на одночлен увеличивает его формальную степень на 1. Таким образом, построенный на шаге 1 полином является формальной степени L.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2.&#039;&#039;&#039; Построим матричный полином &amp;lt;math&amp;gt; f(x) = \sum_{i=0}^Df_ix^i &amp;lt;/math&amp;gt; формальной степени D с матричными коэффициентами &amp;lt;math&amp;gt; f_i\in\mathbb{F}_2^{m_b\times(m_b + n_b)}&amp;lt;/math&amp;gt;, для которого выполняются следующие условия:&lt;br /&gt;
# &#039;&#039;Справедливо полиномиальное соотношение&#039;&#039; &amp;lt;math&amp;gt; a(x)f(x) = g(x) + e(x)x^M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; g(x) &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; e(x) &amp;lt;/math&amp;gt; - матричные полиномы;&lt;br /&gt;
# Степень матричного полинома &amp;lt;math&amp;gt; g &amp;lt;/math&amp;gt; не превосходит &amp;lt;math&amp;gt; D &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; M &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; D &amp;lt;/math&amp;gt; удовлетворяют соотношению &amp;lt;math&amp;gt; M - D - 1 &amp;gt; \frac{n}{n_b}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Метод построения матричного полинома &amp;lt;math&amp;gt; f(x) &amp;lt;/math&amp;gt; изложим ниже)&lt;br /&gt;
&lt;br /&gt;
Т.к. &amp;lt;math&amp;gt; deg(g) \leq D&amp;lt;/math&amp;gt;, то матричные коэффициенты при степенях, больших D, равны 0. Следовательно, матричные коэффициенты a(x) и f(x) удовлетворяют системе: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum\limits_{k=0}^D a_{i + k + 1}f_{D-k} = 0, \; \forall i=\overline{0, M-D-2}&amp;lt;/math&amp;gt;, что эквивалентно, при подстановке &amp;lt;math&amp;gt; a_{i+k+1} &amp;lt;/math&amp;gt;, следующему уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Y^T A^i A\underbrace{\left(\sum\limits_{k=0}^D (A^{k} X) f_{D - k}\right)}_{W} = 0, \; \forall i = \overline{0, M - D - 2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, W удовлетворяет условиям А-ортагональности со всеми блоками векторов вида &amp;lt;math&amp;gt; Y, A^TY, (A^T)^2Y... (A^T)^{M - D - 2}Y &amp;lt;/math&amp;gt;. Далее возможно два варианта: &lt;br /&gt;
&lt;br /&gt;
1) Если линейная оболочка блоков вышеперечисленных векторов совпала со всем пространством &amp;lt;math&amp;gt;\mathbb{F}_2^n&amp;lt;/math&amp;gt;, то выбором n линейно независимых столбцов и составлением невырожденной матрицы &amp;lt;math&amp;gt;\hat{Y}&amp;lt;/math&amp;gt; получили бы следующее равенство:&lt;br /&gt;
&amp;lt;math&amp;gt; \hat{Y}AW = 0 &amp;lt;/math&amp;gt;. Домножив на обратную, получим &amp;lt;math&amp;gt; AW = 0&amp;lt;/math&amp;gt;  и если &amp;lt;math&amp;gt; W \neq 0 &amp;lt;/math&amp;gt;, то задача решена.&lt;br /&gt;
&lt;br /&gt;
2)Оболочка блоков не охватила всего пространства, тогда можно вероятностно оценить, что: Т.к. &amp;lt;math&amp;gt; M - D - 1 &amp;gt; \frac{n}{n_b} &amp;lt;/math&amp;gt;, то почти наверняка размерность линейной оболочки &amp;lt;math&amp;gt; (A^T)^iY, \; \forall i=\overline{0,M-D-2} &amp;lt;/math&amp;gt; близка к n. Этого достаточно, чтобы утверждать, что задача решена. (Для деталей см. &amp;lt;ref&amp;gt; Don Coppersmith. 1994. Solving homogeneous linear equations over GF(2) via block Wiedemann algorithm. Math. Comput. 62, 205 (January 1994), 333-350. DOI=10.2307/2153413 http://dx.doi.org/10.2307/2153413  &amp;lt;/ref&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
====Метод построения матричного полинома====&lt;br /&gt;
Копперсмит предложил итерационную процедуру:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;:&amp;lt;math&amp;gt; M := 0,\;&lt;br /&gt;
f(x) := [I_{m_b}\; 0],\;&lt;br /&gt;
e(x) := [a(x)\; I_{n_b}],\;&lt;br /&gt;
\delta_j = 0 &amp;lt;/math&amp;gt;, где j -- номер столбца &amp;lt;math&amp;gt;f(x), \delta_j&amp;lt;/math&amp;gt; -- формальная степень;&lt;br /&gt;
# &#039;&#039;&#039;Итерация&#039;&#039;&#039;:&lt;br /&gt;
##Вычислить &amp;lt;math&amp;gt; e_0 = e(0) &amp;lt;/math&amp;gt;;&lt;br /&gt;
##Найти P: &amp;lt;math&amp;gt; e_0P = [0\; F_{n_b}] &amp;lt;/math&amp;gt;, причём преобразование P должно быть допустимым;&lt;br /&gt;
##Вычислить &amp;lt;math&amp;gt; e:=\frac{eP(x)}{x}, \; f:=fP(x) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; P(x) = P \begin{pmatrix}I_{m_b} &amp;amp; 0\\ 0 &amp;amp; xI_{n_b}\end{pmatrix} &amp;lt;/math&amp;gt;;&lt;br /&gt;
##&amp;lt;math&amp;gt;M:=M+1&amp;lt;/math&amp;gt;&lt;br /&gt;
##&amp;lt;math&amp;gt; \delta_{j_k}:= \delta_{j_k} + 1&amp;lt;/math&amp;gt; для тех столбцов, которые были умножены на x;&lt;br /&gt;
##Вычислить формальную степень D матричного полинома f(x);&lt;br /&gt;
#&#039;&#039;&#039;Останов&#039;&#039;&#039; Проверить критерий останова: &amp;lt;math&amp;gt; M - D &amp;gt; \frac{n}{n_b} + \Delta &amp;lt;/math&amp;gt;. Если выполнен, то остановиться, нет - продолжить.&lt;br /&gt;
&lt;br /&gt;
Сколько всего потребуется итераций? Если &amp;lt;math&amp;gt;m_b = n_b&amp;lt;/math&amp;gt;, то будет выполнена оценка &amp;lt;math&amp;gt; s \approx 2\left(\frac{n}{n_b} + 1\right) &amp;lt;/math&amp;gt;. Если же брать &amp;lt;math&amp;gt;m_b = 2n_b&amp;lt;/math&amp;gt;, как советовал Копперсмит, то &amp;lt;math&amp;gt; s \approx \frac{3}{2}\left(\frac{n}{n_b} + 1\right) &amp;lt;/math&amp;gt; (Более подробный анализ см. в &amp;lt;ref&amp;gt;Замарашкин, Николай Леонидович.&lt;br /&gt;
Алгоритмы для разряженных систем линейных уравнений в GF(2) [Текст] : учебное пособие для студентов высших учебных заведений, обучающихся по направлениям ВПО 010400 &amp;quot;Прикладная математика и информатика&amp;quot; и 010300 &amp;quot;Фундаментальная информатика и информационные технологии&amp;quot; / Н. Л. Замарашкин ; Московский гос. ун-т им. М. В. Ломоносова. - Москва : Изд-во Московского ун-та, 2013. - 128, [2] с. : ил., табл.; 21 см. - (Серия: Суперкомпьютерное образование / Суперкомпьютерный консорциум ун-тов России).; ISBN 978-5-211-06483-6&amp;lt;/ref&amp;gt; ). С точки зрения вероятностной устойчивости и скорости логичнее использовать второй случай, однако, как показывал опыт, и исходя из указаний Копперсмита (глава 5 &amp;lt;ref&amp;gt; Don Coppersmith. 1994. Solving homogeneous linear equations over GF(2) via block Wiedemann algorithm. Math. Comput. 62, 205 (January 1994), 333-350. DOI=10.2307/2153413 http://dx.doi.org/10.2307/2153413  &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;
=== Схема реализации последовательного алгоритма ===&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;
&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>GKormakov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%92%D0%B8%D0%B4%D0%B5%D0%BC%D0%B0%D0%BD%D0%B0-%D0%9A%D0%BE%D0%BF%D0%BF%D0%B5%D1%80%D1%81%D0%BC%D0%B8%D1%82%D0%B0&amp;diff=27565</id>
		<title>Метод Видемана-Копперсмита</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%92%D0%B8%D0%B4%D0%B5%D0%BC%D0%B0%D0%BD%D0%B0-%D0%9A%D0%BE%D0%BF%D0%BF%D0%B5%D1%80%D1%81%D0%BC%D0%B8%D1%82%D0%B0&amp;diff=27565"/>
		<updated>2019-11-19T20:32:16Z</updated>

		<summary type="html">&lt;p&gt;GKormakov: /* Невырожденный случай */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{Автор - Участник:GKormakov}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Видемана-Копперсмита&#039;&#039;&#039; был предложен Дугласом Видеманом в статье 1986 года &amp;lt;ref&amp;gt;Wiedemann D.H. Solving sparce linear equations over finite fields (англ.). — 1986. — Январь (т. 32, № 1). — С. 54—62.&amp;lt;/ref&amp;gt;. Алгоритм позволял получить решение системы линейных уравнений &amp;lt;math&amp;gt;Ax = b &amp;lt;/math&amp;gt; над полем GF(2) (в общем случае, над конечным полем GF(q)) в случае, когда матрица A являлась разреженной. В частности, совместный алгоритм Видемана-Копперсмита решал задачу поиска нетривиальных векторов из ядра матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, т.е. нетривиальные решения уравнения  &amp;lt;math&amp;gt;Ax = 0 &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; A^T A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Статья обосновывала корректность алгоритма, оценивала сложность вычислений, рассматривала разложения многочленов на множители и вычисление матричных полиномов. После выхода статьи сам метод не получил широкого применения, однако теоретические оценки и вспомогательные алгоритмы получили признание.&lt;br /&gt;
&lt;br /&gt;
В рамках вычислений алгоритм является улучшенной версией алгоритма Копперсмита и алгоритма Монтгомери. В отличии от алгоритма Монтгомери имеет более эффективную реализацию на параллельных вычислительных системах - одним из главных отличий является меньший обмен данными между вычислительными узлами. &lt;br /&gt;
&lt;br /&gt;
Алгоритм получил широкое применение в алгоритмах криптографии, в том числе, в алгоритме факторизации, использующего факторные базы&amp;lt;ref&amp;gt;Замарашкин, Николай Леонидович.&lt;br /&gt;
Алгоритмы для разряженных систем линейных уравнений в GF(2) [Текст] : учебное пособие для студентов высших учебных заведений, обучающихся по направлениям ВПО 010400 &amp;quot;Прикладная математика и информатика&amp;quot; и 010300 &amp;quot;Фундаментальная информатика и информационные технологии&amp;quot; / Н. Л. Замарашкин ; Московский гос. ун-т им. М. В. Ломоносова. - Москва : Изд-во Московского ун-та, 2013. - 128, [2] с. : ил., табл.; 21 см. - (Серия: Суперкомпьютерное образование / Суперкомпьютерный консорциум ун-тов России).; ISBN 978-5-211-06483-6&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование стандартных методов Крылова (например, метода Ланцоша) не могли гарантировать условий на матрицу в GF(2), которые гарантировали сходимость, в связи с этим и были предложены перечисленные выше методы.&lt;br /&gt;
&lt;br /&gt;
===Математическое описание алгоритма===&lt;br /&gt;
====Метод Видемана====&lt;br /&gt;
=====Невырожденный случай=====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Ax = b, A\in\mathbb{F}_2^{n \times n}, b\in \mathbb{F}_2^n&amp;lt;/math&amp;gt; - согласованная СЛАУ с квадратной невырожденной матрицей. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
f(\lambda) = 1 + \sum_{i=1}^n f_i \lambda^i&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; - характеристический полином матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с коэффициентами &amp;lt;math&amp;gt;f_i\in\mathbb{F}_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По теореме Гамильтона-Кэли &amp;lt;math&amp;gt;f(A) = 0&amp;lt;/math&amp;gt;, следовательно, &amp;lt;math&amp;gt;f(A)b = 0&amp;lt;/math&amp;gt;. И, учитывая вид характеристической функции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
b = \sum_{i=1}^n f_i A^i b = A(\sum_{i=1}^{n-1} f_{i+1}A^i b )&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, если коэффициенты характеристического полинома известны, то единственное решение исследуемой системы можно найти как линейную комбинацию векторов Крылова: &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
x = \sum_{i=1}^{n-1} f_{i+1}A^i b&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Но как искать эти коэффициенты? Для случая СЛАУ с разреженной матрицей Видеман предложил следующую идею:&lt;br /&gt;
Выбрать случайный вектор &amp;lt;math&amp;gt;y \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;, тогда для &amp;lt;math&amp;gt;j = 0...n&amp;lt;/math&amp;gt; верны следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
y^Tf(A)A^jb = y^T(\sum_{i=0}^{n} f_iA^i)A^jb = \sum_{i=0}^{n}(y^TA^{i+j}b)f_i = 0&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt; \alpha_i = y^T A^ib \in \mathbb{F}_2, \forall i=0...n&amp;lt;/math&amp;gt;, тогда верхняя система преобразуется в однородную СЛАУ: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\sum_{i=0}^{n}\alpha_{i+j}f_i = 0 , j = 0...n&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
с матрицей &amp;lt;math&amp;gt;H_{ij}=\alpha_{i+j}&amp;lt;/math&amp;gt; порядка n + 1, имеющую ганкелеву структуру, что позволяет проще (за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; - алгоритм Тренча) решать СЛАУ, поскольку матрица задаётся 2n + 1 параметрами. Если переставить строки матрицы &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в обратном порядке, то матрица станет теплицевой. Над GF(2) также известны быстрые алгоритмы решения СЛАУ (алгоритм Берлекампа - Масси)&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;
Поскольку &amp;lt;math&amp;gt; A&amp;lt;/math&amp;gt; теперь вырожденная, то характеристический полином будет выглядеть иначе (занулятся младшие коэффициенты):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
f(\lambda) = \lambda^s(\sum_{i=0}^{n-s} f_{i+s} \lambda^i), причём f_s \neq 0&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
В этом случае выбираем произвольный вектор &amp;lt;math&amp;gt; x\in\mathbb{F}_2^n&amp;lt;/math&amp;gt;  и находим вектор &amp;lt;math&amp;gt; \omega \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\omega = (\sum_{i=0}^{n-s} f_{i+s} A^i)x&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Т.к. размерность ядра матрицы &amp;lt;math&amp;gt;\sum_{i=0}^{n-s} f_{i+s} A^i&amp;lt;/math&amp;gt; не может быть больше n - 1, а размерность пространства &amp;lt;math&amp;gt;\mathbb{F} &amp;lt;/math&amp;gt; равна n, то с вероятностью 1/2 &amp;lt;math&amp;gt;\omega \neq 0&amp;lt;/math&amp;gt;. Если же он равен 0, то выбираем другой x и ищем степень матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A^\delta \omega \neq 0, а A^{\delta + 1} \omega = 0&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;A^\delta \omega&amp;lt;/math&amp;gt; - искомый вектор из ядра.&lt;br /&gt;
&lt;br /&gt;
Перепишем итоговый алгоритм Видемана для нахождения вектора из ядра A:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1.&#039;&#039;&#039; Выбираем случайные векторы &amp;lt;math&amp;gt;x, y \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2.&#039;&#039;&#039; &amp;lt;math&amp;gt;\forall s = 0, ... 2n&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;\alpha_s = y^TA^sx&amp;lt;/math&amp;gt; и строим полином &amp;lt;math&amp;gt;a(x) = \sum\alpha_ix^i \textit{формальной}&amp;lt;/math&amp;gt; степени 2n&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3.&#039;&#039;&#039; Характеристическому полиному &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; ставим в соответствие полином &amp;lt;math&amp;gt;\widetilde{f(x)} = x^n f(\frac{1}{x}), тогда f_i = \widetilde{f(x)}_{n-i}&amp;lt;/math&amp;gt; и &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i=0}^n\alpha_{i+j}f_i = \sum_{i=0}^n\alpha_{i+j}\widetilde{f(x)}_{n-i} = 0,  j=0...n&amp;lt;/math&amp;gt;,  т.е. все коэффициенты в &amp;lt;math&amp;gt;a(x)\widetilde{f(x)}&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;x^n, x^{n+1}, ..., x^{2n}&amp;lt;/math&amp;gt; будут равны &lt;br /&gt;
&lt;br /&gt;
Т.е. &amp;lt;math&amp;gt;a(x)\widetilde{f(x)} = g(x) mod \,x^{2n + 1}, где\, deg(g) &amp;lt; n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом построили полином &amp;lt;math&amp;gt;\widetilde{f(x)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4.&#039;&#039;&#039; Получаем решение &amp;lt;math&amp;gt;\omega = A^\delta \sum_if_iA^ix : A\omega = 0&amp;lt;/math&amp;gt; алгоритмом, описанным выше&lt;br /&gt;
&lt;br /&gt;
====Алгоритм Видемана-Копперсмита====&lt;br /&gt;
Алгоритм Видемана по поиску вектора из ядра матрицы A сводился к решению СЛАУ с генкелевой или теплицевой матрицей, что ускоряло алгоритм, однако алгоритм Видемана является последовательным алгоритмом (коэффициенты полинома &amp;lt;math&amp;gt;a(x)&amp;lt;/math&amp;gt; вычисляются последовательно), т.е. он не имеет выигрыша по скорости перед методом Монтгомери при распараллеливании на несколько узлов. Поэтому Копперсмит добавил в алгоритм Видемана работу с блочными матрицами.&lt;br /&gt;
&lt;br /&gt;
Пусть также задана однородная СЛАУ &amp;lt;math&amp;gt;Ax = 0\, , A\in\mathbb{F}_2^{n\times n}&amp;lt;/math&amp;gt;, так же требуется найти нетривиальное решение. Опишем предложения Копперсмита:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1.&#039;&#039;&#039; Рассмотрим два случайных блока &amp;lt;math&amp;gt;Z\in \mathbb{F}_2^{n\times m_b}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y\in \mathbb{F}_2^{n\times n_b}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m_b \neq n_b&amp;lt;/math&amp;gt;. Тогда столбцы матрицы &amp;lt;math&amp;gt;AZ = X\in \mathbb{F}_2^{n\times m_b}&amp;lt;/math&amp;gt; будут принадлежать линейной оболочке столбцов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. На практике числа &amp;lt;math&amp;gt;m_b, n_b&amp;lt;/math&amp;gt; кратны размеру машинного слова, это будет использовано при параллельной реализации.&lt;br /&gt;
&lt;br /&gt;
Далее вычисляются матрицы &amp;lt;math&amp;gt;a_i = Y^TA^iX \in \mathbb{F}_2^{n_b\times m_b} \forall\, i=0...L&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;L = \frac{n}{n_b} + \frac{n}{m_b} + \Delta&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt; - небольшое натуральное число, например, 10.&lt;br /&gt;
С помощью этих матриц определяем полином &amp;lt;math&amp;gt;a(x) = \sum_{i=0}^La_ix^i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Определение&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;Степенью матричного полинома&#039;&#039; назовём степень полинома максимальной степени.&lt;br /&gt;
&lt;br /&gt;
Однако на практике оказывается более важным смотреть на &#039;&#039;формальную степень&#039;&#039;. Работая с ними можно использовать следующие правила: 1) Формальная степень суммы полиномов равна максимуму из формальных степеней каждого слагаемого; 2) Умножение полинома на одночлен увеличивает его формальную степень на 1. Таким образом, построенный на шаге 1 полином является формальной степени L.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2.&#039;&#039;&#039; Построим матричный полином &amp;lt;math&amp;gt; f(x) = \sum_{i=0}^Df_ix^i &amp;lt;/math&amp;gt; формальной степени D с матричными коэффициентами &amp;lt;math&amp;gt; f_i\in\mathbb{F}_2^{m_b\times(m_b + n_b)}&amp;lt;/math&amp;gt;, для которого выполняются следующие условия:&lt;br /&gt;
# &#039;&#039;Справедливо полиномиальное соотношение&#039;&#039; &amp;lt;math&amp;gt; a(x)f(x) = g(x) + e(x)x^M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; g(x) &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; e(x) &amp;lt;/math&amp;gt; - матричные полиномы;&lt;br /&gt;
# Степень матричного полинома &amp;lt;math&amp;gt; g &amp;lt;/math&amp;gt; не превосходит &amp;lt;math&amp;gt; D &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; M &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; D &amp;lt;/math&amp;gt; удовлетворяют соотношению &amp;lt;math&amp;gt; M - D - 1 &amp;gt; \frac{n}{n_b}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Метод построения матричного полинома &amp;lt;math&amp;gt; f(x) &amp;lt;/math&amp;gt; изложим ниже)&lt;br /&gt;
&lt;br /&gt;
Т.к. &amp;lt;math&amp;gt; deg(g) \leq D&amp;lt;/math&amp;gt;, то матричные коэффициенты при степенях, больших D, равны 0. Следовательно, матричные коэффициенты a(x) и f(x) удовлетворяют системе: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum\limits_{k=0}^D a_{i + k + 1}f_{D-k} = 0, \; \forall i=\overline{0, M-D-2}&amp;lt;/math&amp;gt;, что эквивалентно, при подстановке &amp;lt;math&amp;gt; a_{i+k+1} &amp;lt;/math&amp;gt;, следующему уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Y^T A^i A\underbrace{\left(\sum\limits_{k=0}^D (A^{k} X) f_{D - k}\right)}_{W} = 0, \; \forall i = \overline{0, M - D - 2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, W удовлетворяет условиям А-ортагональности со всеми блоками векторов вида &amp;lt;math&amp;gt; Y, A^TY, (A^T)^2Y... (A^T)^{M - D - 2}Y &amp;lt;/math&amp;gt;. Далее возможно два варианта: &lt;br /&gt;
&lt;br /&gt;
1) Если линейная оболочка блоков вышеперечисленных векторов совпала со всем пространством \mathbb{F}_2^n, то выбором n линейно независимых столбцов и составлением невырожденной матрицы \hat{Y} получили бы следующее равенство:&lt;br /&gt;
&amp;lt;math&amp;gt; \hat{Y}AW = 0 &amp;lt;/math&amp;gt;. Домножив на обратную, получим &amp;lt;math&amp;gt; AW = 0&amp;lt;/math&amp;gt;  и если &amp;lt;math&amp;gt; W \neq 0 &amp;lt;/math&amp;gt;, то задача решена.&lt;br /&gt;
&lt;br /&gt;
2)Оболочка блоков не охватила всего пространства, тогда можно вероятностно оценить, что: Т.к. &amp;lt;math&amp;gt; M - D - 1 &amp;gt; \frac{n}{n_b} &amp;lt;/math&amp;gt;, то почти наверняка размерность линейной оболочки &amp;lt;math&amp;gt; (A^T)^iY, \; \forall i=\overline{0,M-D-2} &amp;lt;/math&amp;gt; близка к n. Этого достаточно, чтобы утверждать, что задача решена. (Для деталей см. &amp;lt;ref&amp;gt; Don Coppersmith. 1994. Solving homogeneous linear equations over GF(2) via block Wiedemann algorithm. Math. Comput. 62, 205 (January 1994), 333-350. DOI=10.2307/2153413 http://dx.doi.org/10.2307/2153413  &amp;lt;/ref&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
====Метод построения матричного полинома====&lt;br /&gt;
Копперсмит предложил итерационную процедуру:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;:&amp;lt;math&amp;gt; M := 0,\;&lt;br /&gt;
f(x) := [I_{m_b}\; 0],\;&lt;br /&gt;
e(x) := [a(x)\; I_{n_b}],\;&lt;br /&gt;
\delta_j = 0 &amp;lt;/math&amp;gt;, где j -- номер столбца &amp;lt;math&amp;gt;f(x), \delta_j&amp;lt;/math&amp;gt; -- формальная степень;&lt;br /&gt;
# &#039;&#039;&#039;Итерация&#039;&#039;&#039;:&lt;br /&gt;
##Вычислить &amp;lt;math&amp;gt; e_0 = e(0) &amp;lt;/math&amp;gt;;&lt;br /&gt;
##Найти P: &amp;lt;math&amp;gt; e_0P = [0\; F_{n_b}] &amp;lt;/math&amp;gt;, причём преобразование P должно быть допустимым;&lt;br /&gt;
##Вычислить &amp;lt;math&amp;gt; e:=\frac{eP(x)}{x}, \; f:=fP(x) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; P(x) = P \begin{pmatrix}I_{m_b} &amp;amp; 0\\ 0 &amp;amp; xI_{n_b}\end{pmatrix} &amp;lt;/math&amp;gt;;&lt;br /&gt;
##&amp;lt;math&amp;gt;M:=M+1&amp;lt;/math&amp;gt;&lt;br /&gt;
##&amp;lt;math&amp;gt; \delta_{j_k}:= \delta_{j_k} + 1&amp;lt;/math&amp;gt; для тех столбцов, которые были умножены на x;&lt;br /&gt;
##Вычислить формальную степень D матричного полинома f(x);&lt;br /&gt;
#&#039;&#039;&#039;Останов&#039;&#039;&#039; Проверить критерий останова: &amp;lt;math&amp;gt; M - D &amp;gt; \frac{n}{n_b} + \Delta &amp;lt;/math&amp;gt;. Если выполнен, то остановиться, нет - продолжить.&lt;br /&gt;
&lt;br /&gt;
Сколько всего потребуется итераций? Если &amp;lt;math&amp;gt;m_b = n_b&amp;lt;/math&amp;gt;, то будет выполнена оценка &amp;lt;math&amp;gt; s \approx 2\left(\frac{n}{n_b} + 1\right) &amp;lt;/math&amp;gt;. Если же брать &amp;lt;math&amp;gt;m_b = 2n_b&amp;lt;/math&amp;gt;, как советовал Копперсмит, то &amp;lt;math&amp;gt; s \approx \frac{3}{2}\left(\frac{n}{n_b} + 1\right) &amp;lt;/math&amp;gt; (Более подробный анализ см. в &amp;lt;ref&amp;gt;Замарашкин, Николай Леонидович.&lt;br /&gt;
Алгоритмы для разряженных систем линейных уравнений в GF(2) [Текст] : учебное пособие для студентов высших учебных заведений, обучающихся по направлениям ВПО 010400 &amp;quot;Прикладная математика и информатика&amp;quot; и 010300 &amp;quot;Фундаментальная информатика и информационные технологии&amp;quot; / Н. Л. Замарашкин ; Московский гос. ун-т им. М. В. Ломоносова. - Москва : Изд-во Московского ун-та, 2013. - 128, [2] с. : ил., табл.; 21 см. - (Серия: Суперкомпьютерное образование / Суперкомпьютерный консорциум ун-тов России).; ISBN 978-5-211-06483-6&amp;lt;/ref&amp;gt; ). С точки зрения вероятностной устойчивости и скорости логичнее использовать второй случай, однако, как показывал опыт, и исходя из указаний Копперсмита (глава 5 &amp;lt;ref&amp;gt; Don Coppersmith. 1994. Solving homogeneous linear equations over GF(2) via block Wiedemann algorithm. Math. Comput. 62, 205 (January 1994), 333-350. DOI=10.2307/2153413 http://dx.doi.org/10.2307/2153413  &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;
=== Схема реализации последовательного алгоритма ===&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;
&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>GKormakov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%92%D0%B8%D0%B4%D0%B5%D0%BC%D0%B0%D0%BD%D0%B0-%D0%9A%D0%BE%D0%BF%D0%BF%D0%B5%D1%80%D1%81%D0%BC%D0%B8%D1%82%D0%B0&amp;diff=27564</id>
		<title>Метод Видемана-Копперсмита</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%92%D0%B8%D0%B4%D0%B5%D0%BC%D0%B0%D0%BD%D0%B0-%D0%9A%D0%BE%D0%BF%D0%BF%D0%B5%D1%80%D1%81%D0%BC%D0%B8%D1%82%D0%B0&amp;diff=27564"/>
		<updated>2019-11-19T20:04:23Z</updated>

		<summary type="html">&lt;p&gt;GKormakov: /* Метод построения матричного полинома */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{Автор - Участник:GKormakov}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Видемана-Копперсмита&#039;&#039;&#039; был предложен Дугласом Видеманом в статье 1986 года &amp;lt;ref&amp;gt;Wiedemann D.H. Solving sparce linear equations over finite fields (англ.). — 1986. — Январь (т. 32, № 1). — С. 54—62.&amp;lt;/ref&amp;gt;. Алгоритм позволял получить решение системы линейных уравнений &amp;lt;math&amp;gt;Ax = b &amp;lt;/math&amp;gt; над полем GF(2) (в общем случае, над конечным полем GF(q)) в случае, когда матрица A являлась разреженной. В частности, совместный алгоритм Видемана-Копперсмита решал задачу поиска нетривиальных векторов из ядра матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, т.е. нетривиальные решения уравнения  &amp;lt;math&amp;gt;Ax = 0 &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; A^T A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Статья обосновывала корректность алгоритма, оценивала сложность вычислений, рассматривала разложения многочленов на множители и вычисление матричных полиномов. После выхода статьи сам метод не получил широкого применения, однако теоретические оценки и вспомогательные алгоритмы получили признание.&lt;br /&gt;
&lt;br /&gt;
В рамках вычислений алгоритм является улучшенной версией алгоритма Копперсмита и алгоритма Монтгомери. В отличии от алгоритма Монтгомери имеет более эффективную реализацию на параллельных вычислительных системах - одним из главных отличий является меньший обмен данными между вычислительными узлами. &lt;br /&gt;
&lt;br /&gt;
Алгоритм получил широкое применение в алгоритмах криптографии, в том числе, в алгоритме факторизации, использующего факторные базы&amp;lt;ref&amp;gt;Замарашкин, Николай Леонидович.&lt;br /&gt;
Алгоритмы для разряженных систем линейных уравнений в GF(2) [Текст] : учебное пособие для студентов высших учебных заведений, обучающихся по направлениям ВПО 010400 &amp;quot;Прикладная математика и информатика&amp;quot; и 010300 &amp;quot;Фундаментальная информатика и информационные технологии&amp;quot; / Н. Л. Замарашкин ; Московский гос. ун-т им. М. В. Ломоносова. - Москва : Изд-во Московского ун-та, 2013. - 128, [2] с. : ил., табл.; 21 см. - (Серия: Суперкомпьютерное образование / Суперкомпьютерный консорциум ун-тов России).; ISBN 978-5-211-06483-6&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование стандартных методов Крылова (например, метода Ланцоша) не могли гарантировать условий на матрицу в GF(2), которые гарантировали сходимость, в связи с этим и были предложены перечисленные выше методы.&lt;br /&gt;
&lt;br /&gt;
===Математическое описание алгоритма===&lt;br /&gt;
====Метод Видемана====&lt;br /&gt;
=====Невырожденный случай=====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Ax = b, A\in\mathbb{F}_2^{n \times n}, b\in \mathbb{F}_2^n&amp;lt;/math&amp;gt; - согласованная СЛАУ с квадратной невырожденной матрицей. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
f(\lambda) = 1 + \sum_{i=1}^n f_i \lambda^i&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; - характеристический полином матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с коэффициентами &amp;lt;math&amp;gt;f_i\in\mathbb{F}_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По теореме Гамильтона-Кэли &amp;lt;math&amp;gt;f(A) = 0&amp;lt;/math&amp;gt;, следовательно, &amp;lt;math&amp;gt;f(A)b = 0&amp;lt;/math&amp;gt;. И, учитывая вид характеристической функции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
b = \sum_{i=1}^n f_i A^i b = A(\sum_{i=1}^{n-1} f_{i+1}A^i b )&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, если коэффициенты характеристического полинома известны, то единственное решение исследуемой системы можно найти как линейную комбинацию векторов Крылова: &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
x = \sum_{i=1}^{n-1} f_{i+1}A^i b&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Но как искать эти коэффициенты? Для случая СЛАУ с разреженной матрицей Видеман предложил следующую идею:&lt;br /&gt;
1Выбрать случайный вектор &amp;lt;math&amp;gt;y \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;, тогда для &amp;lt;math&amp;gt;j = 0...n&amp;lt;/math&amp;gt; верны следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
y^Tf(A)A^jb = y^T(\sum_{i=0}^{n} f_iA^i)A^jb = \sum_{i=0}^{n}(y^TA^{i+j}b)f_i = 0&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt; \alpha_i = y^T A^ib \in \mathbb{F}_2, \forall i=0...n&amp;lt;/math&amp;gt;, тогда верхняя система преобразуется в однородную СЛАУ: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\sum_{i=0}^{n}\alpha_{i+j}f_i = 0 , j = 0...n&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
с матрицей &amp;lt;math&amp;gt;H_{ij}=\alpha_{i+j}&amp;lt;/math&amp;gt; порядка n + 1, имеющую ганкелеву структуру, что позволяет проще (за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; - алгоритм Тренча) решать СЛАУ, поскольку матрица задаётся 2n + 1 параметрами. Если переставить строки матрицы &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в обратном порядке, то матрица станет теплицевой. Над GF(2) также известны быстрые алгоритмы решения СЛАУ (алгоритм Берлекампа - Масси)&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;
Поскольку &amp;lt;math&amp;gt; A&amp;lt;/math&amp;gt; теперь вырожденная, то характеристический полином будет выглядеть иначе (занулятся младшие коэффициенты):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
f(\lambda) = \lambda^s(\sum_{i=0}^{n-s} f_{i+s} \lambda^i), причём f_s \neq 0&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
В этом случае выбираем произвольный вектор &amp;lt;math&amp;gt; x\in\mathbb{F}_2^n&amp;lt;/math&amp;gt;  и находим вектор &amp;lt;math&amp;gt; \omega \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\omega = (\sum_{i=0}^{n-s} f_{i+s} A^i)x&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Т.к. размерность ядра матрицы &amp;lt;math&amp;gt;\sum_{i=0}^{n-s} f_{i+s} A^i&amp;lt;/math&amp;gt; не может быть больше n - 1, а размерность пространства &amp;lt;math&amp;gt;\mathbb{F} &amp;lt;/math&amp;gt; равна n, то с вероятностью 1/2 &amp;lt;math&amp;gt;\omega \neq 0&amp;lt;/math&amp;gt;. Если же он равен 0, то выбираем другой x и ищем степень матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A^\delta \omega \neq 0, а A^{\delta + 1} \omega = 0&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;A^\delta \omega&amp;lt;/math&amp;gt; - искомый вектор из ядра.&lt;br /&gt;
&lt;br /&gt;
Перепишем итоговый алгоритм Видемана для нахождения вектора из ядра A:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1.&#039;&#039;&#039; Выбираем случайные векторы &amp;lt;math&amp;gt;x, y \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2.&#039;&#039;&#039; &amp;lt;math&amp;gt;\forall s = 0, ... 2n&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;\alpha_s = y^TA^sx&amp;lt;/math&amp;gt; и строим полином &amp;lt;math&amp;gt;a(x) = \sum\alpha_ix^i \textit{формальной}&amp;lt;/math&amp;gt; степени 2n&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3.&#039;&#039;&#039; Характеристическому полиному &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; ставим в соответствие полином &amp;lt;math&amp;gt;\widetilde{f(x)} = x^n f(\frac{1}{x}), тогда f_i = \widetilde{f(x)}_{n-i}&amp;lt;/math&amp;gt; и &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i=0}^n\alpha_{i+j}f_i = \sum_{i=0}^n\alpha_{i+j}\widetilde{f(x)}_{n-i} = 0,  j=0...n&amp;lt;/math&amp;gt;,  т.е. все коэффициенты в &amp;lt;math&amp;gt;a(x)\widetilde{f(x)}&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;x^n, x^{n+1}, ..., x^{2n}&amp;lt;/math&amp;gt; будут равны &lt;br /&gt;
&lt;br /&gt;
Т.е. &amp;lt;math&amp;gt;a(x)\widetilde{f(x)} = g(x) mod \,x^{2n + 1}, где\, deg(g) &amp;lt; n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом построили полином &amp;lt;math&amp;gt;\widetilde{f(x)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4.&#039;&#039;&#039; Получаем решение &amp;lt;math&amp;gt;\omega = A^\delta \sum_if_iA^ix : A\omega = 0&amp;lt;/math&amp;gt; алгоритмом, описанным выше&lt;br /&gt;
&lt;br /&gt;
====Алгоритм Видемана-Копперсмита====&lt;br /&gt;
Алгоритм Видемана по поиску вектора из ядра матрицы A сводился к решению СЛАУ с генкелевой или теплицевой матрицей, что ускоряло алгоритм, однако алгоритм Видемана является последовательным алгоритмом (коэффициенты полинома &amp;lt;math&amp;gt;a(x)&amp;lt;/math&amp;gt; вычисляются последовательно), т.е. он не имеет выигрыша по скорости перед методом Монтгомери при распараллеливании на несколько узлов. Поэтому Копперсмит добавил в алгоритм Видемана работу с блочными матрицами.&lt;br /&gt;
&lt;br /&gt;
Пусть также задана однородная СЛАУ &amp;lt;math&amp;gt;Ax = 0\, , A\in\mathbb{F}_2^{n\times n}&amp;lt;/math&amp;gt;, так же требуется найти нетривиальное решение. Опишем предложения Копперсмита:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1.&#039;&#039;&#039; Рассмотрим два случайных блока &amp;lt;math&amp;gt;Z\in \mathbb{F}_2^{n\times m_b}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y\in \mathbb{F}_2^{n\times n_b}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m_b \neq n_b&amp;lt;/math&amp;gt;. Тогда столбцы матрицы &amp;lt;math&amp;gt;AZ = X\in \mathbb{F}_2^{n\times m_b}&amp;lt;/math&amp;gt; будут принадлежать линейной оболочке столбцов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. На практике числа &amp;lt;math&amp;gt;m_b, n_b&amp;lt;/math&amp;gt; кратны размеру машинного слова, это будет использовано при параллельной реализации.&lt;br /&gt;
&lt;br /&gt;
Далее вычисляются матрицы &amp;lt;math&amp;gt;a_i = Y^TA^iX \in \mathbb{F}_2^{n_b\times m_b} \forall\, i=0...L&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;L = \frac{n}{n_b} + \frac{n}{m_b} + \Delta&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt; - небольшое натуральное число, например, 10.&lt;br /&gt;
С помощью этих матриц определяем полином &amp;lt;math&amp;gt;a(x) = \sum_{i=0}^La_ix^i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Определение&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;Степенью матричного полинома&#039;&#039; назовём степень полинома максимальной степени.&lt;br /&gt;
&lt;br /&gt;
Однако на практике оказывается более важным смотреть на &#039;&#039;формальную степень&#039;&#039;. Работая с ними можно использовать следующие правила: 1) Формальная степень суммы полиномов равна максимуму из формальных степеней каждого слагаемого; 2) Умножение полинома на одночлен увеличивает его формальную степень на 1. Таким образом, построенный на шаге 1 полином является формальной степени L.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2.&#039;&#039;&#039; Построим матричный полином &amp;lt;math&amp;gt; f(x) = \sum_{i=0}^Df_ix^i &amp;lt;/math&amp;gt; формальной степени D с матричными коэффициентами &amp;lt;math&amp;gt; f_i\in\mathbb{F}_2^{m_b\times(m_b + n_b)}&amp;lt;/math&amp;gt;, для которого выполняются следующие условия:&lt;br /&gt;
# &#039;&#039;Справедливо полиномиальное соотношение&#039;&#039; &amp;lt;math&amp;gt; a(x)f(x) = g(x) + e(x)x^M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; g(x) &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; e(x) &amp;lt;/math&amp;gt; - матричные полиномы;&lt;br /&gt;
# Степень матричного полинома &amp;lt;math&amp;gt; g &amp;lt;/math&amp;gt; не превосходит &amp;lt;math&amp;gt; D &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; M &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; D &amp;lt;/math&amp;gt; удовлетворяют соотношению &amp;lt;math&amp;gt; M - D - 1 &amp;gt; \frac{n}{n_b}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Метод построения матричного полинома &amp;lt;math&amp;gt; f(x) &amp;lt;/math&amp;gt; изложим ниже)&lt;br /&gt;
&lt;br /&gt;
Т.к. &amp;lt;math&amp;gt; deg(g) \leq D&amp;lt;/math&amp;gt;, то матричные коэффициенты при степенях, больших D, равны 0. Следовательно, матричные коэффициенты a(x) и f(x) удовлетворяют системе: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum\limits_{k=0}^D a_{i + k + 1}f_{D-k} = 0, \; \forall i=\overline{0, M-D-2}&amp;lt;/math&amp;gt;, что эквивалентно, при подстановке &amp;lt;math&amp;gt; a_{i+k+1} &amp;lt;/math&amp;gt;, следующему уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Y^T A^i A\underbrace{\left(\sum\limits_{k=0}^D (A^{k} X) f_{D - k}\right)}_{W} = 0, \; \forall i = \overline{0, M - D - 2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, W удовлетворяет условиям А-ортагональности со всеми блоками векторов вида &amp;lt;math&amp;gt; Y, A^TY, (A^T)^2Y... (A^T)^{M - D - 2}Y &amp;lt;/math&amp;gt;. Далее возможно два варианта: &lt;br /&gt;
&lt;br /&gt;
1) Если линейная оболочка блоков вышеперечисленных векторов совпала со всем пространством \mathbb{F}_2^n, то выбором n линейно независимых столбцов и составлением невырожденной матрицы \hat{Y} получили бы следующее равенство:&lt;br /&gt;
&amp;lt;math&amp;gt; \hat{Y}AW = 0 &amp;lt;/math&amp;gt;. Домножив на обратную, получим &amp;lt;math&amp;gt; AW = 0&amp;lt;/math&amp;gt;  и если &amp;lt;math&amp;gt; W \neq 0 &amp;lt;/math&amp;gt;, то задача решена.&lt;br /&gt;
&lt;br /&gt;
2)Оболочка блоков не охватила всего пространства, тогда можно вероятностно оценить, что: Т.к. &amp;lt;math&amp;gt; M - D - 1 &amp;gt; \frac{n}{n_b} &amp;lt;/math&amp;gt;, то почти наверняка размерность линейной оболочки &amp;lt;math&amp;gt; (A^T)^iY, \; \forall i=\overline{0,M-D-2} &amp;lt;/math&amp;gt; близка к n. Этого достаточно, чтобы утверждать, что задача решена. (Для деталей см. &amp;lt;ref&amp;gt; Don Coppersmith. 1994. Solving homogeneous linear equations over GF(2) via block Wiedemann algorithm. Math. Comput. 62, 205 (January 1994), 333-350. DOI=10.2307/2153413 http://dx.doi.org/10.2307/2153413  &amp;lt;/ref&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
====Метод построения матричного полинома====&lt;br /&gt;
Копперсмит предложил итерационную процедуру:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;:&amp;lt;math&amp;gt; M := 0,\;&lt;br /&gt;
f(x) := [I_{m_b}\; 0],\;&lt;br /&gt;
e(x) := [a(x)\; I_{n_b}],\;&lt;br /&gt;
\delta_j = 0 &amp;lt;/math&amp;gt;, где j -- номер столбца &amp;lt;math&amp;gt;f(x), \delta_j&amp;lt;/math&amp;gt; -- формальная степень;&lt;br /&gt;
# &#039;&#039;&#039;Итерация&#039;&#039;&#039;:&lt;br /&gt;
##Вычислить &amp;lt;math&amp;gt; e_0 = e(0) &amp;lt;/math&amp;gt;;&lt;br /&gt;
##Найти P: &amp;lt;math&amp;gt; e_0P = [0\; F_{n_b}] &amp;lt;/math&amp;gt;, причём преобразование P должно быть допустимым;&lt;br /&gt;
##Вычислить &amp;lt;math&amp;gt; e:=\frac{eP(x)}{x}, \; f:=fP(x) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; P(x) = P \begin{pmatrix}I_{m_b} &amp;amp; 0\\ 0 &amp;amp; xI_{n_b}\end{pmatrix} &amp;lt;/math&amp;gt;;&lt;br /&gt;
##&amp;lt;math&amp;gt;M:=M+1&amp;lt;/math&amp;gt;&lt;br /&gt;
##&amp;lt;math&amp;gt; \delta_{j_k}:= \delta_{j_k} + 1&amp;lt;/math&amp;gt; для тех столбцов, которые были умножены на x;&lt;br /&gt;
##Вычислить формальную степень D матричного полинома f(x);&lt;br /&gt;
#&#039;&#039;&#039;Останов&#039;&#039;&#039; Проверить критерий останова: &amp;lt;math&amp;gt; M - D &amp;gt; \frac{n}{n_b} + \Delta &amp;lt;/math&amp;gt;. Если выполнен, то остановиться, нет - продолжить.&lt;br /&gt;
&lt;br /&gt;
Сколько всего потребуется итераций? Если &amp;lt;math&amp;gt;m_b = n_b&amp;lt;/math&amp;gt;, то будет выполнена оценка &amp;lt;math&amp;gt; s \approx 2\left(\frac{n}{n_b} + 1\right) &amp;lt;/math&amp;gt;. Если же брать &amp;lt;math&amp;gt;m_b = 2n_b&amp;lt;/math&amp;gt;, как советовал Копперсмит, то &amp;lt;math&amp;gt; s \approx \frac{3}{2}\left(\frac{n}{n_b} + 1\right) &amp;lt;/math&amp;gt; (Более подробный анализ см. в &amp;lt;ref&amp;gt;Замарашкин, Николай Леонидович.&lt;br /&gt;
Алгоритмы для разряженных систем линейных уравнений в GF(2) [Текст] : учебное пособие для студентов высших учебных заведений, обучающихся по направлениям ВПО 010400 &amp;quot;Прикладная математика и информатика&amp;quot; и 010300 &amp;quot;Фундаментальная информатика и информационные технологии&amp;quot; / Н. Л. Замарашкин ; Московский гос. ун-т им. М. В. Ломоносова. - Москва : Изд-во Московского ун-та, 2013. - 128, [2] с. : ил., табл.; 21 см. - (Серия: Суперкомпьютерное образование / Суперкомпьютерный консорциум ун-тов России).; ISBN 978-5-211-06483-6&amp;lt;/ref&amp;gt; ). С точки зрения вероятностной устойчивости и скорости логичнее использовать второй случай, однако, как показывал опыт, и исходя из указаний Копперсмита (глава 5 &amp;lt;ref&amp;gt; Don Coppersmith. 1994. Solving homogeneous linear equations over GF(2) via block Wiedemann algorithm. Math. Comput. 62, 205 (January 1994), 333-350. DOI=10.2307/2153413 http://dx.doi.org/10.2307/2153413  &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;
=== Схема реализации последовательного алгоритма ===&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;
&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>GKormakov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%92%D0%B8%D0%B4%D0%B5%D0%BC%D0%B0%D0%BD%D0%B0-%D0%9A%D0%BE%D0%BF%D0%BF%D0%B5%D1%80%D1%81%D0%BC%D0%B8%D1%82%D0%B0&amp;diff=27561</id>
		<title>Метод Видемана-Копперсмита</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%92%D0%B8%D0%B4%D0%B5%D0%BC%D0%B0%D0%BD%D0%B0-%D0%9A%D0%BE%D0%BF%D0%BF%D0%B5%D1%80%D1%81%D0%BC%D0%B8%D1%82%D0%B0&amp;diff=27561"/>
		<updated>2019-11-19T19:15:48Z</updated>

		<summary type="html">&lt;p&gt;GKormakov: /* Алгоритм Видемана-Копперсмита */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{Автор - Участник:GKormakov}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Видемана-Копперсмита&#039;&#039;&#039; был предложен Дугласом Видеманом в статье 1986 года &amp;lt;ref&amp;gt;Wiedemann D.H. Solving sparce linear equations over finite fields (англ.). — 1986. — Январь (т. 32, № 1). — С. 54—62.&amp;lt;/ref&amp;gt;. Алгоритм позволял получить решение системы линейных уравнений &amp;lt;math&amp;gt;Ax = b &amp;lt;/math&amp;gt; над полем GF(2) (в общем случае, над конечным полем GF(q)) в случае, когда матрица A являлась разреженной. В частности, совместный алгоритм Видемана-Копперсмита решал задачу поиска нетривиальных векторов из ядра матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, т.е. нетривиальные решения уравнения  &amp;lt;math&amp;gt;Ax = 0 &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; A^T A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Статья обосновывала корректность алгоритма, оценивала сложность вычислений, рассматривала разложения многочленов на множители и вычисление матричных полиномов. После выхода статьи сам метод не получил широкого применения, однако теоретические оценки и вспомогательные алгоритмы получили признание.&lt;br /&gt;
&lt;br /&gt;
В рамках вычислений алгоритм является улучшенной версией алгоритма Копперсмита и алгоритма Монтгомери. В отличии от алгоритма Монтгомери имеет более эффективную реализацию на параллельных вычислительных системах - одним из главных отличий является меньший обмен данными между вычислительными узлами. &lt;br /&gt;
&lt;br /&gt;
Алгоритм получил широкое применение в алгоритмах криптографии, в том числе, в алгоритме факторизации, использующего факторные базы&amp;lt;ref&amp;gt;Замарашкин, Николай Леонидович.&lt;br /&gt;
Алгоритмы для разряженных систем линейных уравнений в GF(2) [Текст] : учебное пособие для студентов высших учебных заведений, обучающихся по направлениям ВПО 010400 &amp;quot;Прикладная математика и информатика&amp;quot; и 010300 &amp;quot;Фундаментальная информатика и информационные технологии&amp;quot; / Н. Л. Замарашкин ; Московский гос. ун-т им. М. В. Ломоносова. - Москва : Изд-во Московского ун-та, 2013. - 128, [2] с. : ил., табл.; 21 см. - (Серия: Суперкомпьютерное образование / Суперкомпьютерный консорциум ун-тов России).; ISBN 978-5-211-06483-6&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование стандартных методов Крылова (например, метода Ланцоша) не могли гарантировать условий на матрицу в GF(2), которые гарантировали сходимость, в связи с этим и были предложены перечисленные выше методы.&lt;br /&gt;
&lt;br /&gt;
===Математическое описание алгоритма===&lt;br /&gt;
====Метод Видемана====&lt;br /&gt;
=====Невырожденный случай=====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Ax = b, A\in\mathbb{F}_2^{n \times n}, b\in \mathbb{F}_2^n&amp;lt;/math&amp;gt; - согласованная СЛАУ с квадратной невырожденной матрицей. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
f(\lambda) = 1 + \sum_{i=1}^n f_i \lambda^i&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; - характеристический полином матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с коэффициентами &amp;lt;math&amp;gt;f_i\in\mathbb{F}_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По теореме Гамильтона-Кэли &amp;lt;math&amp;gt;f(A) = 0&amp;lt;/math&amp;gt;, следовательно, &amp;lt;math&amp;gt;f(A)b = 0&amp;lt;/math&amp;gt;. И, учитывая вид характеристической функции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
b = \sum_{i=1}^n f_i A^i b = A(\sum_{i=1}^{n-1} f_{i+1}A^i b )&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, если коэффициенты характеристического полинома известны, то единственное решение исследуемой системы можно найти как линейную комбинацию векторов Крылова: &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
x = \sum_{i=1}^{n-1} f_{i+1}A^i b&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Но как искать эти коэффициенты? Для случая СЛАУ с разреженной матрицей Видеман предложил следующую идею:&lt;br /&gt;
1Выбрать случайный вектор &amp;lt;math&amp;gt;y \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;, тогда для &amp;lt;math&amp;gt;j = 0...n&amp;lt;/math&amp;gt; верны следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
y^Tf(A)A^jb = y^T(\sum_{i=0}^{n} f_iA^i)A^jb = \sum_{i=0}^{n}(y^TA^{i+j}b)f_i = 0&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt; \alpha_i = y^T A^ib \in \mathbb{F}_2, \forall i=0...n&amp;lt;/math&amp;gt;, тогда верхняя система преобразуется в однородную СЛАУ: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\sum_{i=0}^{n}\alpha_{i+j}f_i = 0 , j = 0...n&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
с матрицей &amp;lt;math&amp;gt;H_{ij}=\alpha_{i+j}&amp;lt;/math&amp;gt; порядка n + 1, имеющую ганкелеву структуру, что позволяет проще (за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; - алгоритм Тренча) решать СЛАУ, поскольку матрица задаётся 2n + 1 параметрами. Если переставить строки матрицы &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в обратном порядке, то матрица станет теплицевой. Над GF(2) также известны быстрые алгоритмы решения СЛАУ (алгоритм Берлекампа - Масси)&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;
Поскольку &amp;lt;math&amp;gt; A&amp;lt;/math&amp;gt; теперь вырожденная, то характеристический полином будет выглядеть иначе (занулятся младшие коэффициенты):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
f(\lambda) = \lambda^s(\sum_{i=0}^{n-s} f_{i+s} \lambda^i), причём f_s \neq 0&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
В этом случае выбираем произвольный вектор &amp;lt;math&amp;gt; x\in\mathbb{F}_2^n&amp;lt;/math&amp;gt;  и находим вектор &amp;lt;math&amp;gt; \omega \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\omega = (\sum_{i=0}^{n-s} f_{i+s} A^i)x&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Т.к. размерность ядра матрицы &amp;lt;math&amp;gt;\sum_{i=0}^{n-s} f_{i+s} A^i&amp;lt;/math&amp;gt; не может быть больше n - 1, а размерность пространства &amp;lt;math&amp;gt;\mathbb{F} &amp;lt;/math&amp;gt; равна n, то с вероятностью 1/2 &amp;lt;math&amp;gt;\omega \neq 0&amp;lt;/math&amp;gt;. Если же он равен 0, то выбираем другой x и ищем степень матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A^\delta \omega \neq 0, а A^{\delta + 1} \omega = 0&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;A^\delta \omega&amp;lt;/math&amp;gt; - искомый вектор из ядра.&lt;br /&gt;
&lt;br /&gt;
Перепишем итоговый алгоритм Видемана для нахождения вектора из ядра A:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1.&#039;&#039;&#039; Выбираем случайные векторы &amp;lt;math&amp;gt;x, y \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2.&#039;&#039;&#039; &amp;lt;math&amp;gt;\forall s = 0, ... 2n&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;\alpha_s = y^TA^sx&amp;lt;/math&amp;gt; и строим полином &amp;lt;math&amp;gt;a(x) = \sum\alpha_ix^i \textit{формальной}&amp;lt;/math&amp;gt; степени 2n&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3.&#039;&#039;&#039; Характеристическому полиному &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; ставим в соответствие полином &amp;lt;math&amp;gt;\widetilde{f(x)} = x^n f(\frac{1}{x}), тогда f_i = \widetilde{f(x)}_{n-i}&amp;lt;/math&amp;gt; и &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i=0}^n\alpha_{i+j}f_i = \sum_{i=0}^n\alpha_{i+j}\widetilde{f(x)}_{n-i} = 0,  j=0...n&amp;lt;/math&amp;gt;,  т.е. все коэффициенты в &amp;lt;math&amp;gt;a(x)\widetilde{f(x)}&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;x^n, x^{n+1}, ..., x^{2n}&amp;lt;/math&amp;gt; будут равны &lt;br /&gt;
&lt;br /&gt;
Т.е. &amp;lt;math&amp;gt;a(x)\widetilde{f(x)} = g(x) mod \,x^{2n + 1}, где\, deg(g) &amp;lt; n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом построили полином &amp;lt;math&amp;gt;\widetilde{f(x)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4.&#039;&#039;&#039; Получаем решение &amp;lt;math&amp;gt;\omega = A^\delta \sum_if_iA^ix : A\omega = 0&amp;lt;/math&amp;gt; алгоритмом, описанным выше&lt;br /&gt;
&lt;br /&gt;
====Алгоритм Видемана-Копперсмита====&lt;br /&gt;
Алгоритм Видемана по поиску вектора из ядра матрицы A сводился к решению СЛАУ с генкелевой или теплицевой матрицей, что ускоряло алгоритм, однако алгоритм Видемана является последовательным алгоритмом (коэффициенты полинома &amp;lt;math&amp;gt;a(x)&amp;lt;/math&amp;gt; вычисляются последовательно), т.е. он не имеет выигрыша по скорости перед методом Монтгомери при распараллеливании на несколько узлов. Поэтому Копперсмит добавил в алгоритм Видемана работу с блочными матрицами.&lt;br /&gt;
&lt;br /&gt;
Пусть также задана однородная СЛАУ &amp;lt;math&amp;gt;Ax = 0\, , A\in\mathbb{F}_2^{n\times n}&amp;lt;/math&amp;gt;, так же требуется найти нетривиальное решение. Опишем предложения Копперсмита:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1.&#039;&#039;&#039; Рассмотрим два случайных блока &amp;lt;math&amp;gt;Z\in \mathbb{F}_2^{n\times m_b}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y\in \mathbb{F}_2^{n\times n_b}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m_b \neq n_b&amp;lt;/math&amp;gt;. Тогда столбцы матрицы &amp;lt;math&amp;gt;AZ = X\in \mathbb{F}_2^{n\times m_b}&amp;lt;/math&amp;gt; будут принадлежать линейной оболочке столбцов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. На практике числа &amp;lt;math&amp;gt;m_b, n_b&amp;lt;/math&amp;gt; кратны размеру машинного слова, это будет использовано при параллельной реализации.&lt;br /&gt;
&lt;br /&gt;
Далее вычисляются матрицы &amp;lt;math&amp;gt;a_i = Y^TA^iX \in \mathbb{F}_2^{n_b\times m_b} \forall\, i=0...L&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;L = \frac{n}{n_b} + \frac{n}{m_b} + \Delta&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt; - небольшое натуральное число, например, 10.&lt;br /&gt;
С помощью этих матриц определяем полином &amp;lt;math&amp;gt;a(x) = \sum_{i=0}^La_ix^i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Определение&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;Степенью матричного полинома&#039;&#039; назовём степень полинома максимальной степени.&lt;br /&gt;
&lt;br /&gt;
Однако на практике оказывается более важным смотреть на &#039;&#039;формальную степень&#039;&#039;. Работая с ними можно использовать следующие правила: 1) Формальная степень суммы полиномов равна максимуму из формальных степеней каждого слагаемого; 2) Умножение полинома на одночлен увеличивает его формальную степень на 1. Таким образом, построенный на шаге 1 полином является формальной степени L.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2.&#039;&#039;&#039; Построим матричный полином &amp;lt;math&amp;gt; f(x) = \sum_{i=0}^Df_ix^i &amp;lt;/math&amp;gt; формальной степени D с матричными коэффициентами &amp;lt;math&amp;gt; f_i\in\mathbb{F}_2^{m_b\times(m_b + n_b)}&amp;lt;/math&amp;gt;, для которого выполняются следующие условия:&lt;br /&gt;
# &#039;&#039;Справедливо полиномиальное соотношение&#039;&#039; &amp;lt;math&amp;gt; a(x)f(x) = g(x) + e(x)x^M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; g(x) &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; e(x) &amp;lt;/math&amp;gt; - матричные полиномы;&lt;br /&gt;
# Степень матричного полинома &amp;lt;math&amp;gt; g &amp;lt;/math&amp;gt; не превосходит &amp;lt;math&amp;gt; D &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; M &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; D &amp;lt;/math&amp;gt; удовлетворяют соотношению &amp;lt;math&amp;gt; M - D - 1 &amp;gt; \frac{n}{n_b}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Метод построения матричного полинома &amp;lt;math&amp;gt; f(x) &amp;lt;/math&amp;gt; изложим ниже)&lt;br /&gt;
&lt;br /&gt;
Т.к. &amp;lt;math&amp;gt; deg(g) \leq D&amp;lt;/math&amp;gt;, то матричные коэффициенты при степенях, больших D, равны 0. Следовательно, матричные коэффициенты a(x) и f(x) удовлетворяют системе: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum\limits_{k=0}^D a_{i + k + 1}f_{D-k} = 0, \; \forall i=\overline{0, M-D-2}&amp;lt;/math&amp;gt;, что эквивалентно, при подстановке &amp;lt;math&amp;gt; a_{i+k+1} &amp;lt;/math&amp;gt;, следующему уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Y^T A^i A\underbrace{\left(\sum\limits_{k=0}^D (A^{k} X) f_{D - k}\right)}_{W} = 0, \; \forall i = \overline{0, M - D - 2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, W удовлетворяет условиям А-ортагональности со всеми блоками векторов вида &amp;lt;math&amp;gt; Y, A^TY, (A^T)^2Y... (A^T)^{M - D - 2}Y &amp;lt;/math&amp;gt;. Далее возможно два варианта: &lt;br /&gt;
&lt;br /&gt;
1) Если линейная оболочка блоков вышеперечисленных векторов совпала со всем пространством \mathbb{F}_2^n, то выбором n линейно независимых столбцов и составлением невырожденной матрицы \hat{Y} получили бы следующее равенство:&lt;br /&gt;
&amp;lt;math&amp;gt; \hat{Y}AW = 0 &amp;lt;/math&amp;gt;. Домножив на обратную, получим &amp;lt;math&amp;gt; AW = 0&amp;lt;/math&amp;gt;  и если &amp;lt;math&amp;gt; W \neq 0 &amp;lt;/math&amp;gt;, то задача решена.&lt;br /&gt;
&lt;br /&gt;
2)Оболочка блоков не охватила всего пространства, тогда можно вероятностно оценить, что: Т.к. &amp;lt;math&amp;gt; M - D - 1 &amp;gt; \frac{n}{n_b} &amp;lt;/math&amp;gt;, то почти наверняка размерность линейной оболочки &amp;lt;math&amp;gt; (A^T)^iY, \; \forall i=\overline{0,M-D-2} &amp;lt;/math&amp;gt; близка к n. Этого достаточно, чтобы утверждать, что задача решена. (Для деталей см. &amp;lt;ref&amp;gt; Don Coppersmith. 1994. Solving homogeneous linear equations over GF(2) via block Wiedemann algorithm. Math. Comput. 62, 205 (January 1994), 333-350. DOI=10.2307/2153413 http://dx.doi.org/10.2307/2153413  &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;
&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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>GKormakov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%92%D0%B8%D0%B4%D0%B5%D0%BC%D0%B0%D0%BD%D0%B0-%D0%9A%D0%BE%D0%BF%D0%BF%D0%B5%D1%80%D1%81%D0%BC%D0%B8%D1%82%D0%B0&amp;diff=27560</id>
		<title>Метод Видемана-Копперсмита</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%92%D0%B8%D0%B4%D0%B5%D0%BC%D0%B0%D0%BD%D0%B0-%D0%9A%D0%BE%D0%BF%D0%BF%D0%B5%D1%80%D1%81%D0%BC%D0%B8%D1%82%D0%B0&amp;diff=27560"/>
		<updated>2019-11-19T19:14:22Z</updated>

		<summary type="html">&lt;p&gt;GKormakov: /* Алгоритм Видемана-Копперсмита */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{Автор - Участник:GKormakov}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Видемана-Копперсмита&#039;&#039;&#039; был предложен Дугласом Видеманом в статье 1986 года &amp;lt;ref&amp;gt;Wiedemann D.H. Solving sparce linear equations over finite fields (англ.). — 1986. — Январь (т. 32, № 1). — С. 54—62.&amp;lt;/ref&amp;gt;. Алгоритм позволял получить решение системы линейных уравнений &amp;lt;math&amp;gt;Ax = b &amp;lt;/math&amp;gt; над полем GF(2) (в общем случае, над конечным полем GF(q)) в случае, когда матрица A являлась разреженной. В частности, совместный алгоритм Видемана-Копперсмита решал задачу поиска нетривиальных векторов из ядра матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, т.е. нетривиальные решения уравнения  &amp;lt;math&amp;gt;Ax = 0 &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; A^T A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Статья обосновывала корректность алгоритма, оценивала сложность вычислений, рассматривала разложения многочленов на множители и вычисление матричных полиномов. После выхода статьи сам метод не получил широкого применения, однако теоретические оценки и вспомогательные алгоритмы получили признание.&lt;br /&gt;
&lt;br /&gt;
В рамках вычислений алгоритм является улучшенной версией алгоритма Копперсмита и алгоритма Монтгомери. В отличии от алгоритма Монтгомери имеет более эффективную реализацию на параллельных вычислительных системах - одним из главных отличий является меньший обмен данными между вычислительными узлами. &lt;br /&gt;
&lt;br /&gt;
Алгоритм получил широкое применение в алгоритмах криптографии, в том числе, в алгоритме факторизации, использующего факторные базы&amp;lt;ref&amp;gt;Замарашкин, Николай Леонидович.&lt;br /&gt;
Алгоритмы для разряженных систем линейных уравнений в GF(2) [Текст] : учебное пособие для студентов высших учебных заведений, обучающихся по направлениям ВПО 010400 &amp;quot;Прикладная математика и информатика&amp;quot; и 010300 &amp;quot;Фундаментальная информатика и информационные технологии&amp;quot; / Н. Л. Замарашкин ; Московский гос. ун-т им. М. В. Ломоносова. - Москва : Изд-во Московского ун-та, 2013. - 128, [2] с. : ил., табл.; 21 см. - (Серия: Суперкомпьютерное образование / Суперкомпьютерный консорциум ун-тов России).; ISBN 978-5-211-06483-6&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование стандартных методов Крылова (например, метода Ланцоша) не могли гарантировать условий на матрицу в GF(2), которые гарантировали сходимость, в связи с этим и были предложены перечисленные выше методы.&lt;br /&gt;
&lt;br /&gt;
===Математическое описание алгоритма===&lt;br /&gt;
====Метод Видемана====&lt;br /&gt;
=====Невырожденный случай=====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Ax = b, A\in\mathbb{F}_2^{n \times n}, b\in \mathbb{F}_2^n&amp;lt;/math&amp;gt; - согласованная СЛАУ с квадратной невырожденной матрицей. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
f(\lambda) = 1 + \sum_{i=1}^n f_i \lambda^i&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; - характеристический полином матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с коэффициентами &amp;lt;math&amp;gt;f_i\in\mathbb{F}_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По теореме Гамильтона-Кэли &amp;lt;math&amp;gt;f(A) = 0&amp;lt;/math&amp;gt;, следовательно, &amp;lt;math&amp;gt;f(A)b = 0&amp;lt;/math&amp;gt;. И, учитывая вид характеристической функции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
b = \sum_{i=1}^n f_i A^i b = A(\sum_{i=1}^{n-1} f_{i+1}A^i b )&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, если коэффициенты характеристического полинома известны, то единственное решение исследуемой системы можно найти как линейную комбинацию векторов Крылова: &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
x = \sum_{i=1}^{n-1} f_{i+1}A^i b&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Но как искать эти коэффициенты? Для случая СЛАУ с разреженной матрицей Видеман предложил следующую идею:&lt;br /&gt;
1Выбрать случайный вектор &amp;lt;math&amp;gt;y \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;, тогда для &amp;lt;math&amp;gt;j = 0...n&amp;lt;/math&amp;gt; верны следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
y^Tf(A)A^jb = y^T(\sum_{i=0}^{n} f_iA^i)A^jb = \sum_{i=0}^{n}(y^TA^{i+j}b)f_i = 0&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt; \alpha_i = y^T A^ib \in \mathbb{F}_2, \forall i=0...n&amp;lt;/math&amp;gt;, тогда верхняя система преобразуется в однородную СЛАУ: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\sum_{i=0}^{n}\alpha_{i+j}f_i = 0 , j = 0...n&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
с матрицей &amp;lt;math&amp;gt;H_{ij}=\alpha_{i+j}&amp;lt;/math&amp;gt; порядка n + 1, имеющую ганкелеву структуру, что позволяет проще (за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; - алгоритм Тренча) решать СЛАУ, поскольку матрица задаётся 2n + 1 параметрами. Если переставить строки матрицы &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в обратном порядке, то матрица станет теплицевой. Над GF(2) также известны быстрые алгоритмы решения СЛАУ (алгоритм Берлекампа - Масси)&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;
Поскольку &amp;lt;math&amp;gt; A&amp;lt;/math&amp;gt; теперь вырожденная, то характеристический полином будет выглядеть иначе (занулятся младшие коэффициенты):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
f(\lambda) = \lambda^s(\sum_{i=0}^{n-s} f_{i+s} \lambda^i), причём f_s \neq 0&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
В этом случае выбираем произвольный вектор &amp;lt;math&amp;gt; x\in\mathbb{F}_2^n&amp;lt;/math&amp;gt;  и находим вектор &amp;lt;math&amp;gt; \omega \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\omega = (\sum_{i=0}^{n-s} f_{i+s} A^i)x&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Т.к. размерность ядра матрицы &amp;lt;math&amp;gt;\sum_{i=0}^{n-s} f_{i+s} A^i&amp;lt;/math&amp;gt; не может быть больше n - 1, а размерность пространства &amp;lt;math&amp;gt;\mathbb{F} &amp;lt;/math&amp;gt; равна n, то с вероятностью 1/2 &amp;lt;math&amp;gt;\omega \neq 0&amp;lt;/math&amp;gt;. Если же он равен 0, то выбираем другой x и ищем степень матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A^\delta \omega \neq 0, а A^{\delta + 1} \omega = 0&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;A^\delta \omega&amp;lt;/math&amp;gt; - искомый вектор из ядра.&lt;br /&gt;
&lt;br /&gt;
Перепишем итоговый алгоритм Видемана для нахождения вектора из ядра A:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1.&#039;&#039;&#039; Выбираем случайные векторы &amp;lt;math&amp;gt;x, y \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2.&#039;&#039;&#039; &amp;lt;math&amp;gt;\forall s = 0, ... 2n&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;\alpha_s = y^TA^sx&amp;lt;/math&amp;gt; и строим полином &amp;lt;math&amp;gt;a(x) = \sum\alpha_ix^i \textit{формальной}&amp;lt;/math&amp;gt; степени 2n&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3.&#039;&#039;&#039; Характеристическому полиному &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; ставим в соответствие полином &amp;lt;math&amp;gt;\widetilde{f(x)} = x^n f(\frac{1}{x}), тогда f_i = \widetilde{f(x)}_{n-i}&amp;lt;/math&amp;gt; и &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i=0}^n\alpha_{i+j}f_i = \sum_{i=0}^n\alpha_{i+j}\widetilde{f(x)}_{n-i} = 0,  j=0...n&amp;lt;/math&amp;gt;,  т.е. все коэффициенты в &amp;lt;math&amp;gt;a(x)\widetilde{f(x)}&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;x^n, x^{n+1}, ..., x^{2n}&amp;lt;/math&amp;gt; будут равны &lt;br /&gt;
&lt;br /&gt;
Т.е. &amp;lt;math&amp;gt;a(x)\widetilde{f(x)} = g(x) mod \,x^{2n + 1}, где\, deg(g) &amp;lt; n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом построили полином &amp;lt;math&amp;gt;\widetilde{f(x)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4.&#039;&#039;&#039; Получаем решение &amp;lt;math&amp;gt;\omega = A^\delta \sum_if_iA^ix : A\omega = 0&amp;lt;/math&amp;gt; алгоритмом, описанным выше&lt;br /&gt;
&lt;br /&gt;
====Алгоритм Видемана-Копперсмита====&lt;br /&gt;
Алгоритм Видемана по поиску вектора из ядра матрицы A сводился к решению СЛАУ с генкелевой или теплицевой матрицей, что ускоряло алгоритм, однако алгоритм Видемана является последовательным алгоритмом (коэффициенты полинома &amp;lt;math&amp;gt;a(x)&amp;lt;/math&amp;gt; вычисляются последовательно), т.е. он не имеет выигрыша по скорости перед методом Монтгомери при распараллеливании на несколько узлов. Поэтому Копперсмит добавил в алгоритм Видемана работу с блочными матрицами.&lt;br /&gt;
&lt;br /&gt;
Пусть также задана однородная СЛАУ &amp;lt;math&amp;gt;Ax = 0\, , A\in\mathbb{F}_2^{n\times n}&amp;lt;/math&amp;gt;, так же требуется найти нетривиальное решение. Опишем предложения Копперсмита:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1.&#039;&#039;&#039; Рассмотрим два случайных блока &amp;lt;math&amp;gt;Z\in \mathbb{F}_2^{n\times m_b}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y\in \mathbb{F}_2^{n\times n_b}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m_b \neq n_b&amp;lt;/math&amp;gt;. Тогда столбцы матрицы &amp;lt;math&amp;gt;AZ = X\in \mathbb{F}_2^{n\times m_b}&amp;lt;/math&amp;gt; будут принадлежать линейной оболочке столбцов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. На практике числа &amp;lt;math&amp;gt;m_b, n_b&amp;lt;/math&amp;gt; кратны размеру машинного слова, это будет использовано при параллельной реализации.&lt;br /&gt;
&lt;br /&gt;
Далее вычисляются матрицы &amp;lt;math&amp;gt;a_i = Y^TA^iX \in \mathbb{F}_2^{n_b\times m_b} \forall\, i=0...L&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;L = \frac{n}{n_b} + \frac{n}{m_b} + \Delta&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt; - небольшое натуральное число, например, 10.&lt;br /&gt;
С помощью этих матриц определяем полином &amp;lt;math&amp;gt;a(x) = \sum_{i=0}^La_ix^i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Определение&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;Степенью матричного полинома&#039;&#039; назовём степень полинома максимальной степени.&lt;br /&gt;
&lt;br /&gt;
Однако на практике оказывается более важным смотреть на &#039;&#039;формальную степень&#039;&#039;. Работая с ними можно использовать следующие правила: 1) Формальная степень суммы полиномов равна максимуму из формальных степеней каждого слагаемого; 2) Умножение полинома на одночлен увеличивает его формальную степень на 1. Таким образом, построенный на шаге 1 полином является формальной степени L.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2.&#039;&#039;&#039; Построим матричный полином &amp;lt;math&amp;gt; f(x) = \sum_{i=0}^Df_ix^i &amp;lt;/math&amp;gt; формальной степени D с матричными коэффициентами &amp;lt;math&amp;gt; f_i\in\mathbb{F}_2^{m_b\times(m_b + n_b)}&amp;lt;/math&amp;gt;, для которого выполняются следующие условия:&lt;br /&gt;
# &#039;&#039;Справедливо полиномиальное соотношение&#039;&#039; &amp;lt;math&amp;gt; a(x)f(x) = g(x) + e(x)x^M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; g(x) &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; e(x) &amp;lt;/math&amp;gt; - матричные полиномы;&lt;br /&gt;
# Степень матричного полинома &amp;lt;math&amp;gt; g &amp;lt;/math&amp;gt; не превосходит &amp;lt;math&amp;gt; D &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; M &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; D &amp;lt;/math&amp;gt; удовлетворяют соотношению &amp;lt;math&amp;gt; M - D - 1 &amp;gt; \frac{n}{n_b}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Метод построения матричного полинома &amp;lt;math&amp;gt; f(x) &amp;lt;/math&amp;gt; изложим ниже)&lt;br /&gt;
&lt;br /&gt;
Т.к. &amp;lt;math&amp;gt; deg(g) \leq D&amp;lt;/math&amp;gt;, то матричные коэффициенты при степенях, больших D, равны 0. Следовательно, матричные коэффициенты a(x) и f(x) удовлетворяют системе: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum\limits_{k=0}^D a_{i + k + 1}f_{D-k} = 0, \; \forall i=\overline{0, M-D-2}&amp;lt;/math&amp;gt;, что эквивалентно, при подстановке &amp;lt;math&amp;gt; a_{i+k+1} &amp;lt;/math&amp;gt;, следующему уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Y^T A^i A\underbrace{\left(\sum\limits_{k=0}^D (A^{k} X) f_{D - k}\right)}_{W} = 0, \; \forall i = \overline{0, M - D - 2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, W удовлетворяет условиям А-ортагональности со всеми блоками векторов вида &amp;lt;math&amp;gt; Y, A^TY, (A^T)^2Y... (A^T)^{M - D - 2}Y &amp;lt;/math&amp;gt;. Далее возможно два варианта: &lt;br /&gt;
&lt;br /&gt;
1) Если линейная оболочка блоков вышеперечисленных векторов совпала со всем пространством \mathcal{F}_2^n, то выбором n линейно независимых столбцов и составлением невырожденной матрицы \hat{Y} получили бы следующее равенство:&lt;br /&gt;
&amp;lt;math&amp;gt; \hat{Y}AW = 0 &amp;lt;/math&amp;gt;. Домножив на обратную, получим &amp;lt;math&amp;gt; AW = 0&amp;lt;/math&amp;gt;  и если &amp;lt;math&amp;gt; W \neq 0 &amp;lt;/math&amp;gt;, то задача решена.&lt;br /&gt;
&lt;br /&gt;
2)Оболочка блоков не охватила всего пространства, тогда можно вероятностно оценить, что: Т.к. &amp;lt;math&amp;gt; M - D - 1 &amp;gt; \frac{n}{n_b} &amp;lt;/math&amp;gt;, то почти наверняка размерность линейной оболочки &amp;lt;math&amp;gt; (A^T)^iY, \; \forall i=\overline{0,M-D-2} &amp;lt;/math&amp;gt; близка к n. Этого достаточно, чтобы утверждать, что задача решена. (Для деталей см. &amp;lt;ref&amp;gt; Don Coppersmith. 1994. Solving homogeneous linear equations over GF(2) via block Wiedemann algorithm. Math. Comput. 62, 205 (January 1994), 333-350. DOI=10.2307/2153413 http://dx.doi.org/10.2307/2153413  &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;
&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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>GKormakov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%92%D0%B8%D0%B4%D0%B5%D0%BC%D0%B0%D0%BD%D0%B0-%D0%9A%D0%BE%D0%BF%D0%BF%D0%B5%D1%80%D1%81%D0%BC%D0%B8%D1%82%D0%B0&amp;diff=27559</id>
		<title>Метод Видемана-Копперсмита</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%92%D0%B8%D0%B4%D0%B5%D0%BC%D0%B0%D0%BD%D0%B0-%D0%9A%D0%BE%D0%BF%D0%BF%D0%B5%D1%80%D1%81%D0%BC%D0%B8%D1%82%D0%B0&amp;diff=27559"/>
		<updated>2019-11-19T18:52:56Z</updated>

		<summary type="html">&lt;p&gt;GKormakov: /* Алгоритм Видемана-Копперсмита */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{Автор - Участник:GKormakov}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Видемана-Копперсмита&#039;&#039;&#039; был предложен Дугласом Видеманом в статье 1986 года &amp;lt;ref&amp;gt;Wiedemann D.H. Solving sparce linear equations over finite fields (англ.). — 1986. — Январь (т. 32, № 1). — С. 54—62.&amp;lt;/ref&amp;gt;. Алгоритм позволял получить решение системы линейных уравнений &amp;lt;math&amp;gt;Ax = b &amp;lt;/math&amp;gt; над полем GF(2) (в общем случае, над конечным полем GF(q)) в случае, когда матрица A являлась разреженной. В частности, совместный алгоритм Видемана-Копперсмита решал задачу поиска нетривиальных векторов из ядра матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, т.е. нетривиальные решения уравнения  &amp;lt;math&amp;gt;Ax = 0 &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; A^T A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Статья обосновывала корректность алгоритма, оценивала сложность вычислений, рассматривала разложения многочленов на множители и вычисление матричных полиномов. После выхода статьи сам метод не получил широкого применения, однако теоретические оценки и вспомогательные алгоритмы получили признание.&lt;br /&gt;
&lt;br /&gt;
В рамках вычислений алгоритм является улучшенной версией алгоритма Копперсмита и алгоритма Монтгомери. В отличии от алгоритма Монтгомери имеет более эффективную реализацию на параллельных вычислительных системах - одним из главных отличий является меньший обмен данными между вычислительными узлами. &lt;br /&gt;
&lt;br /&gt;
Алгоритм получил широкое применение в алгоритмах криптографии, в том числе, в алгоритме факторизации, использующего факторные базы&amp;lt;ref&amp;gt;Замарашкин, Николай Леонидович.&lt;br /&gt;
Алгоритмы для разряженных систем линейных уравнений в GF(2) [Текст] : учебное пособие для студентов высших учебных заведений, обучающихся по направлениям ВПО 010400 &amp;quot;Прикладная математика и информатика&amp;quot; и 010300 &amp;quot;Фундаментальная информатика и информационные технологии&amp;quot; / Н. Л. Замарашкин ; Московский гос. ун-т им. М. В. Ломоносова. - Москва : Изд-во Московского ун-та, 2013. - 128, [2] с. : ил., табл.; 21 см. - (Серия: Суперкомпьютерное образование / Суперкомпьютерный консорциум ун-тов России).; ISBN 978-5-211-06483-6&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование стандартных методов Крылова (например, метода Ланцоша) не могли гарантировать условий на матрицу в GF(2), которые гарантировали сходимость, в связи с этим и были предложены перечисленные выше методы.&lt;br /&gt;
&lt;br /&gt;
===Математическое описание алгоритма===&lt;br /&gt;
====Метод Видемана====&lt;br /&gt;
=====Невырожденный случай=====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Ax = b, A\in\mathbb{F}_2^{n \times n}, b\in \mathbb{F}_2^n&amp;lt;/math&amp;gt; - согласованная СЛАУ с квадратной невырожденной матрицей. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
f(\lambda) = 1 + \sum_{i=1}^n f_i \lambda^i&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; - характеристический полином матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с коэффициентами &amp;lt;math&amp;gt;f_i\in\mathbb{F}_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По теореме Гамильтона-Кэли &amp;lt;math&amp;gt;f(A) = 0&amp;lt;/math&amp;gt;, следовательно, &amp;lt;math&amp;gt;f(A)b = 0&amp;lt;/math&amp;gt;. И, учитывая вид характеристической функции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
b = \sum_{i=1}^n f_i A^i b = A(\sum_{i=1}^{n-1} f_{i+1}A^i b )&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, если коэффициенты характеристического полинома известны, то единственное решение исследуемой системы можно найти как линейную комбинацию векторов Крылова: &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
x = \sum_{i=1}^{n-1} f_{i+1}A^i b&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Но как искать эти коэффициенты? Для случая СЛАУ с разреженной матрицей Видеман предложил следующую идею:&lt;br /&gt;
1Выбрать случайный вектор &amp;lt;math&amp;gt;y \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;, тогда для &amp;lt;math&amp;gt;j = 0...n&amp;lt;/math&amp;gt; верны следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
y^Tf(A)A^jb = y^T(\sum_{i=0}^{n} f_iA^i)A^jb = \sum_{i=0}^{n}(y^TA^{i+j}b)f_i = 0&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt; \alpha_i = y^T A^ib \in \mathbb{F}_2, \forall i=0...n&amp;lt;/math&amp;gt;, тогда верхняя система преобразуется в однородную СЛАУ: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\sum_{i=0}^{n}\alpha_{i+j}f_i = 0 , j = 0...n&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
с матрицей &amp;lt;math&amp;gt;H_{ij}=\alpha_{i+j}&amp;lt;/math&amp;gt; порядка n + 1, имеющую ганкелеву структуру, что позволяет проще (за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; - алгоритм Тренча) решать СЛАУ, поскольку матрица задаётся 2n + 1 параметрами. Если переставить строки матрицы &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в обратном порядке, то матрица станет теплицевой. Над GF(2) также известны быстрые алгоритмы решения СЛАУ (алгоритм Берлекампа - Масси)&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;
Поскольку &amp;lt;math&amp;gt; A&amp;lt;/math&amp;gt; теперь вырожденная, то характеристический полином будет выглядеть иначе (занулятся младшие коэффициенты):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
f(\lambda) = \lambda^s(\sum_{i=0}^{n-s} f_{i+s} \lambda^i), причём f_s \neq 0&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
В этом случае выбираем произвольный вектор &amp;lt;math&amp;gt; x\in\mathbb{F}_2^n&amp;lt;/math&amp;gt;  и находим вектор &amp;lt;math&amp;gt; \omega \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\omega = (\sum_{i=0}^{n-s} f_{i+s} A^i)x&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Т.к. размерность ядра матрицы &amp;lt;math&amp;gt;\sum_{i=0}^{n-s} f_{i+s} A^i&amp;lt;/math&amp;gt; не может быть больше n - 1, а размерность пространства &amp;lt;math&amp;gt;\mathbb{F} &amp;lt;/math&amp;gt; равна n, то с вероятностью 1/2 &amp;lt;math&amp;gt;\omega \neq 0&amp;lt;/math&amp;gt;. Если же он равен 0, то выбираем другой x и ищем степень матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A^\delta \omega \neq 0, а A^{\delta + 1} \omega = 0&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;A^\delta \omega&amp;lt;/math&amp;gt; - искомый вектор из ядра.&lt;br /&gt;
&lt;br /&gt;
Перепишем итоговый алгоритм Видемана для нахождения вектора из ядра A:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1.&#039;&#039;&#039; Выбираем случайные векторы &amp;lt;math&amp;gt;x, y \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2.&#039;&#039;&#039; &amp;lt;math&amp;gt;\forall s = 0, ... 2n&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;\alpha_s = y^TA^sx&amp;lt;/math&amp;gt; и строим полином &amp;lt;math&amp;gt;a(x) = \sum\alpha_ix^i \textit{формальной}&amp;lt;/math&amp;gt; степени 2n&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3.&#039;&#039;&#039; Характеристическому полиному &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; ставим в соответствие полином &amp;lt;math&amp;gt;\widetilde{f(x)} = x^n f(\frac{1}{x}), тогда f_i = \widetilde{f(x)}_{n-i}&amp;lt;/math&amp;gt; и &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i=0}^n\alpha_{i+j}f_i = \sum_{i=0}^n\alpha_{i+j}\widetilde{f(x)}_{n-i} = 0,  j=0...n&amp;lt;/math&amp;gt;,  т.е. все коэффициенты в &amp;lt;math&amp;gt;a(x)\widetilde{f(x)}&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;x^n, x^{n+1}, ..., x^{2n}&amp;lt;/math&amp;gt; будут равны &lt;br /&gt;
&lt;br /&gt;
Т.е. &amp;lt;math&amp;gt;a(x)\widetilde{f(x)} = g(x) mod \,x^{2n + 1}, где\, deg(g) &amp;lt; n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом построили полином &amp;lt;math&amp;gt;\widetilde{f(x)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4.&#039;&#039;&#039; Получаем решение &amp;lt;math&amp;gt;\omega = A^\delta \sum_if_iA^ix : A\omega = 0&amp;lt;/math&amp;gt; алгоритмом, описанным выше&lt;br /&gt;
&lt;br /&gt;
====Алгоритм Видемана-Копперсмита====&lt;br /&gt;
Алгоритм Видемана по поиску вектора из ядра матрицы A сводился к решению СЛАУ с генкелевой или теплицевой матрицей, что ускоряло алгоритм, однако алгоритм Видемана является последовательным алгоритмом (коэффициенты полинома &amp;lt;math&amp;gt;a(x)&amp;lt;/math&amp;gt; вычисляются последовательно), т.е. он не имеет выигрыша по скорости перед методом Монтгомери при распараллеливании на несколько узлов. Поэтому Копперсмит добавил в алгоритм Видемана работу с блочными матрицами.&lt;br /&gt;
&lt;br /&gt;
Пусть также задана однородная СЛАУ &amp;lt;math&amp;gt;Ax = 0\, , A\in\mathbb{F}_2^{n\times n}&amp;lt;/math&amp;gt;, так же требуется найти нетривиальное решение. Опишем предложения Копперсмита:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1.&#039;&#039;&#039; Рассмотрим два случайных блока &amp;lt;math&amp;gt;Z\in \mathbb{F}_2^{n\times m_b}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y\in \mathbb{F}_2^{n\times n_b}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m_b \neq n_b&amp;lt;/math&amp;gt;. Тогда столбцы матрицы &amp;lt;math&amp;gt;AZ = X\in \mathbb{F}_2^{n\times m_b}&amp;lt;/math&amp;gt; будут принадлежать линейной оболочке столбцов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. На практике числа &amp;lt;math&amp;gt;m_b, n_b&amp;lt;/math&amp;gt; кратны размеру машинного слова, это будет использовано при параллельной реализации.&lt;br /&gt;
&lt;br /&gt;
Далее вычисляются матрицы &amp;lt;math&amp;gt;a_i = Y^TA^iX \in \mathbb{F}_2^{n_b\times m_b} \forall\, i=0...L&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;L = \frac{n}{n_b} + \frac{n}{m_b} + \Delta&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt; - небольшое натуральное число, например, 10.&lt;br /&gt;
С помощью этих матриц определяем полином &amp;lt;math&amp;gt;a(x) = \sum_{i=0}^La_ix^i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Определение&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;Степенью матричного полинома&#039;&#039; назовём степень полинома максимальной степени.&lt;br /&gt;
&lt;br /&gt;
Однако на практике оказывается более важным смотреть на &#039;&#039;формальную степень&#039;&#039;. Работая с ними можно использовать следующие правила: 1) Формальная степень суммы полиномов равна максимуму из формальных степеней каждого слагаемого; 2) Умножение полинома на одночлен увеличивает его формальную степень на 1. Таким образом, построенный на шаге 1 полином является формальной степени L.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2.&#039;&#039;&#039; Построим матричный полином &amp;lt;math&amp;gt; f(x) = \sum_{i=0}^Df_ix^i &amp;lt;/math&amp;gt; формальной степени D с матричными коэффициентами &amp;lt;math&amp;gt; f_i\in\mathbb{F}_2^{m_b\times(m_b + n_b)}&amp;lt;/math&amp;gt;, для которого выполняются следующие условия:&lt;br /&gt;
# &#039;&#039;Справедливо полиномиальное соотношение&#039;&#039; &amp;lt;math&amp;gt; a(x)f(x) = g(x) + e(x)x^M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; g(x) &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; e(x) &amp;lt;/math&amp;gt; - матричные полиномы;&lt;br /&gt;
# Степень матричного полинома &amp;lt;math&amp;gt; g &amp;lt;/math&amp;gt; не превосходит &amp;lt;math&amp;gt; D &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; M &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; D &amp;lt;/math&amp;gt; удовлетворяют соотношению &amp;lt;math&amp;gt; M - D - 1 &amp;gt; \frac{n}{n_b}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Метод построения матричного полинома &amp;lt;math&amp;gt; f(x) &amp;lt;/math&amp;gt; изложим ниже)&lt;br /&gt;
&lt;br /&gt;
Т.к. &amp;lt;math&amp;gt; deg(g) \leq D&amp;lt;/math&amp;gt;, то матричные коэффициенты при степенях, больших D, равны 0. Следовательно, матричные коэффициенты a(x) и f(x) удовлетворяют системе: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum\limits_{k=0}^D a_{i + k + 1}f_{D-k} = 0, \; \forall i=\overline{0, M-D-2}&amp;lt;/math&amp;gt;, что эквивалентно, при подстановке &amp;lt;math&amp;gt; a_{i+k+1} &amp;lt;/math&amp;gt;, следующему уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Y^T A^i A\underbrace{\left(\sum\limits_{k=0}^D (A^{k} X) f_{D - k}\right)}_{W} = 0, \; \forall i = \overline{0, M - D - 2}&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;
=== Макроструктура алгоритма ===&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;
&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>GKormakov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%92%D0%B8%D0%B4%D0%B5%D0%BC%D0%B0%D0%BD%D0%B0-%D0%9A%D0%BE%D0%BF%D0%BF%D0%B5%D1%80%D1%81%D0%BC%D0%B8%D1%82%D0%B0&amp;diff=27558</id>
		<title>Метод Видемана-Копперсмита</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%92%D0%B8%D0%B4%D0%B5%D0%BC%D0%B0%D0%BD%D0%B0-%D0%9A%D0%BE%D0%BF%D0%BF%D0%B5%D1%80%D1%81%D0%BC%D0%B8%D1%82%D0%B0&amp;diff=27558"/>
		<updated>2019-11-19T18:48:58Z</updated>

		<summary type="html">&lt;p&gt;GKormakov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{Автор - Участник:GKormakov}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Видемана-Копперсмита&#039;&#039;&#039; был предложен Дугласом Видеманом в статье 1986 года &amp;lt;ref&amp;gt;Wiedemann D.H. Solving sparce linear equations over finite fields (англ.). — 1986. — Январь (т. 32, № 1). — С. 54—62.&amp;lt;/ref&amp;gt;. Алгоритм позволял получить решение системы линейных уравнений &amp;lt;math&amp;gt;Ax = b &amp;lt;/math&amp;gt; над полем GF(2) (в общем случае, над конечным полем GF(q)) в случае, когда матрица A являлась разреженной. В частности, совместный алгоритм Видемана-Копперсмита решал задачу поиска нетривиальных векторов из ядра матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, т.е. нетривиальные решения уравнения  &amp;lt;math&amp;gt;Ax = 0 &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; A^T A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Статья обосновывала корректность алгоритма, оценивала сложность вычислений, рассматривала разложения многочленов на множители и вычисление матричных полиномов. После выхода статьи сам метод не получил широкого применения, однако теоретические оценки и вспомогательные алгоритмы получили признание.&lt;br /&gt;
&lt;br /&gt;
В рамках вычислений алгоритм является улучшенной версией алгоритма Копперсмита и алгоритма Монтгомери. В отличии от алгоритма Монтгомери имеет более эффективную реализацию на параллельных вычислительных системах - одним из главных отличий является меньший обмен данными между вычислительными узлами. &lt;br /&gt;
&lt;br /&gt;
Алгоритм получил широкое применение в алгоритмах криптографии, в том числе, в алгоритме факторизации, использующего факторные базы&amp;lt;ref&amp;gt;Замарашкин, Николай Леонидович.&lt;br /&gt;
Алгоритмы для разряженных систем линейных уравнений в GF(2) [Текст] : учебное пособие для студентов высших учебных заведений, обучающихся по направлениям ВПО 010400 &amp;quot;Прикладная математика и информатика&amp;quot; и 010300 &amp;quot;Фундаментальная информатика и информационные технологии&amp;quot; / Н. Л. Замарашкин ; Московский гос. ун-т им. М. В. Ломоносова. - Москва : Изд-во Московского ун-та, 2013. - 128, [2] с. : ил., табл.; 21 см. - (Серия: Суперкомпьютерное образование / Суперкомпьютерный консорциум ун-тов России).; ISBN 978-5-211-06483-6&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование стандартных методов Крылова (например, метода Ланцоша) не могли гарантировать условий на матрицу в GF(2), которые гарантировали сходимость, в связи с этим и были предложены перечисленные выше методы.&lt;br /&gt;
&lt;br /&gt;
===Математическое описание алгоритма===&lt;br /&gt;
====Метод Видемана====&lt;br /&gt;
=====Невырожденный случай=====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Ax = b, A\in\mathbb{F}_2^{n \times n}, b\in \mathbb{F}_2^n&amp;lt;/math&amp;gt; - согласованная СЛАУ с квадратной невырожденной матрицей. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
f(\lambda) = 1 + \sum_{i=1}^n f_i \lambda^i&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; - характеристический полином матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с коэффициентами &amp;lt;math&amp;gt;f_i\in\mathbb{F}_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По теореме Гамильтона-Кэли &amp;lt;math&amp;gt;f(A) = 0&amp;lt;/math&amp;gt;, следовательно, &amp;lt;math&amp;gt;f(A)b = 0&amp;lt;/math&amp;gt;. И, учитывая вид характеристической функции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
b = \sum_{i=1}^n f_i A^i b = A(\sum_{i=1}^{n-1} f_{i+1}A^i b )&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, если коэффициенты характеристического полинома известны, то единственное решение исследуемой системы можно найти как линейную комбинацию векторов Крылова: &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
x = \sum_{i=1}^{n-1} f_{i+1}A^i b&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Но как искать эти коэффициенты? Для случая СЛАУ с разреженной матрицей Видеман предложил следующую идею:&lt;br /&gt;
1Выбрать случайный вектор &amp;lt;math&amp;gt;y \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;, тогда для &amp;lt;math&amp;gt;j = 0...n&amp;lt;/math&amp;gt; верны следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
y^Tf(A)A^jb = y^T(\sum_{i=0}^{n} f_iA^i)A^jb = \sum_{i=0}^{n}(y^TA^{i+j}b)f_i = 0&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt; \alpha_i = y^T A^ib \in \mathbb{F}_2, \forall i=0...n&amp;lt;/math&amp;gt;, тогда верхняя система преобразуется в однородную СЛАУ: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\sum_{i=0}^{n}\alpha_{i+j}f_i = 0 , j = 0...n&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
с матрицей &amp;lt;math&amp;gt;H_{ij}=\alpha_{i+j}&amp;lt;/math&amp;gt; порядка n + 1, имеющую ганкелеву структуру, что позволяет проще (за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; - алгоритм Тренча) решать СЛАУ, поскольку матрица задаётся 2n + 1 параметрами. Если переставить строки матрицы &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в обратном порядке, то матрица станет теплицевой. Над GF(2) также известны быстрые алгоритмы решения СЛАУ (алгоритм Берлекампа - Масси)&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;
Поскольку &amp;lt;math&amp;gt; A&amp;lt;/math&amp;gt; теперь вырожденная, то характеристический полином будет выглядеть иначе (занулятся младшие коэффициенты):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
f(\lambda) = \lambda^s(\sum_{i=0}^{n-s} f_{i+s} \lambda^i), причём f_s \neq 0&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
В этом случае выбираем произвольный вектор &amp;lt;math&amp;gt; x\in\mathbb{F}_2^n&amp;lt;/math&amp;gt;  и находим вектор &amp;lt;math&amp;gt; \omega \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\omega = (\sum_{i=0}^{n-s} f_{i+s} A^i)x&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Т.к. размерность ядра матрицы &amp;lt;math&amp;gt;\sum_{i=0}^{n-s} f_{i+s} A^i&amp;lt;/math&amp;gt; не может быть больше n - 1, а размерность пространства &amp;lt;math&amp;gt;\mathbb{F} &amp;lt;/math&amp;gt; равна n, то с вероятностью 1/2 &amp;lt;math&amp;gt;\omega \neq 0&amp;lt;/math&amp;gt;. Если же он равен 0, то выбираем другой x и ищем степень матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A^\delta \omega \neq 0, а A^{\delta + 1} \omega = 0&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;A^\delta \omega&amp;lt;/math&amp;gt; - искомый вектор из ядра.&lt;br /&gt;
&lt;br /&gt;
Перепишем итоговый алгоритм Видемана для нахождения вектора из ядра A:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1.&#039;&#039;&#039; Выбираем случайные векторы &amp;lt;math&amp;gt;x, y \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2.&#039;&#039;&#039; &amp;lt;math&amp;gt;\forall s = 0, ... 2n&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;\alpha_s = y^TA^sx&amp;lt;/math&amp;gt; и строим полином &amp;lt;math&amp;gt;a(x) = \sum\alpha_ix^i \textit{формальной}&amp;lt;/math&amp;gt; степени 2n&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3.&#039;&#039;&#039; Характеристическому полиному &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; ставим в соответствие полином &amp;lt;math&amp;gt;\widetilde{f(x)} = x^n f(\frac{1}{x}), тогда f_i = \widetilde{f(x)}_{n-i}&amp;lt;/math&amp;gt; и &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i=0}^n\alpha_{i+j}f_i = \sum_{i=0}^n\alpha_{i+j}\widetilde{f(x)}_{n-i} = 0,  j=0...n&amp;lt;/math&amp;gt;,  т.е. все коэффициенты в &amp;lt;math&amp;gt;a(x)\widetilde{f(x)}&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;x^n, x^{n+1}, ..., x^{2n}&amp;lt;/math&amp;gt; будут равны &lt;br /&gt;
&lt;br /&gt;
Т.е. &amp;lt;math&amp;gt;a(x)\widetilde{f(x)} = g(x) mod \,x^{2n + 1}, где\, deg(g) &amp;lt; n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом построили полином &amp;lt;math&amp;gt;\widetilde{f(x)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4.&#039;&#039;&#039; Получаем решение &amp;lt;math&amp;gt;\omega = A^\delta \sum_if_iA^ix : A\omega = 0&amp;lt;/math&amp;gt; алгоритмом, описанным выше&lt;br /&gt;
&lt;br /&gt;
====Алгоритм Видемана-Копперсмита====&lt;br /&gt;
Алгоритм Видемана по поиску вектора из ядра матрицы A сводился к решению СЛАУ с генкелевой или теплицевой матрицей, что ускоряло алгоритм, однако алгоритм Видемана является последовательным алгоритмом (коэффициенты полинома &amp;lt;math&amp;gt;a(x)&amp;lt;/math&amp;gt; вычисляются последовательно), т.е. он не имеет выигрыша по скорости перед методом Монтгомери при распараллеливании на несколько узлов. Поэтому Копперсмит добавил в алгоритм Видемана работу с блочными матрицами.&lt;br /&gt;
&lt;br /&gt;
Пусть также задана однородная СЛАУ &amp;lt;math&amp;gt;Ax = 0\, , A\in\mathbb{F}_2^{n\times n}&amp;lt;/math&amp;gt;, так же требуется найти нетривиальное решение. Опишем предложения Копперсмита:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1.&#039;&#039;&#039; Рассмотрим два случайных блока &amp;lt;math&amp;gt;Z\in \mathbb{F}_2^{n\times m_b}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y\in \mathbb{F}_2^{n\times n_b}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m_b \neq n_b&amp;lt;/math&amp;gt;. Тогда столбцы матрицы &amp;lt;math&amp;gt;AZ = X\in \mathbb{F}_2^{n\times m_b}&amp;lt;/math&amp;gt; будут принадлежать линейной оболочке столбцов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. На практике числа &amp;lt;math&amp;gt;m_b, n_b&amp;lt;/math&amp;gt; кратны размеру машинного слова, это будет использовано при параллельной реализации.&lt;br /&gt;
&lt;br /&gt;
Далее вычисляются матрицы &amp;lt;math&amp;gt;a_i = Y^TA^iX \in \mathbb{F}_2^{n_b\times m_b} \forall\, i=0...L&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;L = \frac{n}{n_b} + \frac{n}{m_b} + \Delta&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt; - небольшое натуральное число, например, 10.&lt;br /&gt;
С помощью этих матриц определяем полином &amp;lt;math&amp;gt;a(x) = \sum_{i=0}^La_ix^i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Определение&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;Степенью матричного полинома&#039;&#039; назовём степень полинома максимальной степени.&lt;br /&gt;
&lt;br /&gt;
Однако на практике оказывается более важным смотреть на &#039;&#039;формальную степень&#039;&#039;. Работая с ними можно использовать следующие правила: 1) Формальная степень суммы полиномов равна максимуму из формальных степеней каждого слагаемого; 2) Умножение полинома на одночлен увеличивает его формальную степень на 1. Таким образом, построенный на шаге 1 полином является формальной степени L.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2.&#039;&#039;&#039; Построим матричный полином &amp;lt;math&amp;gt; f(x) = \sum_{i=0}^Df_ix^i &amp;lt;/math&amp;gt; формальной степени D с матричными коэффициентами &amp;lt;math&amp;gt; f_i\in\mathbb{F}_2^{m_b\times(m_b + n_b)}&amp;lt;/math&amp;gt;, для которого выполняются следующие условия:&lt;br /&gt;
# &#039;&#039;Справедливо полиномиальное соотношение&#039;&#039; &amp;lt;math&amp;gt; a(x)f(x) = g(x) + e(x)x^M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; g(x) &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; e(x) &amp;lt;/math&amp;gt; - матричные полиномы;&lt;br /&gt;
# Степень матричного полинома &amp;lt;math&amp;gt; g &amp;lt;/math&amp;gt; не превосходит &amp;lt;math&amp;gt; D &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; M &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; D &amp;lt;/math&amp;gt; удовлетворяют соотношению &amp;lt;math&amp;gt; M - D - 1 &amp;gt; \frac{n}{n_b}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Метод построения матричного полинома &amp;lt;math&amp;gt; f(x) &amp;lt;/math&amp;gt; изложим ниже)&lt;br /&gt;
&lt;br /&gt;
Т.к. &amp;lt;math&amp;gt; deg(g) \leq D&amp;lt;/math&amp;gt;, то матричные коэффициенты при степенях, больших D, равны 0. Следовательно, матричные коэффициенты a(x) и f(x) удовлетворяют системе: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum\limits_{k=0}^D a_{i + k + 1}f_{D-k} = 0, \; \forall i=\overline{0, M-D-2}&amp;lt;/math&amp;gt;, что эквивалентно, при подстановке &amp;lt;math&amp;gt; a_{i+k+1} &amp;lt;/math&amp;gt;, следующему уравнению:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt; Y^T A^i A\underbrace{\left(\sum\limits_{k=0}^D (A^{k} X) f_{D - k}\right)}_{W} = 0, \; \forall i = \overline{0, M - D - 2}&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;
&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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>GKormakov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%92%D0%B8%D0%B4%D0%B5%D0%BC%D0%B0%D0%BD%D0%B0-%D0%9A%D0%BE%D0%BF%D0%BF%D0%B5%D1%80%D1%81%D0%BC%D0%B8%D1%82%D0%B0&amp;diff=27482</id>
		<title>Метод Видемана-Копперсмита</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%92%D0%B8%D0%B4%D0%B5%D0%BC%D0%B0%D0%BD%D0%B0-%D0%9A%D0%BE%D0%BF%D0%BF%D0%B5%D1%80%D1%81%D0%BC%D0%B8%D1%82%D0%B0&amp;diff=27482"/>
		<updated>2019-10-22T23:42:54Z</updated>

		<summary type="html">&lt;p&gt;GKormakov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{Автор - Участник:GKormakov}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Видемана-Копперсмита&#039;&#039;&#039; был предложен Дугласом Видеманом в статье 1986 года &amp;lt;ref&amp;gt;Wiedemann D.H. Solving sparce linear equations over finite fields (англ.). — 1986. — Январь (т. 32, № 1). — С. 54—62.&amp;lt;/ref&amp;gt;. Алгоритм позволял получить решение системы линейных уравнений &amp;lt;math&amp;gt;Ax = b &amp;lt;/math&amp;gt; над полем GF(2) (в общем случае, над конечным полем GF(q)) в случае, когда матрица A являлась разреженной. В частности, совместный алгоритм Видемана-Копперсмита решал задачу поиска нетривиальных векторов из ядра матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, т.е. нетривиальные решения уравнения  &amp;lt;math&amp;gt;Ax = 0 &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; A^T A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Статья обосновывала корректность алгоритма, оценивала сложность вычислений, рассматривала разложения многочленов на множители и вычисление матричных полиномов. После выхода статьи сам метод не получил широкого применения, однако теоретические оценки и вспомогательные алгоритмы получили признание.&lt;br /&gt;
&lt;br /&gt;
В рамках вычислений алгоритм является улучшенной версией алгоритма Копперсмита и алгоритма Монтгомери. В отличии от алгоритма Монтгомери имеет более эффективную реализацию на параллельных вычислительных системах - одним из главных отличий является меньший обмен данными между вычислительными узлами. &lt;br /&gt;
&lt;br /&gt;
Алгоритм получил широкое применение в алгоритмах криптографии, в том числе, в алгоритме факторизации, использующего факторные базы&amp;lt;ref&amp;gt;Замарашкин, Николай Леонидович.&lt;br /&gt;
Алгоритмы для разряженных систем линейных уравнений в GF(2) [Текст] : учебное пособие для студентов высших учебных заведений, обучающихся по направлениям ВПО 010400 &amp;quot;Прикладная математика и информатика&amp;quot; и 010300 &amp;quot;Фундаментальная информатика и информационные технологии&amp;quot; / Н. Л. Замарашкин ; Московский гос. ун-т им. М. В. Ломоносова. - Москва : Изд-во Московского ун-та, 2013. - 128, [2] с. : ил., табл.; 21 см. - (Серия: Суперкомпьютерное образование / Суперкомпьютерный консорциум ун-тов России).; ISBN 978-5-211-06483-6&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование стандартных методов Крылова (например, метода Ланцоша) не могли гарантировать условий на матрицу в GF(2), которые гарантировали сходимость, в связи с этим и были предложены перечисленные выше методы.&lt;br /&gt;
&lt;br /&gt;
===Математическое описание алгоритма===&lt;br /&gt;
====Метод Видемана====&lt;br /&gt;
=====Невырожденный случай=====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Ax = b, A\in\mathbb{F}_2^{n \times n}, b\in \mathbb{F}_2^n&amp;lt;/math&amp;gt; - согласованная СЛАУ с квадратной невырожденной матрицей. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
f(\lambda) = 1 + \sum_{i=1}^n f_i \lambda^i&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; - характеристический полином матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с коэффициентами &amp;lt;math&amp;gt;f_i\in\mathbb{F}_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По теореме Гамильтона-Кэли &amp;lt;math&amp;gt;f(A) = 0&amp;lt;/math&amp;gt;, следовательно, &amp;lt;math&amp;gt;f(A)b = 0&amp;lt;/math&amp;gt;. И, учитывая вид характеристической функции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
b = \sum_{i=1}^n f_i A^i b = A(\sum_{i=1}^{n-1} f_{i+1}A^i b )&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, если коэффициенты характеристического полинома известны, то единственное решение исследуемой системы можно найти как линейную комбинацию векторов Крылова: &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
x = \sum_{i=1}^{n-1} f_{i+1}A^i b&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Но как искать эти коэффициенты? Для случая СЛАУ с разреженной матрицей Видеман предложил следующую идею:&lt;br /&gt;
1Выбрать случайный вектор &amp;lt;math&amp;gt;y \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;, тогда для &amp;lt;math&amp;gt;j = 0...n&amp;lt;/math&amp;gt; верны следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
y^Tf(A)A^jb = y^T(\sum_{i=0}^{n} f_iA^i)A^jb = \sum_{i=0}^{n}(y^TA^{i+j}b)f_i = 0&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt; \alpha_i = y^T A^ib \in \mathbb{F}_2, \forall i=0...n&amp;lt;/math&amp;gt;, тогда верхняя система преобразуется в однородную СЛАУ: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\sum_{i=0}^{n}\alpha_{i+j}f_i = 0 , j = 0...n&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
с матрицей &amp;lt;math&amp;gt;H_{ij}=\alpha_{i+j}&amp;lt;/math&amp;gt; порядка n + 1, имеющую ганкелеву структуру, что позволяет проще (за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; - алгоритм Тренча) решать СЛАУ, поскольку матрица задаётся 2n + 1 параметрами. Если переставить строки матрицы &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в обратном порядке, то матрица станет теплицевой. Над GF(2) также известны быстрые алгоритмы решения СЛАУ (алгоритм Берлекампа - Масси)&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;
Поскольку &amp;lt;math&amp;gt; A&amp;lt;/math&amp;gt; теперь вырожденная, то характеристический полином будет выглядеть иначе (занулятся младшие коэффициенты):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
f(\lambda) = \lambda^s(\sum_{i=0}^{n-s} f_{i+s} \lambda^i), причём f_s \neq 0&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
В этом случае выбираем произвольный вектор &amp;lt;math&amp;gt; x\in\mathbb{F}_2^n&amp;lt;/math&amp;gt;  и находим вектор &amp;lt;math&amp;gt; \omega \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\omega = (\sum_{i=0}^{n-s} f_{i+s} A^i)x&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Т.к. размерность ядра матрицы &amp;lt;math&amp;gt;\sum_{i=0}^{n-s} f_{i+s} A^i&amp;lt;/math&amp;gt; не может быть больше n - 1, а размерность пространства &amp;lt;math&amp;gt;\mathbb{F} &amp;lt;/math&amp;gt; равна n, то с вероятностью 1/2 &amp;lt;math&amp;gt;\omega \neq 0&amp;lt;/math&amp;gt;. Если же он равен 0, то выбираем другой x и ищем степень матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A^\delta \omega \neq 0, а A^{\delta + 1} \omega = 0&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;A^\delta \omega&amp;lt;/math&amp;gt; - искомый вектор из ядра.&lt;br /&gt;
&lt;br /&gt;
Перепишем итоговый алгоритм Видемана для нахождения вектора из ядра A:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1.&#039;&#039;&#039; Выбираем случайные векторы &amp;lt;math&amp;gt;x, y \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2.&#039;&#039;&#039; &amp;lt;math&amp;gt;\forall s = 0, ... 2n&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;\alpha_s = y^TA^sx&amp;lt;/math&amp;gt; и строим полином &amp;lt;math&amp;gt;a(x) = \sum\alpha_ix^i \textit{формальной}&amp;lt;/math&amp;gt; степени 2n&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3.&#039;&#039;&#039; Характеристическому полиному &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; ставим в соответствие полином &amp;lt;math&amp;gt;\widetilde{f(x)} = x^n f(\frac{1}{x}), тогда f_i = \widetilde{f(x)}_{n-i}&amp;lt;/math&amp;gt; и &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i=0}^n\alpha_{i+j}f_i = \sum_{i=0}^n\alpha_{i+j}\widetilde{f(x)}_{n-i} = 0,  j=0...n&amp;lt;/math&amp;gt;,  т.е. все коэффициенты в &amp;lt;math&amp;gt;a(x)\widetilde{f(x)}&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;x^n, x^{n+1}, ..., x^{2n}&amp;lt;/math&amp;gt; будут равны &lt;br /&gt;
&lt;br /&gt;
Т.е. &amp;lt;math&amp;gt;a(x)\widetilde{f(x)} = g(x) mod \,x^{2n + 1}, где\, deg(g) &amp;lt; n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом построили полином &amp;lt;math&amp;gt;\widetilde{f(x)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4.&#039;&#039;&#039; Получаем решение &amp;lt;math&amp;gt;\omega = A^\delta \sum_if_iA^ix : A\omega = 0&amp;lt;/math&amp;gt; алгоритмом, описанным выше&lt;br /&gt;
&lt;br /&gt;
====Алгоритм Видемана-Копперсмита====&lt;br /&gt;
Алгоритм Видемана по поиску вектора из ядра матрицы A сводился к решению СЛАУ с генкелевой или теплицевой матрицей, что ускоряло алгоритм, однако алгоритм Видемана является последовательным алгоритмом (коэффициенты полинома &amp;lt;math&amp;gt;a(x)&amp;lt;/math&amp;gt; вычисляются последовательно), т.е. он не имеет выигрыша по скорости перед методом Монтгомери при распараллеливании на несколько узлов. Поэтому Копперсмит добавил в алгоритм Видемана работу с блочными матрицами.&lt;br /&gt;
&lt;br /&gt;
Пусть также задана однородная СЛАУ &amp;lt;math&amp;gt;Ax = 0\, , A\in\mathbb{F}_2^{n\times n}&amp;lt;/math&amp;gt;, так же требуется найти нетривиальное решение. Опишем предложения Копперсмита:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1.&#039;&#039;&#039; Рассмотрим два случайных блока &amp;lt;math&amp;gt;Z\in \mathbb{F}_2^{n\times m_b}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y\in \mathbb{F}_2^{n\times n_b}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m_b \neq n_b&amp;lt;/math&amp;gt;. Тогда столбцы матрицы &amp;lt;math&amp;gt;AZ = X\in \mathbb{F}_2^{n\times m_b}&amp;lt;/math&amp;gt; будут принадлежать линейной оболочке столбцов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. На практике числа &amp;lt;math&amp;gt;m_b, n_b&amp;lt;/math&amp;gt; кратны размеру машинного слова, это будет использовано при параллельной реализации.&lt;br /&gt;
&lt;br /&gt;
Далее вычисляются матрицы &amp;lt;math&amp;gt;a_i = Y^TA^iX \in \mathbb{F}_2^{n_b\times m_b} \forall\, i=0...L&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;L = \frac{n}{n_b} + \frac{n}{m_b} + \Delta&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt; - небольшое натуральное число, например, 10.&lt;br /&gt;
С помощью этих матриц определяем полином &amp;lt;math&amp;gt;a(x) = \sum_{i=0}^La_ix^i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Определение&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;Степенью матричного полинома&#039;&#039; назовём степень полинома максимальной степени.&lt;br /&gt;
&lt;br /&gt;
Однако на практике оказывается более важным смотреть на &#039;&#039;формальную степень&#039;&#039;. Работая с ними можно использовать следующие правила: 1) Формальная степень суммы полиномов равна максимуму из формальных степеней каждого слагаемого; 2) Умножение полинома на одночлен увеличивает его формальную степень на 1. Таким образом, построенный на шаге 1 полином является формальной степени L.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2.&#039;&#039;&#039; Построим матричный полином &amp;lt;math&amp;gt; f(x) = \sum_{i=0}^Df_ix^i &amp;lt;/math&amp;gt; формальной степени D с матричными коэффициентами &amp;lt;math&amp;gt; f_i\in\mathbb{F}_2^{m_b\times(m_b + n_b)}&amp;lt;/math&amp;gt;, для которого выполняются следующие условия:&lt;br /&gt;
# &#039;&#039;Справедливо полиномиальное соотношение&#039;&#039; &amp;lt;math&amp;gt; a(x)f(x) = g(x) + e(x)x^M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; g(x) &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; e(x) &amp;lt;/math&amp;gt; - матричные полиномы;&lt;br /&gt;
# Степень матричного полинома &amp;lt;math&amp;gt; g &amp;lt;/math&amp;gt; не превосходит &amp;lt;math&amp;gt; D &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; M &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; D &amp;lt;/math&amp;gt; удовлетворяют соотношению &amp;lt;math&amp;gt; M - D - 1 &amp;gt; \frac{n}{n_b}&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;
&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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>GKormakov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%92%D0%B8%D0%B4%D0%B5%D0%BC%D0%B0%D0%BD%D0%B0-%D0%9A%D0%BE%D0%BF%D0%BF%D0%B5%D1%80%D1%81%D0%BC%D0%B8%D1%82%D0%B0&amp;diff=27478</id>
		<title>Метод Видемана-Копперсмита</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%92%D0%B8%D0%B4%D0%B5%D0%BC%D0%B0%D0%BD%D0%B0-%D0%9A%D0%BE%D0%BF%D0%BF%D0%B5%D1%80%D1%81%D0%BC%D0%B8%D1%82%D0%B0&amp;diff=27478"/>
		<updated>2019-10-22T00:24:08Z</updated>

		<summary type="html">&lt;p&gt;GKormakov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{Автор - Участник:GKormakov}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Видемана-Копперсмита&#039;&#039;&#039; был предложен Дугласом Видеманом в статье 1986 года &amp;lt;ref&amp;gt;Wiedemann D.H. Solving sparce linear equations over finite fields (англ.). — 1986. — Январь (т. 32, № 1). — С. 54—62.&amp;lt;/ref&amp;gt;. Алгоритм позволял получить решение системы линейных уравнений &amp;lt;math&amp;gt;Ax = b &amp;lt;/math&amp;gt; над полем GF(2) (в общем случае, над конечным полем GF(q)) в случае, когда матрица A являлась разреженной. В частности, совместный алгоритм Видемана-Копперсмита решал задачу поиска нетривиальных векторов из ядра матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, т.е. нетривиальные решения уравнения  &amp;lt;math&amp;gt;Ax = 0 &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; A^T A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Статья обосновывала корректность алгоритма, оценивала сложность вычислений, рассматривала разложения многочленов на множители и вычисление матричных полиномов. После выхода статьи сам метод не получил широкого применения, однако теоретические оценки и вспомогательные алгоритмы получили признание.&lt;br /&gt;
&lt;br /&gt;
В рамках вычислений алгоритм является улучшенной версией алгоритма Копперсмита и алгоритма Монтгомери. В отличии от алгоритма Монтгомери имеет более эффективную реализацию на параллельных вычислительных системах - одним из главных отличий является меньший обмен данными между вычислительными узлами. &lt;br /&gt;
&lt;br /&gt;
Алгоритм получил широкое применение в алгоритмах криптографии, в том числе, в алгоритме факторизации, использующего факторные базы&amp;lt;ref&amp;gt;Замарашкин, Николай Леонидович.&lt;br /&gt;
Алгоритмы для разряженных систем линейных уравнений в GF(2) [Текст] : учебное пособие для студентов высших учебных заведений, обучающихся по направлениям ВПО 010400 &amp;quot;Прикладная математика и информатика&amp;quot; и 010300 &amp;quot;Фундаментальная информатика и информационные технологии&amp;quot; / Н. Л. Замарашкин ; Московский гос. ун-т им. М. В. Ломоносова. - Москва : Изд-во Московского ун-та, 2013. - 128, [2] с. : ил., табл.; 21 см. - (Серия: Суперкомпьютерное образование / Суперкомпьютерный консорциум ун-тов России).; ISBN 978-5-211-06483-6&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование стандартных методов Крылова (например, метода Ланцоша) не могли гарантировать условий на матрицу в GF(2), которые гарантировали сходимость, в связи с этим и были предложены перечисленные выше методы.&lt;br /&gt;
&lt;br /&gt;
===Математическое описание алгоритма===&lt;br /&gt;
====Метод Видемана====&lt;br /&gt;
=====Невырожденный случай=====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Ax = b, A\in\mathbb{F}_2^{n \times n}, b\in \mathbb{F}_2^n&amp;lt;/math&amp;gt; - согласованная СЛАУ с квадратной невырожденной матрицей. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
f(\lambda) = 1 + \sum_{i=1}^n f_i \lambda^i&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; - характеристический полином матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с коэффициентами &amp;lt;math&amp;gt;f_i\in\mathbb{F}_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По теореме Гамильтона-Кэли &amp;lt;math&amp;gt;f(A) = 0&amp;lt;/math&amp;gt;, следовательно, &amp;lt;math&amp;gt;f(A)b = 0&amp;lt;/math&amp;gt;. И, учитывая вид характеристической функции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
b = \sum_{i=1}^n f_i A^i b = A(\sum_{i=1}^{n-1} f_{i+1}A^i b )&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, если коэффициенты характеристического полинома известны, то единственное решение исследуемой системы можно найти как линейную комбинацию векторов Крылова: &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
x = \sum_{i=1}^{n-1} f_{i+1}A^i b&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Но как искать эти коэффициенты? Для случая СЛАУ с разреженной матрицей Видеман предложил следующую идею:&lt;br /&gt;
1Выбрать случайный вектор &amp;lt;math&amp;gt;y \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;, тогда для &amp;lt;math&amp;gt;j = 0...n&amp;lt;/math&amp;gt; верны следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
y^Tf(A)A^jb = y^T(\sum_{i=0}^{n} f_iA^i)A^jb = \sum_{i=0}^{n}(y^TA^{i+j}b)f_i = 0&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt; \alpha_i = y^T A^ib \in \mathbb{F}_2, \forall i=0...n&amp;lt;/math&amp;gt;, тогда верхняя система преобразуется в однородную СЛАУ: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\sum_{i=0}^{n}\alpha_{i+j}f_i = 0 , j = 0...n&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
с матрицей &amp;lt;math&amp;gt;H_{ij}=\alpha_{i+j}&amp;lt;/math&amp;gt; порядка n + 1, имеющую ганкелеву структуру, что позволяет проще (за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; - алгоритм Тренча) решать СЛАУ, поскольку матрица задаётся 2n + 1 параметрами. Если переставить строки матрицы &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в обратном порядке, то матрица станет теплицевой. Над GF(2) также известны быстрые алгоритмы решения СЛАУ (алгоритм Берлекампа - Масси)&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;
Поскольку &amp;lt;math&amp;gt; A&amp;lt;/math&amp;gt; теперь вырожденная, то характеристический полином будет выглядеть иначе (занулятся младшие коэффициенты):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
f(\lambda) = \lambda^s(\sum_{i=0}^{n-s} f_{i+s} \lambda^i), причём f_s \neq 0&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
В этом случае выбираем произвольный вектор &amp;lt;math&amp;gt; x\in\mathbb{F}_2^n&amp;lt;/math&amp;gt;  и находим вектор &amp;lt;math&amp;gt; \omega \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\omega = (\sum_{i=0}^{n-s} f_{i+s} A^i)x&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Т.к. размерность ядра матрицы &amp;lt;math&amp;gt;\sum_{i=0}^{n-s} f_{i+s} A^i&amp;lt;/math&amp;gt; не может быть больше n - 1, а размерность пространства &amp;lt;math&amp;gt;\mathbb{F} &amp;lt;/math&amp;gt; равна n, то с вероятностью 1/2 &amp;lt;math&amp;gt;\omega \neq 0&amp;lt;/math&amp;gt;. Если же он равен 0, то выбираем другой x и ищем степень матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A^\delta \omega \neq 0, а A^{\delta + 1} \omega = 0&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;A^\delta \omega&amp;lt;/math&amp;gt; - искомый вектор из ядра.&lt;br /&gt;
&lt;br /&gt;
Перепишем итоговый алгоритм Видемана для нахождения вектора из ядра A:&lt;br /&gt;
&lt;br /&gt;
1. Выбираем случайные векторы &amp;lt;math&amp;gt;x, y \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;\forall s = 0, ... 2n&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;\alpha_s = y^TA^sx&amp;lt;/math&amp;gt; и строим полином &amp;lt;math&amp;gt;a(x) = \sum\alpha_ix^i \textit{формальной}&amp;lt;/math&amp;gt; степени 2n&lt;br /&gt;
&lt;br /&gt;
3. Характеристическому полиному &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; ставим в соответствие полином &amp;lt;math&amp;gt;\widetilde{f(x)} = x^n f(\frac{1}{x}), тогда f_i = \widetilde{f(x)}_{n-i}&amp;lt;/math&amp;gt; и &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i=0}^n\alpha_{i+j}f_i = \sum_{i=0}^n\alpha_{i+j}\widetilde{f(x)}_{n-i} = 0,  j=0...n&amp;lt;/math&amp;gt;,  т.е. все коэффициенты в &amp;lt;math&amp;gt;a(x)\widetilde{f(x)}&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;x^n, x^{n+1}, ..., x^{2n}&amp;lt;/math&amp;gt; будут равны 0. &lt;br /&gt;
&lt;br /&gt;
Т.е. &amp;lt;math&amp;gt;a(x)\widetilde{f(x)} = g(x) mod \,x^{2n + 1}, где\, deg(g) &amp;lt; n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом построили полином &amp;lt;math&amp;gt;\widetilde{f(x)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Получаем решение &amp;lt;math&amp;gt;\omega = A^\delta \sum_if_iA^ix : A\omega = 0&amp;lt;/math&amp;gt; алгоритмом, описанным выше&lt;br /&gt;
&lt;br /&gt;
====Алгоритм Видемана-Копперсмита====&lt;br /&gt;
Алгоритм Видемана по поиску вектора из ядра матрицы A сводился к решению СЛАУ с генкелевой или теплицевой матрицей, что ускоряло алгоритм, однако алгоритм Видемана является последовательным алгоритмом (коэффициенты полинома &amp;lt;math&amp;gt;a(x)&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;
&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;
&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>GKormakov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%92%D0%B8%D0%B4%D0%B5%D0%BC%D0%B0%D0%BD%D0%B0-%D0%9A%D0%BE%D0%BF%D0%BF%D0%B5%D1%80%D1%81%D0%BC%D0%B8%D1%82%D0%B0&amp;diff=27477</id>
		<title>Метод Видемана-Копперсмита</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%92%D0%B8%D0%B4%D0%B5%D0%BC%D0%B0%D0%BD%D0%B0-%D0%9A%D0%BE%D0%BF%D0%BF%D0%B5%D1%80%D1%81%D0%BC%D0%B8%D1%82%D0%B0&amp;diff=27477"/>
		<updated>2019-10-22T00:13:21Z</updated>

		<summary type="html">&lt;p&gt;GKormakov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{Автор - Участник:GKormakov}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Видемана-Копперсмита&#039;&#039;&#039; был предложен Дугласом Видеманом в статье 1986 года &amp;lt;ref&amp;gt;Wiedemann D.H. Solving sparce linear equations over finite fields (англ.). — 1986. — Январь (т. 32, № 1). — С. 54—62.&amp;lt;/ref&amp;gt;. Алгоритм позволял получить решение системы линейных уравнений &amp;lt;math&amp;gt;Ax = b &amp;lt;/math&amp;gt; над полем GF(2) (в общем случае, над конечным полем GF(q)) в случае, когда матрица A являлась разреженной. В частности, совместный алгоритм Видемана-Копперсмита решал задачу поиска нетривиальных векторов из ядра матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, т.е. нетривиальные решения уравнения  &amp;lt;math&amp;gt;Ax = 0 &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; A^T A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Статья обосновывала корректность алгоритма, оценивала сложность вычислений, рассматривала разложения многочленов на множители и вычисление матричных полиномов. После выхода статьи сам метод не получил широкого применения, однако теоретические оценки и вспомогательные алгоритмы получили признание.&lt;br /&gt;
&lt;br /&gt;
В рамках вычислений алгоритм является улучшенной версией алгоритма Копперсмита и алгоритма Монтгомери. В отличии от алгоритма Монтгомери имеет более эффективную реализацию на параллельных вычислительных системах - одним из главных отличий является меньший обмен данными между вычислительными узлами. &lt;br /&gt;
&lt;br /&gt;
Алгоритм получил широкое применение в алгоритмах криптографии, в том числе, в алгоритме факторизации, использующего факторные базы&amp;lt;ref&amp;gt;Замарашкин, Николай Леонидович.&lt;br /&gt;
Алгоритмы для разряженных систем линейных уравнений в GF(2) [Текст] : учебное пособие для студентов высших учебных заведений, обучающихся по направлениям ВПО 010400 &amp;quot;Прикладная математика и информатика&amp;quot; и 010300 &amp;quot;Фундаментальная информатика и информационные технологии&amp;quot; / Н. Л. Замарашкин ; Московский гос. ун-т им. М. В. Ломоносова. - Москва : Изд-во Московского ун-та, 2013. - 128, [2] с. : ил., табл.; 21 см. - (Серия: Суперкомпьютерное образование / Суперкомпьютерный консорциум ун-тов России).; ISBN 978-5-211-06483-6&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование стандартных методов Крылова (например, метода Ланцоша) не могли гарантировать условий на матрицу в GF(2), которые гарантировали сходимость, в связи с этим и были предложены перечисленные выше методы.&lt;br /&gt;
&lt;br /&gt;
===Математическое описание алгоритма===&lt;br /&gt;
====Метод Видемана====&lt;br /&gt;
=====Невырожденный случай=====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Ax = b, A\in\mathbb{F}_2^{n \times n}, b\in \mathbb{F}_2^n&amp;lt;/math&amp;gt; - согласованная СЛАУ с квадратной невырожденной матрицей. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
f(\lambda) = 1 + \sum_{i=1}^n f_i \lambda^i&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; - характеристический полином матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с коэффициентами &amp;lt;math&amp;gt;f_i\in\mathbb{F}_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По теореме Гамильтона-Кэли &amp;lt;math&amp;gt;f(A) = 0&amp;lt;/math&amp;gt;, следовательно, &amp;lt;math&amp;gt;f(A)b = 0&amp;lt;/math&amp;gt;. И, учитывая вид характеристической функции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
b = \sum_{i=1}^n f_i A^i b = A(\sum_{i=1}^{n-1} f_{i+1}A^i b )&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, если коэффициенты характеристического полинома известны, то единственное решение исследуемой системы можно найти как линейную комбинацию векторов Крылова: &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
x = \sum_{i=1}^{n-1} f_{i+1}A^i b&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Но как искать эти коэффициенты? Для случая СЛАУ с разреженной матрицей Видеман предложил следующую идею:&lt;br /&gt;
1Выбрать случайный вектор &amp;lt;math&amp;gt;y \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;, тогда для &amp;lt;math&amp;gt;j = 0...n&amp;lt;/math&amp;gt; верны следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
y^Tf(A)A^jb = y^T(\sum_{i=0}^{n} f_iA^i)A^jb = \sum_{i=0}^{n}(y^TA^{i+j}b)f_i = 0&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt; \alpha_i = y^T A^ib \in \mathbb{F}_2, \forall i=0...n&amp;lt;/math&amp;gt;, тогда верхняя система преобразуется в однородную СЛАУ: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\sum_{i=0}^{n}\alpha_{i+j}f_i = 0 , j = 0...n&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
с матрицей &amp;lt;math&amp;gt;H_{ij}=\alpha_{i+j}&amp;lt;/math&amp;gt; порядка n + 1, имеющую ганкелеву структуру, что позволяет проще (за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; - алгоритм Тренча) решать СЛАУ, поскольку матрица задаётся 2n + 1 параметрами. Если переставить строки матрицы &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в обратном порядке, то матрица станет теплицевой. Над GF(2) также известны быстрые алгоритмы решения СЛАУ (алгоритм Берлекампа - Масси)&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;
Поскольку &amp;lt;math&amp;gt; A&amp;lt;/math&amp;gt; теперь вырожденная, то характеристический полином будет выглядеть иначе (занулятся младшие коэффициенты):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
f(\lambda) = \lambda^s(\sum_{i=0}^{n-s} f_{i+s} \lambda^i), причём f_s \neq 0&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
В этом случае выбираем произвольный вектор &amp;lt;math&amp;gt; x\in\mathbb{F}_2^n&amp;lt;/math&amp;gt;  и находим вектор &amp;lt;math&amp;gt; \omega \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\omega = (\sum_{i=0}^{n-s} f_{i+s} A^i)x&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Т.к. размерность ядра матрицы &amp;lt;math&amp;gt;\sum_{i=0}^{n-s} f_{i+s} A^i&amp;lt;/math&amp;gt; не может быть больше n - 1, а размерность пространства &amp;lt;math&amp;gt;\mathbb{F} &amp;lt;/math&amp;gt; равна n, то с вероятностью 1/2 &amp;lt;math&amp;gt;\omega \neq 0&amp;lt;/math&amp;gt;. Если же он равен 0, то выбираем другой x и ищем степень матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A^\delta \omega \neq 0, а A^{\delta + 1} \omega = 0&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;A^\delta \omega&amp;lt;/math&amp;gt; - искомый вектор из ядра.&lt;br /&gt;
&lt;br /&gt;
Перепишем итоговый алгоритм Видемана для нахождения вектора из ядра A:&lt;br /&gt;
&lt;br /&gt;
1. Выбираем случайные векторы &amp;lt;math&amp;gt;x, y \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;\forall s = 0, ... 2n&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;\alpha_s = y^TA^sx&amp;lt;/math&amp;gt; и строим полином &amp;lt;math&amp;gt;a(x) = \sum\alpha_ix^i \textit{формальной}&amp;lt;/math&amp;gt; степени 2n&lt;br /&gt;
&lt;br /&gt;
3. Характеристическому полиному &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; ставим в соответствие полином &amp;lt;math&amp;gt;\widetilde{f(x)} = x^n f(\frac{1}{x}), тогда f_i = \widetilde{f(x)}_{n-i}&amp;lt;/math&amp;gt; и &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i=0}^n\alpha_{i+j}f_i = \sum_{i=0}^n\alpha_{i+j}\widetilde{f(x)}_{n-i} = 0,  j=0...n&amp;lt;/math&amp;gt;,  т.е. все коэффициенты в &amp;lt;math&amp;gt;a(x)\widetilde{f(x)}&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;x^n, x^{n+1}, ..., x^{2n}&amp;lt;/math&amp;gt; будут равны 0. &lt;br /&gt;
&lt;br /&gt;
Т.е. &amp;lt;math&amp;gt;a(x)\widetilde{f(x)} = g(x) mod \,x^{2n + 1}, где\, deg(g) &amp;lt; n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом построили полином &amp;lt;math&amp;gt;\widetilde{f(x)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Получаем решение &amp;lt;math&amp;gt;\omega = A^\delta \sum_if_iA^ix : A\omega = 0&amp;lt;/math&amp;gt; алгоритмом, описанным выше&lt;br /&gt;
&lt;br /&gt;
====Алгоритм Видемана-Копперсмита====&lt;br /&gt;
Алгоритм Видемана по поиску вектора из ядра матрицы A сводился к решению СЛАУ с генкелевой или теплицевой матрицей, что ускоряло алгоритм, однако алгоритм Видемана является последовательным алгоритмом (коэффициенты полинома &amp;lt;math&amp;gt;a(x)&amp;lt;/math&amp;gt; вычисляются последовательно), т.е. он не имеет выигрыша по скорости перед методом Монтгомери при распараллеливании на несколько узлов. Поэтому Копперсмит добавил в алгоритм Видемана работу с блочными матрицами.&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>GKormakov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%92%D0%B8%D0%B4%D0%B5%D0%BC%D0%B0%D0%BD%D0%B0-%D0%9A%D0%BE%D0%BF%D0%BF%D0%B5%D1%80%D1%81%D0%BC%D0%B8%D1%82%D0%B0&amp;diff=27476</id>
		<title>Метод Видемана-Копперсмита</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%92%D0%B8%D0%B4%D0%B5%D0%BC%D0%B0%D0%BD%D0%B0-%D0%9A%D0%BE%D0%BF%D0%BF%D0%B5%D1%80%D1%81%D0%BC%D0%B8%D1%82%D0%B0&amp;diff=27476"/>
		<updated>2019-10-22T00:05:50Z</updated>

		<summary type="html">&lt;p&gt;GKormakov: Новая страница: «{algorithm | name = Участник:GKormakov/Метод Видемана-Копперсмита}  == Свойства и структура алгоритма =…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{algorithm&lt;br /&gt;
| name = Участник:GKormakov/Метод Видемана-Копперсмита}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Видемана-Копперсмита&#039;&#039;&#039; был предложен Дугласом Видеманом в статье 1986 года &amp;lt;ref&amp;gt;Wiedemann D.H. Solving sparce linear equations over finite fields (англ.). — 1986. — Январь (т. 32, № 1). — С. 54—62.&amp;lt;/ref&amp;gt;. Алгоритм позволял получить решение системы линейных уравнений &amp;lt;math&amp;gt;Ax = b &amp;lt;/math&amp;gt; над полем GF(2) (в общем случае, над конечным полем GF(q)) в случае, когда матрица A являлась разреженной. В частности, совместный алгоритм Видемана-Копперсмита решал задачу поиска нетривиальных векторов из ядра матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, т.е. нетривиальные решения уравнения  &amp;lt;math&amp;gt;Ax = 0 &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; A^T A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Статья обосновывала корректность алгоритма, оценивала сложность вычислений, рассматривала разложения многочленов на множители и вычисление матричных полиномов. После выхода статьи сам метод не получил широкого применения, однако теоретические оценки и вспомогательные алгоритмы получили признание.&lt;br /&gt;
&lt;br /&gt;
В рамках вычислений алгоритм является улучшенной версией алгоритма Копперсмита и алгоритма Монтгомери. В отличии от алгоритма Монтгомери имеет более эффективную реализацию на параллельных вычислительных системах - одним из главных отличий является меньший обмен данными между вычислительными узлами. &lt;br /&gt;
&lt;br /&gt;
Алгоритм получил широкое применение в алгоритмах криптографии, в том числе, в алгоритме факторизации, использующего факторные базы&amp;lt;ref&amp;gt;Замарашкин, Николай Леонидович.&lt;br /&gt;
Алгоритмы для разряженных систем линейных уравнений в GF(2) [Текст] : учебное пособие для студентов высших учебных заведений, обучающихся по направлениям ВПО 010400 &amp;quot;Прикладная математика и информатика&amp;quot; и 010300 &amp;quot;Фундаментальная информатика и информационные технологии&amp;quot; / Н. Л. Замарашкин ; Московский гос. ун-т им. М. В. Ломоносова. - Москва : Изд-во Московского ун-та, 2013. - 128, [2] с. : ил., табл.; 21 см. - (Серия: Суперкомпьютерное образование / Суперкомпьютерный консорциум ун-тов России).; ISBN 978-5-211-06483-6&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование стандартных методов Крылова (например, метода Ланцоша) не могли гарантировать условий на матрицу в GF(2), которые гарантировали сходимость, в связи с этим и были предложены перечисленные выше методы.&lt;br /&gt;
&lt;br /&gt;
===Математическое описание алгоритма===&lt;br /&gt;
====Метод Видемана====&lt;br /&gt;
=====Невырожденный случай=====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Ax = b, A\in\mathbb{F}_2^{n \times n}, b\in \mathbb{F}_2^n&amp;lt;/math&amp;gt; - согласованная СЛАУ с квадратной невырожденной матрицей. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
f(\lambda) = 1 + \sum_{i=1}^n f_i \lambda^i&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; - характеристический полином матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с коэффициентами &amp;lt;math&amp;gt;f_i\in\mathbb{F}_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По теореме Гамильтона-Кэли &amp;lt;math&amp;gt;f(A) = 0&amp;lt;/math&amp;gt;, следовательно, &amp;lt;math&amp;gt;f(A)b = 0&amp;lt;/math&amp;gt;. И, учитывая вид характеристической функции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
b = \sum_{i=1}^n f_i A^i b = A(\sum_{i=1}^{n-1} f_{i+1}A^i b )&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, если коэффициенты характеристического полинома известны, то единственное решение исследуемой системы можно найти как линейную комбинацию векторов Крылова: &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
x = \sum_{i=1}^{n-1} f_{i+1}A^i b&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Но как искать эти коэффициенты? Для случая СЛАУ с разреженной матрицей Видеман предложил следующую идею:&lt;br /&gt;
1Выбрать случайный вектор &amp;lt;math&amp;gt;y \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;, тогда для &amp;lt;math&amp;gt;j = 0...n&amp;lt;/math&amp;gt; верны следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
y^Tf(A)A^jb = y^T(\sum_{i=0}^{n} f_iA^i)A^jb = \sum_{i=0}^{n}(y^TA^{i+j}b)f_i = 0&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt; \alpha_i = y^T A^ib \in \mathbb{F}_2, \forall i=0...n&amp;lt;/math&amp;gt;, тогда верхняя система преобразуется в однородную СЛАУ: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\sum_{i=0}^{n}\alpha_{i+j}f_i = 0 , j = 0...n&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
с матрицей &amp;lt;math&amp;gt;H_{ij}=\alpha_{i+j}&amp;lt;/math&amp;gt; порядка n + 1, имеющую ганкелеву структуру, что позволяет проще (за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; - алгоритм Тренча) решать СЛАУ, поскольку матрица задаётся 2n + 1 параметрами. Если переставить строки матрицы &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; в обратном порядке, то матрица станет теплицевой. Над GF(2) также известны быстрые алгоритмы решения СЛАУ (алгоритм Берлекампа - Масси)&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;
Поскольку &amp;lt;math&amp;gt; A&amp;lt;/math&amp;gt; теперь вырожденная, то характеристический полином будет выглядеть иначе (занулятся младшие коэффициенты):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
f(\lambda) = \lambda^s(\sum_{i=0}^{n-s} f_{i+s} \lambda^i), причём f_s \neq 0&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
В этом случае выбираем произвольный вектор &amp;lt;math&amp;gt; x\in\mathbb{F}_2^n&amp;lt;/math&amp;gt;  и находим вектор &amp;lt;math&amp;gt; \omega \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\omega = (\sum_{i=0}^{n-s} f_{i+s} A^i)x&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Т.к. размерность ядра матрицы &amp;lt;math&amp;gt;\sum_{i=0}^{n-s} f_{i+s} A^i&amp;lt;/math&amp;gt; не может быть больше n - 1, а размерность пространства &amp;lt;math&amp;gt;\mathbb{F} &amp;lt;/math&amp;gt; равна n, то с вероятностью 1/2 &amp;lt;math&amp;gt;\omega \neq 0&amp;lt;/math&amp;gt;. Если же он равен 0, то выбираем другой x и ищем степень матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A^\delta \omega \neq 0, а A^{\delta + 1} \omega = 0&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;A^\delta \omega&amp;lt;/math&amp;gt; - искомый вектор из ядра.&lt;br /&gt;
&lt;br /&gt;
Перепишем итоговый алгоритм Видемана для нахождения вектора из ядра A:&lt;br /&gt;
&lt;br /&gt;
1. Выбираем случайные векторы &amp;lt;math&amp;gt;x, y \in \mathbb{F}_2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;\forall s = 0, ... 2n&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;\alpha_s = y^TA^sx&amp;lt;/math&amp;gt; и строим полином &amp;lt;math&amp;gt;a(x) = \sum\alpha_ix^i \textit{формальной}&amp;lt;/math&amp;gt; степени 2n&lt;br /&gt;
&lt;br /&gt;
3. Характеристическому полиному &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; ставим в соответствие полином &amp;lt;math&amp;gt;\widetilde{f(x)} = x^n f(\frac{1}{x}), тогда f_i = \widetilde{f(x)}_{n-i}&amp;lt;/math&amp;gt; и &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{i=0}^n\alpha_{i+j}f_i = \sum_{i=0}^n\alpha_{i+j}\widetilde{f(x)}_{n-i} = 0,  j=0...n&amp;lt;/math&amp;gt;,  т.е. все коэффициенты в &amp;lt;math&amp;gt;a(x)\widetilde{f(x)}&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;x^n, x^{n+1}, ..., x^{2n}&amp;lt;/math&amp;gt; будут равны 0. &lt;br /&gt;
&lt;br /&gt;
Т.е. &amp;lt;math&amp;gt;a(x)\widetilde{f(x)} = g(x) mod \,x^{2n + 1}, где\, deg(g) &amp;lt; n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом построили полином &amp;lt;math&amp;gt;\widetilde{f(x)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Получаем решение &amp;lt;math&amp;gt;\omega = A^\delta \sum_if_iA^ix : A\omega = 0&amp;lt;/math&amp;gt; алгоритмом, описанным выше&lt;br /&gt;
&lt;br /&gt;
====Алгоритм Видемана-Копперсмита====&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>GKormakov</name></author>
	</entry>
</feed>