
- •Глава 3. Машинная арифметика
- •3.1. Машинное представление целых чисел
- •3.2. Арифметика чисел с фиксированной точкой
- •3.3. Арифметика чисел с плавающей точкой
- •3.3.2. Сложение чисел в форме с плавающей точкой
- •3.3.3. Умножение и деление чисел в форме с плавающей точкой
- •3.3.4. Точность арифметических операций с числами в форме с плавающей точкой
- •3.4. Вычисления с многократной точностью
- •3.4.1. Вычисления с большими целыми числами
- •3.4.2. Модулярная арифметика
- •3.4.3. Ускорение процесса умножения
- •3.5. Эффективные алгоритмы вычисления степеней
- •3.5.1. Бинарный метод
- •3.5.2. Метод факторизации показателя
- •3.6. Эффективные действия с дробями
- •3.7. Алгоритм Евклида для больших чисел
- •3.8. Алгоритмы разложения на простые множители
- •3.8.1.Метод пробных делений
- •3.8.2. Метод Ферма
- •3.8.3. Метод Крайчика
3.5. Эффективные алгоритмы вычисления степеней
3.5.1. Бинарный метод
С целью сокращения
операций умножения целесообразно по
возможности часто использовать в
промежуточных вычислениях возведение
в квадрат: вместо цепочки действий при
вычислении
вида
можно провести вычисления по схеме
.
Если показатель
не является степенью двойки, помимо
возведений в квадрат приходится иногда
производить умножение на
.
Например, при вычислении
:
.
Последовательность
возведений в квадрат и умножений может
быть и другой. Например, после вычисления
можно дальше вычислять
.
Если не запоминать
отдельно результаты промежуточных
вычислений, то на каждом шаге мы имеем
только исходное число
и его очередную степень. Стандартную
последовательность действий можно
получить исходя из двоичной записи
показателя степени
следующим образом.
В двоичной записи:
;
;
;
;
;
;
;
.
;
.
Порядок возведений
в квадрат и умножений на первую степень
не зависит от старшей цифры двоичного
представления показателя, которая
всегда равна единице. Далее, при
сканировании представления слева
направо, очередной цифре
соответствует возведение уже накопленного
результата в квадрат, а очередной цифре
соответствует возведение в квадрат и
умножение на первую степень исходного
основания
.
Данное правило
соответствует представлению показателя
в виде
При возведении в
степень по заданному модулю
,
то есть при вычислении
следует каждый промежуточный результат
заменять остатком от деления на
.
Это позволяет оперировать с числами в
существенно меньшем диапазоне:
…
поскольку
,
то
….
3.5.2. Метод факторизации показателя
Пусть составной
показатель
разложен в произведение с участием
своего простого множителя
:
.
Вычисление степени может быть проведено
по схеме
.
Например,
,
где сначала вычисляется
по схеме, изложенной выше:
,
а затем по той же
схеме вычисляется .
3.6. Эффективные действия с дробями
Дробь
может быть представлена как упорядоченная
пара чисел (первое число — числитель,
второе — знаменатель). Для экономного
представления естественно потребовать
взаимную простоту
и
.
Умножение дробей, производимое по схеме
может нарушить
взаимную простоту числителя и знаменателя
для их произведения. Поэтому сначала
находятся с помощью алгоритма Евклида
наибольшие общие делители
,
так что
,
и
,
где целые числа
находятся предварительно делением «в
столбик» (с нулевым остатком). Другой
возможностью является отыскание
наибольшего общего делителя
и деление на него числителя
и знаменателя
результирующей дроби. Второй случай,
однако, приводит к действиям с бóльшими
числами
Деление дробей соответствует схеме
,
и также предполагает обеспечение взаимной простоты числителя и знаменателя результирующей дроби одним из двух способов аналогично случаю произведения дробей.
Сложение и вычитание дробей соответствует схеме
,
после чего дробь
приводится к несократимому виду после
отыскания наибольшего
общего делителя числителя и знаменателя
результирующей дроби. Можно также
предварительно найти
и выполнить сложение/вычитание дробей
с меньшими числами:
.
Пусть
и
,
так что
.
Тогда
,
где
могут оказаться существенно меньше
исходных
,
и можно показать, что дробь
несократима.