Java Как инвертировать BigInteger? - PullRequest
5 голосов
/ 30 ноября 2011

Мне нужно инвертировать BigInteger.

Допустим, у меня есть BigInteger x;, и мне нужно вычислить x.modPow(new BigInteger("-1"), p).

Я получаю следующую ошибку: java.lang.ArithmeticException: BigInteger not invertible.

Ответы [ 2 ]

5 голосов
/ 30 ноября 2011

Используйте BigInteger.modInverse() - он будет делать то, что вы хотите.

Если вы читаете документы для BigInteger.modInverse() (который выполняет идентичные вычисления, но более эффективно, чем ваш кодна самом деле предположительно BigInteger.modPow() вызывает modInverse() для отрицательных входов перед повышением до мощности), вы увидите:

Броски: ArithmeticException - m <= 0, или этот BigInteger не имеет мультипликативобратный мод m (то есть этот BigInteger не является относительно простым для m). </p>

Если вы получаете «BigInteger необратимый», это означает, что x и p не являются относительно простыми, поэтомунет математически определенного обратного для пары чисел x и p, заданной в качестве входных данных.

Возможности:

  • p простое, а x равно 0 или кратно p
  • p не простое число, а x и p имеют общий множитель
  • p не является положительным целым числом (0 или отрицательным), что нарушает требования modPow() и modInverse()
0 голосов
/ 30 ноября 2011

Просто поставьте return BigInteger.ZERO.Каждый раз, когда вы инвертируете число больше единицы, ваш результат будет между 0 и 1. Когда это число представляется как целое число, оно в конечном итоге становится 0 ...

...