Как быстро возвести число в степень без калькулятора
Перейти к содержимому

Как быстро возвести число в степень без калькулятора

  • автор:

Как быстро возвести число в степень без калькулятора

Представим, что оператора возведения в степень нет в нашем распоряжении, так что остаётся лишь умножать. Определение степени с целым неотрицательным показателем x n позволяет сделать вычисление с использованием n − 1 умножения. Но умножение — достаточно затратная операция (вспомним умножение в столбик). Поэтому постараемся свести к минимуму число выполняемых умножений.

К примеру, если показатель степени сам является степенью двойки, n = 2 m , то потребуется всего лишь m умножений, точнее, возведений в квадрат: x 2 m = x 2 2 2 … 2 . Это полезное наблюдение можно распространить на общий случай, воспользовавшись очевидными равенствами: x n = x 2 n 2 при чётном n , x ⁢ x 2 n − 1 2 при нечётном n . Можно отнестись к этим формулам как к рекурсивному способу вычисления степени. Конечно же эти соотношения нужно дополнить граничными условиями x 0 = 1 , x 1 = x .

Оказывается, количество умножений, которое следует выполнить для возведения в степень в соответствии с описанной рекурсивной процедурой, вычисляется по формуле μ n = ζ n + 2 ⁢ ε n − 2 , где ζ n и ε n — количества соответственно нулей и единиц в двоичной записи числа n . Эта величина растёт крайне медленно с ростом n , о чём свидетельствует таблица:

n μ n
1 0
10 4
100 8
1000 14
10000 17
100000 21
1000000 25
10000000 30
100000000 37
1000000000 41
10000000000 43

Очень маловероятно, что нам придётся возводить что-то в 10000000000 -ю степень, но, если бы пришлось, то мы обошлись бы всего сорока тремя умножениями!

Формула находится в полном согласии с рассмотренным ранее частным случаем, когда n = 2 m и ζ = m , ε = 1 . В общем же случае заметим, что цифры в двоичном разложении числа равны остаткам от многократного деления этого числа на два. Появление нулевой цифры пускает рекурсивный алгоритм по первому (чётному) пути, что добавляет одно лишнее умножение. Цифра один выбирает нечётную ветвь алгоритма, что требует двух дополнительных умножений.

Мы разберём, помимо наивной версии программы, не заслуживающей отдельного разговора из-за её тривиальности, ещё две: рекурсивную и итеративную. Оба варианта основаны на быстром методе возведения в степень.

Итеративные версии

Раньше мы обсуждали преимущества нерекурсивных алгоритмов перед рекурсивными. Было бы заманчиво реализовать быстрое возведение в степень без рекурсии, при помощи одного цикла. Эта задача оказывается не такой простой, как хотелось бы. Нам стоит вооружиться методом, который позволял бы строить циклы не в результате божественного откровения (оно посещает нас довольно редко), а целенаправленно. Метод построения цикла при помощи инварианта — как раз то, что нам сейчас нужно.

Построение цикла при помощи инварианта

Цель каждой команды в программе — приближать нас к решению поставленной задачи, то есть к ситуации, когда нужные переменные получат наконец нужные, правильно вычисленные значения. Единственная возможность достичь такой цели — менять значения переменных на новые, это делается путём присваивания. Посмотрим с этой точки зрения на команды, образующие тело цикла.

Пусть в программе задействован набор переменных X = x y … z . Назовём его состоянием программы. Цикл считается правильным, если в результате его работы выполнено нужное соотношение между переменными. Под соотношением понимается некоторое утверждение про переменные. Что значит утверждение? Рассмотрим функцию G ⁡ X , зависящую от состояния, и принимающую логическое значение. Равенство G ⁡ X = да означает, что утверждение выполняется, а в противном случае не выполняется. Функцию G будем называть целевой функцией цикла.

Тело цикла состоит из команд, присваивающих переменным X новые значения F ⁡ X : X ← F ⁡ X Таким образом строится рекуррентная последовательность состояний программы. Цель цикла достигнута, когда целевая функция примет истинное значение, так что в качестве условия цикла можно взять выражение ¬ G ⁡ X : цикл пока ¬ G ⁡ X X ← F ⁡ X конец цикла Мы предполагаем, что к моменту входа в цикл переменные X имели начальные значения X 0 .

