JavaScript大整数平方根

时间:2018-12-08 15:29:15

标签: javascript node.js bigint

这涉及到Chrome和Node v10.4支持的新JavaScript BigInt类型

以下两行均引发错误:

Math.sqrt(9n)
Math.sqrt(BigInt(9))

错误是:

  

无法将BigInt值转换为数字

如何在JavaScript中获得BigInt的平方根? TIA

3 个答案:

答案 0 :(得分:2)

这是n-th root

的更通用的解决方案

function rootNth(val, k=2n) {
    let o=0; // old approx value
    let x = val;
    let limit = 100;
    
    while(x**k!=k && x!=o && --limit) {
      o=x;
      x = ((k-1n)*x + val/x**(k-1n))/k;
    }
    
    return x;
}

let v = 1000000n;
console.log(`root^3 form ${v.toString()} = ${rootNth(v,3n).toString()}` );

答案 1 :(得分:1)

从这里:https://golb.hplar.ch/2018/09/javascript-bigint.html

function sqrt(value) {
    if (value < 0n) {
        throw 'square root of negative numbers is not supported'
    }

    if (value < 2n) {
        return value;
    }

    function newtonIteration(n, x0) {
        const x1 = ((n / x0) + x0) >> 1n;
        if (x0 === x1 || x0 === (x1 - 1n)) {
            return x0;
        }
        return newtonIteration(n, x1);
    }

    return newtonIteration(value, 1n);
}

sqrt(BigInt(9))

答案 2 :(得分:1)

有一个npm库bigint-isqrt,似乎工作正常。如果没有整数根,则返回底值。

const sqrt = require('bigint-isqrt');
> sqrt(1023n);
31n
> sqrt(1024n);
32n

尽管对于我来说仍然是一个谜,在实现中像value < 16n1n << 52n这样的魔术数字如何帮助找到平方根。从PR来看,这是一种近似启发式算法,我想知道它是否比其他答案中的算法更有效...