gpt4 book ai didi

javascript - Javascript 中的 Karatsuba 算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:30:23 26 4
gpt4 key购买 nike

我用 Javascript 实现了 Karatsuba 的算法。

const multiply = (a, b) => {
let sizeA = numOfDigits(a);
let sizeB = numOfDigits(b);
if(sizeA < sizeB) {
a = '0'.repeat(sizeB-sizeA).concat(a);
}
else if(sizeB < sizeA) {
b = '0'.repeat(sizeA - sizeB).concat(b);
}
if (numOfDigits(a) === 1 && numOfDigits(b) === 1) {
return a * b;
} else {
let n = numOfDigits(a);
n = ( n % 2 === 0 ) ? n : n + 1;
let n_2 = parseInt(Math.ceil(n /2));
let splitA = reduceInHalf(a);
let splitB = reduceInHalf(b);
let p = splitA[0];
let q = splitA[1];
let r = splitB[0];
let s = splitB[1];
let u = multiply(p, r);
let v = multiply((q - p).toString(), (s - r).toString());
let w = multiply(q, s);
let product = u * Math.pow(10,n) + (u + w - v) * Math.pow(10, n_2) + w;
return product;
}
}

当我传递非常大的数字时,它会失败,比如 2 个 64 位数字。我遇到了最大调用堆栈问题。我还遇到了另一个返回错误结果的实现。

对于 2 个 32 位的数字也能正常工作。一旦我输入 2 个 64 位数字,它就会进入非终止递归。这可以工作吗?

最佳答案

看起来您依赖于 JavaScript 数字功能来处理各种部分(例如 q - p,以及所有 u * Math.pow(10,n) + (u + w - v) * Math.pow(10, n_2) + w);但是 JavaScript 数字是 double 浮点值。它们不能准确表示超过 16 位的整数。 (参见 "biggest integer that can be stored in a double"。)

如果你想用非常大的整数进行数学运算,你需要找到一个大整数库,或者自己管理它(使用字符串或数组或诸如此类的东西)。

关于javascript - Javascript 中的 Karatsuba 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40566587/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com