【问题标题】:Assigning values to BigIntegers为 BigIntegers 赋值
【发布时间】:2014-05-12 21:52:15
【问题描述】:

假设我这样做

BigInteger n;

我可以给 n 赋值而不溢出吗?例如,

p = new BigInteger(512*512*512, 15, new Random());
n=p;

这是因为我制作了 RSA alg。有时它给了我正确的值,而有时它给了我错误的值,我想确保我不会在某个地方溢出。

如果溢出是问题,我应该,或者我应该如何初始化我的 BigInts?

【问题讨论】:

  • 你不应该做n = p,这分配了参考;
  • 嗯,这仍然不能解释为什么有时我得到正确的值,有时我得到错误的值。或者可能是这样?
  • 使用字符串而不是数字
  • @GeorgeIrimiciuc 但是要存储位长为 512 的三个数字的乘积,您只需要位长 1536,而不是 512 ^ 3。
  • 你需要 512 * 3 位,而不是 512 ^ 3,基本上,来表示三个数字的乘积,每个数字有 512 位。

标签: java biginteger bigint


【解决方案1】:

我可以给 n 赋值而不溢出吗?

BigInteger 可以表示的内容是有限制的。正如javadoc 所说:

"BigInteger 必须支持 -2Integer.MAX_VALUE(不包括)到 +2Integer.MAX_VALUE(不包括)范围内的值,并且可能支持范围之外的值那个范围。”

后来,它说:

“当结果超出支持范围时,BigInteger 构造函数和操作抛出 ArithmeticException ...”

...因此您不会出现未通知的溢出(就像使用原始整数类型一样)或类似 INF/NaN 的值(如浮点类型)。


还有一个问题是,如果堆已满/太小,创建大的BigInteger 会引发 OOME。


如果溢出是问题...

在您的示例中,BigInteger 代码中的溢出不是问题。你会看到某种异常。

此外,表达式512*512*512 不会溢出。 (但一般来说,您可能会在构造函数参数表达式中出现溢出……因为这些计算通常是使用原始整数算术完成的,它会无声地溢出。)

(迂腐...赋值n = p; 是引用赋值,不能溢出或抛出OOME。AFAIK,它不可能在Java 模型的上下文中失败。你会需要硬件错误、电源故障、堆损坏、代码生成错误等...)

【讨论】:

  • 所以...据此他的 BigInteger 不应该溢出,对吧? 512^3 就是 2^27,够小了吧?
【解决方案2】:

既然你在谈论 RSA 算法,我怀疑这是你真正想要编写的代码:

Random rand = new Random();
BigInteger p = new BigInteger(512, 15, rand);  // A random prime
BigInteger q = new BigInteger(512, 15, rand);  // Another random prime
BigInteger n = p.multiply(q);  // The product of the two primes

【讨论】:

  • 特别是,当您编写 new BigInteger(512*512*512, ...) 时,您试图创建一个 134217728 位的素数,这肯定不是您想要的。
  • 确实我试图生成私钥e。我生成它直到它gcd(e,n)=1e<n。认为这就是问题所在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-09
  • 2019-05-14
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
相关资源
最近更新 更多