vector<int> a6 = convert_base(this->a, base_digits, 6);
vector<int> b6 = convert_base(v.a, base_digits, 6);
vll a(a6.begin(), a6.end());
vll b(b6.begin(), b6.end());
while (a.size() < b.size())
a.push_back(0);
while (b.size() < a.size())
b.push_back(0);
while (a.size() & (a.size() - 1))
a.push_back(0), b.push_back(0);
vll c = karatsubaMultiply(a, b);
bigint res;
res.sign = sign * v.sign;
for (int i = 0, carry = 0; i < (int) c.size(); i++) {
long long cur = c[i] + carry;
res.a.push_back((int) (cur % 1000000));
carry = (int) (cur / 1000000);
}
res.a = convert_base(res.a, 6, base_digits);
res.trim();
return res;
}
Подскажите, пожалуйста, оператор *, хорошо ли реализован? Он в цикле выполняется по 100тыс раз. И это очень долго получается по времени. Если бегло на код посмотреть, может есть где-то затратное копирование или типа того, что можно ускорить?? Если кратко, код скорее норм, или совсем плохой?
Судя по тому что это нечитаемая простыня плохо
Не помню уже, есть ли у Карацубы оптимизации, но то, что ты создаешь новые векторы a и b - точно лишнее
Ты их в функции karatsubaMultiply даже не меняешь. Можно просто итераторы передавать от a6 и b6
Обсуждают сегодня