JavaScript 中大数的除法和求余

Sea*_*ano 5 javascript math

我正在尝试获取一个大数的余数,例如:

1551690021432628813 % 64

但我发现对于 JavaScript 来说这几个数字太长了。即它四舍五入为零。

除了使用BigInteger.js这样的 26kb 库之外,还有其他方法可以解决这个问题吗?

Joh*_*man 3

您可以将数字分成 10 位数字的块(从右侧开始),并对这些块进行模算术,最后合并结果:

1551690021432628813 = 155169002 * 10**10 + 1432628813
Run Code Online (Sandbox Code Playgroud)

因此

1551690021432628813 % 64 = (155169002 % 64 * (10**10) % 64  + 1432628813 % 64) % 64
Run Code Online (Sandbox Code Playgroud)

(等于13)。

您可以编写一个递归函数来实现这个想法。以下是用 Python 编写的(我更流利),但应该很容易翻译成 JavaScript:

def remainder(s,m):
    #computes int(s) % m, while just using small numbers
    #s is a string and m is an integer

    n = len(s)
    if n <= 10:
        return int(s) % m
    else:
        first = s[:n-10] #first n-10 digits in s
        second = s[-10:] #last 10 digits
        return (remainder(first,m) * ((10**10) % m) + int(second) % m) % m
Run Code Online (Sandbox Code Playgroud)

对于模数为 的特殊情况64,有一个非常简单的方法:64 divides 10**6所以,绝对总是

n % 64 == (last 6 digits of n) % 64
Run Code Online (Sandbox Code Playgroud)

例如,

1551690021432628813 % 64 = 628813 % 64 = 13
Run Code Online (Sandbox Code Playgroud)

只要模数是 2 的幂,类似的说法就成立。