Редукція Барретта

Матеріал з testwiki
Перейти до навігації Перейти до пошуку

Редукція Барретта — алгоритм обчислення лишку за модулем, запропонований Барреттом 1986 року[1].
Наївний спосіб обчислення виразу c=amodn полягає в застосуванні ділення з остачею, яке в довгій арифметиці є складною операцією (зазвичай, зводиться до кількох операцій множення та віднімання). Алгоритм Барретта розроблено для оптимізації цієї операції за умов a<n2 та сталого n. У ньому ділення замінено двома множеннями, зсувом та відніманням.

Алгоритм

Попередні обчислення:

  1. Нехай nN,n3 і n — не степінь 2 (обчислення лишку за модулем, який дорівнює степені 2, у двійковій системі є тривіальним).
  2. Обрати kN таке, що 2k>n (найменше таке k дорівнює log2n).
  3. Обчислимо r=4kn (це й буде наперед обчислений множник).

Обчислення залишку за модулем:

  1. Маємо xN таке, що 0x<n2, залишок від ділення якого на n потрібно знайти.
  2. Обчислюємо t=xxr4kn.
  3. Якщо t<n, тоді повернути t; інакше — повернути (tn). Цей результат дорівнює xmodn.

Доведення правильності

  1. Оскільки n не є степенем 2, то число 4kn — не ціле. Отже, (4kn1)<r<4kn.
  2. Множення на x (x0):x(4kn1)xrx4kn.
  3. Ділення на 4k:(xnx4k)xr4kxn.
  4. Із того, що x<n2<4k випливає, що x4k<1. Тому: (xn1)<xr4kxn.
  5. Також: (xn2)<xn1 і xn1xr4k. Разом маємо: xn2<xn1xr4k.
  6. Множимо на n (n>0):x2n<xr4knx.
  7. Множимо на 1:xxr4kn<2nx.
  8. Додаємо x:0xxr4kn<2n.
  9. Очевидно, що xxxr4kn(modn), оскільки число xr4kn кратне n.

У результаті ми перейшли від x у діапазоні [0,n2) до t у діапазоні [0,2n) без зміни конгруентності за модулем n.
Останній крок простий: необхідно отримати результат у діапазоні [0,n).

Застосування

Редукція Барретта застосовується для обчислення залишку за модулем в операціях модульного множення й модульної експоненти, які широко застосовуються в системах криптографічного захисту інформації[2].

Примітки

Шаблон:Reflist

Шаблон:Алгоритми теорії чисел