Javascript中的Karatsuba算法

Javascript中的Karatsuba算法,javascript,algorithm,karatsuba,Javascript,Algorithm,Karatsuba,我用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

我用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;
    }
}
constmultiply=(a,b)=>{
设sizeA=numOfDigits(a);
设sizeB=numf位数(b);
if(sizeA
当我传递非常大的数字时,它失败了,比如说2个64位数的数字。我遇到了最大调用堆栈问题。我还遇到了另一个返回错误结果的实现


使用两个32位数的数字也可以正常工作。只要我输入2个64位数字,它就会进入一个非终止递归。这能起作用吗

看起来您对各种片段(例如
q-p
,以及所有
u*Math.pow(10,n)+(u+w-v)*Math.pow(10,n_2)+w
)依赖JavaScript数字功能;但是JavaScript数字是双精度浮点值。它们不能精确地表示超过16位的整数。(见附件。)

如果你想用非常大的整数做数学运算,你需要找到一个大整数库,或者自己管理它(使用字符串、数组等等)