行列乗算アルゴリズムは、計算の複雑さの観点から分析されます。計算モデルは、次の形式の命令を持つ直線プログラムです。a←b∘c、 どこ ∘∈{+,−,×,÷}、 a 変数であり、 b,c変数、入力、または定数のいずれかです。さらに、特定の変数は出力として区別されます。たとえば、2つを乗算する方法は次のとおりです2×2 通常のアルゴリズムを使用した行列と入力行列 aij,bij および出力行列 cij:
x11x12x21x22←a11×b11←a11×b12←a21×b11←a21×b12y11y12y21y22←a12×b21←a12×b22←a22×b21←a22×b22c11c12c21c22←x11+y11←x12+y12←x21+y21←x22+y22
複雑さの尺度は、プログラムの行数です。
行列乗算の場合、すべてのアルゴリズムの正規形を証明できます。すべてのアルゴリズムを次の形式のアルゴリズムに変換できますが、複雑さは一定の乗法的に増加するだけです。
- 特定の線形結合 αi 入力行列の ajk 計算されます。
- 特定の線形結合 βi 入力行列の bjk 計算されます。
- γi→αi×βi。
- 出力行列の各エントリは、次の線形結合です。 γis。
これは双一次正規形として知られています。上記の行列乗算アルゴリズムでは、xjk,yjk として機能 γiただし、Strassenのアルゴリズムでは、線形結合の方が興味深いです。彼らはMi「でね、ウィキペディアの説明。
Strassenのアルゴリズムの漸近分析に類似したテンソルアプローチ(つまり、同じアルゴリズムを再帰的に適用する)を使用すると、 n × n 行列 r 製品(ie r 変数 γ私)、次に任意 N× N 行列は複雑に乗算できます O (Nログんr); したがって、製品の数のみが漸近的に重要になります。Strassenのアルゴリズムでは、n = 2 そして r = 7、したがって、境界は O (Nログ27)。
行列の乗算を計算するために必要な最小数の積を見つける問題は、3次テンソル(2つではなく3つのインデックスを持つ「行列」)のランクを見つけることと言い換えることができ、これは代数的複雑性理論への接続を形成します。詳細については、この本またはこれらの講義ノート(ここに続きます)を参照してください。
このモデルが使用される理由は2つあります。1つ目は、非常にシンプルで分析が容易であることです。2つ目は、より一般的なRAMモデルと密接に関連しています。
直線プログラムはRAMモデルに実装でき、両方のモデルの複雑さは強く関連しています。算術演算は、モデルのいくつかのバリアント(たとえば、実数のRAMモデル)でユニットコストを持ち、それ以外の場合は多項的に関連します。数字のサイズに。したがって、モジュラーマトリックス乗算の場合、算術計算の複雑さがRAMモデルの複雑さの上限となります。整数または有理行列の乗算の場合、テンソル化の結果として生じる双一次アルゴリズムの場合、数値のサイズが大きくなりすぎないため、算術的な複雑さがRAMモデルの上限を対数係数まで提供することを示すことができます。
RAMマシンが、算術モデルが気付かないいくつかのトリックを引き出すことができるのは、アプリオリかもしれません。しかし、多くの場合、行列乗算アルゴリズムが任意のフィールド(またはリング)上の行列に対して機能することを望みます。その場合、均一アルゴリズムはモデルで指定された算術演算のみを使用する必要があります。したがって、このモデルは「フィールドに依存しない」アルゴリズムを形式化したものです。