gpt4 book ai didi

java - 循环访问 java BigInteger 中的各个位

转载 作者:行者123 更新时间:2023-12-02 07:28:58 26 4
gpt4 key购买 nike

我正在尝试为加密作业实现一些蒙哥马利数学代码;除了需要将 BigInteger 中的每个单独位与 1 进行比较的步骤之外,我已经完成了大部分工作。

我在第 4 步中一直使用的数学算法是

for i = k - 1 down to 0 do
xBar = MonPro(xBar, xBar)
if e[i] = 1 then xBar = MonPro(MBar, xBar)

i 只是一个索引,k 是 BIgInteger 中的位数,b 是指数。我的尝试是:

for(int i = n.bitLength() - 1; i > 0 ; i--) {
xBar = monPro(xBar, xBar, r, nPrime, n);
if (n.testBit(i) == true)
xBar = monPro(mBar, xBar, r, nPrime, n);
}
return monPro(xBar, BigINteger.ONE, r, nPrime, n);

monPro 是一个绝对有效的辅助函数。同样,该代码片段之前省略的步骤肯定有效。所以主要问题是,如何按位迭代 BigInteger?除非我对 e[i] 的理解是错误的,否则请参见下文。

过去一段时间我对此进行了大量阅读,但实际实现方面的资源却很少。发表的一些关于该主题的数学论文纯粹是令人费解的。

我也不确定上面的 e[i] 是不是。在书中,它是e,下面有一个小i,就像Log2一般在下面写成一个小数字2一样。谁能解释一下吗?

我尝试将 BigInteger 转换为以 2 为基数的字符串,并从中创建一个 char 数组,并对其进行与 1 的比较。我还尝试了 BigInteger.toString(2) 来创建一个以 2 为基数的字符串,并使用 charAt[i] == 1 循环遍历该字符串。

我确信 e[i] 上面的所有步骤都是正确的,因为我已经用很多不同的值检查了它们。

如果我在 E[i] 方面偏离了轨道,那么有人可以解释它的实际含义吗?如果没有,有人可以指出任何错误或轻微的方向吗?

这是一项家庭作业,因此请不要列出除代码片段之外的任何代码。

任何方向或建议将不胜感激。

最佳答案

for(int i = n.bitLength() - 1; i > 0 ; i--) { ... }

这将错过位 0(因为当 i==0 时循环终止。)
尝试使用 >= 而不是 >:

for(int i = n.bitLength() - 1; i >= 0 ; i--) { ... }

或者,如果您使用 Java 7并且您知道 n 为正数,那么您可以将其转换为 BitSet 并进行迭代通过其“1”位:

static void showBitsOf(BigInteger n) {
if (n.compareTo(BigInteger.ZERO) < 0) {
throw new IllegalArgumentException("n must not be negative");
}
BitSet bs = BitSet.valueOf(n.toByteArray());
for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
System.out.println(i);
}
}

关于java - 循环访问 java BigInteger 中的各个位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13171301/

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