Отрицательные показатели с использованием класса BigInteger - PullRequest
0 голосов
/ 01 декабря 2018

Я делаю некоторые математические операции, используя класс Java BigInteger, но получаю сообщение об ошибке, когда пытаюсь использовать отрицательное число в качестве показателя степени.Правильно ли я думаю, что вы можете переставить:

b · φ(N)^−1 mod N

как:

      b
------------
φ(N)^1 mod N

Если нет, то как я могу переставить выражение, чтобы не получить ошибку отрицательного показателя в моем Java-коде

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Арифметический мод N должен выполняться с измененными правилами.В частности, инверсии должны быть рассчитаны очень по-разному.Основная аксиома обратного верна:

x * x -1 = 1 мод N.

, но вы не можете вычислить x -1 mod N путем вычисления 1 / x в виде числа с плавающей запятой или десятичного значения.Вместо этого вы должны использовать алгоритм специально для этой цели.Обычно используется вариант расширенного евклидового алгоритма .

Для удобства класс Java BigInteger уже содержит этот алгоритм для вас: modInverse(),Таким образом, ваш расчет должен выглядеть примерно так:

BigInteger phi = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE));
BigInteger phiInverse = phi.modInverse(N);
BigInteger result = b.multiply(phiInverse).mod(N);
0 голосов
/ 01 декабря 2018

BigInteger не может иметь отрицательных показателей, потому что это делало бы его дробью (1 на что-то), а не целым числом.

Попробуйте вместо этого использовать BigDecimal.

Что касается перестановки выражения, оно должно быть переставлено следующим образом:

      b
------------  mod N
   φ(N)^1
...