Функция modPow может быть эффективно оценена с помощью алгоритма "квадрат и умножение". В Java это выглядело бы так (если бы у Java BigInteger его еще не было):
/* Compute x^n mod m. */
static BigInteger modPow(BigInteger x, BigInteger n, BigInteger m)
{
if (n.signum() < 0)
throw new IllegalArgumentException("bwah, negative exponent");
BigInteger r = BigInteger.ONE;
for (int i = n.bitLength() - 1; i >= 0; i --) {
if (n.testBit(i))
r = r.multiply(x).mod(m);
if (i > 0)
r = r.multiply(r).mod(m);
}
return r;
}
При этом число итераций цикла равно длине, в битах, показателя степени, так что вычислительное время является приемлемым.
Вы по-прежнему получаете одно или два модульных сокращения за итерацию, так что это не будет самый быстрый алгоритм возведения в степень за все время (модульные сокращения значительно дороже, чем умножение). Типичные реализации modPow () используют сокращение Монтгомери, которое является умным приемом, который объединяет все модульное сокращение в одну аналогичную операцию в конце.
Если у вас есть время, реализация собственного модульного возведения в степень была бы очень педагогической; Вы начнете с прочтения главы 14 «Руководства по прикладной криптографии», которую можно бесплатно загрузить с с этого сайта . Однако в этом суровом мире, где мирские соображения бюджета часто ограничивают креативность и свободное время, вы, вероятно, были бы довольны уже внедренной библиотекой. GMP, как известно, довольно хорош, но несколько сложен в использовании в Windows. Возможно, вам повезет больше с NTL .