책에 addTo함수와 subFrom 함수가 나와있지 않아서 직접 구현했고
karatsuba는 책에 있는 그대로 적었는데 그냥 multiply로 계산한 것과 값이 다르게 나와 여쭤봅니다.
처음에는 addTo나 subFrom에 문제가 있겠거니 생각해서 디버깅 다 해봤는데 굉장히 잘 돌아갑니다.
코드 첨부합니다.
void addTo(vector<int>& a, const vector<int>& b, int k) { // 10^k만큼 b에 곱한 값을 a에 곱한다.
unsigned m = a.size();
unsigned n = b.size();
if (a.size() < k) {
for (unsigned i = 0; i < k - m; ++i)
a.push_back(0);
for (unsigned i = 0; i < n; ++i)
a.push_back(b[i]);
}
else {
for (unsigned i = 0; i < min(m - k, n); ++i) {
a[i + k] += b[i];
}
if (m < n + k)
for (unsigned i = m - k; i < n; ++i)
a.push_back(b[i]);
}
}
void subFrom(vector<int>& a, const vector<int>& b) { // b.size() < a.size()라고 가정.
for (unsigned i = 0; i < b.size(); ++i) {
a[i] -= b[i];
}
}
AlgoPrince
책에 addTo함수와 subFrom 함수가 나와있지 않아서 직접 구현했고
karatsuba는 책에 있는 그대로 적었는데 그냥 multiply로 계산한 것과 값이 다르게 나와 여쭤봅니다.
처음에는 addTo나 subFrom에 문제가 있겠거니 생각해서 디버깅 다 해봤는데 굉장히 잘 돌아갑니다.
코드 첨부합니다.
그리고 카라츠바 곱셈 알고리즘은 책에 나와있는 대로 이렇게 짰습니다.
가장 큰 문제점은 카라츠바로 계산했을 때 노멀라이즈가 되지 않고 음수가 포함되어 나온다는 것입니다. 계산 시간은 확실히 빠르지만 왜 그런지 이유를 찾지 못하고 있습니다.
9년 전