Метод Видемана-Копперсмита

Материал из Алговики
Версия от 00:05, 22 октября 2019; GKormakov (обсуждение | вклад) (Новая страница: «{algorithm | name = Участник:GKormakov/Метод Видемана-Копперсмита} == Свойства и структура алгоритма =…»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

{algorithm | name = Участник:GKormakov/Метод Видемана-Копперсмита}

Свойства и структура алгоритма

Общее описание алгоритма

Алгоритм Видемана-Копперсмита был предложен Дугласом Видеманом в статье 1986 года [1]. Алгоритм позволял получить решение системы линейных уравнений [math]\displaystyle{ Ax = b }[/math] над полем GF(2) (в общем случае, над конечным полем GF(q)) в случае, когда матрица A являлась разреженной. В частности, совместный алгоритм Видемана-Копперсмита решал задачу поиска нетривиальных векторов из ядра матрицы [math]\displaystyle{ A }[/math], т.е. нетривиальные решения уравнения [math]\displaystyle{ Ax = 0 }[/math]

Стоит отметить, что алгоритм описывался для квадратной матрицы [math]\displaystyle{ A }[/math], однако его легко можно обобщить на случай прямоугольной матрицы, переходя к матрице [math]\displaystyle{ A^T A }[/math]

Статья обосновывала корректность алгоритма, оценивала сложность вычислений, рассматривала разложения многочленов на множители и вычисление матричных полиномов. После выхода статьи сам метод не получил широкого применения, однако теоретические оценки и вспомогательные алгоритмы получили признание.

В рамках вычислений алгоритм является улучшенной версией алгоритма Копперсмита и алгоритма Монтгомери. В отличии от алгоритма Монтгомери имеет более эффективную реализацию на параллельных вычислительных системах - одним из главных отличий является меньший обмен данными между вычислительными узлами.

Алгоритм получил широкое применение в алгоритмах криптографии, в том числе, в алгоритме факторизации, использующего факторные базы[2]

Использование стандартных методов Крылова (например, метода Ланцоша) не могли гарантировать условий на матрицу в GF(2), которые гарантировали сходимость, в связи с этим и были предложены перечисленные выше методы.

Математическое описание алгоритма

Метод Видемана

Невырожденный случай

Пусть [math]\displaystyle{ Ax = b, A\in\mathbb{F}_2^{n \times n}, b\in \mathbb{F}_2^n }[/math] - согласованная СЛАУ с квадратной невырожденной матрицей.

[math]\displaystyle{ \begin{align} f(\lambda) = 1 + \sum_{i=1}^n f_i \lambda^i \end{align} }[/math] - характеристический полином матрицы [math]\displaystyle{ A }[/math] с коэффициентами [math]\displaystyle{ f_i\in\mathbb{F}_2 }[/math]

По теореме Гамильтона-Кэли [math]\displaystyle{ f(A) = 0 }[/math], следовательно, [math]\displaystyle{ f(A)b = 0 }[/math]. И, учитывая вид характеристической функции:

[math]\displaystyle{ \begin{align} b = \sum_{i=1}^n f_i A^i b = A(\sum_{i=1}^{n-1} f_{i+1}A^i b ) \end{align} }[/math]

Таким образом, если коэффициенты характеристического полинома известны, то единственное решение исследуемой системы можно найти как линейную комбинацию векторов Крылова: [math]\displaystyle{ \begin{align} x = \sum_{i=1}^{n-1} f_{i+1}A^i b \end{align} }[/math]

Но как искать эти коэффициенты? Для случая СЛАУ с разреженной матрицей Видеман предложил следующую идею: 1Выбрать случайный вектор [math]\displaystyle{ y \in \mathbb{F}_2^n }[/math], тогда для [math]\displaystyle{ j = 0...n }[/math] верны следующие соотношения:

[math]\displaystyle{ \begin{align} 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 \end{align} }[/math]

Пусть [math]\displaystyle{ \alpha_i = y^T A^ib \in \mathbb{F}_2, \forall i=0...n }[/math], тогда верхняя система преобразуется в однородную СЛАУ:

[math]\displaystyle{ \begin{align} \sum_{i=0}^{n}\alpha_{i+j}f_i = 0 , j = 0...n \end{align} }[/math]

с матрицей [math]\displaystyle{ H_{ij}=\alpha_{i+j} }[/math] порядка n + 1, имеющую ганкелеву структуру, что позволяет проще (за [math]\displaystyle{ O(n^2) }[/math] - алгоритм Тренча) решать СЛАУ, поскольку матрица задаётся 2n + 1 параметрами. Если переставить строки матрицы [math]\displaystyle{ H }[/math] в обратном порядке, то матрица станет теплицевой. Над GF(2) также известны быстрые алгоритмы решения СЛАУ (алгоритм Берлекампа - Масси)

Вырожденный случай

Для случая нахождения произвольного вектора из ядра матрицы [math]\displaystyle{ A }[/math] идея Видемана применяется в следующем виде:

Поскольку [math]\displaystyle{ A }[/math] теперь вырожденная, то характеристический полином будет выглядеть иначе (занулятся младшие коэффициенты):

[math]\displaystyle{ \begin{align} f(\lambda) = \lambda^s(\sum_{i=0}^{n-s} f_{i+s} \lambda^i), причём f_s \neq 0 \end{align} }[/math]

В этом случае выбираем произвольный вектор [math]\displaystyle{ x\in\mathbb{F}_2^n }[/math] и находим вектор [math]\displaystyle{ \omega \in \mathbb{F}_2^n }[/math]: [math]\displaystyle{ \begin{align} \omega = (\sum_{i=0}^{n-s} f_{i+s} A^i)x \end{align} }[/math]

Т.к. размерность ядра матрицы [math]\displaystyle{ \sum_{i=0}^{n-s} f_{i+s} A^i }[/math] не может быть больше n - 1, а размерность пространства [math]\displaystyle{ \mathbb{F} }[/math] равна n, то с вероятностью 1/2 [math]\displaystyle{ \omega \neq 0 }[/math]. Если же он равен 0, то выбираем другой x и ищем степень матрицы [math]\displaystyle{ A }[/math]: [math]\displaystyle{ A^\delta \omega \neq 0, а A^{\delta + 1} \omega = 0 }[/math], тогда [math]\displaystyle{ A^\delta \omega }[/math] - искомый вектор из ядра.

Перепишем итоговый алгоритм Видемана для нахождения вектора из ядра A:

1. Выбираем случайные векторы [math]\displaystyle{ x, y \in \mathbb{F}_2^n }[/math]

2. [math]\displaystyle{ \forall s = 0, ... 2n }[/math] вычисляем [math]\displaystyle{ \alpha_s = y^TA^sx }[/math] и строим полином [math]\displaystyle{ a(x) = \sum\alpha_ix^i \textit{формальной} }[/math] степени 2n

3. Характеристическому полиному [math]\displaystyle{ f(x) }[/math] ставим в соответствие полином [math]\displaystyle{ \widetilde{f(x)} = x^n f(\frac{1}{x}), тогда f_i = \widetilde{f(x)}_{n-i} }[/math] и

[math]\displaystyle{ \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 }[/math], т.е. все коэффициенты в [math]\displaystyle{ a(x)\widetilde{f(x)} }[/math] при [math]\displaystyle{ x^n, x^{n+1}, ..., x^{2n} }[/math] будут равны 0.

Т.е. [math]\displaystyle{ a(x)\widetilde{f(x)} = g(x) mod \,x^{2n + 1}, где\, deg(g) \lt n }[/math]

Таким образом построили полином [math]\displaystyle{ \widetilde{f(x)} }[/math]

4. Получаем решение [math]\displaystyle{ \omega = A^\delta \sum_if_iA^ix : A\omega = 0 }[/math] алгоритмом, описанным выше

Алгоритм Видемана-Копперсмита

Литература

<references \>

  1. ↑ Wiedemann D.H. Solving sparce linear equations over finite fields (англ.). — 1986. — Январь (т. 32, № 1). — С. 54—62.
  2. ↑ Замарашкин, Николай Леонидович. Алгоритмы для разряженных систем линейных уравнений в GF(2) [Текст] : учебное пособие для студентов высших учебных заведений, обучающихся по направлениям ВПО 010400 "Прикладная математика и информатика" и 010300 "Фундаментальная информатика и информационные технологии" / Н. Л. Замарашкин ; Московский гос. ун-т им. М. В. Ломоносова. - Москва : Изд-во Московского ун-та, 2013. - 128, [2] с. : ил., табл.; 21 см. - (Серия: Суперкомпьютерное образование / Суперкомпьютерный консорциум ун-тов России).; ISBN 978-5-211-06483-6