Зачастую бывает неудобно вычислять условие завершения цикла G ⁡ X . Тогда, если повезёт, можно попытаться подобрать более сильное условие Q ⁡ X (то есть такое, что для всех X выполняется Q ⁡ X ⇒ G ⁡ X ), которое проще вычислить.

Весь этот формализм не отвечает на вопросы о том, как найти преобразование F такое, чтобы цикл рано или поздно завершился, и как построить условие окончания цикла Q ⁡ X . Метод инвариантов помогает найти и преобразование, и условие.

  • I ⁡ X 0 — инвариант принимает истинное значение в начальном состоянии;
  • I ⁡ X ⇒ I ⁡ F ⁡ X — истинность инварианта сохраняется при проходе цикла;
  • I ⁡ X ∧ Q ⁡ X ⇒ G ⁡ X — одновременная истинность инварианта и условия окончания цикла влекут истинность целевого условия.

Если перед входом в цикл позаботиться о выполнении условия I ⁡ X и подобрать преобразование F ⁡ X , при котором сохраняется истинность инварианта, а цикл когда-нибудь завершится, цель будет достигнута по завершении цикла.

Наивная версия

От абстрактных идей пора перейти к конкретным примерам. Построим алгоритм наивного вычисления степени p = x n .

Предусмотрим в программе набор переменных X = p x n . Их начальные значения (перед входом в цикл) равны X 0 = p 0 x 0 n 0 . Значения x 0 и n 0 являются входными параметрами алгоритма.

Придумаем цикл, по завершении которого переменная p получит значение x 0 n 0 , так что в качестве целевой функции примем G ⁡ p x n = p = x 0 n 0 .

Простейший (но отнюдь не самый быстрый) алгоритм сводит задачу о возведении в степень n к задаче о возведении в степень n − 1 , так что в цикле переменная n будет уменьшаться на единицу до своего обнуления. Поэтому условием окончания сделаем Q ⁡ p x n = n = 0 .

Теперь нужно подобрать инвариант. Пусть в теле цикла переменным p x n присваиваются новые значения p ′ x ′ n ′ , причём, как мы решили ранее, n ′ = n − 1 . Нетрудно проверить, что функция I ⁡ p x n = x 0 n 0 = p ⁢ x n годится на роль инварианта.

Действительно, I ⁡ p 0 x 0 n 0 = x 0 n 0 = p 0 ⁢ x 0 n 0 истинно, если положить p 0 = 1 . Второе условие, которому должен удовлетворять инвариант, также выполнено. Поскольку должно выполняться I ⁡ p x n ⇒ I ⁡ p ′ x ′ n ′ , то есть x 0 n 0 = p ⁢ x n ⇒ x 0 n 0 = p ′ ⁢ x ′ n − 1 , достаточно положить p ′ = p ⁢ x и x ′ = x , чтобы обеспечить инвариантность. Наконец, проверим третье условие, I ⁡ p x n ∧ Q ⁡ p x n ⇒ Q ⁡ p x n , то есть x 0 n 0 = p ⁢ x n ∧ n = 0 ⇒ p = x 0 n 0 . Очевидно, и оно выполняется. Проверяя условия, мы заодно нашли преобразования, происходящие в теле цикла.

Мы пришли к алгоритму p ← 1 цикл пока n ≠ 0 p n ← p ⁢ x n − 1 конец цикла

Читатель, возможно, недоумевает, зачем понадобились столь сложная подготовка для получения столь очевидного алгоритма. Возможно, быстрый вариант итеративного алгоритма более убедительно продемонстрирует мощь метода инвариантов.

Быстрая итеративная версия

Отличие быстрого алгоритма от наивного состоит в том, что в цикле переменная n вместо того, чтобы уменьшаться на единицу, уменьшается примерно вдвое. Точнее, если n чётно, оно делится пополам, а если нечётно — уменьшается на единицу и затем делится пополам. Понятно, что со временем n обратится в нуль, и это станет, как и в наивном алгоритме, условием завершения цикла.

