Этот фрагмент кода реализует хорошо известный алгоритм «быстрого возведения в степень», также известный как Возведение в степень путем возведения в квадрат .
Также используется тот факт, что (a * b) mod p = ((a mod p) * (b mod p)) mod p. (Как сложение, так и умножение являются сохраняющимися структурами при взятии простого модуля - это гомоморфизм). Таким образом, в каждой точке алгоритма он сводится к числам, меньшим, чем p.
Хотя вы можете попытаться рассчитать их чередующимся образом в цикле, в этом нет никакой реальной выгоды. Просто рассчитайте их отдельно, умножьте их вместе и возьмите мод в последний раз.
Имейте в виду, что вы получите переполнение, если p ^ 2 больше, чем наибольшее представимое целое число, и что это приведет к неправильному ответу. Для Java переключение на большое целое число может быть разумным, или, по крайней мере, выполнить проверку во время выполнения размера p и выдать исключение.
Наконец, если это для криптографических целей, вам, вероятно, следует использовать для этого библиотеку, а не реализовывать ее самостоятельно. Очень легко сделать что-то немного неправильное, что, кажется, работает, но обеспечивает минимальную безопасность или ее отсутствие.