При реализации алгоритма Карацубы метод подсчитывает только малые числа, но большой ответ не верен, в чем проблема?

Реализация алгоритма Карацуба, метод считает только маленькие числа, правда, но большой ответ не является правильным, в чем проблема?

var x = "1685287499328328297814655639278583667919355849391453456921116729";
var y = "7114192848577754587969744626558571536728983167954552999895348492";

function karatsuba(x, y) {
    if (x.length < 2 && y.length < 2) {
        return BigInt(parseInt(x) * parseInt(y));
    }
    var m = Math.min(x.length, y.length);
    var m2 = m / 2;
    var a = BigInt(x.substring(0, m2));
    var b = BigInt(x.substring(m2));
    var c = BigInt(y.substring(0, m2));
    var d = BigInt(y.substring(m2));
    var ac = a * c;
    var bd = b * d;
    var sum = (a + b) * (c + d) - ac - bd;

    return BigInt(Math.pow(10, m)) * ac + BigInt(Math.pow(10, m2)) * sum + bd;
}

console.log(karatsuba(x, y));

3 ответа

Решение

Вызов Math.pow очень подозрительно Согласно документации, это

Возвращает зависящее от реализации приближение к результату возведения x в степень y.

Вы не хотите никаких приближений в Karatzuba.

return BigInt(parseInt(x) * parseInt(y));

Это побеждает точку умножения больших вещей вместе перед созданием BigInt.

В дополнение к предупреждению user58697 об арифметике с плавающей запятой в общем и трансцендентных функциях в частности:

Ты используешь m2 в разделении чисел, но m (тоже) в масштабировании до / в комбинации /"(полиномиальная) оценка".

Вам нужно использовать 2*m2,

Другие вопросы по тегам