C++で学ぶシュトラッセンの行列乗算アルゴリズム|7つの式を簡単に覚える方法
シュトラッセンのアルゴリズムとは
シュトラッセンのアルゴリズム(Strassen's Algorithm)は、分割統治法に基づく行列乗算アルゴリズムです。同じサイズの2つの行列を乗算する際に使用され、従来の手法と比べて乗算の回数を削減できることで知られています。
通常の行列乗算
2つの行列の積を求める場合、一般的には以下のように計算します。

シュトラッセンのアルゴリズムによる乗算
シュトラッセンのアルゴリズムでは、乗算の手順を簡略化することで計算のオーバーヘッドを削減します。具体的には、以下の7つの積(M1〜M7)を求めます。

M1 = a × (f − h)
M2 = (a + b) × h
M3 = (c + d) × e
M4 = d × (g − e)
M5 = (a + d) × (e + h)
M6 = (b − d) × (g + h)
M7 = (a − c) × (e + f)
7つの式を簡単に覚えるコツ
これらの式は、いくつかのルールを押さえておけば簡単に記憶でき、アルゴリズムのコードも自然と導き出せるようになります。まず、以下の6つのポイントを覚えましょう。
- AHED:M1〜M4の最初の4つの値は「AHED」の順で覚えます。
- 対角乗算:M5は対角成分同士の掛け算で求めます。
- 後ろのCR:M6は「行列1の最後の列」と「行列2の最後の行」の組み合わせ(CR)を使用します。
- 前のCR:M7は「行列1の最初の列」と「行列2の最初の行」の組み合わせ(CR)を使用します。
- 行は足し算、列は引き算:行の要素を扱う場合は加算し、列の要素を扱う場合は減算します。
- 隣接する値で更新:その後、隣接する値を使って各値を更新していきます。
これらのルールを活用すれば、M1〜M7の値を無理なく覚えることができ、シュトラッセンのアルゴリズムをC++で実装する際にも大いに役立ちます。
-
C++で行列を走査する方法:行優先トラバーサルと列優先トラバーサルの徹底解説
行列の走査には2つの方法がある2次元行列(マトリックス)の要素を訪問する方法は、大きく分けて2種類あります。行優先(Row-wise)トラバーサルでは、1行目から順に、各行の要素を先頭のインデックスから最後のインデックスまで左から右へと訪問していきます。すべての行を処理し終えるまで、これを繰り返します。一方、列優先(Column-wise)トラバーサルでは、1列目から最終列目へ向かって、各列の要素を上から下へと順番に訪問します。インデックスの基本的な考え方2次元行列 M[i][j] において、インデックス i は行、インデックス j は列を表します。行優先トラバーサルの場合は、次の順序でアクセ
-
C++で解くスパイラル行列 III:時計回りに全マスを訪問するアルゴリズム
本記事では、R行C列の2次元グリッドを時計回りの渦巻き(スパイラル)状に巡回し、すべてのマスを訪問した順に座標を求める問題「スパイラル行列 III」をC++で解く方法を解説します。 問題の概要 R行C列の2次元グリッドを考えます。スタート地点は (r0, c0) で、最初は東向きに面しています。グリッドの北西の角は第1行・第1列に位置し、南東の角は最終行・最終列にあります。 私たちは時計回りの渦巻き状に歩きながら、グリッド内のすべてのマスを訪問します。途中でグリッドの境界外に出た場合でも、そのまま外側を歩き続け、後で再びグリッド内に戻ることがあります。 求めるのは、訪問した順番に並べたグリッド