Сокращение Барретта
В модульной арифметике сокращение Барретта сокращения, — это алгоритм предложенный в 1986 году П.Д. Барреттом. [1]
Наивный способ вычислений
было бы использовать быстрый алгоритм деления . Сокращение Барретта — это алгоритм, предназначенный для оптимизации этой операции, предполагая, что является постоянным, и , заменяя деление умножением.
Исторически для ценностей , один вычисленный применяя Приведение Барретта к полному произведению . Недавно было показано, что полное произведение не является необходимым, если мы можем выполнить предварительные вычисления для одного из операндов. [2] [3]
Общая идея
[ редактировать ]Мы вызываем функцию целочисленное приближение, если . Для модуля и целочисленное приближение , мы определяем как
- .
Распространенный выбор — это функции Floor , потолок и округление .
Обычно умножение Барретта начинается с указания двух целочисленных приближений. и вычисляет достаточно близкое приближение как
- ,
где — фиксированная константа, обычно степень 2, выбранная так, чтобы умножение и деление на может выполняться эффективно.
Дело был представлен П.Д. Барреттом [1] для случая напольной функции . Общий случай для можно найти в NTL . [2] Представление целочисленной аппроксимации и соответствие между умножением Монтгомери и умножением Барретта были обнаружены Ханно Беккером, Винсентом Хвангом, Матиасом Дж. Каннвишером, Бо-Инь Яном и Шан-И Яном. [3]
Сокращение Барретта одним словом
[ редактировать ]Первоначально Барретт рассматривал целочисленную версию приведенного выше алгоритма, когда значения укладываются в машинные слова. Проиллюстрируем идею для случая функции пола с помощью и .
При расчете для беззнаковых целых чисел очевидным аналогом было бы использование деления на :
func reduce(a uint) uint {
q:= a / n // Division implicitly returns the floor of the result.
return a - q * n
}
Однако деление может быть дорогостоящим и в настройках шифрования может не быть инструкцией с постоянным временем на некоторых процессорах, что подвергает операцию атаке по времени . Таким образом, сокращение Барретта приближается со значением потому что деление на это просто правый сдвиг, и поэтому он дешевый.
Чтобы рассчитать оптимальное значение данный учитывать:
Для чтобы быть целым числом, нам нужно округлить как-то. Округление до ближайшего целого числа даст наилучшее приближение, но может привести к быть больше, чем , что может привести к переполнению. Таким образом используется для беззнаковой арифметики.
Таким образом, мы можем аппроксимировать приведенную выше функцию следующим образом:
func reduce(a uint) uint {
q := (a * m) >> k // ">> k" denotes bitshift by k.
return a - q * n
}
Однако, поскольку , значение q
в этой функции может оказаться слишком маленькой и, следовательно, a
гарантированно находится только в пределах скорее, чем как обычно требуется. Условное вычитание исправит это:
func reduce(a uint) uint {
q := (a * m) >> k
a -= q * n
if a >= n {
a -= n
}
return a
}
Умножение Барретта одним словом
[ редактировать ]Предполагать известно. Это позволяет нам предварительно вычислить прежде чем мы получим . Вычисления умножения Барретта , приближается к верхней части с , и вычитает приближение. С кратно , результирующее значение является представителем .
Соответствие между умножениями Барретта и Монтгомери
[ редактировать ]Напомним, что беззнаковое умножение Монтгомери вычисляет представителя как
- .
Фактически это значение равно .
Докажем это утверждение следующим образом.
Обычно для целочисленных приближений , у нас есть
- . [3]
Диапазон умножения Барретта
[ редактировать ]Мы связали вывод с помощью .
Аналогичные оценки справедливы и для других видов функций целочисленной аппроксимации. Например, если мы выберем , функция округления в большую сторону , тогда у нас есть
Сокращение Барретта из нескольких слов
[ редактировать ]Основной мотивацией Барретта рассмотреть возможность сокращения была реализация RSA , где рассматриваемые значения почти наверняка превысят размер машинного слова. В этой ситуации Барретт предложил алгоритм, который аппроксимирует приведенную выше версию с одним словом, но для значений, состоящих из нескольких слов. Подробности см. в разделе 14.3.3 Справочника по прикладной криптографии . [4]
Алгоритм Барретта для полиномов
[ редактировать ]Также можно использовать алгоритм Барретта для деления полиномов, обращая полиномы и используя X-адическую арифметику. [5]
См. также
[ редактировать ]- Сокращение Монтгомери — еще один похожий алгоритм.
Ссылки
[ редактировать ]- ^ Jump up to: Перейти обратно: а б Барретт, П. (1986). «Реализация алгоритма шифрования с открытым ключом Ривеста Шамира и Адлемана на стандартном процессоре цифровых сигналов». Достижения криптологии – КРИПТО' 86 . Конспекты лекций по информатике. Том. 263. С. 311–323. дои : 10.1007/3-540-47721-7_24 . ISBN 978-3-540-18047-0 .
- ^ Jump up to: Перейти обратно: а б Шуп, Виктор. «Библиотека теории чисел» .
- ^ Jump up to: Перейти обратно: а б с Беккер, Ханно; Хван, Винсент; Канвишер, Маттиас Дж.; Ян, Бо-Инь; Ян, Шан-И, «Neon NTT: более быстрый дилитий, Kyber и Sabre на Cortex-A72 и Apple M1» , Транзакции по криптографическому оборудованию и встроенным системам , 2022 (1): 221–244
- ^ Менезес, Альфред; Ооршот, Пол; Ванстон, Скотт (1997). Справочник по прикладной криптографии . ISBN 0-8493-8523-7 .
- ^ «Редукция Барретта для полиномов» . www.corsix.org . Проверено 7 сентября 2022 г.
Источники
[ редактировать ]- Босселерс, А.; Говертс, Р.; Вандевалле, Дж. (1993). «Сравнение трех модульных функций приведения» . В Стинсоне, Дуглас Р. (ред.). Достижения криптологии – Крипто'93 . Конспекты лекций по информатике. Полный. 773. Спрингер. стр. 175–186. CiteSeerX 10.1.1.40.3779 . ISBN 3540483292 .
- Хазенплау, В.; Гаубац, Г.; Гопал, В. (2007). «Быстрое модульное сокращение» (PDF) . 18-й симпозиум IEEE по компьютерной арифметике (ARITH'07) . стр. 225–229. дои : 10.1109/ARITH.2007.18 . ISBN 978-0-7695-2854-0 . S2CID 14801112 .