Сайт о программировании, математике и моделировании
Длинные числа. Вычисление обратного по модулю
При проверке ЭЦП необходимо вычислить величину v = (h(M1))q-2 (mod q). Это можно сделать, по крайней мере, двумя способами:
возведением в степень и вычислением обратного с помощью расширенного алгоритма Евклида. Действительно, в теории чисел известна малая теорема Ферма, которая утверждает, что если р — простое число, а — целое число, не делящееся на р, то ар-1 ≡ 1 (mod p).
Отсюда следует, что
ар-2 ≡ a-1 (mod p).
При этом а-1 есть такое целое число, что aЧa-1 ≡ 1(mod p). Это число называется мультипликативным обратным а по модулю р.
С другой стороны, поскольку а и р взаимно простые, то существуют такие целые числа х и у, что ах+ру = 1. Если перейти к сравнениям mod p, то мы получим ах ≡ 1 (mod p).
Откуда
х ≡ a-1 (mod p)
и значит
х ≡ ар-2 (mod p).
Для нахождения таких чисел х и у можно использовать так называемый расширенный алгоритм Евклида.
Алгоритм 1.19. Расширенный алгоритм Евклида, вычисления d = НОД(а,b) и х и у, что ax + by = d
1. если b = 0, то d := а; х := 1; у := 0;
2. х2 := 1; х, := 0; у2 := 0; у1 := 1; а1:=а; b1:=b;
3. пока b > 0 выполнить 4-5;
4. q := |a1/b1|; r := а1 — qb1; х := х2 – qx1; у := у2 – qy1;
5. a1:= b,; b1:= г; х2 := x1; x1 := х; у2 := y1; y1 := у;
6. d:= a1;x:=x2;y :=у2;
7. конец.
Программную реализацию функции вычисления мультипликативного обратного с использованием расширенного алгоритма Евклида оставим в качестве упражнения. Скажем только, что с его помощью можно достичь довольно немалого ускорения. Остался небольшой «грешок» при реализации операции Монтгомери. Была обещана функция, вычисляющая параметр z = -Р0-1 (mod b). Малая теорема Ферма нам не подходит, поскольку модуль в данном случае не простой (напомним, b = 2m). Но можно воспользоваться ее обобщением, теоремой Эйлера:
если а и с — взаимно простые целые числа, то
аф(с) = 1 (mod с).
(ф — функция Эйлера).
Таким образом, аф(с)-1 = a-1 (mod с).
В данном случае модулем является число b =2m. Поэтому ф(b) = 2m-1 и ф(b)-1 = 2m-1-1 — число, двоичная запись которого состоит из m-1 единичного разряда: 11…112. Воспользуемся бинарным алгоритмом для вычисления значения a-1 mod b. Заметим при этом, что a-1 mod b существует только при а взаимно простом с числом и, т.е. при нечетном а.
Алгоритм 1.20. Алгоритм вычисления z = -a-1 (mod 2m)
1. если а четно, то z=0; конец;
2. d := a;
3. повторить m-2 раза шаги 4-5;
4. d := d2 (mod 2m):
5. d := d Ч a (mod 2m);
6. конец.
Здесь предполагаем, что m — длина машинного слова и приведение к модулю 2m выполняется при умножении автоматически. Если это не так, необходимо выполнить эту редукцию перед возвратом результата.
Print article | This entry was posted by root on 03.12.2010 at 8:04 пп, and is filed under Информатика и программирование, Математика. Follow any responses to this post through RSS 2.0. Вы можете оставить комментарий или трэкбэк с вашего сайта. |