【发布时间】:2021-07-13 13:01:30
【问题描述】:
我正在构建 DSA 算法。但是在将 BigInteger 数字与其他 BigInteger 数字进行排名时遇到了问题。这是我要使用的公式:
v = ((g^u1 * y^u2) mod p) mod q
这是我制作的代码:
BigInteger v = g.pow(u1.intValue()).multiply(y.pow(u2.intValue())).mod(p).mod(q);
运行脚本时报错:
Exception in thread "main" java.lang.ArithmeticException: BigInteger would overflow supported range
at java.math.BigInteger.reportOverflow(Unknown Source)
at java.math.BigInteger.pow(Unknown Source)
at DSAVerifying.main(DSAVerifying.java:38)
【问题讨论】:
-
使用
modPow,而不是先使用pow,然后再使用mod。 -
原来有 mathematical tricks 可以用来计算 a^b mod c 形式的东西,当通过蛮力计算时会产生非常大的数字,而
modPow正好使用那些技巧。 -
@luk2302 当文档与我实现的文档不同时,我很难使用 modPow
-
我建议您edit 您的问题来准确解释您是如何“遇到困难”以及“文档与我实施的文档有何不同”。
标签: java exponentiation dsa