gpt4 book ai didi

javascript - 为什么 bigInt 在计算时给出不同的结果。 pow() (使用 npm 大整数)?如何解密给定的数字?

转载 作者:行者123 更新时间:2023-11-30 06:20:13 31 4
gpt4 key购买 nike

我正在尝试解密我的加密号码。

函数

function decrypt(arg){
let encrypNum = bigInt(arg).pow(dNum(eNum,eValue))
let result = encrypNum%b
return result
}

在值中它看起来像这样:

加密后的值为七。

结果 = 7.pow(103)%143它应该返回 123,但它仍然返回 38。我认为这个数字太大了,所以我使用了 bigInt 方法,但它仍然返回 38。

解决方案应该是(下面不是代码,它就像伪代码,因为我不知道如何在 sof 中编写数学。抱歉,我会解决的):7.pow(103) mod 143 = 7.pow(64) * 7.pow(32) * 7.pow(4) * 7.pow(2) * 7.pow(1) mod 143

等于

113 × 16 × 113 × 49 × 7 模 143 = 123

但为什么我的 bigInt 方法不起作用,为什么它们显示不同的结果?如果第二种方法是正确的方法,如何在代码中实现它?

第一个代码:

function decrypt(arg){
let encrypNum = Math.pow(arg,dNum(eNum,eValue))
let result = encrypNum%b
return result
}

最佳答案

JavaScript % 运算符仅适用于普通的 JS 数字(即 IEEE 754 double-precision floating-point numbers ),不适用于 bigInt 对象。因此,当您尝试将 % 应用于 bigInt 时,它首先会转换为 float 。如果 bigInt 太大而不能用 double float 精确表示,它的最低位将被四舍五入,丢弃任何依赖于的计算(如 %)他们。

一般的解决方案是使用 BigInteger.js .mod() 方法而不是原生 JavaScript % 运算符。但是,对于 modular exponentiation 的具体情况,您应该使用的是 .modPow() 方法,因为它的效率要高得多(至少对于通常用于 RSA 加密的大数;也许不适用于这个玩具示例),而不是进行完整的 .pow() 计算,然后将 .mod() 应用于结果。

这是一个演示这些不同操作的堆栈片段:

console.log('bigInt(7).pow(103) =', bigInt(7).pow(103));
console.log('bigInt(7).pow(103).mod(143) =', bigInt(7).pow(103).mod(143));
console.log('bigInt(7).modPow(103, 143) =', bigInt(7).modPow(103, 143));

console.log('Number(bigInt(7).pow(103)) =', Number(bigInt(7).pow(103)));
console.log('Number(bigInt(7).pow(103)) % 143 =', Number(bigInt(7).pow(103)) % 143);
console.log('bigInt(7).pow(103) % 143 =', bigInt(7).pow(103) % 143);
<script src="https://cdn.jsdelivr.net/gh/peterolson/BigInteger.js@1.6.40/BigInteger.min.js"></script>

运行上面的代码片段应该会产生类似以下的输出(可能会有细微的格式差异,具体取决于 BigInteger.js 最终使用的后端实现):

bigInt(7).pow(103) = "1109425442801291991031214184801374366124020697224286512520326098667350170655466324580343"
bigInt(7).pow(103).mod(143) = "123"
bigInt(7).modPow(103, 143) = "123"
Number(bigInt(7).pow(103)) = 1.109425442801292e+87
Number(bigInt(7).pow(103)) % 143 = 38
bigInt(7).pow(103) % 143 = 38

附言。最近提出native JavaScript BigInt objects 使用普通的 JS 算术运算符,如 %(尽管两个操作数都必须是 BigInt,否则你会得到一个错误)。如果您的浏览器支持此功能,则以下内容也应该有效:

console.log('BigInt(7)**BigInt(103) % BigInt(143) = ' + BigInt(7)**BigInt(103) % BigInt(143) + 'n');
console.log('7n**103n % 143n = ' + 7n**103n % 143n + 'n');

在上述代码可以运行的浏览器上,两个表达式的计算结果都应为 BigInt 值 123n。 (显然,Stack Snippets 控制台还不知道如何正确显示 BigInt 对象,所以我必须手动将它们字符串化才能显示结果。)

不幸的是,原生的 BigInt 提案似乎(还)没有包含适当的模幂例程。因此,为了处理大量的模块化幂,仍然建议使用 BigInteger.js 之类的包装器(如果可用,它应该在内部自动使用 native BigInts)。

关于javascript - 为什么 bigInt 在计算时给出不同的结果。 pow() (使用 npm 大整数)?如何解密给定的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53618601/

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