行列の乗算を高速化するためのダブルベースシステムについて、漠然と覚えています。
ダブルベースシステムは、1つの番号に2つのベースを使用する冗長システムです。
n = Sum(i=1 --> l){ c_i * 2^{a_i} * 3 ^ {b_i}, where c in {-1,1}
冗長とは、1つの番号をさまざまな方法で指定できることを意味します。
TodorCooklevのVassilDimitrovによる記事「行列多項式の計算のためのハイブリッドアルゴリズム」を探すことができます。
私ができる最高の短い概要を提供しようとしています。
彼らは行列多項式を計算しようとしていました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
私はこの分野の専門家ではないので、より良い説明については記事を見てください。