Эта статья требует дополнительных ссылок для проверки . ( февраль 2018 г. ) ( Узнайте, как и когда удалить это сообщение-шаблон ) |
В математике и компьютерного программирования , потенцируя путем возведения в квадрат является общим методом для быстрого вычисления больших положительных целых степеней числа , или в более общем случае из элемента полугруппы , подобно полиномом или в квадратной матрицы . Некоторые варианты обычно называются алгоритмами возведения в квадрат и умножение или двоичным возведением в степень . Они могут иметь довольно общее применение, например, в модульной арифметике или в питании матриц. Для полугрупп, для которых обычно используются аддитивные обозначения , например эллиптические кривыеиспользуемый в криптографии , этот метод также называют двойным и сложением .
Основной метод [ править ]
Этот раздел может сбивать с толку или непонятно читателям . В частности, в примере описывается алгоритм, отличный от алгоритма оставшейся части раздела, поскольку биты показателя степени рассматриваются в противоположном порядке. ( Апрель 2019 г. ) ( Узнайте, как и когда удалить этот шаблон сообщения ) |
Метод основан на наблюдении, что для положительного целого n мы имеем
Этот метод использует биты экспоненты для определения вычисляемых степеней.
В этом примере показано, как выполнять вычисления с использованием этого метода. Показатель степени 13 в двоичной системе равен 1101. Биты используются в порядке слева направо. У экспоненты 4 бита, поэтому есть 4 итерации.
Во- первых, инициализировать результат 1: .
- Шаг 1) ; бит 1 = 1, поэтому вычислить ;
- Шаг 2) ; бит 2 = 1, поэтому вычислить ;
- Шаг 3) ; бит 3 = 0, поэтому мы закончили этот шаг (эквивалентно, это соответствует );
- Шаг 4) ; бит 4 = 1, поэтому вычислим .
Если мы запишем в двоичном формате as , это эквивалентно определению последовательности путем разрешения и последующего определения for , где будет равно .
Это может быть реализовано в виде следующего рекурсивного алгоритма :
Функция exp_by_squaring ( х , п ) , если п < 0 , то возвращают exp_by_squaring ( 1 / х , - п ) ; остальное , если п = 0 , то возвращает 1 ; остальное , если п = 1 , то возвращают х ; иначе , если п будет даже тогда вернуть exp_by_squaring ( х * х , п / 2 ) ; остальное , если п является нечетным , то возвращают х * exp_by_squaring ( х * х , ( п - 1 ) / 2 ) ;
Хотя этот алгоритм не является хвостовым рекурсивным , его можно переписать в хвостовой рекурсивный алгоритм, введя вспомогательную функцию:
Функция exp_by_squaring ( х , п ) возвращение exp_by_squaring2 ( 1 , х , п ) Функция exp_by_squaring2 ( у , х , п ) , если п < 0 , то возвращают exp_by_squaring2 ( у , 1 / х , - п ) ; иначе , если п = 0 , то возвращают у ; иначе если n = 1, затем вернуть x * y ; остальное , если п будет даже тогда возвращать exp_by_squaring2 ( у , х * х , п / 2 ) ; остальное , если п является нечетным , то возвращают exp_by_squaring2 ( х * у , х * х , ( п - 1 ) / 2 ) .
Вариант с хвостовой рекурсией также может быть построен с использованием пары аккумуляторов вместо вспомогательной функции, как показано в примере F # ниже. Накопители a1 и a2 можно рассматривать как хранящие значения, и где i и j инициализируются значениями 1 и 0 соответственно. В четном случае i удваивается, а в нечетном случае j увеличивается на i. Конечный результат - где .
let exp_by_squaring x n = let rec _ exp x n ' a1 a2 = if n' = 0 then 1 elif n ' = 1 then a1 * a2 elif n' % 2 = 0 then _ exp x ( n ' / 2 ) ( a1 * a1 ) a2 else _ exp x ( n ' - 1) a1 ( a1 * a2 ) _ ехр x n x 1
Итерационная версия алгоритма также использует ограниченное вспомогательное пространство и задается формулой
Функция exp_by_squaring_iterative ( x , n ), если n < 0, то x : = 1 / x ; n : = - n ; если п = 0 , то возвращают 1 у : = 1 ; в то время как п > 1 делать , если п является даже тогда х : = х * х ; n : = n / 2 ; иначе y : = x * y ; х : = х * х ; п : = ( п - 1 ) / 2 ; вернуть x * y
Вычислительная сложность [ править ]
Краткий анализ показывает, что такой алгоритм использует квадраты и не более чем умножения, где обозначает функцию пола . Точнее, количество умножений на единицу меньше количества единиц, присутствующих в двоичном разложении числа n . Для n больше примерно 4 это более эффективно с вычислительной точки зрения, чем наивное многократное умножение основания на себя.
Каждое возведение в квадрат приводит примерно к удвоению количества цифр по сравнению с предыдущим, и поэтому, если умножение двух d- значных чисел реализовано за O ( d k ) операций для некоторого фиксированного k , то сложность вычисления x n определяется выражением
2- к- арный метод [ править ]
Этот алгоритм вычисляет значение x n после раскрытия экспоненты по основанию 2 k . Впервые он был предложен Брауэром в 1939 году. В приведенном ниже алгоритме мы используем следующие функции f (0) = ( k , 0) и f ( m ) = ( s , u ), где m = u · 2 s с ты странный.
Алгоритм:
- Вход
- Элемент x группы G , параметр k > 0, неотрицательное целое число n = ( n l -1 , n l -2 , ..., n 0 ) 2 k и предварительно вычисленные значения .
- Выход
- Элемент x n в G
у: = 1; i: = l - 1, а i ≥ 0 сделать (s, u): = f (n i ) для j: = от 1 до k - s do y: = y 2 y: = y * x u для j: = 1 до s do y: = y 2 я: = я - 1вернуть y
Для оптимальной эффективности k должно быть наименьшим целым числом, удовлетворяющим [1] [ требуется пояснение ]
Метод скользящего окна [ править ]
Этот метод является эффективным вариантом 2- к- мерного метода. Например, чтобы вычислить показатель степени 398, который имеет двоичное расширение (110 001 110) 2 , мы берем окно длиной 3, используя алгоритм 2 k -арного метода, и вычисляем 1, x 3 , x 6 , x 12 , x 24 , х 48 , х 49 , х 98 , х 99 , х 198 , х 199 , х 398 . Но мы также можем вычислить 1, x 3 , x 6 , x 12 , x 24 , x 48 , x 96, x 192 , x 199 , x 398 , что экономит одно умножение и сводится к вычислению (110 001 110) 2
Вот общий алгоритм:
Алгоритм:
- Вход
- Элемент x группы G , неотрицательное целое число n = ( n l -1 , n l -2 , ..., n 0 ) 2 , параметр k > 0 и предварительно вычисленные значения .
- Выход
- Элемент х п ∈ G .
Алгоритм:
у: = 1; i: = l - 1, а i> -1 делать, если n i = 0, то y: = y 2 'i: = i - 1 иначе s: = max {i - k + 1, 0} в то время как n s = 0 do s: = s + 1 [примечания 1] для h: = 1 to i - s + 1 do y: = y 2 u: = (n i , n i-1 , ..., n s ) 2 y: = y * x u я: = s - 1вернуть y
Техника лестницы Монтгомери [ править ]
Многие алгоритмы возведения в степень не обеспечивают защиты от атак по побочным каналам . А именно, злоумышленник, наблюдающий за последовательностью квадратов и умножений, может (частично) восстановить показатель степени, участвующий в вычислении. Это проблема, если показатель степени должен оставаться в секрете, как во многих криптосистемах с открытым ключом . Метод, названный « лестницей Монтгомери » [2], решает эту проблему.
Учитывая двоичное разложение положительного ненулевого целого числа n = ( n k −1 ... n 0 ) 2 с n k − 1 = 1, мы можем вычислить x n следующим образом:
х 1 = х; x 2 = x 2 для i = k - от 2 до 0 do Если n i = 0, то x 2 = x 1 * x 2 ; х 1 = х 1 2 иначе х 1 = х 1 * х 2 ; x 2 = x 2 2 возврат x 1
Алгоритм выполняет фиксированную последовательность операций ( до log n ): умножение и возведение в квадрат происходят для каждого бита в экспоненте, независимо от конкретного значения бита. Аналогичный алгоритм умножения на удвоение существует.
Эта конкретная реализация лестницы Монтгомери еще не защищена от атак на синхронизацию кэша : злоумышленник может по-прежнему наблюдать задержки доступа к памяти, поскольку доступ к различным переменным осуществляется в зависимости от значения битов секретной экспоненты. Современные криптографические реализации используют метод «разброса», чтобы гарантировать, что процессор всегда пропускает более быстрый кэш. [3]
Показатель с фиксированной базой [ править ]
Существует несколько методов, которые можно использовать для вычисления x n, когда основание фиксировано, а показатель степени изменяется. Как видно, предварительные вычисления играют ключевую роль в этих алгоритмах.
Метод Яо [ править ]
Метод Яо ортогонален 2 k- мерному методу, в котором показатель степени раскрывается по основанию b = 2 k, а вычисления выполняются в соответствии с приведенным выше алгоритмом. Пусть n , n i , b и b i - целые числа.
Пусть показатель n записывается как
где для всех .
Пусть x i = x b i .
Тогда алгоритм использует равенство
Учитывая элемент x группы G и показатель степени n, записанный в приведенной выше форме, вместе с предварительно вычисленными значениями x b 0 ... x b w −1 , элемент x n вычисляется с использованием следующего алгоритма:
y = 1, u = 1, j = h - 1, а j> 0 сделать для i = 0 до w - 1 сделать, если n i = j, то u = u × x b i у = у × и j = j - 1вернуть y
Если мы установим h = 2 k и b i = h i , тогда значения n i будут просто цифрами n в базе h . Метод Яо собирает в u сначала те x i, которые появляются в высшей степени ; в следующем раунде те, у кого есть мощность , также собираются в u и т. д. Переменная y умножается на начальное u , умножается на следующие наибольшие степени и так далее. Алгоритм использует умножения иэлементы должны быть сохранены для вычисления x n . [1]
Евклидов метод [ править ]
Евклидов метод был впервые представлен в книге « Эффективное возведение в степень с использованием цепочек предварительного вычисления и сложения векторов » П.Д. Ройджем.
В этом методе вычислений в группе G , где n - натуральное целое число, алгоритм которого приведен ниже, рекурсивно используется следующее равенство:
где . Другими словами, евклидово деление показателя n 1 на n 0 используется для возврата частного q и остатка n 1 по модулю n 0 .
Учитывая базовый элемент x в группе G и показатель степени, записанный, как в методе Яо, элемент вычисляется с использованием предварительно вычисленных значений, а затем алгоритма ниже.
Начать цикл Find , такой что . Найдите , такое что . Прервите цикл, если . Пусть , а потом пусть . Вычислите рекурсивно , а затем позвольте . Конец петли ;Возвращение .
Алгоритм сначала находит наибольшее значение среди n i, а затем супремум в наборе { n i \ i ≠ M } . Тогда он поднимает е М к источнику д , умножает это значение с й N , а затем присваивает й г N результата этого вычисления и п М значения п М по модулю п Н .
Дальнейшие приложения [ править ]
Та же идея позволяет быстро вычислять большие показатели по модулю числа. Особенно в криптографии , это полезно для вычисления силы в кольце из целых чисел по модулю д . Его также можно использовать для вычисления целочисленных степеней в группе , используя правило
- Степень ( x , - n ) = (Мощность ( x , n )) −1 .
Метод работает во всех полугруппах и часто используется для вычисления степеней матриц .
Например, оценка
- 13789 722341 (мод. 2345) = 2029
потребовалось бы очень много времени и много места для хранения, если бы использовался простой метод: вычислите 13789 722341 , затем возьмите остаток при делении на 2345. Даже использование более эффективного метода займет много времени: возведите 13789 в квадрат, возьмите остаток при делении на 2345, умножьте результат на 13789 и так далее. Это займет меньше, чем модульное умножение.
Применение вышеуказанного алгоритма возведения в квадрат с "*", интерпретируемым как x * y = xy mod 2345 (то есть умножение с последующим делением на остаток), приводит только к 27 умножениям и делениям целых чисел, которые все могут быть сохранены одним машинным словом.
Перекодирование знаковых цифр [ править ]
В некоторых вычислениях может быть более эффективным разрешить отрицательные коэффициенты и, следовательно, использовать инверсию основания, при условии, что инверсия в G является «быстрой» или была предварительно вычислена. Например, при вычислении x 2 k -1 двоичный метод требует k -1 умножений и k -1 квадратов. Однако можно выполнить k квадратов, чтобы получить x 2 k, а затем умножить на x −1, чтобы получить x 2 k −1 .
С этой целью мы определяем представление целого числа n в системе счисления b в виде цифр со знаком как
Знаковое двоичное представление соответствует конкретному выбору b = 2 и . Обозначается он . Есть несколько методов вычисления этого представления. Представление не уникальное. Например, возьмем n = 478 : два различных знаковых двоичных представления даны как и , где используется для обозначения −1 . Поскольку двоичный метод вычисляет умножение для каждой ненулевой записи в представлении n по основанию 2 , мы заинтересованы в поиске двоичного представления со знаком с наименьшим числом ненулевых элементов, то есть с минимальным значением Хэмминга. масса . Один из способов сделать это - вычислить представление в несмежной форме , или сокращенно NAF, которая удовлетворяет и обозначается как . Например, представление NAF для 478 - это . Это представление всегда имеет минимальный вес Хэмминга. Простой алгоритм для вычисления представления NAF данного целого числа с состоит в следующем:
для я = 0 до л - 1 сделать возврат
Другой алгоритм Коямы и Цуруока не требует условия, что ; он по-прежнему минимизирует вес Хэмминга.
Альтернативы и обобщения [ править ]
Возведение в степень возведением в квадрат можно рассматривать как субоптимальный алгоритм возведения в степень цепочки сложения : он вычисляет показатель степени с помощью цепочки сложения, состоящей из повторяющихся удвоений показателя степени (возведения в квадрат) и / или увеличения показателя степени только на единицу (умножение на x ). В более общем плане, если можно суммировать любые ранее вычисленные показатели степени (путем умножения этих степеней x ), иногда можно выполнить возведение в степень, используя меньшее количество умножений (но обычно с использованием большего объема памяти). Наименьшая степень, при которой это происходит, - для n = 15:
- (возведение в квадрат, 6 умножений),
- (оптимальная цепочка сложения, 5 умножений, если повторно используется x 3 ).
В общем, поиск оптимальной цепочки сложения для заданного показателя степени является сложной задачей, для которой не известны эффективные алгоритмы, поэтому оптимальные цепочки обычно используются только для малых показателей (например, в компиляторах, где цепочки для малых степеней предварительно табулированы. ). Однако существует ряд эвристических алгоритмов, которые, хотя и не являются оптимальными, имеют меньше операций умножения, чем возведение в степень возведением в квадрат, за счет дополнительной бухгалтерской работы и использования памяти. Тем не менее, количество умножений никогда не растет медленнее, чем Θ (log n ), поэтому эти алгоритмы улучшаются асимптотически только после возведения в степень путем возведения в квадрат в лучшем случае с постоянным множителем.
См. Также [ править ]
- Модульное возведение в степень
- Векторная цепочка сложения
- Редукция Монтгомери
- Несмежная форма
- Цепочка добавления
Заметки [ править ]
- ^ В этой строке цикл находит самую длинную строку, длина которой меньше или равна k, заканчивающуюся ненулевым значением. Не все нечетные степенидвойки, которые необходимо вычислить, необходимо учитывать только те, которые конкретно участвуют в вычислении.
Ссылки [ править ]
- ^ a b Cohen, H .; Фрей, Г., ред. (2006). Справочник по криптографии на эллиптических и гиперэллиптических кривых . Дискретная математика и ее приложения. Чепмен и Холл / CRC. ISBN 9781584885184.
- ^ Монтгомери, Питер Л. (1987). «Ускорение методов факторизации Полларда и эллиптических кривых» (PDF) . Математика. Comput . 48 (177): 243–264.
- ^ Gueron, Шей (5 апреля 2012). «Эффективные программные реализации модульного возведения в степень» (PDF) . Журнал криптографической инженерии . 2 (1): 31–43. DOI : 10.1007 / s13389-012-0031-5 .