Возьмём без изменений из наивного алгоритма инвариант I ⁡ p x n = x 0 n 0 = p ⁢ x n , и станем добиваться, чтобы выполнялось I ⁡ p x n ⇒ I ⁡ p ′ x ′ n ′ , где на этот раз n ′ = n 2 при чётном n , n − 1 2 при нечётном n . Тогда придётся обеспечить выполнение условия x 0 n 0 = p ⁢ x n ⇒ x 0 n 0 = p ′ ⁢ x ′ n 2 при чётном n , x 0 n 0 = p ′ ⁢ x ′ n − 1 2 при нечётном n , то есть p ⁢ x n = p ′ ⁢ x ′ n 2 при чётном n , p ′ ⁢ x ′ n − 1 2 при нечётном n . Чтобы это равенство выполнялось, достаточно положить p ′ = p при чётном n , p ⁢ x при нечётном n , x ′ = x 2 .

Результатом наших изысканий стал алгоритм p ← 1 цикл пока n ≠ 0 если n mod 2 = 1 p ← p ⁢ x n ← n − 1 конец если x ← x 2 n ← n 2 конец цикла

Следует признаться, что этот алгоритм мы первоначально составили, не прибегая к методу инвариантов. Программа хорошо работала, но, несмотря на её краткость, оказалась трудной для понимания. Мы никак не могли подобрать нужных слов, чтобы объяснить её читателю и доказать её правильность. И только метод инвариантов дал и объяснение, и доказательство.

Не стоит считать, что метод инвариантов делает создание любого цикла рутинной задачей. Остаётся ещё большой простор для творчества. Например, построение инварианта во многих случаях является не самым очевидным делом. Поэтому расскажем, какие соображения привели нас к инварианту I ⁡ p x n = x 0 n 0 = p ⁢ x n . В поисках инвариантного соотношения между переменными программы, сохраняющего истинность при повторениях тела цикла, мы составили таблицу значений этого набора переменных. Для примера мы выбрали возведение двойки в тринадцатую степень: p x n 1 2 13 2 4 6 2 16 3 32 256 1 8192 65536 0

Закономерность, выполняемая в каждой строке таблицы, была быстро найдена: значение выражения p ⁢ x n оказалось одним и тем же, и равным как раз 2 13 .

Оказывается, задача о быстром возведении числа в степень n тесно связана вот с какой задачей. Представим вычислительную машину, которая располагает лишь одним регистром (ячейкой памяти), способным хранить целое неотрицательное число. Набор команд этой воображаемой машины содержит только две инструкции: D удваивает содержимое регистра (от слова Double — удвоить) и I увеличивает регистр на единицу ( Increment — увеличить). Изначально регистр содержит ноль. Требуется найти наиболее короткую программу для машины, после выполнения которой в регистре окажется число n . Программа — это некоторая конечная последовательность инструкций D и I .

Для любого заданного n существует бесконечно много программ. К примеру, всегда годится программа I I I … I (всего n инструкций I ). Кроме того, приписывание любого количества инструкций D к началу правильной программы, очевидно, не меняет её правильность.

Получается своеобразная система счисления: каждому целому неотрицательному числу можно поставить в соответствие программу для его получения — слово над алфавитом из двух букв (или лучше сказать, цифр), D и I . Недостатком этой системы счисления является её многозначность: для каждого числа найдётся бесконечно много представлений. Можно попытаться устранить этот недостаток, если среди всевозможных представлений выбирать самое короткое. Но даже самое короткое представление не является единственным. Понятно, кратчайшее представление следует искать среди начинающихся с I , так как если оно начинается с D , его можно укоротить, выкинув это D . Теперь заметим, что если I I … — кратчайшее представление, то I D … — также кратчайшее представление (увеличение единицы на единицу равносильно её удвоению). При всех остальных значениях регистра удвоение даёт больший результат, чем прибавление единицы. Эту единственную оставшуюся неоднозначность устраняем, потребовав дополнительно, чтобы в представлении не было подряд двух «цифр» I . Полученное представление назовём каноническим.

Оказывается, каноническое представление можно легко получить из двоичной записи числа n : нужно каждый ноль заменить на «цифру» D , а каждую единицу — на «цифры» D I . После того, как это будет сделано, следует отбросить «цифру» D из начала полученной программы, если она там окажется. Например, для n = 13 = 1101 2 получается программа I D I D D I . И действительно, 13 = 0 + 1 ⋅ 2 + 1 ⋅ 2 ⋅ 2 + 1 .

