Java pow BigInteger 实现

Posted

技术标签:

【中文标题】Java pow BigInteger 实现【英文标题】:Java pow BigInteger implementation 【发布时间】:2015-03-07 08:25:31 【问题描述】:

我正在研究密码学实现,部分设计包括以下内容:

( (y^a)^b / (y^c)^b ) 模 p

我有以下sn-p:

BigInteger yab = y.pow(ab.intValue());
BigInteger ycb = y.pow(cb.intValue());

BigInteger ans = (yab.divide(ycb)).mod(p);

它适用于小整数。一旦我用生成的键替换它,指数变得如此巨大,我将遇到“BigInteger out of int range”错误。 modPow函数我试过了,结果不一样。

我知道将其转换为 int 有其局限性。这是否意味着我的实现不可行?

【问题讨论】:

看看你的另一个问题,你真的应该读一读什么是模逆...... 嗨@Mysticial,我的实现的某些部分确实使用了modInverse。但我不确定它如何适用于这种情况。你能提供建议吗? @kenAu89 你肯定选错了答案:虽然 peter-lawrey 给了你想要的东西,但这并不是你真正需要计算的东西,因为没有理智的密码学家会设计一个允许任何形式的减少的公式,尤其是即使是小学生也可以锻炼的公式。您应该听从上面mysticial的建议,并接受下面artjom-b的解决方案。 @AntonSamsonov 你好,先生。感谢您的意见。现在关于在我的实现中使用模逆的一切似乎都更清楚了。 【参考方案1】:

您似乎在 组中进行模运算,其中 n 是质数(在您的情况下是 n = p)。这意味着

x / y

不是除法,而是 xy-1 的乘积(y 的模逆)。

好在BigInteger类提供了这样一个方法:

BigInteger ans = yab.multiply(ycb.modInverse(p)).mod(p);

其中yabycb 可以有效地计算而不会溢出(假设abab 的乘积):

BigInteger yab = y.modPow(ab, p);
BigInteger ycb = y.modPow(cb, p);

【讨论】:

【参考方案2】:

您可以简化代码,这也会使其更快

x^y / x^z = x^(y - z)

所以

BigInteger yab = y.pow(ab.intValue());
BigInteger ycb = y.pow(cb.intValue());

BigInteger ans = (yab.divide(ycb)).mod(p);

可以简化为

BigInteger yabc = y.pow((int) (ab.longValue() - cb.longValue()));
BigInteger ans = yabc.mod(p);

BigInteger and = y.modPow(ab.minus(cb), p);

【讨论】:

您好先生,您的解决方案有效!因为我可以使用 modpow 函数,所以它不再局限于转换为 int。非常感谢!感谢您的建议! modPow 也能正确处理负指数。

以上是关于Java pow BigInteger 实现的主要内容,如果未能解决你的问题,请参考以下文章

BigInteger实现除法取余

CoreJavaE10V1P3.9 第3章 Java的基本编程结构-3.9 大数值(Big Numbers)

Kotlin:使Java函数可调用中缀

有一个很大很大的数,用BigInteger也装不下,如何计算它的乘方?Java实现谢谢

BigInteger简析

Java大数BigInteger-用法记录