>
2.2. Піднесення до степеня. Розглянемо задачу обчислення функції у довільному кільці. Безхитрісна
прямолінійна програма для цієї функції має складність d — 1:
У подальших розділах неодноразово виникатиме задача
Піднесення до степеня за модулем
Задано: .
Обчислити: .
Завжди можна вважати, що
d < п. Інакше можна скористатися теоремою Ойлера, щоб понизити показник.
Якщо ми використаємо для розв'язання цієї задачі наведену вище прямолінійну
програму (з множенням в кільці ), то отримаємо експоненційний алгоритм.
Справді, коли d не набагато менше, ніж п , то довжина входу має
порядок
, а кількість
операцій множення має порядок п .
На щастя, є значно ощадніший алгоритм, який був відомий ще до нашої ери
в Індії. Ми називатимемо його бінарним методом. Опишемо цей метод у
вигляді прямолінійної програми для обчислення функції .
Подамо показник у
двійковій системі числення:
, де
і
. Для спрощення запису дозволимо одній команді програми виконувати до
двох множень і покладемо
. Тоді
-та команда задається так:
Всього
команд .
Результатом виконання останньої є
Всього витрачається множень (множення першої команди
не є необхідним — вона включена для однорідності). Наведену прямолінійну програму
можна легко конвертувати в алгоритм у сенсі пункту 1.2, чи в програму на
будь-якій мові програмування, що розв'язує задачу піднесення до степеня за
модулем
.