【问题标题】:How do you raise a Java BigInteger to the power of a BigInteger without doing modular arithmetic?如何在不进行模运算的情况下将 Java BigInteger 提升到 BigInteger 的能力?
【发布时间】:2010-05-15 07:14:14
【问题描述】:

我正在做一些大整数计算,我需要将一个 BigInteger 提升到另一个 BigInteger 的幂。 .pow() 方法可以满足我的要求,但需要一个 int 值作为参数。 .modPow 方法将 BigInteger 作为参数,但我不希望得到与我尝试计算的值一致的答案。

我的 BigInteger 指数太大而无法表示为 int,有人可以提出解决此限制的方法吗?

【问题讨论】:

    标签: java biginteger


    【解决方案1】:

    您不应该尝试计算一个极大数与另一个极大数的幂。结果数字将使用大量内存。如果您计算a.pow(b),它将大约有log(a)*b 位数。如果b 太大而无法放入整数,那么即使a 的值非常小,结果也会有几十亿位。

    尝试重新考虑您要实现的目标以及如何在不执行此操作的情况下实现它。

    【讨论】:

    • 这不是答案。这是一项不做被要求的事情的提议,也是该提议的理由。
    【解决方案2】:

    实际的解决方案是将指数从 BigInteger 转换为 int。

    如果您因为指数太大而无法执行此操作,则您的算法无法实现。结果数字几乎肯定会太大而无法表示为 BigInteger。 (BigInteger 使用字节数组来表示数字,Java 数组的最大大小是 2**31 - 1 元素,无论堆有多大。)即使您实现了一个表示数字的“BiggerInteger”类,您很快就会突破机器物理内存大小的限制。 (计算N.pow(M) 所花费的时间将是...... NP 棘手...... O((MlogN)^M) 我认为)。

    当然,如果您取的幂是01-1,那么结果很容易适合BigInteger。但在这些情况下,有更好的方法来计算功率:-)。

    【讨论】:

      【解决方案3】:

      您找不到“Java BigInteger to-the-power BigInteger”的值,因为根据 JavaDoc“BigInteger 必须支持 -2^Integer.MAX_VALUE(不包括)到 +2^Integer.MAX_VALUE 范围内的值(独占)并且可能支持超出该范围的值。”

      因此,Java BigInteger 不支持大于 2^Integer.MAX_VALUE 的任何内容。这就是为什么 pow 方法不接受任何高于 int 的参数的原因。

      希望这个答案有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多