2

Karatsuba算法的实现,方法只算小数为真,但大答案不正确,有什么问题?

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));

4

3 回答 3

1

调用Math.pow非常可疑。根据文档,它

返回将 x 提高到 y 次方的结果的依赖于实现的近似值。

您不希望在 Karatzuba 中使用任何近似值。

于 2019-01-15T23:29:07.797 回答
1
return BigInt(parseInt(x) * parseInt(y));

它破坏了在构造 BigInt 之前将大型事物相乘的观点。

于 2019-01-16T00:01:59.150 回答
0

除了user58697 对浮点运算的一般警告和超越函数的警告之外:

您用于m2拆分数字,但m(也)用于缩放之前/组合/“(多项式)评估”。

你需要使用2*m2.

于 2019-01-15T23:56:51.020 回答