ましょ大きさの固定された正の整数であるビット。n
必要に応じて、この整数を前処理できます。
サイズビットの別の正の整数が与えられた場合、乗算複雑さは?m A B
すでにアルゴリズムがあることに注意してください。ここでのクエリは、巧妙なもので\ epsilon = 0を取ることができるかどうかです。 ϵ = 0
ましょ大きさの固定された正の整数であるビット。n
必要に応じて、この整数を前処理できます。
サイズビットの別の正の整数が与えられた場合、乗算複雑さは?m A B
すでにアルゴリズムがあることに注意してください。ここでのクエリは、巧妙なもので\ epsilon = 0を取ることができるかどうかです。 ϵ = 0
回答:
常に最も効率的なアルゴリズムとは限りませんが、この質問は追加チェーンと非常に密接な関係があります。加算チェーンによって迅速に計算ためのアルゴリズムは、繰り返し加算によってを計算するためのアルゴリズムに変換されます(各加算はもちろん操作です)。反対に、任意のを計算するためのクイックアルゴリズムは、を計算ためのクイックアルゴリズムにつながりますが、もちろんこのアルゴリズムは必ずしも加算チェーンの形式である必要はありません。それでも、それは開始するのに最適な場所のようです。見てhttp://en.wikipedia.org/wiki/Addition_chainまたは容積をチェックしてください。の2f (B )= A B O (n )A B B A詳細については、コンピュータープログラミングの技術。
Steven Stadnickiのアイデアを拡張するために、離散フーリエ変換を使用した行列乗算よりも優れた素朴なアルゴリズムをすばやく構築できます。
数をカウントします。ビットの半分が1未満の場合、それらの位置のリンクリストを作成します。乗算するには、リスト内の各位置で左にシフトし(表されるビットを乗算)、結果を追加します。B
ビットの半分以上が1である場合、上記と同じことを行いますが、代わりにゼロを使用して位置のリストを設定します。考え方は、すべてを1で乗算して得られる合計からこの合計を差し引くということです。すべてのものの合計を取得するには、我々はシフト中のビット数でおよび減算これから。次に、リンクリストから取得した合計を減算できます。A B
これを単純なリンクリストアルゴリズムと呼ぶことができます。その実行時間は最悪の場合はですが、平均的な場合はであり、小さい場合はDFTよりも高速です。。O (| B | √| A|
リストの概念を最適に使用するには、分割統治法を使用します。を半分に分割し、単純なアルゴリズムを使用して関連リストのサイズを見つけます。それらが5より大きい場合、すべての半分を5未満に削減できるまで、5より大きい半分に対して単純なアルゴリズムを再度呼び出します。(これは、これを4つの減算に減らすことができるためです)
さらに良いことに、分割統治アルゴリズムを改善します。可能なすべての分岐の組み合わせを反復処理し、貪欲に最適なものを選択します。この前処理には、実際の乗算とほぼ同じ時間がかかります。
前処理で無限の自由が許される場合、すべてのブランチに対して最適化された分割統治アルゴリズムを最適に解決します。これには最悪の場合時間がかかりますが、追加チェーン方式では〜最適なはずです。
上記のアルゴリズムのより正確な値の計算に取り組んでいます。
紙と呼ばれる定数で乗算をサブリニアれる(PDFは)アルゴリズム与えるここで、シフト/加算演算を一定の大きさであります。n
本質的には、定数のビットを探し、定数のそれらのビットだけに乗算する数をシフトして追加します(バイナリの長い乗算のように、乗算する一番下の数のビットは上部はシフトおよび追加されませんが、ビットは上部がシフトおよび追加されることを意味します。ただし、定数にはビットが存在する可能性があるため、これはまだです。1 0 1 O (n )O(n )1
次に、この論文では、定数の数値表現を進数の数値システムに変更することについて説明します。変換が正しく行われると、明らかにビットはまばらになります(非常に冗長な数値システムです)。彼らはそれがいかにまばらかを計算します。ゼロ以外のビットの数は未満に制限されているため、必要な追加のサブリニア数があります。ただし、各加算のコストがであるため、実際の操作はまだ(は定数、およびは他の数値のサイズです)。O(n )O (n mO(m)nm
あなたの質問に答えるために、はい、行列ベクトル乗算と同様の結果があります。定数であれば高速化が得られ。もちろん、この高速化は素朴な長い乗算を超えるだけであり、よりもはるかに優れた乗算アルゴリズムが存在しますこのアルゴリズム。O (n 2
Matt Groffが提案したように、インスピレーションを得るために(またはあなたの状況のが現在のCPUのビット幅の範囲内である場合)実践コミュニティに興味があるかもしれません。実際、定数による整数乗算の問題は、多くのコンパイラライターや回路設計者によって検討されていますが、通常、「マルチプレクサレスマルチプレクサ」(シフト、加算、減算を使用した乗算)に関心があります。私が知っている初期の参考文献の1つは次のとおりです(私はこれをHackerのDelightセクション8.4から学びました)。
Bernstein、R.(1986)、整数定数による乗算。ソフトウェア:実践と経験、16:641〜652。土井:10.1002 / spe.4380160704
VincentLefèvreによるより現代的な作品はここにあります(彼のフォローアップ作品を必ずご覧ください)。また、彼は効率的な回路合成に関するCMUプロジェクトにも注目しています(参考文献を参照)。後者のプロジェクトでは、定数のセットによる同時乗算も検討しています。
PSユーザー名をわかりやすい名前に変更することを検討することをお勧めします。