Внедрение алгоритма модуля быстрого мощности предлагается ограничениями наивного алгоритма, который берет модуль из десятичных десятиц большого числа. В наивном методе мы рассчитываем число, например, 5^1003%31, которое очень много потребляет наши вычислительные ресурсы. Самая неприятная вещь во всем процессе расчета - это наш процесс 5^1003.
Недостаток 1: В процессе расчета индекса позже расчетные числа не все увеличены, что занимает много наших вычислительных ресурсов (в основном время и пространство)
Недостаток 2: Числа в нашем расчете настолько велики, что наши существующие компьютеры не могут записывать такие длинные данные, поэтому мы должны подумать о более эффективном способе решения этой проблемы.
Когда мы рассчитываем AB%C, наиболее удобным способом является вызов метода POW в математической функции. Тем не менее, иногда число А к мощности В слишком велика, и даже двойной двойной двойной рецепт переполняется. В настоящее время, чтобы получить результат AB%C, мы решим использовать алгоритм модуля Fast Power, чтобы получить желаемый результат, который мы хотим просто и быстро.
Чтобы предотвратить переполнение и уменьшение сложности чисел, нам необходимо использовать следующую формулу:
abmod c = (a mod c) bmod c
Значение этой формулы: продукт берет остаток, равный продукту, занимает оставшуюся часть. Легко видеть, что эта формула является переходной, так что мы можем сделать меньше и меньше, постоянно взяв остаток, чтобы предотвратить переполнение.
Теоретически, с этой формулой мы можем написать код. Постоянно модулируя А, мы гарантируем, что результат не переполнится. Это действительно может рассчитать модуль мощности для большей мощности, но сложность этого метода по -прежнему остается O (n) и не является быстрой.
Чтобы быстрее рассчитать модуль мощности, нам также необходимо полагаться на следующую формулу:
ab mod c = (a2) b/2 mod c, b - равномерное число
ab mod c = ((a2) b/2 ・ a) mod c, b - нечетное число
Эта формула очень проста. Принцип состоит в том, чтобы постоянно заменить B на квадрат A и заменить B на исходную половину. Потому что через первую формулу мы знаем, что модуль числа обладает одинаковой силой (это предложение немного сбивает с толку, что означает Формулу -1). Тогда эффект использования результата*%c вместо a является одинаковым.
Таким образом, в соответствии с вышеуказанной формулой, мы получаем метод для расчета быстрой мощности со сложности O (LOGN):
Import java.util.scanner; открытый класс main {public static void main (String [] args) {сканер в = новый сканер (System.in); int a = in.nextint (), b = in.nextint (), c = in.nextint (); int res = 1; %= c; for (; b! = 0; b /= 2) {if (b % 2 == 1) res = (res * a) % c; a = (a * a) % c; } System.out.println (res); }}Этот алгоритм примерно такой. Первый шаг - уменьшить a%= c, чтобы предотвратить переполнение числа, когда A*A выполняется в первый раз. В цикле FO, если B - нечетное число, пусть res = res*a, а затем сначала умножьте в результат, а затем обработайте его. Чтобы предотвратить переполнение числа, результат мод C RES*A находится непосредственно. В этом для цикла, рано или поздно B будет равняться 1, введите ветвь IF и, наконец, вычислите значение RES, а MOD C выходит из петли, а затем конечный результат.
Суммировать
Выше приведено подробное объяснение этой статьи о реализации алгоритма модуля быстрого мощности языка Java. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!