ブースのアルゴリズム

乗算器の高速化のためには、部分積の段数を減らすことが効果的ですが、 そのためのうまい方法として、ブースのアルゴリズム (Booth's algorithm) というものが知られています。

まず、被乗数Xと乗数Yを、N桁の符号つきの2進数で 次のようにあらわすことにします。

ここで、やや唐突ですが、次のようなYjを考えましょう。 このようなYjに対して、次のようにYを求めることにしましょう。 たとえばj = 0, 1, 2を順番に足してみる(つまりN=6)と、 次のようになります。 ただしy-1 = 0とおきました。 つまり、もともとのYそのものとなるわけです。 一応証明しておきましょう。 さてこのYの表現を使うと、Z = X・Yは次のように求められます。 ここでZjはj段目の部分積で、次のように書くことができます。 つまり乗算結果Zを求めるためには、jを0から順に XをYj・22j倍ずつして求めたZjを 足していけばよいわけです。

ポイントは、この加算が、(N-2)/2回、つまり普通に部分積を足していく場合の 半分程度の回数で済む、ということです。 これは、y2j +y2j-1 - 2y2j+1という項を 使って、1個とばしで部分積を足していく方法、と考えることができます。

このうち、Yjに含まれる y2j, y2j-1, y2j+1の組み合わせは 8通りしかありませんから、それをまとめると次のようになるでしょう。
y2j+1 y2j y2j-1 Yj Zj Zjを求める作業 Q1 Q2 QN
000 0 0 何もしない 000
001 1 0 2j ビットシフト 100
010 1 0 2j ビットシフト 100
011 2 0 (2j+1)ビットシフト 010
100-2 0 (2j+1)ビットシフトし、2の補数 011
101-1 0 2j ビットシフトし、2の補数 101
110-1 0 2j ビットシフトし、2の補数 101
111 0 0 何もしない 000
ここで、Q1, Q2, QNは、Zjを求める作業で、 するべき操作を示す、次のような数値です。

このように乗算を行う方法を ブースのアルゴリズム (Booth's algorithm)と呼びます。