Алгоритм Фрейвальдса (названный в честь Русиньш Мартиньш Фрейвальдс ) является вероятностным рандомизированный алгоритм используется для проверки матричное умножение. Учитывая три п × п матрицы
,
, и
, общая проблема состоит в том, чтобы проверить,
. Наивный алгоритм вычислил бы продукт
явно и сравните по срокам, равен ли этот продукт
. Однако самый известный алгоритм умножения матриц работает в
время.[1] Алгоритм Фрейвальдса использует рандомизация чтобы сократить это время, привязанное к
[2]с большой вероятностью. В
время, когда алгоритм может проверить матричное произведение с вероятностью отказа меньше, чем
.
Алгоритм
Вход
Три п × п матрицы
,
, и
.
Выход
Да, если
; В противном случае нет.
Процедура
- Создать п × 1 случайный 0/1 вектор
. - Вычислить
. - Выведите «Да», если
; «Нет», иначе.
Ошибка
Если
, то алгоритм всегда возвращает «Да». Если
, то вероятность того, что алгоритм вернет «Да», меньше или равна половине. Это называется односторонняя ошибка.
Повторяя алгоритм k раз и возвращает «Да», только если все итерации дают «Да», время выполнения
и вероятность ошибки
Достигнут.
Пример
Предположим, кто-то желает определить:
![AB =
begin {bmatrix}
2 и 3
3 и 4
end {bmatrix}
begin {bmatrix}
1 & 0
1 и 2
end {bmatrix}
stackrel {?} {=}
begin {bmatrix}
6 и 5
8 и 7
end {bmatrix}
= C.](https://wikimedia.org/api/rest_v1/media/math/render/svg/40b8b964afcdf0a656d6335c6eee3d9605409700)
Выбирается случайный двухэлементный вектор с элементами, равными 0 или 1, например
- и используется для вычисления:
![begin {align}
A times (B vec {r}) - C vec {r} & =
begin {bmatrix}
2 и 3
3 и 4
end {bmatrix}
оставили(
begin {bmatrix}
1 & 0
1 и 2
end {bmatrix}
begin {bmatrix} 1 1 end {bmatrix}
верно)
-
begin {bmatrix}
6 и 5
8 и 7
end {bmatrix}
begin {bmatrix} 1 1 end {bmatrix}
знак равно
begin {bmatrix}
2 и 3
3 и 4
end {bmatrix}
begin {bmatrix} 1 3 end {bmatrix}
-
begin {bmatrix} 11 15 end {bmatrix}
знак равно
begin {bmatrix} 11 15 end {bmatrix}
-
begin {bmatrix} 11 15 end {bmatrix}
знак равно
begin {bmatrix} 0 0 end {bmatrix}.
end {align}](https://wikimedia.org/api/rest_v1/media/math/render/svg/6d3c195761cf6bd80066615a92dc1ce584b12f17)
Это дает нулевой вектор, предполагая возможность того, что AB = C. Однако, если во втором испытании вектор
выбран, результат становится:
![A times (B vec {r}) - C vec {r} =
begin {bmatrix}
2 и 3
3 и 4
end {bmatrix}
оставили(
begin {bmatrix}
1 & 0
1 и 2
end {bmatrix}
begin {bmatrix} 1 0 end {bmatrix}
верно)
-
begin {bmatrix}
6 и 5
8 и 7
end {bmatrix}
begin {bmatrix} 1 0 end {bmatrix}
знак равно
begin {bmatrix} -1 -1 end {bmatrix}.](https://wikimedia.org/api/rest_v1/media/math/render/svg/2f350143b68beb89ba227ad3c703cb97fac29c3c)
Результат отличен от нуля, что доказывает, что AB ≠ C.
Имеется четыре двухэлементных вектора 0/1, половина из которых в данном случае дает нулевой вектор (
и
), поэтому шанс случайного выбора их в двух испытаниях (и ложного заключения о том, что AB = C) равен 1/2.2 или 1/4. В общем случае доля р дающий нулевой вектор может быть меньше 1/2, и будет использовано большее количество попыток (например, 20), что сделает вероятность ошибки очень малой.
Анализ ошибок
Позволять п равно вероятность ошибки. Мы утверждаем, что если А × B = C, тогда п = 0, а если А × B ≠ C, тогда п ≤ 1/2.
Дело А × B = C
![begin {align}
vec {P} & = A times (B vec {r}) - C vec {r}
& = (A times B) vec {r} - C vec {r}
& = (A раз B - C) vec {r}
& = vec {0}
end {align}](https://wikimedia.org/api/rest_v1/media/math/render/svg/5fabd27ff04a5b967fc378a944e3a230a6d6339c)
Это независимо от стоимости
, поскольку он использует только это
. Следовательно, вероятность ошибки в этом случае равна:
![Pr [ vec {P} neq 0] = 0](https://wikimedia.org/api/rest_v1/media/math/render/svg/c73087a7efc162b4e75c6865e98c1d05aec25a0a)
Дело А × B ≠ C
Позволять
такой, что
![vec {P} = D times vec {r} = (p_1, p_2, dots, p_n) ^ T](https://wikimedia.org/api/rest_v1/media/math/render/svg/c7bbb1d0196e78bfa7347345e0b05877f8616198)
Где
.
С
, у нас есть этот элемент
отличен от нуля. Предположим, что элемент
. По определению матричное умножение, у нас есть:
.
Для некоторой постоянной
.С помощью Теорема Байеса, мы можем разделить
:
![Pr [p_i = 0] = Pr [p_i = 0 | y = 0] cdot Pr [y = 0] , + , Pr [p_i = 0 | y neq 0] cdot Pr [y neq 0]](https://wikimedia.org/api/rest_v1/media/math/render/svg/ee0c1200643490dc0be3f3c50339db18734b4e7c) | | (1) |
Мы используем это:
![Pr [p_i = 0 | y = 0] = Pr [r_j = 0] = frac {1} {2}](https://wikimedia.org/api/rest_v1/media/math/render/svg/7c5a17eb0d50e08bb9a83418bf18f5ada6d2b210)
![{ displaystyle Pr [p_ {i} = 0 | y neq 0] = Pr [r_ {j} = 1 land d_ {ij} = - y] leq Pr [r_ {j} = 1] = { frac {1} {2}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/c0ba405df9fd611dbb73bf7c9bf4eac801ae8a30)
Подключив их к уравнению (1), мы получили:
![begin {align}
Pr [p_i = 0] & leq frac {1} {2} cdot Pr [y = 0] + frac {1} {2} cdot Pr [y neq 0]
& = frac {1} {2} cdot Pr [y = 0] + frac {1} {2} cdot (1 - Pr [y = 0])
& = frac {1} {2}
end {align}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ac04124bbed15468913248264a3f495d919efe2e)
Следовательно,
![{ Displaystyle Pr [{ vec {P}} = 0] = Pr [p_ {1} = 0 land dots land p_ {i} = 0 land dots land p_ {n} = 0 ] leq Pr [p_ {i} = 0] leq { frac {1} {2}}.}](https://wikimedia.org/api/rest_v1/media/math/render/svg/0e355ff8aa8a654e52019735c8e960fc2555f859)
Это завершает доказательство.
Разветвления
Простой алгоритмический анализ показывает, что время работы этого алгоритм является О (п2), превосходя классический детерминированный алгоритм граница О (п3). Анализ ошибок также показывает, что если мы запустим алгоритм k раз мы можем достичь граница ошибки менее чем
, экспоненциально малая величина. Алгоритм также быстр на практике из-за широкой доступности быстрых реализаций для произведений матрица-вектор. Следовательно, использование рандомизированные алгоритмы может ускорить очень медленно детерминированный алгоритм. Фактически, наиболее известный детерминированный алгоритм умножения матриц, известный в настоящее время, является вариантом метода Алгоритм Копперсмита – Винограда с асимптотическим временем работы О (п2.3729).[1]
Алгоритм Фрейвальдса часто встречается при введении в вероятностные алгоритмы из-за его простоты и того, как он иллюстрирует превосходство вероятностных алгоритмов на практике для некоторых задач.
Смотрите также
Рекомендации
- Р. Фрейвальдс (1977), «Вероятностные машины могут использовать меньшее время работы», Конгресс ИФИП 1977 г., стр. 839–842.
|
---|
Ключевые идеи | |
---|
Проблемы | |
---|
Аппаратное обеспечение | |
---|
Программного обеспечения | |
---|