フレイヴァルドのアルゴリズム(ルーシンシュ・マルティンシュ・フレイヴァルドにちなんで命名)は、行列乗算を検証するために使用される確率的ランダム化アルゴリズムです。3 つのn × n行列が与えられた場合、 、、 そして一般的な問題は、単純なアルゴリズムでは、積を計算する。明示的に、この積が等しいかどうかを項ごとに比較しますしかし、最もよく知られている行列乗算アルゴリズムは、時間。フレイヴァルドのアルゴリズムは、ランダム化を利用して、この制限時間を短縮します。[ 1 ]高い確率で。アルゴリズムは、以下の確率で行列積を検証できます。。
3つのn × n行列 、、 そして。
はい、もしいいえ、それ以外の場合は。
もしそうすれば、アルゴリズムは常に「Yes」を返します。すると、アルゴリズムが「はい」を返す確率は 2分の1以下になります。これは片側誤差と呼ばれます。
アルゴリズムをk回繰り返し、すべての反復で「Yes」が得られた場合にのみ「Yes」を返すことで、実行時間はそしてエラー確率達成された。
仮に、次のようなことを確認したいとします。
要素が0または1のランダムな2要素ベクトルが選択されます。 そして、以下の計算に使用されます。
これによりゼロベクトルが得られ、AB = C の可能性が示唆されます。しかし、2回目の試行でベクトルがが選択されると、結果は次のようになります。
結果はゼロではないため、実際にはAB ≠ Cであることが証明される。
2要素の0/1ベクトルは4つあり、そのうち半分はこの場合ゼロベクトルになります(そして)、したがって、これらを 2 回の試行でランダムに選択する確率 (そして AB=C と誤って結論付ける確率) は 1/2 または 1/4 です。一般的には、ゼロベクトルを生成するrの割合は 1/2 未満になる可能性があり、より多くの試行 (例えば 20 回) を使用することで、エラーの確率は非常に小さくなります。
pを誤りの確率とする。A × B = Cの場合、p = 0であり、A × B ≠ Cの場合、p ≤ 1/2 であると主張する。
これは、なぜなら、それはそれしか使わないからしたがって、この場合のエラーの確率は次のようになります。
させてそのため
どこ
以来、私たちは、はゼロではない。要素が行列乗算の定義によれば、次のようになります。
ある定数に対してベイズの定理を用いると、 を分割することができる。:
私たちはそれを使います。
これらを式(1)に代入すると、次のようになります。
したがって、
これで証明は完了です。
簡単なアルゴリズム解析によると、このアルゴリズムの実行時間は(ビッグオー記法で)これは、古典的な決定論的アルゴリズムの実行時間を上回ります。(または高速行列乗算を使用する場合)。エラー分析では、アルゴリズムを実行すると、回数、誤差範囲は以下指数関数的に小さい量で達成できます。また、行列とベクトルの積の高速な実装が広く利用可能であるため、このアルゴリズムは実際には高速です。したがって、ランダム化アルゴリズムを利用することで、非常に遅い決定論的アルゴリズムを高速化できます。
フレイヴァルズのアルゴリズムは、その簡潔さと、いくつかの問題において確率的アルゴリズムが実際に優れていることを示す例として、確率的アルゴリズムの入門書で頻繁に取り上げられる。