宿題プロジェクト用の小さなbignumライブラリを書いています。カラツバ掛け算を実装するのですが、その前に単純な掛け算ルーチンを書きたいと思います。
オンラインで無料で入手できる「Modern Computer Arithmetic」というタイトルの Paul Zimmerman によって書かれたガイドに従っています。
4 ページに、小学校の乗算を実行する BasecaseMultiply というタイトルのアルゴリズムの説明があります。
B^j が 1, j 回の桁シフトであるステップ 2、3 を理解しています。しかし、A*b_j があるステップ 1 と 3 がわかりません。bignum の乗算がまだ定義されていない場合、この乗算はどのように実行されるのでしょうか?
このアルゴリズムの操作「*」は、単に繰り返し加算法ですか?
ここまで書いてきた部分です。私はそれらをユニットテストしたので、ほとんどの場合正しいようです:
bignum に使用する構造は次のとおりです。
#define BIGNUM_DIGITS 2048
typedef uint32_t u_hw; // halfword
typedef uint64_t u_w; // word
typedef struct {
unsigned int sign; // 0 or 1
unsigned int n_digits;
u_hw digits[BIGNUM_DIGITS];
} bn;
現在利用可能なルーチン:
bn *bn_add(bn *a, bn *b); // returns a+b as a newly allocated bn
void bn_lshift(bn *b, int d); // shifts d digits to the left, retains sign
int bn_cmp(bn *a, bn *b); // returns 1 if a>b, 0 if a=b, -1 if a<b