Я пишу небольшую бигнум-библиотеку для домашнего задания. Я должен реализовать умножение Карацубы, но перед этим я хотел бы написать наивную процедуру умножения.
Я следую руководству, написанному Полом Циммерманом под названием «Современная компьютерная арифметика», которое бесплатно доступен в Интернете.
На странице 4 есть описание алгоритма BasecaseMultiply, который выполняет умножение в начальной школе.
Я понимаю шаги 2, 3, где B^j - сдвиг цифры 1, j раз. Но я не понимаю шагов 1 и 3, где у нас A*b_j. Как должно выполняться это умножение, если умножение 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