为BigIntegers分配值

时间:2014-04-01 21:43:06

标签: java biginteger bigint

假设我

BigInteger n;

我可以在没有溢出的情况下为n分配任何值吗?例如,

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

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

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

2 个答案:

答案 0 :(得分:4)

  

我可以在没有溢出的情况下为n分配任何值吗?

BigInteger可以代表什么是有限的。正如javadoc所说:

  

" BigInteger必须支持-2 Integer.MAX_VALUE (不包括)+2 Integer.MAX_VALUE (不包括)范围内的值可能支持该范围之外的值。"

后来,它说:

  当结果超出支持的范围时,

" BigInteger构造函数和操作抛出ArithmeticException ..."

...所以你不会得到未经宣布的溢出(就像使用原始整数类型一样)或类似INF / NaN的值(如浮点类型)。


还有一个问题是,如果堆已满/太小,则创建大BigInteger会抛出OOME。


  

如果溢出是问题......

在您的示例中,BigInteger代码溢出不是问题所在。你会看到某种例外情况。

此外,512*512*512表达式不会溢出。 (但一般来说,你可能会在构造函数参数表达式中出现溢出...因为这些计算通常是使用原始整数运算来完成的,它会以静默方式溢出。)

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

答案 1 :(得分: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