숙제 프로젝트를위한 작은 bignum 라이브러리를 쓰고 있습니다. Karatsuba 곱셈을 구현할 것이지만 그 전에는 순진한 곱셈 루틴을 작성하고 싶습니다.임의 정밀도 (bignum) 정수에 대한 곱셈 알고리즘
"현대 컴퓨터 계산"이라는 제목의 Paul Zimmerman이 작성한 가이드를 따르고 있습니다. freely available online입니다.
페이지 4에는 Gradeschool 곱셈을 수행하는 BasecaseMultiply라는 알고리즘에 대한 설명이 있습니다.
단계 2, 3을 이해합니다. 여기서 B^j는 1, j 배의 자리 이동입니다. 그러나 단계 1과 3을 이해하지 못합니다. 여기에 A * b_j가 있습니다. 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
A * b_j를 수행해야하므로 bignum 곱셈 루틴을 재귀 적으로 만들 수 있습니다. 나는 그것이 어떻게 정의 될지 모르겠다. 그래서 그것은 거의 답이 아니다. 그러나 그것은 적어도 하나의 생각이다. 더 나은 해결책이 있다고 확신합니다. :) – Dustin