Я передаю функцию modExp из int в BigInteger, но результат другой, чем отличаются эти две функции?
Спасибо!!!
Функция с BigInteger, результат всегда 1:
public static BigInteger modExp(BigInteger a, BigInteger b, BigInteger n) {
BigInteger two = new BigInteger("2");
if (b == BigInteger.ZERO)
return BigInteger.ONE;
BigInteger t = modExp (a, b.divide(two), n);
BigInteger c = (t.pow(2)).mod(n);
if (b.mod(two) == BigInteger.ONE)
c = (c.multiply(a)).mod(n);
return c;
}
Функция с int:
public static int modexp(int a, int b, int n) {
if (b == 0) return 1;
long t = modexp(a, b/2, n); // use long for intermediate computations to eliminate overflow
long c = (t * t) % n;
if (b % 2 == 1)
c = (c * a) % n;
return (int) c;
}
Функция предназначена для вычисления a^b mod p
, например:
a=4 b=6 p=11 result1 = 1 result2 = 4
a=9 b=2 p=11 result1 = 1 result2 = 4
a=5 b=6 p=23 result1 = 1 result2 = 8 ...
compareTo
вместо==
. - person Bubletan   schedule 21.08.2015b.compareTo(BigInteger.ZERO) == 0
, но результат тот же, поэтому я использую==
, чтобы упростить - person Stephen   schedule 21.08.2015.shiftRight(1)
(но не забывайте об отрицательных числах), и проверка нуля может быть выполнена с помощью.signum() == 0
. - person Joop Eggen   schedule 21.08.2015==1
, когда я его меняю, это правильно. Спасибо - person Stephen   schedule 21.08.2015==
определенно неверно, это равенство объектов. Иногда это срабатывает при сравнении таких констант, как ZERO. - person Joop Eggen   schedule 21.08.2015