除算アルゴリズムは、2 つの整数NとD (それぞれ分子と分母) が与えられ、ユークリッド除算の結果である商と余りを計算するアルゴリズムです。一部は手作業で適用され、その他はデジタル回路設計やソフトウェアで採用されています。
除算アルゴリズムは、低速除算と高速除算の 2 つの主なカテゴリに分類されます。低速除算アルゴリズムでは、反復ごとに最終商の 1 桁が生成されます。低速除算の例には、復元除算、非実行復元除算、非復元除算、SRT 除算などがあります。高速除算法は、最終商の近似値から開始し、反復ごとに最終商の 2 倍の桁を生成します。[1]ニュートン・ラプソン アルゴリズムとゴールドシュミット アルゴリズムはこのカテゴリに分類されます。
これらのアルゴリズムのバリエーションにより、高速乗算アルゴリズムを使用できます。その結果、大きな整数の場合、どの乗算アルゴリズムを使用しても、除算に必要なコンピュータ時間は、定数倍まで乗算に必要な時間と同じになります。
議論はフォームを参照する。
は入力であり、
出力です。
繰り返し減算による除算
最も単純な除算アルゴリズムは、歴史的にはユークリッドの『原論』第 7 巻、命題 1で提示された最大公約数アルゴリズムに組み込まれており、減算と比較のみを使用して 2 つの正の整数の余りを計算します。
R : = N
Q : = 0
R ≥ Dの場合 R : = R − D Q : = Q + 1を実行し、( Q , R )を返します。
商と余りが存在し、一意であることの証明 (ユークリッド除算で説明) により、加算、減算、比較を使用して、負の数と正の数の両方に適用できる完全な除算アルゴリズムが得られます。
function division ( N , D )
if D = 0 then error ( DivisionByZero ) end
if D < 0 then ( Q , R ) : = division ( N , − D ); return ( − Q , R ) end
if N < 0 then
( Q , R ) : = division ( − N , D )
if R = 0 then return ( − Q , 0 )
else return ( − Q − 1 , D − R ) end
end
-- この時点で、N ≥ 0 かつ D > 0
return division_unsigned ( N , D )
end
function division_unsigned ( N , D )
Q : = 0 ; R : = N
while R ≥ D do
Q : = Q + 1
R : = R − D
end
return ( Q , R )
end
この手順では常に R ≥ 0 が生成されます。非常に単純ですが、Ω(Q) ステップかかるため、長除算などの低速除算アルゴリズムよりも指数関数的に遅くなります。Q が小さいことがわかっている場合 (出力に敏感なアルゴリズムであるため) に役立ち、実行可能な仕様として使用できます。
長除算
長除法は、10 進数表記で表された多桁の数字をペンと紙で除算するときに使用される標準的なアルゴリズムです。このアルゴリズムは、被除数の左端から右端へと徐々にシフトし、各段階で除数の最大可能な倍数 (桁レベル) を減算します。その後、倍数が商の桁になり、最終的な差が余りになります。
この方法は、2 進基数で使用すると、以下の剰余アルゴリズム (符号なし) 整数除算の基礎となります。短除算は、1 桁の除数に適した長除算の短縮形です。チャンキング (部分商法またはハングマン法とも呼ばれる) は、長除算の効率の低い形式ですが、理解しやすいかもしれません。各段階で現在よりも多くの倍数を減算できるようにすることで、長除算のより自由な形式も開発できます。
剰余のある整数除算(符号なし)
次のアルゴリズムは、有名な長除算の 2 進バージョンであり、 N をDで割り、商をQに、余りをRに格納します。次の疑似コードでは、すべての値が符号なし整数として扱われます。
D = 0 の場合、 エラー( DivisionByZeroException )が発生します。 終了
Q : = 0 -- 商と余りをゼロに初期化します。
R : = 0
for i : = n − 1 .. 0 do -- n は N のビット数です。
R : = R << 1 -- R を 1 ビット左にシフトします。
R ( 0 ) : = N ( i ) -- R の最下位ビットを分子のビット i と同じに設定します。
R ≥ Dの場合 、R : = R − D Q ( i ) : = 1終了します。終了
例
N=1100 2 (12 10 )、D=100 2 (4 10 ) とすると
ステップ1 : R=0、Q=0に設定する
ステップ2 : i=3(Nのビット数より1少ない)にする
ステップ3 : R=00(1だけ左にシフト)
ステップ4 : R=01(R(0)をN(i)に設定する)
ステップ5 : R < Dなので、ステートメントをスキップする
ステップ2 : i=2 に設定
ステップ3 : R=010
ステップ4 : R=011
ステップ5 : R < D、ステートメントはスキップ
ステップ2 : i=1に設定
ステップ3 : R=0110
ステップ4 : R=0110
ステップ5 : R>=D、ステートメントを入力
ステップ5b : R=10 (R−D)
ステップ5c : Q=10 (Q(i)を1に設定)
ステップ2 : i=0に設定
ステップ3 : R=100
ステップ4 : R=100
ステップ5 : R>=D、ステートメントを入力
ステップ5b : R=0 (R−D)
ステップ5c : Q=11 (Q(i)を1に設定)
終了
Q=11 2 (3 10 ) かつR=0。
遅い除算法
低速除算法はすべて標準的な再帰方程式に基づいている[2]
どこ:
- R j は割り算のj番目の部分剰余である。
- B は基数(基数、コンピュータや計算機の内部では通常 2)です。
- q n − ( j + 1) は商のn −( j +1)の位置の桁であり、桁の位置は最下位 0 から最上位n −1まで番号が付けられている。
- nは商の桁数です
- Dは除数である
分割の復元
復元除算は固定小数点小数に対して行われ、0 < D < Nという仮定に依存します。[引用が必要]
商の数字qは数字セット{0,1}から形成されます。
2進数(基数2)の復元除算の基本アルゴリズムは次のとおりです。
R : = N
D : = D << n -- R と D は N と Q の 2 倍のワード幅が必要です
for i : = n − 1 .. 0 do -- たとえば 32 ビットの場合は 31..0
R : = 2 * R − D -- シフトされた値からの減算を試みます (2 を掛けると 2 進数表現ではシフトになります)
if R >= 0 then
q ( i ) : = 1 -- 結果ビット 1
else
q ( i ) : = 0 -- 結果ビット 0
R : = R + D -- 新しい部分剰余は (復元された) シフトされた値です
end
end
-- ここで、N = 分子、D = 分母、n = ビット数、R = 部分剰余、q(i) = 商のビット数 i
実行されない復元除算は復元除算と似ていますが、2R の値が保存されるため、R < 0 の場合に D を再度追加する必要はありません。
非復元部門
非復元除算では、商の桁に{0, 1}ではなく桁セット{−1, 1}を使用します。アルゴリズムはより複雑ですが、ハードウェアで実装すると商ビットごとに決定と加算/減算が1回だけになるという利点があります。減算後に復元ステップがないため、[3]操作回数を最大半分に減らし、より高速に実行できます。[4] 負でない数の2進数(基数2)非復元除算の基本アルゴリズムは次のとおりです。
R : = N
D : = D << n -- R と D は N と Q の 2 倍のワード幅が必要です。
for i = n − 1 .. 0 do -- たとえば 32 ビットの場合は 31..0
if R >= 0 then
q ( i ) : = + 1
R : = 2 * R − D
else
q ( i ) : = − 1
R : = 2 * R + D
end if
end
-- 注: N = 分子、D = 分母、n = ビット数、R = 部分剰余、q(i) = 商のビット数 i。
このアルゴリズムに従うと、商は -1 と +1 の数字で構成される非標準形式になります。最終的な商を形成するには、この形式を 2 進数に変換する必要があります。例:
の -1 桁目が、一般的なようにゼロ (0) として格納されている場合、 となり、計算は簡単です。元の に対して 1 の補数 (ビットごとの補数) を実行します。
Q : = Q − bit . bnot ( Q ) -- Q の −1 桁が通常どおりゼロとして表される場合は適切です。
最後に、このアルゴリズムで計算される商は常に奇数であり、R の剰余は -D ≤ R < D の範囲にあります。たとえば、5 / 2 = 3 R -1 です。正の剰余に変換するには、Q を非標準形式から標準形式に変換した 後、1 つの復元手順を実行します。
R < 0 の場合、
Q : = Q − 1
R : = R + D -- 剰余が重要な場合のみ必要
。
実際の剰余は R >> n です。(除算の復元と同様に、R の下位ビットは商 Q のビットが生成されるのと同じ速度で使用され、両方に単一のシフト レジスタを使用するのが一般的です。)
SRT部門
SRT除算は、多くのマイクロプロセッサ実装でよく使われる除算方法です。 [5] [6]このアルゴリズムは、 IBMのDWスウィーニー、イリノイ大学のジェームズ・E・ロバートソン、インペリアル・カレッジ・ロンドンのKDトッチャーにちなんで名付けられました。彼らはほぼ同時期にこのアルゴリズムを独立して開発しました(それぞれ1957年2月、1958年9月、1958年1月に発表)。[7] [8] [9]
SRT 除算は非復元除算に似ていますが、被除数と除数に基づく 参照テーブルを使用して商の各桁を決定します。
最も大きな違いは、商に冗長な表現が使用されることです。たとえば、基数 4 の SRT 除算を実装する場合、商の各桁は5 つの可能性 { −2、−1、0、+1、+2 } から選択されます。このため、商の桁の選択は完璧である必要はなく、後の商の桁でわずかな誤差を修正できます。(たとえば、商の桁のペア (0、+2) と (1、−2) は、0×4+2 = 1×4−2 なので同等です。) この許容範囲により、全角減算を必要とせず、被除数と除数の最上位ビットのみを使用して商の桁を選択できます。この簡略化により、2 より大きい基数を使用できるようになります。
非復元除算と同様に、最後の手順は、最後の商ビットを解決するための最終的な全角減算と、商の標準の 2 進形式への変換です。
インテルペンティアムプロセッサの悪名高い浮動小数点除算のバグは、ルックアップテーブルのコードが誤っていたために発生しました。1066エントリのうち5つが誤って省略されていました。[10] [11]
高速除算法
ニュートン・ラプソン分割
ニュートン・ラプソン法では、ニュートン法を使用しての逆数を求め、その逆数に を掛けて最終的な商を求めます。
ニュートン・ラプソン除算の手順は次のとおりです。
- 除数の逆数の推定値を計算します。
- 逆数のより正確な推定値を連続的に計算します。ここでは、ニュートン・ラプソン法を使用します。
- 被除数に除数の逆数を掛けて商を計算します。
ニュートン法を適用して の逆数を求めるには、で零点を持つ関数を見つける必要があります。そのような関数として明らかなのは ですが、ニュートン・ラプソン反復法は の逆数が分かっていなければ計算できないため役に立ちません(さらに、反復による改善ではなく、1 ステップで正確な逆数を計算しようとします)。 が有効な関数であり、ニュートン・ラプソン反復法では次の式が得られます 。
これは、乗算と減算のみを使用して計算することも、2つの融合された乗算と加算を使用して計算することもできます。
計算の観点から見ると、式と は同等ではありません。2番目の式を使用して2 nビットの精度の結果を得るには、との積を の指定された精度( nビット)の2 倍で計算する必要があります。 [要出典]対照的に、 と の積は、の先頭のnビット (2 進小数点の後) がゼロである ため、 nビットの精度で計算するだけで済みます。
エラーが と定義されている場合、次のようになります。
この各反復ステップでの誤差の二乗(いわゆるニュートン・ラプソン法の二次収束)により、結果の正しい桁の数が反復ごとにほぼ 2 倍になるという効果があります。この特性は、関係する数字の桁数が多い場合(たとえば、大きな整数領域内)に非常に役立ちます。ただし、この特性は、特に初期推定値が適切に選択されていない 場合、この方法の初期収束が比較的遅くなる可能性があることも意味します。
初期推定値を選択するサブ問題では、除数Dにビットシフトを適用して0.5 ≤ D ≤ 1となるようにスケーリング するのが便利です 。同じビットシフトを分子Nに適用することで、商が変化しないことが保証されます。次に、次の形式の 線形近似を使用できます。
ニュートン・ラプソンを初期化する。区間 におけるこの近似の誤差の絶対値の最大値を最小化するには、
線形近似の係数は次のように決定されます。誤差の絶対値は です。誤差の最大絶対値の最小値は、に適用されるチェビシェフの等振動定理によって決定されます。 の極小値はのときに発生し、その解は です。その極小値における関数は、端点における関数と反対の符号、つまり でなければなりません。2 つの未知数における 2 つの方程式は、一意の解と を持ち、最大誤差は です。この近似を使用すると、初期値の誤差の絶対値は より小さくなります。
Remez アルゴリズムを使用して係数を計算し、1 より大きい次数の多項式近似を生成することが可能です。トレードオフは、初期推定により多くの計算サイクルが必要になることですが、その代わりにニュートン・ラプソン法の反復回数が少なくなることが期待されます。
この方法では収束は正確に2次式となるため、
ステップは、 2 進数までの値を計算するのに十分です。これは、IEEE単精度の場合は 3、倍精度と倍精度拡張形式の場合は 4と評価されます。
擬似コード
以下は、 NとDの商をPバイナリ桁の精度で計算します。
DをM × 2 eとして表す(1 ≤ M < 2(標準浮動小数点表現)) D' := D / 2 e+1 // 0.5 から 1 の間でスケールし、ビットシフト / 指数減算で実行できます N' := N / 2 e+1 X := 48/17 − 32/17 × D' // D の繰り返し回数と同じ精度で定数を事前計算します // 固定 P に基づいて事前計算できます X := X + X × (1 - D' × X) 終了 リターンN' × X
たとえば、倍精度浮動小数点除算の場合、この方法では 10 回の乗算、9 回の加算、および 2 回のシフトが使用されます。
変形ニュートン・ラプソン除算
ニュートン・ラプソン除算法は、以下のように変更すると少し速くなる。NとDをシフトしてDが[0.5, 1.0]になる ようにし、次のように初期化する。
これは 1/ Dに最もよく適合する二次関数であり、誤差の絶対値は 1/99 以下になります。誤差が再スケールされた 3 次チェビシェフ多項式と等しくなるように選択されます。係数は事前に計算してハードコードする必要があります。
次に、ループ内で、エラーを 3 乗する反復処理を使用します。
Y ⋅ E項は新しいものです。
Xが先頭のPビットで1/ Dと一致するまでループを実行すると、反復回数は
これは99を3乗して2 P +1になる回数です。
Pビットの商です。
初期化または反復のいずれかで高次多項式を使用すると、必要な追加の乗算をより多くの反復の実行に費やした方がよいため、パフォーマンスが低下します。
ゴールドシュミット部門
ゴールドシュミット除算[12](ロバート・エリオット・ゴールドシュミットに由来)[13]は、除数が1に収束するように選択された共通因数F iを被除数と除数の両方に繰り返し掛ける反復プロセスを使用します。これにより、被除数は求められる商Qに収束します。
ゴールドシュミット除算の手順は次のとおりです。
- 乗算係数F iの推定値を生成します。
- 被除数と除数をF iで乗算します。
- 除数が 1 に十分近い場合は被除数を返し、そうでない場合はステップ 1 に戻ります。
N / Dが0 < D < 1になるようにスケールされていると 仮定すると、各FiはDに基づきます。
被除数と除数を因数で乗算すると次のようになります。
十分な回数kの反復後。
ゴールドシュミット法は、AMD Athlon CPUおよびそれ以降のモデルで使用されています。[14] [15]これは、アンダーソン・アール・ゴールドシュミット・パワー(AEGP)アルゴリズムとしても知られ、さまざまなIBMプロセッサで実装されています。[16] [17]ニュートン・ラプソン実装と同じ速度で収束しますが、ゴールドシュミット法の利点の1つは、分子と分母の乗算を並列に実行できることです。[17]
二項定理
ゴールドシュミット法は、二項定理による簡略化を可能にする因子とともに使用できます。 がとなるように2 の累乗でスケールされていると仮定します。および を選択します。これにより、
- 。
nステップ後、分母は次のように丸められる。1相対誤差あり
これはのときに最大となり、2進数の最小精度が提供されます。
大きな整数メソッド
ハードウェア実装用に設計された方法は、一般に、小数点以下が数千または数百万の整数には対応していません。このような状況は、たとえば暗号のモジュラー縮約などで頻繁に発生します。このような大きな整数の場合、より効率的な除算アルゴリズムによって、問題が少数の乗算を使用するように変換されます。この乗算は、 Karatsuba アルゴリズム、Toom-Cook 乗算、Schönhage-Strassen アルゴリズムなどの漸近的に効率的な乗算アルゴリズムを使用して実行できます。その結果、除算の計算量は、乗算の計算量と同じオーダーになります (乗法定数まで)。例としては、前述のニュートン法による乗算への縮約、 [18]や、わずかに高速な Burnikel-Ziegler 除算、[19] Barrett 縮約、およびMontgomery 縮約アルゴリズムなどがあります。[20] [検証が必要]ニュートン法は、同じ除数で何度も除算しなければならないシナリオでは特に効率的です。これは、最初のニュートン逆変換の後、各除算に必要な乗算は1回だけ(切り捨て)であるためです。
定数による除算
定数Dによる除算は、その逆数による乗算と同等です。分母が定数なので、その逆数 (1/ D ) も定数です。したがって、コンパイル時に(1/ D ) の値を 1 回計算し、実行時に除算N/Dではなく乗算N ·(1/ D ) を実行することが可能です。浮動小数点演算では (1/ D )を使用してもほとんど問題はありませんが[a] 、整数演算では逆数は常にゼロと評価されます (| D | > 1 と仮定)。
特に (1/ D )を使用する必要はありません。(1/ D )に簡約される任意の値 ( X / Y )を使用できます。たとえば、3 で割る場合、係数 1/3、2/6、3/9、または 194/582 を使用できます。したがって、Y が2 の累乗である場合、除算手順は高速な右ビット シフトに簡約されます。N / D を ( N · X )/ Y として計算する効果は、除算を乗算とシフトに置き換えます。N · ( X / Y ) はゼロに評価されるため、括弧が重要であることに注意してください。
しかし、D自体が 2 の累乗でない限り、上記の条件を満たすXとY は存在しません。幸いなことに、( N · X )/ Y は、( X / Y ) が 1/ Dと正確に等しくない場合でも、整数演算でN / Dとまったく同じ結果になりますが、近似によって導入された誤差はシフト演算で破棄されるビットにあるほど「十分に近い」ものです。[21] [22] [23]バレット減算では、 Yの値に 2 の累乗を使用して、 Yによる除算を単純な右シフトにします。[b]
具体的な固定小数点演算の例として、32ビットの符号なし整数の場合、3による除算は、2863311531/2 33 、2863311531( 16進数0xAAAAAAAB)を乗算し、その後33ビット右シフトします。2863311531の値は次のように計算されます2 33/3、その後切り上げられます。同様に、10で割る場合は、3435973837 (0xCCCCCCCD) を掛け、2 35 (または35 右ビットシフト) で割ることで表すことができます。[25] : p230-234 OEIS では、乗算の定数シーケンスを A346495、右シフトの定数シーケンスを A346496 として提供しています。
除数Dが 2 の累乗ではない一般的なxビットの符号なし整数除算の場合、次の恒等式は、およびを事前計算した後、除算を 2 つのxビット加算/減算、1 つのxビットxビット乗算 (結果の上位半分のみを使用)、および複数のシフトに変換します。
場合によっては、「定数による乗算」を一連のシフトと加算または減算に変換することで、定数による除算をさらに短時間で実行できます。[26]特に興味深いのは10による除算で、正確な商が得られ、必要に応じて余りも得られます。[27]
丸め誤差
除算演算を実行すると、正確な商 と余りがコンピュータの精度の制限内に収まるように近似されます。除算アルゴリズムは次のように定義されます。
どこ。
浮動小数点演算では、商は 、剰余はと表され、丸め誤差と が発生します。
この丸めにより小さな誤差が生じ、それが後続の計算を通じて伝播し蓄積される可能性がある。このような誤差は反復処理で特に顕著であり、ほぼ等しい値を減算する場合に有意性が失われると言われる。これらの誤差を軽減するために、ガード桁の使用や高精度の演算などの技術が採用されている。[28] [29]
参照
注記
参考文献
- ^ Rodeheffer, Thomas L. (2008-08-26). ソフトウェア整数分割(PDF) (技術レポート). Microsoft Research、シリコンバレー。
- ^ Morris, James E.; Iniewski, Krzysztof (2017-11-22). ナノエレクトロニクスデバイスアプリケーションハンドブック。CRC Press。ISBN 978-1-351-83197-0。
- ^ Shaw, Robert F. (1950). 「バイナリコンピュータにおける算術演算」. Review of Scientific Instruments . 21 (8): 690. Bibcode :1950RScI...21..687S. doi :10.1063/1.1745692. ISSN 0034-6748. 2022-02-28時点のオリジナルよりアーカイブ。 2022-02-28に取得。
- ^ Flynn. 「Stanford EE486 (Advanced Computer Arithmetic Division) – Chapter 5 Handout (Division)」(PDF)。スタンフォード大学。 2022年4月18日時点のオリジナルよりアーカイブ(PDF) 。 2019年6月24日閲覧。
- ^ Harris, David L.; Oberman, Stuart F.; Horowitz, Mark A. (1998 年 9 月 9 日). SRT 部門: アーキテクチャ、モデル、実装(PDF) (技術レポート). スタンフォード大学. 2016 年 12 月 24 日時点のオリジナルよりアーカイブ(PDF)されています。2016 年12 月 23 日閲覧。
- ^ McCann, Mark; Pippenger, Nicholas (2005). 「SRT Division Algorithms as Dynamical Systems」. SIAM Journal on Computing . 34 (6): 1279–1301. CiteSeerX 10.1.1.72.6993 . doi :10.1137/S009753970444106X. hdl :2429/12179. 2022-08-24にオリジナルからアーカイブ。 2022-08-24に取得。
- ^ コック、ジョン、スウィーニー、DW(1957年2月11日)、並列デバイスでの高速演算(会社メモ)、IBM、p. 20、2022年8月24日時点のオリジナルからアーカイブ、 2022年8月24日閲覧。
{{citation}}: CS1 maint: location missing publisher (link) - ^ Robertson, James (1958-09-01). 「新しいクラスのデジタル除算法」. IRE Transactions on Electronic Computers . EC-7 (3). IEEE: 218–222. doi :10.1109/TEC.1958.5222579. hdl : 2027/uiuo.ark:/13960/t0gt7529c . 2022-08-24にオリジナルからアーカイブ。2022-08-24に取得。
- ^ Tocher, KD (1958-01-01). 「自動バイナリコンピュータの乗算と除算のテクニック」. The Quarterly Journal of Mechanics and Applied Mathematics . 11 (3): 364–384. doi :10.1093/qjmam/11.3.364. 2022-08-24にオリジナルからアーカイブ。 2022-08-24に取得。
- ^ 「浮動小数点欠陥の統計分析」。Intel Corporation。1994年。2013年10月23日時点のオリジナルよりアーカイブ。2013年10月22日閲覧。
- ^ Oberman, Stuart F.; Flynn, Michael J. (1995 年 7 月). 除算アルゴリズムと実装の分析(PDF) (技術レポート). スタンフォード大学. CSL-TR-95-675. 2017 年 5 月 17 日のオリジナルからアーカイブ(PDF)されました。 2016 年 12 月 23 日閲覧。
- ^ Goldschmidt, Robert E. (1964). Applications of Division by Convergence (PDF) (論文). M.Sc. dissertation. MIT OCLC 34136725. 2015-12-10 にオリジナルからアーカイブ(PDF)されました。2015-09-15に取得。
- ^ 「著者」。IBM Journal of Research and Development。11 :125–127。1967年。doi : 10.1147/rd.111.0125。2018年7月18日時点のオリジナルよりアーカイブ。
- ^ Oberman, Stuart F. (1999). 「AMD-K7 マイクロプロセッサにおける浮動小数点除算および平方根アルゴリズムと実装」(PDF)。第 14 回 IEEE コンピュータ算術シンポジウムの議事録 (Cat. No.99CB36336) 。pp . 106–115。doi : 10.1109 /ARITH.1999.762835。ISBN 0-7695-0116-8. S2CID 12793819. 2015年11月29日にオリジナルからアーカイブ(PDF)されました。2015年9月15日に取得。
- ^ Soderquist, Peter; Leeser, Miriam (1997 年 7 月 - 8 月)。「除算と平方根: 適切な実装の選択」IEEE Micro . 17 (4): 56–66. doi :10.1109/40.612224。
- ^ SF Anderson、JG Earle、RE Goldschmidt、DM Powers。IBM 360/370 モデル 91: 浮動小数点演算ユニット、IBM Journal of Research and Development、1997 年 1 月
- ^ ab Guy, Even; Peter, Siedel; Ferguson, Warren (2005 年 2 月 1 日)。「ゴールドシュミットの除算アルゴリズムのパラメトリック誤差分析」。Journal of Computer and System Sciences。70 ( 1 ): 118–139。doi : 10.1016/ j.jcss.2004.08.004。
- ^ Hasselström, Karl (2003). Fast Division of Large Integers: A Comparison of Algorithms (PDF) (M.Sc. in Computer Science thesis). Royal Institute of Technology. 2017年7月8日時点のオリジナル(PDF)よりアーカイブ。 2017年7月8日閲覧。
- ^ Joachim Ziegler、Christoph Burnikel (1998)、高速再帰部門、Max-Planck-Institut für Informatik、オリジナルから 2011 年 4 月 26 日にアーカイブ、2021 年 9 月 10 日に取得
{{citation}}: CS1 maint: location missing publisher (link) - ^ Barrett, Paul (1987)。「標準デジタル信号プロセッサでの Rivest Shamir および Adleman 公開鍵暗号化アルゴリズムの実装」。Proceedings on Advances in Cryptology---CRYPTO '86。ロンドン、英国: Springer-Verlag。pp. 311–323。ISBN 0-387-18047-8。
- ^ Granlund, Torbjörn; Montgomery, Peter L. (1994年6月). 「乗算を使用した不変整数による除算」(PDF) . SIGPLAN Notices . 29 (6): 61–72. CiteSeerX 10.1.1.1.2556 . doi :10.1145/773473.178249. 2019年6月6日時点のオリジナルよりアーカイブ(PDF) . 2015年12月8日閲覧。
- ^ Möller, Niels; Granlund, Torbjörn (2011 年 2 月). 「不変整数による除算の改良」(PDF) . IEEE Transactions on Computers . 60 (2): 165–175. doi :10.1109/TC.2010.143. S2CID 13347152. 2015 年 12 月 22 日のオリジナルから アーカイブ(PDF) . 2015 年 12 月 8 日閲覧。
- ^ stupid_fish. 「Labor of Division (Episode III): Faster Unsigned Division by Constants」Wayback Machineに 2022-01-08 にアーカイブ。2011 年。
- ^ stupid_fish. 「libdivide、最適化された整数除算」。2021年11月23日時点のオリジナルよりアーカイブ。2021年7月6日閲覧。
- ^ ウォーレン・ジュニア、ヘンリー・S. (2013)。Hacker 's Delight (第2版)。Addison Wesley - Pearson Education、Inc. ISBN 978-0-321-84268-8。
- ^ LaBudde, Robert A.; Golovchenko, Nikolai; Newton, James; Parker, David; Massmind: 「定数による二進除算」 2022-01-09 にWayback Machineでアーカイブ
- ^ Vowels, RA (1992). 「10による除算」.オーストラリアコンピュータジャーナル. 24 (3): 81–85.
- ^ L. Popyack, Jeffrey (2000 年 6 月)。「丸め誤差」。ドレクセル大学。
- ^ 「9. 機械数値、丸め誤差、および誤差の伝播」。カレッジ・オブ・チャールストン。2021年2月8日。
さらに読む
- Savard, John JG (2018) [2006]. 「Advanced Arithmetic Techniques」. quadibloc . 2018-07-03 にオリジナルからアーカイブ。2018-07-16に取得。
