Практическое занятие №2 (ТСО).
Цель занятия :Ознакомиться с простейшими арифметическими алгоритмами и методами оценки их сложности.
Для удобства
мы будем полагать, что мы оперируем с целыми числами, выраженными в двоичной
системе счисления. У нас есть два
- разрядных числа
и
, то
можно записать
![]()
где
- ²
наиболее значимая половина ² числа
, а
- ² наименее значимая половина ²;
подобным же образом
,
.
Например: Представим в подобной форме число
.
Теперь мы
имеем
.
Эта формула
сводит задачу умножения
разрядных чисел к трем
операциям умножения
разрядных чисел:
. Плюс некоторые прстые
операции сдвига и сложения. Эту формулу можно использовать для умножения с
двойной точностью, когда результат нужно получить с четверной точностью.При
помощи этой формулы можно определить некоторый рекурсивный процесс для
умножения, значительно более быстрый, чем уже знакомый нам метод, когда
- велико и имеющий время выполднения порядка
.
Если
- время, необходимое для выполнения
умножения
- разрядных чисел, то мы имеем
для некоторой константы
, поскольку в правой части соотношения
требуется выполнить только три операции умножения плюс некоторые операции
сложения и сдвига. Из последнего соотношения по индукции вытекает, что
,
если выбрать
- достаточно большим, с тем , чтобы это
неравенство выполнялось при
, получим
![]()
То есть
время, затрачиваемое на умножение, можно сократить с величины порядка
до величины порядка
, и, конечно, при большом ![]()
этот алгоритм гораздо быстрее.
Похожий, но более сложный метод выполнения умножения с временем порядка
был впервые предложен А.
Карацубой.
Время выполнения можно сократить еще больше, если заметить,
что только что расмотренный метод является частным случаем (при
) более общего метода, который дает
для любого фиксированного
. Этот
более общий метод можно получить следующим образом. Разобьем
и 
на
частей:
где каждое
и каждое
являются
разрядными
числами. Рассмотрим многочлены
, ![]()
и положим
.
Так как
и
, то мы имеем
, и
поэтому, если знать коэффициенты
, можно легко вычислить
. Задача состоит в том, чтобы найти хороший
способ вычисления коэффициентов
, выполняя лишь
операций умножения
-
разрядных чисел плюс некоторые дополнительные операции, для которых время
выполнения пропорционально
.
Этого можно достичь вычисляя
.
Коэффициенты всякого многочлена степени
можно записать в виде линейной комбинации
значений этого многочлена в
различных точках.
Время, необходимое для взятия такой комбинации, самое большее пропорционально
.В действительности произведения
являются, сторого говоря, не
произведениями
- разрядных чисел, а
произведениями чисел, разряд которых не превышает
, где
- фиксированная величина, зависящая от
. Легко составить программу умножения для
- разрядных чисел, которая требует
выполнения лишь
операций, так как при
фиксированном
два произведения
- разрядных чисел на
- разрядные можно получить за
операций.Можно показать, что для этого
метода
.
Теорема.
Для любого
существует такая
постоянная
и такой алгоритм умножения, что число
элементарных операций
, которые необходимо выполнить,
чтобы умножить два
-разрядных числа, удовлетворяет
оценке
.
Эта теорема еще не самый лучший результат. Для практических
целей большой недостаток, что метод резко усложняется при
т.е.
. Эта
теорема неудовлетворительна и с теоретической точки зрения, так как в ней не в
полной мере используется лежащий в ее основе метод многочленов.
Прежде чем рассмотреть алгоритм Тоома-Кука, разберем один пример. На этом примере нельзя увидеть эффективность метода, поскольку мы имеем дело с небольшими числами. Но можно увидеть некоторые полезные упрощения, которые применимы в общем случае.
Пример.
Предположим, нам нужно умножить
на
. В двоичной системе счисления
на
. Пусть
. Многочлены
,
.
Отсюда находим
:
(4.1)
Теперь, используя пять последних величин, найдем пять
коэффициентов многочлена
.
Для нахождения коэффициентов многочлена
при заданных значениях
можно воспользоваться одним интересным
небольшим алгоритмом. Сначала запишем
, где ![]()
и где
неизвестны,
равно как и
. Теперь
, и по индукции находим, что для
всех ![]()

Обозначая левую часть выражения через
мы видим, что

и
.
Таким образом, коэффициенты
можно
вычислить с помощью очень простого метода, который можно продемонстрировать для
многочлена
, определенного соотношениями (4.1):

Крайняя колонка состоит из заданных значений
;чтобы
получить
-ю колонку, нужно вычислить разности между
соседними величинами предыдущей колонки и разделить их на
. Коеффициенты
располагаются
в колонках сверху; так,
, поэтому мы имеем
В общем виде можно записать
эта формула показывает, каким
образом из коэфициентов
можно получить
коэффициенты
:

Последовательно получаются коэффициенты многочленов
и т.д.
Согласно последней таблице мы имеем ![]()
Итак, ответом к нашей исходнй задаче будет
где
получается
в результате действий сложения и сдвига. Кроме того, если коэффициенты
многочлена
- неотрицательны, то таковыми будут и
числа
, а тогда все промежуточные результаты,
получаемые в процессе проведения вычисления, являются неотрицательными.
На этой идее основан алгоритм Тоома-Кука. Этот алгоритм позволяет существенно улучшить оценку сложности.
Теорема.
Существует константа
, такая,
что время выполнения алгоритма С меньше
циклов.
Задание. Найти методом Карацубы произведение
двух чисел
и
, где
- номер по журналу. Оценить сложность
вычислений.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.