行列の乗算を高速化するための二重基数システムについて、漠然と覚えています。
ダブルベースシステムは、1 つの番号に対して 2 つのベースを使用する冗長システムです。
n = Sum(i=1 --> l){ c_i * 2^{a_i} * 3 ^ {b_i}, where c in {-1,1}
冗長とは、1 つの数値をさまざまな方法で指定できることを意味します。
Vassil Dimitrov、Todor Cooklev による記事「Hybrid Algorithm for the Computation of the Matrix Polynomial」を探すことができます。
私ができる最善の短い概要を提供しようとしています。
彼らは行列多項式を計算しようとしていましたG(N,A) = I + A + ... + A^{N-1}
。
N がコンポジットG(N,A) = G(J,A) * G(K, A^J)
であると仮定すると、J = 2 を適用すると、次のようになります。
/ (I + A) * G(K, A^2) , if N = 2K
G(N,A) = |
\ I + (A + A^2) * G(K, A^2) , if N = 2K + 1
また、
/ (I + A + A^2) * G(K, A^3) , if N = 3K
G(N,A) = | I + (A + A^2 + A^3) * G(K, A^3) , if N = 3K + 1
\ I + A * (A + A^2 + A^3) * G(K, A^3) , if N = 3K + 2
これらの方程式の一部が最初のシステムで高速であり、2 番目のシステムでより優れていることは "明らか" (冗談) であるため、 に応じて最適なものを選択することをお勧めしますN
。しかし、これには 2 と 3 の両方に対して高速な剰余演算が必要になります。これが二重基数が登場する理由です。基本的に、それらの両方に対して剰余演算を高速に実行して、組み合わせたシステムを提供できます。
/ (I + A + A^2) * G(K, A^3) , if N = 0 or 3 mod 6
G(N,A) = | I + (A + A^2 + A^3) * G(K, A^3) , if N = 1 or 4 mod 6
| (I + A) * G(3K + 1, A^2) , if N = 2 mod 6
\ I + (A + A^2) * G(3K + 2, A^2) , if N = 5 mod 6
私はこの分野の専門家ではないので、より良い説明については記事を参照してください。