Но какое же всё это имеет отношение к быстрому возведению в степень? Пусть имеется некоторое представление показателя степени n . Это значит, что n получается из нуля в результате последовательных увеличений на единицу или удвоений. Но прибавление единицы к показателю степени равносильно домножению всей степени на x , а удвоение показателя — возведению степени в квадрат. Если в нашем распоряжении имеется готовое представление показателя степени, получаем алгоритм p ← 1 цикл для каждой цифры δ из представления n если δ = I p ← p ⁢ x иначе p ← p 2 конец если конец цикла Беда в том, что для получения «цифр» представления прежде придётся устроить другой цикл. Совместить оба цикла будет проблематично, поскольку «цифры» нужны в порядке их записи, то есть слева направо. При этом их гораздо проще получать справа налево (точно так же, как и цифры двоичной записи числа). Наше решение, ради которого мы занялись методом инвариантов, обходит эту трудность. Тот цикл неявно получает «цифры» представления показателя степени справа налево и в зависимости от очередной цифры выполняет нужные действия: цикл пока n ≠ 0 если n mod 2 = 1 I n ← n − 1 иначе D n ← n 2 конец если конец цикла Здесь в случае I следует выполнить команду p ← p ⁢ x , а в случае D — команду x ← x 2 . Разумеется, перед циклом нужно присваивание p ← 1 . Получившийся алгоритм, как легко видеть, равносилен созданному ранее.

Основная трудность нашей задачи заключалась в создании алгоритма. Теперь, когда алгоритмы готовы, не составит никакого труда переложить их на Perl. В связи с этим мы опускаем раздел «Разработка» и сразу переходим к готовым программам.

Глава 8. Быстрое возведение в степень Готовая программа

Быстрое возведение в степень.

Для возведения числа x в степень n, как правило, используют стандартный метод, т. е. число x умножают n раз само на себя. В задачах математического толка, решаемых при помощи бумаги и ручки, такой метод вполне приемлем, ведь степенная функция быстро растет и поэтому сомнительно, что придется производить затруднительные операции вручную.

Другое дело программирование, где важно не только решить поставленную задачу, но и составить оптимальное решение, удовлетворяющее предусмотренному диапазону входных данных. Так, в частности, для операции возведения числа в степень имеется алгоритм, позволяющий значительно сократить число требуемых операций. Он достаточно прост и основывается на математических свойствах степеней.

Пусть имеется некоторая степень x n , где x – действительное число, а n – натуральное. Тогда для x n справедливо равенство:

x n = (x m ) k

При этом m*k=n. Например: 3 6 =(3 3 ) 2 , 5 7 =(5 7 ) 1 . Это свойство является одним из основных степенных свойств, и именно на нем основывается рассматриваемый метод. Далее, заметим, что в случае, если n является четным числом, то верно следующее равенство:

x n = (x n/2 ) 2 = x n/2 * x n/2

Так, если x=3, а n=6, то имеем 3 6 = (3 6/2 ) 2 = 3 6/2 * 3 6/2 . Используя это свойство, удастся существенно уменьшить число операций необходимых для возведения x в степень n. Теперь адаптируем формулу для случая с нечетным n. Для этого понадобиться просто перейти к степени на единицу меньшей. Например: 5 7 = 5 6 *5, 12 5 = 12 4 *12. Общая форма равенства перехода:

x n = x n-1 *x

В программе, реализующей алгоритм быстрого возведения в степень, используются указанные свойства: если степень n четная, то переходим к степени вдвое меньшей, иначе заменяем по имеющимся правилам нечетную степень на четную.

Код программы на C++:

#include "stdafx.h" #include using namespace std; //быстрое возведение в степень float bpow(float x, int n) < float count=1; if (!n) return 1; while (n) < if (n%2==0) < n/=2; x*=x; >else < n--; count*=x; >> return count; > //главная функция void main() < setlocale(LC_ALL,"Rus"); float x; int n; cout"; cin>>x; cout "; cin>>n; cout<>void"); >

Код программы на Pascal:

