Возведение в степень возведением в степень
Эта статья может сбивать с толку или быть непонятной читателям . ( Май 2022 г. ) |
Эта статья нуждается в дополнительных цитатах для проверки . ( февраль 2018 г. ) |
В математике и компьютерном программировании возведение в степень путем возведения в степень является общим методом быстрого вычисления больших положительных целых или степеней числа , в более общем плане, элемента полугруппы , такого как многочлен или квадратная матрица . Некоторые варианты обычно называют алгоритмами квадрата и умножения или двоичным возведением в степень . Они могут иметь весьма общее применение, например, в модульной арифметике или возведении матриц в степень. Для полугрупп, для которых аддитивная запись обычно используется , например эллиптических кривых, используемых в криптографии , этот метод также называется двойным и сложенным .
Основной метод
[ редактировать ]Рекурсивная версия
[ редактировать ]Метод основан на наблюдении, что для любого целого числа , у одного есть:
Если показатель степени n равен нулю, то ответ равен 1. Если показатель степени отрицательный, мы можем повторно использовать предыдущую формулу, переписав значение, используя положительный показатель степени. То есть,
Вместе они могут быть реализованы непосредственно как следующий рекурсивный алгоритм :
In: an integer x; an integer n Out: xn exp_by_squaring(x, n) if n < 0 then return exp_by_squaring(1 / x, -n); else if n = 0 then return 1; else if n is even then return exp_by_squaring(x * x, n / 2); else if n is odd then return x * exp_by_squaring(x * x, (n - 1) / 2); end function
При каждом рекурсивном вызове младшие цифры двоичного представления числа n удаляются. Отсюда следует, что количество рекурсивных вызовов равно количество бит двоичного представления n . Таким образом, этот алгоритм вычисляет это количество квадратов и меньшее количество умножений, которое равно числу 1 в двоичном представлении n . Это логарифмическое количество операций необходимо сравнить с тривиальным алгоритмом, требующим n - 1 умножений.
Этот алгоритм не является хвостовой рекурсией . Это означает, что для этого требуется объем вспомогательной памяти, примерно пропорциональный количеству рекурсивных вызовов — или, возможно, больше, если объем данных на итерацию увеличивается.
Алгоритмы следующего раздела используют другой подход, и полученные алгоритмы требуют того же количества операций, но используют вспомогательную память, примерно такую же, как память, необходимая для хранения результата.
С постоянной вспомогательной памятью
[ редактировать ]Варианты, описанные в этом разделе, основаны на формуле
Если применить эту формулу рекурсивно, начав с y = 1 , в конечном итоге получим показатель степени, равный 0 , и тогда желаемым результатом будет левый множитель.
Это может быть реализовано как функция хвостовой рекурсии:
Function exp_by_squaring(x, n)
return exp_by_squaring2(1, x, n)
Function exp_by_squaring2(y, x, n)
if n < 0 then return exp_by_squaring2(y, 1 / x, -n);
else if n = 0 then return y;
else if n is even then return exp_by_squaring2(y, x * x, n / 2);
else if n is odd then return exp_by_squaring2(x * y, x * x, (n - 1) / 2).
Итерационная версия алгоритма также использует ограниченное вспомогательное пространство и имеет вид
Function exp_by_squaring_iterative(x, n)
if n < 0 then
x := 1 / x;
n := -n;
if n = 0 then return 1
y := 1;
while n > 1 do
if n is odd then
y := x * y;
n := n - 1;
x := x * x;
n := n / 2;
return x * y
Корректность алгоритма обусловлена тем, что является инвариантным во время вычислений; это в начале; и это в конце.
Эти алгоритмы используют точно такое же количество операций, что и алгоритм предыдущего раздела, но умножения выполняются в другом порядке.
Вычислительная сложность
[ редактировать ]Краткий анализ показывает, что такой алгоритм использует квадраты и не более умножения, где обозначает функцию пола . Точнее, количество умножений на единицу меньше, чем количество единиц, присутствующих в представлении n двоичном . Для n больше примерно 4 это в вычислительном отношении более эффективно, чем наивное многократное умножение основания само на себя.
Каждое возведение в квадрат приводит примерно к удвоению количества цифр по сравнению с предыдущим, и поэтому, если умножение двух d -значных чисел реализуется за O( d к ) операций для некоторого фиксированного k , то сложность вычисления x н дается
2 к -арный метод
[ редактировать ]Этот алгоритм вычисляет значение x н после расширения показателя по основанию 2 к . Впервые он был предложен Брауэром в 1939 году. В приведенном ниже алгоритме мы используем следующие функции f (0) = ( k , 0) и f ( m ) = ( s , u ), где m = u · 2 с с тобой странно.
Алгоритм:
- Вход
- Элемент x группы G , параметр k > 0, целое неотрицательное число n = ( n l −1 , n l −2 , ..., n 0 ) 2 к и предварительно вычисленные значения .
- Выход
- Элемент х н в G
y := 1; i := l - 1 while i ≥ 0 do (s, u) := f(ni) for j := 1 to k - s do y := y2 y := y * xu for j := 1 to s do y := y2 i := i - 1 return y
Для оптимальной эффективности k должно быть наименьшим целым числом, удовлетворяющим [1]
Метод скользящего окна
[ редактировать ]Этот метод является эффективным вариантом 2-го метода. к -арный метод. Например, чтобы вычислить показатель степени 398, который имеет двоичное представление (110 001 110) 2 , мы берем окно длиной 3, используя 2 к -арный алгоритм метода и вычислить 1, x 3 , х 6 , х 12 , х 24 , х 48 , х 49 , х 98 , х 99 , х 198 , х 199 , х 398 . Но мы также можем вычислить 1, x 3 , х 6 , х 12 , х 24 , х 48 , х 96 , х 192 , х 199 , х 398 , что экономит одно умножение и дает оценку (110 001 110) 2
Вот общий алгоритм:
Алгоритм:
- Вход
- Элемент x из G , неотрицательное целое число n =( n l −1 , n l −2 , ..., n 0 ) 2 , параметр k > 0 и предварительно вычисленные значения .
- Выход
- Элемент х н G .
Алгоритм:
y := 1; i := l - 1 while i > -1 do if ni = 0 then y := y2' i := i - 1 else s := max{i - k + 1, 0} while ns = 0 do s := s + 1[notes 1] for h := 1 to i - s + 1 do y := y2 u := (ni, ni-1, ..., ns)2 y := y * xu i := s - 1 return y
Лестничная техника Монтгомери
[ редактировать ]Многие алгоритмы возведения в степень не обеспечивают защиту от атак по побочным каналам . А именно, злоумышленник, наблюдающий за последовательностью возведения в квадрат и умножения, может (частично) восстановить показатель степени, участвующий в вычислении. Это проблема, если показатель степени должен оставаться секретным, как во многих криптосистемах с открытым ключом . Техника под названием « Монтгомери ». лестница [2] решает эту проблему.
Учитывая двоичное разложение положительного, ненулевого целого числа n = ( n k −1 ... n 0 ) 2 с n k−1 = 1, мы можем вычислить x н следующее:
x1 = x; x2 = x2 for i = k - 2 to 0 do if ni = 0 then x2 = x1 * x2; x1 = x12 else x1 = x1 * x2; x2 = x22 return x1
Алгоритм выполняет фиксированную последовательность операций ( до log n ): умножение и возведение в квадрат происходит для каждого бита экспоненты, независимо от конкретного значения бита. Аналогичный алгоритм умножения на удвоение существует.
Эта конкретная реализация лестницы Монтгомери еще не защищена от атак по времени кэширования : злоумышленник все еще может наблюдать задержки доступа к памяти, поскольку доступ к различным переменным осуществляется в зависимости от значения битов секретного показателя степени. Современные криптографические реализации используют технику «разброса», чтобы гарантировать, что процессор всегда пропускает более быстрый кэш. [3]
Экспонента с фиксированной базой
[ редактировать ]Существует несколько методов, которые можно использовать для расчета x. н когда основание фиксировано, а показатель степени меняется. Как можно видеть, предварительные вычисления играют ключевую роль в этих алгоритмах.
метод Яо
[ редактировать ]Метод Яо ортогонален методу 2 к -арный метод, в котором показатель степени разлагается по основанию b = 2 к и вычисления выполняются так же, как в алгоритме выше. Пусть n , n i , b и b i — целые числа.
Пусть показатель степени n запишется как
где для всех .
Пусть х i = х с .
Тогда алгоритм использует равенство
Учитывая элемент x из G и показатель степени n, записанный в приведенной выше форме, а также заранее вычисленные значения x б 0 ... х б ш -1 , элемент x н рассчитывается по приведенному ниже алгоритму:
y = 1, u = 1, j = h - 1 while j > 0 do for i = 0 to w - 1 do if ni = j then u = u × xbi y = y × u j = j - 1 return y
Если мы положим h = 2 к и б я = час я , то значения ni — это просто цифры n по основанию h . Метод Яо собирает в u сначала те x i , которые оказываются в высшей степени ; в следующем раунде те, у кого есть сила собираются в u также и т. д. Переменная y умножается раз с начальной буквой u , раз со следующими по величине силами и так далее. Алгоритм использует умножения и элементы должны быть сохранены для вычисления x н . [1]
Евклидов метод
[ редактировать ]Евклидов метод был впервые представлен в книге «Эффективное возведение в степень с использованием предварительных вычислений и цепочек сложения векторов» П.Д. Руиджа.
Этот метод вычисления в группе G , где n — натуральное целое число, алгоритм которого приведен ниже, рекурсивно использует следующее равенство:
где . Другими словами, евклидово деление показателя n 1 на n 0 используется для получения частного q и остатка n 1 mod n 0 .
Учитывая базовый элемент x в группе G и показатель степени записано, как в методе Яо, элемент рассчитывается с использованием предварительно вычисленные значения а затем алгоритм ниже.
Begin loop Find , such that . Find , such that . Break loop if . Let , and then let . Compute recursively , and then let . End loop; Return .
Алгоритм сначала находит наибольшее значение среди n i , а затем верхнюю границу в наборе { n i \ i ≠ M } . Затем он возводит x M в степень q , умножает это значение на x N а затем присваивает x N результат этого вычисления и n M значение n M по модулю n N. ,
Дальнейшие применения
[ редактировать ]Этот подход также работает с полугруппами , которые не имеют нулевой характеристики , например, позволяя быстро вычислять большие показатели степени по модулю числа. Особенно в криптографии полезно вычислять степени в кольце целых чисел по модулю q . Например, оценка
- 13789 722341 (мод. 2345) = 2029
потребовалось бы очень много времени и много места для хранения, если бы наивный метод вычисления 13789 722341 а затем взяли остаток от деления на 2345. Даже использование более эффективного метода займет много времени: возведите в квадрат 13789, возьмите остаток от деления на 2345, умножьте результат на 13789 и так далее.
Применение описанного выше алгоритма exp-by-square , где "*" интерпретируется как x * y = xy mod 2345 (то есть умножение, за которым следует деление с остатком), приводит только к 27 умножениям и делениям целых чисел, которые все могут быть сохранены. в одном машинном слове. Как правило, любой из этих подходов требует менее 2log 2 (722340) ≤ 40 модульных умножений.
Этот подход также можно использовать для вычисления целочисленных степеней в группе , используя любое из правил:
- Мощность( x , − n ) = Мощность( x −1 , н ) ,
- Мощность( Икс , - п ) = (Сила( Икс , п )) −1 .
Этот подход также работает в некоммутативных полугруппах и часто используется для вычисления степеней матриц .
В более общем смысле, этот подход работает с положительными целочисленными показателями в каждой магме , для которой бинарная операция является степенно-ассоциативной .
Перекодирование знаковых цифр
[ редактировать ]В некоторых вычислениях может быть более эффективно разрешить отрицательные коэффициенты и, следовательно, использовать обратную базу, при условии, что инверсия в G является «быстрой» или была предварительно вычислена. Например, при вычислении x 2 к −1 двоичный метод требует k -1 умножений и k -1 возведения в квадрат. Однако можно выполнить k возведение в квадрат, чтобы получить x 2 к а затем умножить на х −1 чтобы получить х 2 к −1 .
С этой целью мы определяем знаковое представление целого числа n в системе счисления b как
Знаковое двоичное представление соответствует конкретному выбору b = 2 и . Это обозначается . Существует несколько методов вычисления этого представления. Представление не уникально. Например, возьмем n = 478 : два различных знаково-двоичных представления задаются формулой и , где используется для обозначения −1 . Поскольку двоичный метод вычисляет умножение для каждой ненулевой записи в представлении n по основанию 2 , мы заинтересованы в поиске знаково-двоичного представления с наименьшим количеством ненулевых записей, то есть с минимальным числом Хэмминга. масса . Один из способов сделать это — вычислить представление в несмежной форме , или сокращенно NAF, которое удовлетворяет условию и обозначается . Например, представление числа 478 в NAF: . Это представление всегда имеет минимальный вес Хэмминга. Простой алгоритм вычисления представления NAF заданного целого числа. с следующее:
for i = 0 to l − 1 do return
Другой алгоритм Коямы и Цуруоки не требует условия, что ; он по-прежнему минимизирует вес Хэмминга.
Альтернативы и обобщения
[ редактировать ]Возведение в степень путем возведения в квадрат можно рассматривать как неоптимальный алгоритм возведения в степень с помощью цепочки сложения : он вычисляет показатель с помощью цепочки сложения, состоящей из повторяющихся удвоений показателя (возведения в квадрат) и/или увеличения показателя степени только на единицу (умножения на x ). В более общем смысле, если кто-то позволяет любые суммировать ранее вычисленные показатели степени (путем умножения этих степеней x ), иногда можно выполнить возведение в степень, используя меньшее количество умножений (но обычно используя больше памяти). Наименьшая степень, при которой это происходит, соответствует n = 15:
- (возведение в квадрат, 6 умножений),
- (оптимальная цепочка сложения, 5 умножается, если x 3 используется повторно).
В общем, поиск оптимальной цепочки сложения для заданного показателя степени является сложной задачей, для которой не известны эффективные алгоритмы, поэтому оптимальные цепочки обычно используются только для малых показателей степени (например, в компиляторах , где цепочки для малых степеней предварительно сведены в таблицы). ). Однако существует ряд эвристических алгоритмов, которые, хотя и не являются оптимальными, имеют меньше умножений, чем возведение в степень путем возведения в квадрат, за счет дополнительной бухгалтерской работы и использования памяти. Несмотря на это, количество умножений никогда не растет медленнее, чем Θ (log n ), поэтому эти алгоритмы асимптотически улучшаются при возведении в степень за счет возведения в квадрат в лучшем случае только с постоянным коэффициентом.
См. также
[ редактировать ]- Модульное возведение в степень
- Векториальная цепочка сложения
- Модульное умножение Монтгомери
- Несмежная форма
- Дополнительная цепочка
Примечания
[ редактировать ]- ^ В этой строке цикл находит самую длинную строку длиной меньше или равной k, оканчивающуюся ненулевым значением. Не все нечетные степени от 2 до необходимо вычислить, и необходимо учитывать только те, которые конкретно участвуют в вычислении.
Ссылки
[ редактировать ]- ^ Перейти обратно: а б Коэн, Х.; Фрей, Г., ред. (2006). Справочник по криптографии эллиптических и гиперэллиптических кривых . Дискретная математика и ее приложения. Чепмен и Холл/CRC. ISBN 9781584885184 .
- ^ Монтгомери, Питер Л. (1987). «Ускорение методов факторизации Полларда и эллиптических кривых» (PDF) . Математика. Вычислить . 48 (177): 243–264. doi : 10.1090/S0025-5718-1987-0866113-7 .
- ^ Герон, Шей (5 апреля 2012 г.). «Эффективная программная реализация модульного возведения в степень» (PDF) . Журнал криптографической инженерии . 2 (1): 31–43. дои : 10.1007/s13389-012-0031-5 . S2CID 7629541 .