Алгоритм Фрейвалдса

Материал из testwiki
Перейти к навигации Перейти к поиску

Алгоритм Фрейвалдса (назван по имени Русиньша Мартыньша Фрейвалдса) — это вероятностный рандомизированный алгоритм, используемый для верификации матричного произведения. По трём матрицам A, B и C размера n×n необходимо проверить, что A×B=C. Наивный алгоритм решения данной задачи заключается в том, чтобы посчитать A×B в явном виде и поэлементно сравнить получившуюся матрицу с C. Однако наилучший известный алгоритм умножения матриц работает за время O(n2.3729)[1]. Алгоритм Фрейвалдса использует рандомизацию чтобы снизить данную оценку до O(n2)[2] с высокой вероятностью. За время O(kn2) алгоритм может проверить матричное произведение с вероятностью ошибки, не превосходящей 2−k.

Алгоритм

Ввод

Три матрицы A, B и C размера n×n.

Вывод

«Да» если A×B=C; «Нет» в противном случае.

Процедура

  1. Сгенерировать случайный вектор r→ из нулей и единиц размера n×1.
  2. Вычислить P→=A×(Br→)−Cr→.
  3. Вывести «Да» если P→=(0,0,…,0)T; «Нет» в противном случае.

Вероятность ошибки

Если A×B=C, то алгоритм всегда возвращает «Да». Если A×B≠C, то вероятность того, что алгоритм вернёт «Да» не больше 1/2.

Если выполнить алгоритм k раз и возвращать «Да» только если на каждой итерации был получен ответ «Да», будет получен алгоритм со временем работы O(kn2) и вероятностью ошибки ≤2−k.

Пример

Пусть нужно проверить, что:

AB=[2334][1012]=?[6587]=C.

Выбирается случайный вектор из нулей и единиц, например, r→=[11], после чего он используется для вычислений:

A×(Br→)−Cr→=[2334]([1012][11])−[6587][11]=[2334][13]−[1115]=[1115]−[1115]=[00].

То, что получен нулевой вектор указывает на то, что AB=C. Однако, если на второй итерации использовать вектор r→=[10] , то будет получен следующий результат:

A×(Br→)−Cr→=[2334]([1012][10])−[6587][10]=[−1−1].

Полученный вектор не нулевой, что доказывает, что AB≠C.

В рассмотренном случае есть всего четыре двухэлементных векторов из нулей и единиц, и на половине из них получается нулевой вектор (r→=[00] и r→=[11]), таким образом вероятность того, что оба раза будет выбран один из этих векторов (что повлечёт ложный вывод о том, что AB=C) равна 2−2 или 1/4. В общем случае доля векторов r, влекущих нулевой вектор может быть меньше 1/2, и использование нескольких итераций (например, 20) сделает вероятность ошибки пренебрежимо малой.

Анализ алгоритма

Пусть вероятность ошибки равна p. Если A×B=C, то p=0, если же A×B≠C, то p≤1/2.

Случай A × B = C

P→=A×(Br→)−Cr→=(A×B)r→−Cr→=(A×B−C)r→=0→

Полученный результат не зависит от r→, так как здесь используется лишь то, что A×B−C=0. Таким образом, вероятность ошибки в данном случае:

Pr⁡[P→≠0]=0

Случай A × B ≠ C

Пусть матрица D такова, что

P→=D×r→=(p1,p2,…,pn)T

Где

D=A×B−C=(dij).

Так как A×B≠C, некоторые элементы матрицы D не равны нулю. Пусть dij≠0. По определению матричного произведения:

pi=∑k=1ndikrk=di1r1+⋯+dijrj+⋯+dinrn=dijrj+y.

Для некоторой константы y. Используя теорему Байеса, можно разложить вероятность по y:

Pr⁡[pi=0]=Pr⁡[pi=0|y=0]⋅Pr⁡[y=0]+Pr⁡[pi=0|y≠0]⋅Pr⁡[y≠0].

Указанные вероятности можно оценить следующим образом:

Pr⁡[pi=0|y=0]=Pr⁡[rj=0]=12
Pr⁡[pi=0|y≠0]=Pr⁡[rj=1∧dij=−y]≤Pr⁡[rj=1]=12

Подставляя эти выражения в исходное равенство, можно прийти к:

Pr⁡[pi=0]≤12⋅Pr⁡[y=0]+12⋅Pr⁡[y≠0]=12⋅Pr⁡[y=0]+12⋅(1−Pr⁡[y=0])=12

Таким образом,

Pr⁡[P→=0]=Pr⁡[p1=0∧…∧pi=0∧…∧pn=0]≤Pr⁡[pi=0]≤12.

См. также

Ссылки

Шаблон:Примечания

  • Freivalds, R. (1977), «Probabilistic Machines Can Use Less Running Time», IFIP Congress 1977, pp. 839—842.