program Exponentiation; uses crt; var x: real; n: integer; function bpow(x: real; n: integer): real; var count: real; begin if n=0 then begin bpow:=1; exit; end; count:=1; while n>0 do begin if n mod 2=0 then begin n:=n div 2; x:=x*x; end else begin n:=n-1; count:=count*x; end; end; bpow:=count; end; begin write('Основание > '); read(x); write('Степень > '); read(n); write(x, '^', n, '=', bpow(x, n)); end.

Быстрое возведение чисел в квадрат без калькулятора

Сегодня мы научимся быстро без калькулятора возводить большие выражения в квадрат. Под большими я подразумеваю числа в пределах от десяти до ста. Большие выражения крайне редко встречаются в настоящих задачах, а значения меньше десяти вы и так умеете считать, потому что это обычная таблица умножения. Материал сегодняшнего урока будет полезен достаточно опытным ученикам, потому что начинающие ученики просто не оценят скорость и эффективность этого приема.

Для начала давайте разберемся вообще, о чем идет речь. Предлагаю для примера сделать возведение произвольного числового выражения, как мы обычно это делаем. Скажем, 34. Возводим его, умножив само на себя столбиком:

1156 — это и есть квадрат 34.

Проблему данного способа можно описать двумя пунктами:

1) он требует письменного оформления;

2) в процессе вычисления очень легко допустить ошибку.

Сегодня мы научимся быстрому умножению без калькулятора, устно и практически без ошибок.

Итак, приступим. Для работы нам потребуется формула квадрата суммы и разности. Давайте запишем их:

Что нам это дает? Дело в том, что любое значение в пределах от 10 до 100 представимо в виде числа $a$, которое делится на 10, и числа $b$, которое является остатком от деления на 10.

Например, 28 можно представить в следующем виде:

Аналогично представляем оставшиеся примеры:

Что дает нам такое представление? Дело в том, что при сумме или разности, мы можем применить вышеописанные выкладки. Разумеется, чтобы сократить вычисления, для каждого из элементов следует выбрать выражение с наименьшим вторым слагаемым. Например, из вариантов $20+8$ и $30-2$ следует выбрать вариант $30-2$.

Аналогично выбираем варианты и для остальных примеров:

Почему следует стремиться к уменьшению второго слагаемого при быстром умножении? Все дело в исходных выкладках квадрата суммы и разности. Дело в том, что слагаемое $2ab$ с плюсом или с минусом труднее всего считается при решении настоящих задач. И если множитель $a$, кратный 10, всегда перемножается легко, то вот с множителем $b$, который является числом в пределах от одного до десяти, у многих учеников регулярно возникают затруднения.

Можете самостоятельно попробовать рассчитать оба разложения, и вы убедитесь, что разложение с наименьшим вторым слагаемым считается проще. А мы перейдем к примерам, которые посчитаем без калькулятора:

Вот так за три минуты мы сделали умножение восьми примеров. Это меньше 25 секунд на каждое выражение. В реальности после небольшой тренировки вы будете считать еще быстрее. На подсчет любого двухзначного выражения у вас будет уходить не более пяти-шести секунд.

Но и это еще не все. Для тех, кому показанный прием кажется недостаточно быстрым и недостаточно крутым, предлагаю еще более быстрый способ умножения, который однако работает не для всех заданий, а лишь для тех, которые на единицу отличаются от кратных 10. В нашем уроке таких значений четыре: 51, 21, 81 и 39.

Казалось бы, куда уж быстрее, мы и так считаем их буквально в пару строчек. Но, на самом деле, ускориться можно, и делается это следующим образом. Записываем значение, кратное десяти, которое наиболее близкое нужному. Например, возьмем 51. Поэтому для начала возведем пятьдесят:

Значения, кратные десяти, поддаются возведению в квадрат намного проще. А теперь к исходному выражению просто добавляем пятьдесят и 51. Ответ получится тот же самый:

И так со всеми числами, отличающимися на единицу.

Если значение, которое мы ищем, больше, чем то, которое мы считаем, то к полученному квадрату мы прибавляем числа. Если же искомое число меньше, как в случае с 39, то при выполнении действия, из квадрата нужно вычесть значение. Давайте потренируемся без использования калькулятора:

Как видите, во всех случаях ответы получаются одинаковыми. Более того, данный прием применим к любым смежным значениям. Например:

При этом нам совсем не нужно вспоминать выкладки квадратов суммы и разности и использовать калькулятор. Скорость работы выше всяких похвал. Поэтому запоминайте, тренируйтесь и используйте на практике.

