1つの整数が固定されている場合の整数の乗算


35

ましょ大きさの固定された正の整数であるビット。nAn

必要に応じて、この整数を前処理できます。

サイズビットの別の正の整数が与えられた場合、乗算複雑さは?m A BBmAB

すでにアルゴリズムがあることに注意してください。ここでのクエリは、巧妙なもので\ epsilon = 0を取ることができるかどうかです。 ϵ = 0(max(n,m))1+ϵϵ=0


6
Aが与えられA場合、2nエントリのルックアップテーブルを作成するだけです。(明らかにこれはあなたが望んでいたものではありませんが、要件をより具体的にする必要があると思います...)
ユッカスオメラ

9
この質問は、標準のブール回路モデルでは完全に理にかなっていると思います。
ノアム

4
明らかな上限と下限、および認識している最良の結果を要約してください。それはあなたが問題を気にしていること、そしてあなたがそれについて考えたことを示し、それはあなたの問題について考える他のすべてのインセンティブを与えます。
ロビンコタリ

4
質問者は、前処理された部分がnO(1)スペースのみを必要とすることを暗黙的に意味すると思います。(マトリックスベクトルmultにそのプロパティがあります。)
ライアンウィリアムズ

私はあなたが何を望むかを知りたいです。私はこれについて無限のケースを経験できると感じています。これが私の最初の回答ですので、できる限り多くの情報を提供できるように心から喜んでいます。ご希望の場合は、mgroff100 @ hotmail.comまでメールでお問い合わせください。さらに多くのご協力をお待ちしております。
マットグロフ

回答:


20

常に最も効率的なアルゴリズムとは限りませんが、この質問は追加チェーンと非常に密接な関係があります。加算チェーンによって迅速に計算ためのアルゴリズムは、繰り返し加算によってを計算するためのアルゴリズムに変換されます(各加算はもちろん操作です)。反対に、任意のを計算するためのクイックアルゴリズムは、を計算ためのクイックアルゴリズムにつながりますが、もちろんこのアルゴリズムは必ずしも加算チェーンの形式である必要はありません。それでも、それは開始するのに最適な場所のようです。見てhttp://en.wikipedia.org/wiki/Addition_chainまたは容積をチェックしてください。の2f B = A B O n A B B AAf(B)=ABO(n)ABBA詳細については、コンピュータープログラミングの技術


17

Steven Stadnickiのアイデアを拡張するために、離散フーリエ変換を使用した行列乗算よりも優れた素朴なアルゴリズムをすばやく構築できます。

数をカウントします。ビットの半分が1未満の場合、それらの位置のリンクリストを作成します。乗算するには、リスト内の各位置で左にシフトし(表されるビットを乗算)、結果を追加します。BAB

ビットの半分以上が1である場合、上記と同じことを行いますが、代わりにゼロを使用して位置のリストを設定します。考え方は、すべてを1で乗算して得られる合計からこの合計を差し引くということです。すべてのものの合計を取得するには、我々はシフト中のビット数でおよび減算これから。次に、リンクリストから取得した合計を減算できます。A BBAB

これを単純なリンクリストアルゴリズムと呼ぶことができます。その実行時間は最悪の場合はですが、平均的な場合はであり、小さい場合はDFTよりも高速です。。O | B | O(n2)| A|O(|B||A|2π)|A|

リストの概念を最適に使用するには、分割統治法を使用します。を半分に分割し、単純なアルゴリズムを使用して関連リストのサイズを見つけます。それらが5より大きい場合、すべての半分を5未満に削減できるまで、5より大きい半分に対して単純なアルゴリズムを再度呼び出します。(これは、これを4つの減算に減らすことができるためです)A

さらに良いことに、分割統治アルゴリズムを改善します。可能なすべての分岐の組み合わせを反復処理し、貪欲に最適なものを選択します。この前処理には、実際の乗算とほぼ同じ時間がかかります。

前処理で無限の自由が許される場合、すべてのブランチに対して最適化された分割統治アルゴリズムを最適に解決します。これには最悪の場合時間がかかりますが、追加チェーン方式では〜最適なはずです。O(2|A|)

上記のアルゴリズムのより正確な値の計算に取り組んでいます。


こんにちはマット:とは および?| B ||A||B|
T ....

A A n | A | N | B | n A B|A|はのサイズ、基本的にの要素の数です。これはと同等です。つまり、。同じ 。ただし、がと異なる場合でも、この式は保持されます。AAn|A|n|B|nAB
マット・Groffの

17

紙と呼ばれる定数で乗算をサブリニアれるPDFは)アルゴリズム与えるここで、シフト/加算演算を一定の大きさであります。nO(nlogn)n

本質的には、定数のビットを探し、定数のそれらのビットだけに乗算する数をシフトして追加します(バイナリの長い乗算のように、乗算する一番下の数のビットは上部はシフトおよび追加されませんが、ビットは上部がシフトおよび追加されることを意味します。ただし、定数にはビットが存在する可能性があるため、これはまだです。1 0 1 O n On 11101O(n)O(n) 1

次に、この論文では、定数の数値表現を進数の数値システムに変更することについて説明します。変換が正しく行われると、明らかにビットはまばらになります(非常に冗長な数値システムです)。彼らはそれがいかにまばらかを計算します。ゼロ以外のビットの数は未満に制限されているため、必要な追加のサブリニア数があります。ただし、各加算のコストがであるため、実際の操作はまだ(は定数、およびは他の数値のサイズです)。On O n m0O(n)OmnmO(nmlogn)O(m)nm

あなたの質問に答えるために、はい、行列ベクトル乗算と同様の結果があります。定数であれば高速化が得られ。もちろん、この高速化は素朴な長い乗算を超えるだけであり、よりもはるかに優れた乗算アルゴリズムが存在しますこのアルゴリズム。O n 2lognO(n2logn)


私の専門である@JAS:D。
リアルツスロー

3
これは、ARITH 2007でdx.doi.org/10.1109/ARITH.2007.24(完全性のため)として登場しました。
アンドラスサラモン

10

Matt Groffが提案したように、インスピレーションを得るために(またはあなたの状況のが現在のCPUのビット幅の範囲内である場合)実践コミュニティに興味があるかもしれません。実際、定数による整数乗算の問題は、多くのコンパイラライターや回路設計者によって検討されていますが、通常、「マルチプレクサレスマルチプレクサ」(シフト、加算、減算を使用した乗算)に関心があります。私が知っている初期の参考文献の1つは次のとおりです(私はこれをHackerのDelightセクション8.4から学びました)。n

Bernstein、R.(1986)、整数定数による乗算。ソフトウェア:実践と経験、16:641〜652。土井:10.1002 / spe.4380160704

VincentLefèvreによるより現代的な作品はここにあります(彼のフォローアップ作品を必ずご覧ください)。また、彼は効率的な回路合成に関するCMUプロジェクトにも注目しています(参考文献を参照)。後者のプロジェクトでは、定数のセットによる同時乗算も検討しています。

PSユーザー名をわかりやすい名前に変更することを検討することをお勧めします。


9

knknnk/2r2r2kn6nここに画像の説明を入力してください

185=1+8+16+32+1286×185=1110=2+4+16+64+102410011101 11101851001110111100110101000110011101

0011101000011110211200110201
01101010001(緑色)との端子出力機能は、(これも緑色です)。このシーケンシャルマシンを体系的に計算する方法の詳細については、このリンクを参照してください

コメントについて詳しく教えてください。
J.-E.

k>2

nknkk

k2r

kn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.