Ввод: целое число n > 2.
Вывод: целая часть квадратного корня из n.
Шаг 1. Начинаем с присвоений: X = n и У = [(n + 1)/2] и переходим к шагу 2.
Шаг 2. Если X = У, то останавливаемся и выписываем Х; в противном случае переходим к шагу 3.
Шаг 3. Заменяем значение X на текущее значение У, а переменной Y присваиваем значение [(X2 + n) / 2Х] и возвращаемся к шагу 2.
Модульное возведение в степень AB mod n
Предположим, что даны три натуральных числа а, е и n. Опишем алгоритм определения вычета степени ае по модулю n. Для более эффективной работы алгоритма полезно представить показатель е в двоичной системе счисления:
где коэффициенты могут принимать значения 0 или 1. Таким образом,
Заметим, что может быть равно 1 (если bо = 0) или а (если bо = 1). Обозначив через P1, получаем
Теперь положим . Тогда
Продолжая начатую процедуру, мы определяем последовательность целых чисел где . Конечно, поскольку мы делаем вычисления с элементами из Zn, нам надлежит находить вычет всех произведений по модулю n на каждом шаге алгоритма.
|
|
Обратите внимание на то, что на каждом этапе мы либо возводим в квадрат число, либо вычисляем произведение Более того, если на каком-то шаге нам попалось нулевое значение bi, нам совершенно не нужно вычислять .
На практике представление показателя е в двоичной системе счисления происходит одновременно с вычислением степени. Так, например, если е нечетно, то bо = 1, в противном случае, bо = 0. Аналогично, основываясь на четности или нечетности числа
можно определить значение b1. Заметьте, что выписанная сумма равна одному из следующих отношений: е / 2, если е — четно, и (е - 1) / 2, если оно нечетно. Формализованный алгоритм выглядит следующим образом: