Как быстро возвести в степень: бинарный алгоритм
Дано: основание , показатель , модуль . Найти: остаток и число умножений, которое на это уйдёт.
Считать сам не нужно: показатель раскладывается в двоичную запись , основание последовательно возводится в квадрат по модулю, и потом перемножаются только нужные квадраты. Ответ: , и получен он за 10 умножений вместо 92. Калькулятор сверху проходит ту же лестницу для любых , и , а ниже разбор по шагам.
Решение по шагам
Дано. , , . Найти: .
Шаг 1. Раскладываем показатель в двоичную запись. Делим 93 на 2 с остатком, пока не дойдём до нуля, и читаем остатки снизу вверх:
Единицы стоят на местах , , , и , поэтому исходная степень распадается в произведение пяти множителей:
Шаг 2. Строим таблицу последовательных квадратов. Каждая строка получается возведением предыдущей в квадрат, и остаток берётся сразу же, поэтому числа никогда не выходят за пределы :
| Что считаем | Результат | Остаток по модулю 101 | |
|---|---|---|---|
| 0 | 7 | 7 | |
| 1 | 49 | 49 | |
| 2 | 2401 | 78 | |
| 3 | 6084 | 24 | |
| 4 | 576 | 71 | |
| 5 | 5041 | 92 | |
| 6 | 8464 | 81 |
Шести умножений хватило, чтобы получить , хотя в самом числе больше полусотни цифр.
Шаг 3. Перемножаем отмеченные строки. Нужны , то есть остатки 7, 78, 24, 71 и 81. Умножаем по очереди и после каждого умножения сразу приводим по модулю:
Шаг 4. Считаем цену вычисления. Шесть возведений в квадрат в таблице плюс четыре умножения при сборке дают десять операций. Наивное перемножение семёрки на себя потребовало бы 92 умножения, то есть в 9,2 раза больше, а для показателя в тысячу разрыв стал бы стократным.
Ответ: , вычислено за 10 умножений вместо 92.
Формула: почему показатель можно удваивать
Весь алгоритм держится на двух тождествах, которые разбирают показатель по чётности:
Чётный показатель стоит ровно одного возведения в квадрат, нечётный обходится в квадрат плюс одно домножение на основание. За один шаг показатель уменьшается вдвое, поэтому шагов будет столько, сколько цифр в двоичной записи , а не столько, сколько единиц в самом .
Второе, что делает счёт возможным, - свойство сравнений: остаток произведения зависит только от остатков сомножителей,
Отсюда правило, которое экономит не время, а разрядность: приводить по модулю нужно после каждого умножения, а не в конце. Тогда любое промежуточное произведение меньше и помещается в обычный целый тип, тогда как честный занимает 79 десятичных цифр.
Общее число умножений считается по двоичной записи точно:
где - количество единиц. Для получаем , что и вышло в разборе. В худшем случае, когда все биты единичные, оценка равна , в лучшем (степень двойки) - просто . Обе оценки логарифмические: показателю в миллион нужно около тридцати умножений.
Второй способ: лестница слева направо
Таблицу квадратов можно не хранить. Заведём один остаток и пройдём двоичную запись показателя от старшего бита к младшему: на каждом бите возводим в квадрат, а если бит равен единице, дополнительно умножаем на основание. Показатель при этом собирается по схеме Горнера: удваивается и иногда получает плюс единицу.
| Бит показателя | 1 | 0 | 1 | 1 | 1 | 0 | 1 |
|---|---|---|---|---|---|---|---|
| Накопленный показатель | 1 | 2 | 5 | 11 | 23 | 46 | 93 |
| Остаток по модулю 101 | 7 | 49 | 41 | 51 | 27 | 22 | 55 |
Последний столбец совпал с ответом первого способа, и число умножений то же самое: шесть квадрирований и четыре домножения. Разница только в памяти: способ справа налево держит таблицу из значений, способ слева направо - одно число. Именно поэтому в библиотеках длинной арифметики реализован обычно второй вариант, а на бумаге удобнее первый: таблица квадратов наглядна и её легко проверить.
График в калькуляторе сверху показывает как раз эту лестницу: столбик - остаток после очередного бита, линия - сколько умножений уже сделано. Переключатель разворачивает второй вид, где видно расхождение наивного и бинарного счёта при росте показателя.
Проверка ответа малой теоремой Ферма
Модуль 101 простой, а основание 7 на него не делится, поэтому работает малая теорема Ферма: . Показателю 93 не хватает до сотни ровно семёрки, значит , и найденный остаток обязан быть обратным к .
Считаем правую часть отдельно: . Проверяем произведение: . Сошлось, ответ верен.
Та же теорема даёт полезный приём для огромных показателей: если , показатель заранее сокращается по модулю , а для простого - по модулю . Например, сводится к , потому что , и бинарный алгоритм после такого сокращения работает с показателем из пяти бит вместо одиннадцати. Проверять взаимную простоту обязательно: при сокращение показателя неверно.
Где это считают: большие модули и степени матриц
Возведение в степень по модулю - рабочая операция асимметричной криптографии, и без бинарного алгоритма она была бы невыполнима: показатель там имеет порядок , а бинарный способ укладывается примерно в три тысячи умножений. На этой операции построены обмен ключами Диффи-Хеллмана и схема Эль-Гамаля; модульная арифметика в том же виде, только над матрицами, лежит в основе шифра Хилла.
Алгоритм не привязан к числам: он работает в любой структуре с ассоциативным умножением. Для матриц это даёт быстрое вычисление - например, при поиске распределения цепи Маркова через матрицу переходов или при вычислении -го числа Фибоначчи за логарифмическое время через степень матрицы .
Частые ошибки
- Сначала считают степень, потом берут остаток. Число имеет 79 цифр, а при криптографических размерах не поместится в память вообще. Приводить по модулю нужно после каждого умножения.
- Пропускают приведение внутри таблицы квадратов. Если возводить в квадрат уже приведённый остаток, произведение не превысит ; если тянуть полное число, разрядность удваивается на каждой строке.
- Теряют или добавляют бит. Число сомножителей в сборке равно числу единиц: для 93 их пять. Быстрая проверка - сумма выбранных степеней двойки должна дать сам показатель: .
- Перемножают показатели вместо сложения. При сборке , а не : показатели складываются, это и есть смысл двоичного разложения.
- Сокращают показатель по модулю , а не по . Правильно , потому что ; сокращение по 101 даёт другое, неверное число.
- Читают двоичную запись не с того конца. В способе справа налево младший бит соответствует , в способе слева направо разбор начинается со старшего бита. Смешение порядков даёт правдоподобный, но неверный остаток.
FAQ
Сколько умножений нужно для показателя из 2048 бит? Квадрирований будет 2047, домножений в среднем около половины от числа бит, то есть примерно 1024. Итого порядка трёх тысяч умножений вместо астрономических . Именно эта разница делает работоспособной криптографию с открытым ключом.
Чем быстрое возведение отличается от бинарного и дихотомического? Ничем: это три названия одного алгоритма. Встречаются также термины «возведение в степень методом квадрирования» и английское square and multiply.
Можно ли обойтись без таблицы квадратов? Да, для этого и нужен проход слева направо: он хранит единственный остаток и делает то же число умножений. Таблица удобна на бумаге, когда решение нужно показать целиком.
Что делать, если модуль составной? Сам алгоритм не меняется, он не требует простоты модуля. Отличается только предварительное сокращение показателя: вместо берётся , а для модуля вида расчёт часто разбивают по китайской теореме об остатках и считают две степени по меньшим модулям.
Коротко
- Разложить показатель в двоичную запись: , единицы стоят на местах .
- Построить таблицу квадратов по модулю: 7, 49, 78, 24, 71, 92, 81 - каждая строка есть квадрат предыдущей, приведённый по модулю 101.
- Перемножить строки с единичными битами, приводя по модулю после каждого умножения: .
- Ответ: за 10 умножений против 92 при перемножении в лоб; общая оценка равна .
- Проверить результат малой теоремой Ферма: .
Похожие задачи
Как найти обратное по модулю: расширенный алгоритм Евклида
Как найти обратное по модулю: разбор на числах 37 и 120, условие существования через НОД, таблица расширенного алгоритма Евклида, приведение коэффициента и проверка остатка.
Теория чисел/криптографияКак найти функцию Эйлера: разбор на числе 7560
Как найти функцию Эйлера: разбор числа 7560 по шагам, каноническое разложение, формула через произведение скобок по простым делителям, проверка мультипликативностью и теорема Эйлера.
Теория чисел/криптографияКак найти первообразный корень: критерий и пример
Как найти первообразный корень по модулю: функция Эйлера, критерий через её простые делители, проверка кандидатов 2, 3, 5 и 6 по модулю 41 и таблица индексов.
Теория чисел/криптографияКак решить систему сравнений: китайская теорема об остатках
Как решить систему сравнений x = 2 (mod 3), x = 3 (mod 5), x = 2 (mod 7): проверка взаимной простоты модулей, сборка ответа по китайской теореме об остатках и проверка подстановкой.
Теория чисел/криптографияКак решить сравнение по модулю: 42x = 30 (mod 78)
Как решить сравнение по модулю на примере 42x = 30 (mod 78): критерий разрешимости через НОД, число решений, сокращение сравнения вместе с модулем и все шесть классов вычетов.
Теория чисел/криптографияКак найти НОК двух чисел: два способа с примером
Как найти НОК двух чисел на примере 126 и 120: разложение на простые множители со старшими степенями, формула через НОД, проверка ответа и задача про шестерни с зубьями.