- •Глава 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.4.2. Модулярная арифметика
При выполнении арифметических действий можно оперировать не с самими числами, а с наборами их остатков по выбранной совокупности взаимно простых делителей. Теоретическим основанием этого является китайская теорема об остатках [19]:
Пусть натуральные числа попарно взаимно просты. Тогда:
1. Для любых целых чисел таких, что, найдётся число, которое при делении надаёт остаток.
2. Если числа иобладают указанным свойством, то.
Геометрически теорема означает, что откладывая на числовой оси от начальной точки последовательно раз отрезок длиной, можно придти при всехк одной и той же точкечисловой оси. Из теоремы следует также, что в диапазоне, где, каждое натуральное числооднозначно определяется остатками по взаимно простым модулям . С другой стороны, если известен только набор остатков , но нет сведений о реальной величине числа , восстановление числавозможно только с точностью до кратного числа:иимеют одинаковый набор остатков.
Напомним некоторые свойства сравнений:
1. .
2. , где.
3. Пусть и. Тогда.
4. Сравнения можно почленно складывать:
.
5. .
6. Сравнения можно почленно перемножать:
.
7. Обе части сравнения можно возводить в степень:
.
8. Обе части сравнения можно умножить на одно и то же число: .
9. Обе части сравнения можно сокращать на одно и то же число, взаимное простое с модулем:
Если и ,то .
10. Если , то , то есть, обе части сравнениявместе с модулем можно разделить на одно и то же число.
11. Пусть ― наименьшее общее кратное чисел . Если
то , то есть, если сравнение имеет место по нескольким модулям, то оно имеет место по модулю их НОК.
12. Пусть и. Тогда, то есть, если сравнение имеет место по модулю, то оно имеет место по модулю любого его делителя .
13. Если ,и, то, то есть, если одна часть сравнения и модуль делятся на, то и другая часть сравнения делится на.
Из свойств сравнений следует, что для чисел и, представленных наборами остатков и можно выполнять сложение, умножение и вычитание в виде:
;
.
Недостатком модулярной арифметики является невозможность непосредственного сравнения по величине двух чисел, представленных наборами остатков. Кроме того модулярные операции обычно сочетаются с операциями, предполагающими обычное представление (например, если необходимо выполнять деление). Модулярные операции существенно снижают затраты времени, если аппаратная реализация позволяет производить параллельно вычисления со всеми остатками.
3.4.3. Ускорение процесса умножения
При стандартном методе умножения разрядных чисел «в столбик» число выполняемых операций пропорционально, так что затрачиваемое время. Это время можно уменьшить, сокращая количество промежуточных умножений.
Пусть нужно перемножить в -ичной системе два числаи, которые имеют поразрядов:
.
Выделяя старших разрядов, можно представить их в виде:
,
где , — «более значимые половины» -ичного представления, а и— «менее значимые половины». Имеет место равенство:
, (*)
которое сводит умножение -битовых чисел к четырём умножениям-битовых и к нескольким операциям сложения и сдвига (умножение на степень основаниясводится в-ичном представлении к сдвигу цифр на соответствующее число позиций влево и дописыванию справа нулей ). Количество умножений можно уменьшить до трёх, используя дополнительные более быстрые операции сложения и вычитания. Именно,
,
где и уже вычислены. Подставляя в (*) правую часть последнего равенства вместо левой, получаем окончательную формулу для быстрого умножения:
.