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

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

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

Алгоритм

Ввод

Три матрицы 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×BC, то вероятность того, что алгоритм вернёт «Да» не больше 1/2.

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

Пример

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

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]=[11].

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

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

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

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

Случай A × B = C

P=A×(Br)Cr=(A×B)rCr=(A×BC)r=0

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

Pr[P0]=0

Случай A × BC

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

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

Где

D=A×BC=(dij).

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

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

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

Pr[pi=0]=Pr[pi=0|y=0]Pr[y=0]+Pr[pi=0|y0]Pr[y0].

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

Pr[pi=0|y=0]=Pr[rj=0]=12
Pr[pi=0|y0]=Pr[rj=1dij=y]Pr[rj=1]=12

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

Pr[pi=0]12Pr[y=0]+12Pr[y0]=12Pr[y=0]+12(1Pr[y=0])=12

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

Pr[P=0]=Pr[p1=0pi=0pn=0]Pr[pi=0]12.

См. также

Ссылки

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

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