- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试解密我的加密号码。
函数
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/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
我发现了 pow(x, n) 的迭代实现,它需要 o(log n) 时间和常量空间,如下所示: double pow(double x, int n) { double left = x;
我想创建一个特征,说它实现了num_traits::pow::Pow - Rust。 我的特征当前定义为: pub trait PrimeSieveTrait: AddAssign + MulAs
对于我的项目,我应该在 java 中创建一个图形计算器(绘制图形),并以函数作为输入。我已经找到了一种正确绘制函数图的方法。但是我想不出一种方法可以让解释器理解该功能。如果我能够做到这一点,以便我可以
我发现对于大整数,math.pow() 没有成功给出它的整数版本。 (我在使用 math.pow 实现时遇到了一个错误 Karatsuba multiplication)。 例如: >>> a_Siz
问题或多或少说明了一切。 calling a host function("std::pow ") from a __device__/__global__ function("_calc_psd")
我想知道,因为当我在检查模式下运行我的代码时,似乎出现了一些差异。例如: List getFactors(int n) { List factors = [[1, n]]; doubl
pow(a/b,x) 和 pow(b/a,-x) 在精度上有区别吗?如果存在,将小于 1 的数字提升为正幂或将大于 1 的数字提升为负幂会产生更准确的结果吗? 编辑:让我们假设 x86_64 处理器和
此代码在 Windows 上的 Visual Studio 2010 上正确编译,但我在 Linux、g++ 上遇到此错误。谁能解释一下如何解决这个问题? int bits; T scale; std
Python内置的pow(x, y)(没有第三个参数)返回的结果和math.pow()返回的值有区别吗>,在两个 float 参数的情况下。 我问这个问题是因为 documentation对于 mat
这个问题在这里已经有了答案: Why was std::pow(double, int) removed from C++11? (1 个回答) 关闭 9 年前。 在 C++ 03 中,使用例如st
我可以将pow()与#include 一起使用,而无需使用using关键字或::运算符。为什么? 最佳答案 来自标准的[headers]/4。 Except as noted in Clause 20
我觉得这很有趣: System.out.println( (long)(Math.pow(2,63) - 1) == Long.MAX_VALUE); // true System.out.prin
这个打印 100: int j=2; int i= pow(10,2); printf("%d\n", i); 这个打印出 99: int j=2; int i= pow(10,j); print
这也是一个与数学相关的问题,但我想用 C++ 实现它...所以,我有一个 2^n 形式的数字,我必须计算它的数字总和(以 10 为基数;P)。我的想法是用下面的公式来计算: sum = (2^n mo
我看到这个关于 std::pow 的老问题:What is more efficient? Using pow to square or just multiply it with itself? 旧
我正在尝试比较 pow(x,2.0) 和 pow(x,2.0000001) 的性能,但我认为 2.0 会快得多,但它们的速度相同。我什至通过使用 -Xint 参数运行 jar 来删除 JIT 优化。
我的 linux 版本是 4.19.0-6-amd64 #1 SMP Debian 4.19.67-2+deb10u1 (2019-09-20) x86_64 GNU/Linux我的 gcc 版本是
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 6 年前。 Improve t
python3 中的 pow() 函数提供指数的值。 >>>pow(2,3) 8 Python3 支持负指数,即 可以使用 pow(10,-1) 表示。当我计算 pow(4,-1,5) 时,它给出了输
我是一名优秀的程序员,十分优秀!