Ключевые моменты

С помощью этого приема вы сможете легко делать умножение любых натуральных чисел в пределах от 10 до 100. Причем все расчеты выполняются устно, без калькулятора и даже без бумаги!

Для начала запомните квадраты значений, кратных 10:

Далее — выкладки квадрата суммы или разности, в зависимости от того, к какому опорному значению ближе наше искомое выражение. Например:

Как считать еще быстрее

Но это еще не все! С помощью данных выражений моментально можно сделать возведение в квадрат чисел, «смежных» с опорными. Например, мы знаем 152 (опорное значение), а надо найти 142 (смежное число, которое на единицу меньше опорного). Давайте запишем:

Обратите внимание: никакой мистики! Квадраты чисел, отличающиеся на 1, действительно получаются из умножения самих на себя опорных чисел, если вычесть или добавить два значения:

Почему так происходит? Давайте запишем формулу квадрата суммы (и разности). Пусть $n$ — наше опорное значение. Тогда они считаются так:

— это и есть формула.

— аналогичная формула для чисел, больших на 1.

Надеюсь, данный прием сэкономит вам время на всех ответственных контрольных и экзаменах по математике. А у меня на этом все. До встречи!

Смотрите также:

  1. Решение ЕГЭ-2011: вариант 1, часть B
  2. Задача B1 — время, числа и проценты
  3. Комбинаторика в задаче B6: легкий тест
  4. Интегрирование по частям
  5. Нестандартная задача B2: студенты, гонорары и налоги
  6. Особенности решения неравенств с радикалами
  • Вход для учеников
  • ЕГЭ-2024
  • Школьникам
  • 1. Арифметика
  • Арифметика
  • Дроби
  • Модуль
  • Проценты
  • Корни
  • Степени
  • Прогрессии
  • Текстовые задачи
  • 2. Алгебра
  • Уравнения
  • Системы уравнений
  • Неравенства
  • Системы неравенств
  • Рациональные дроби
  • Функции
  • Многочлены
  • Логарифмы
  • Экспонента
  • Задачи с параметром
  • Вероятность
  • 4. Геометрия
  • Треугольники
  • Многоугольники
  • Окружность
  • Стереометрия
  • Векторы
  • 3. Математический анализ
  • Тригонометрия
  • Предел
  • Производная
  • Интегралы
  • Студентам
  • Реклама
  • Обо мне
  • © 2010—2023 ИП Бердов Павел Николаевич
    ИНН 760708479500; ОГРНИП 309760424500020
  • При использовании материалов ссылка на сайт обязательна
    Телефон: +7 (963) 963-99-33; почта: pavel@berdov.com
  • Карта сайта

Быстрое возведение в степень по модулю

Этот калькулятор можно использовать для возведения в степень целого числа по модулю. Калькулятор позволяет задать большие целые числа и в модуле, и в основании, и в показателе степени. Используется быстрый алгоритм, описанный сразу за калькулятором.

Возведение в степень по модулю

Показатель
Рассчитать
Ссылка Сохранить Виджет

Алгоритмы быстрого возведения в степень

Если применять наивный способ возведения в степень — просто перемножить p-1 раз основание, нам потребуется на единицу меньше умножений, чем показатель степени. Несмотря на всю мощь современных компьютеров, такой способ нам не подходит, так как мы собираемся использовать для показателя числа даже большие, чем стандартные 64-битные целые. Например, в простом числе Мерсена: 618970019642690137449562111, уменьшая на единицу которое мы используем как значение показателя степени по-умолчанию, насчитывается 89 двоичных разрядов (см. Сколько бит занимает число).
Чтобы оперировать подобными показателями требуются алгоритмы быстрого возведения в степень.

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

Двоичный алгоритм возведения в степень справа налево

Поэтому алгоритм обрабатывает двоичное представление показателя степени начиная с младшего бита и кончая старшим (слева направо), согласно следующему алгоритму:

a //основание степени e //показатель степени m //модуль //Вычисление степени r ⟵ 1 while (e!=0) < if (e mod 2 = 1) r ⟵ r * a mod m; e ⟵ e / 2; a = a*a mod m; >output ⟵ r

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *