Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[2]

2. Сложность теоретико-числовых алгоритмов

Сложность алгоритмов теории чисел обычно принято измерять количеством арифметических операций (сложений, вычитаний, умножений и делений с остатком), необходимых для выполнения всех действий, предписанных алгоритмом. Впрочем, это определение не учитывает величины чисел, участвующих в вычислениях. Ясно, что перемножить два стознач-ных числа значительно сложнее, чем два однозначных, хотя при этом и в том. и в другом случае выполняется лишь одна арифметическая операция. Поэтому иногда учитывают ешё и величину чисел, сводя дело к так называемым битовым операциям, т. е. оценивая количество необходимых операций с цифрами 0 и 1, в двоичной записи чисел. Это зависит от рассматриваемой задачи, от целей автора и т.д.

На первый взгляд странным также кажется, что операции умножения и деления приравниваются по сложности к операциям сложения и вычитания. Житейский опыт подсказывает, что умножать числа значительно сложнее, чем складывать их. В действительности же. вычисления можно организовать так. что на умножение или деление больших чисел понадобится не намного больше битовых операций, чем на сложение. В книге [8] описывается алгоритм Шёнхаге - Штрассена. основанный на так называемом быстром преобразовании Фурье, и требуюший О (га In га lnln га) битовых операций для умножения двух га-разрядных двоичных чисел. Таким же количеством битовых операций можно обойтись при выполнении деления с остатком двух двоичных чисел, записываемых не более, чем га цифрами. Для сравнения отметим, что сложение га-разрядных двоичных чисел требует О (га) битовых операций.

Говоря в этой статье о сложности алгоритмов, мы будем иметь в виду количество арифметических операций. При построении эффективных алгоритмов и обсуждении верхних оценок сложности обычно хватает интуитивных понятий той области математики, которой принадлежит алгоритм. Формализация же этих понятий требуется лишь тогда, когда речь идёт об отсутствии алгоритма или доказательстве нижних оценок сложности. Более детальное и формальное обсуждение этих вопросов см. в статье [9].

Приведем теперь примеры достаточно быстрых алгоритмов с опенками их сложности. Здесь и в дальнейшем мы не будем придерживаться формального описания алгоритмов, стараясь в первую очередь объяснить смысл выполняемых действий.

Следующий алгоритм вычисляет ad (mod то) за О (In то) арифметических операций. При этом, конечно, предполагается, что натуральные числа а и d не превосходят по величине то.


1.Алгоритм вычисления ad (mod то).

1)Представим d в двоичной системе счисления d = do2r + - - + dr i2 + + dr. где d{. цифры в двоичном представлении, равны 0 или 1. do = 1.

2)Положим ао = а и затем для г = 1,.... г вычислим

а{ = а? 1 • ad (mod то). 5j аг есть искомый вычет ad (mod то). Справедливость этого алгоритма вытекает из сравнения at = adoV+-+d< (mod то),

легко доказываемого индукцией по г.

Так как каждое вычисление на шаге 2 требует не более трёх умножений по модулю то и этот шаг выполняется г log2 то раз. то сложность алгоритма может быть оценена величиной О (In то).

Второй алгоритм - это классический алгоритм Евклида вычисления наибольшего обшего делителя целых чисел. Мы предполагаем заданными два натуральных числа а и Ь и вычисляем их наибольший обший делитель (а, Ъ).

2.Алгоритм Евклида.

1)Вычислим г - остаток от деления числа а на Ь. а = bq + г, 0 г < Ь.

2)Если г = О, то Ь есть искомое число.

3)Если г ф О, то заменим пару чисел (а. Ь) парой (Ь. г) и перейдем к шагу 1.

Не останавливаясь на объяснении, почему алгоритм действительно находит (а, Ъ). это общеизвестно, докажем некоторую оценку его сложности.

Теорема 1. При вычислении наибольшего общего делителя (а.Ъ) с помощью алгоритма Евклида будет выполнено не более Ър операций деления с остатком, где р есть количество цифр в десятичной записи меньшего из чисел а и Ь.

Доказательство. Положим го = а > Ь и определим г\,Г2... ..гп - последовательность делителей, появляюшихся в процессе выполнения шага 1 алгоритма Евклида. Тогда

г\ = Ь..... 0 r8 i < г\. г = 0.1... .п - 1.

Пусть также щ = 1, щ = 1. иь+i = uk + "u-k-i, k 1. - последовательность Фибоначчи. Индукцией по г от г = п - 1 до г = 0 легко доказывается неравенство r,-+i ип г-. А так как ип Ю™-15. то имеем неравенства Ш > Ъ = п ип Ю*"-1)/5 и п< 5р + 1.


Немного подправив алгоритм Евклида, можно достаточно быстро решать сравнения ах = 1 (mod Ъ) при условии, что (а. Ъ) = 1. Эта задача равносильна поиску целых решений уравнения ах + Ьу = 1.

3. Алгоритм решения уравнения ах + by = 1.

0)Определим матрицу Е =

1)Вычислим г - остаток от деления числа а на Ь. а = bq + г. О < г < Ь.

2) Если г = 0. то второй столбец матрицы Е даёт вектор

решений уравнения.

3)Если г ф 0. то заменим матрицу Е матрицей Е

4)Заменим пару чисел (а.Ь) парой (Ь.г) и перейдем к шагу 1.

Если обозначить через Ek матрицу Е. возникающую в процессе работы алгоритма перед шагом 2 после к делений с остатком (шаг 1), то в обозначениях из доказательства теоремы 1 в этот момент выполняется векторное равенство (а, Ь) Ej~ = (r-i, г). Его легко доказать индукцией по к. Поскольку числа а и Ь взаимно просты, имеем rn = 1, и это доказывает, что алгоритм действительно даёт решение уравнения ах + by = 1. Буквой п мы обозначили количество делений с остатком, которое в точности такое же. как и в алгоритме Евклида.

Три приведённых выше алгоритма относятся к разряду так называемых полиномиальных алгоритмов. Это название носят алгоритмы, сложность которых оценивается сверху степенным образом в зависимости от длины записи входящих чисел (см. подробности в [9]). Если наибольшее из чисел, подаваемых на вход алгоритма, не превосходит то. то сложность алгоритмов этого типа оценивается величиной 0(1пс то) . где с - некоторая абсолютная постоянная. Во всех приведённых выше примерах с = 1.

Полиномиальные алгоритмы в теории чисел - большая редкость. Да и оценки сложности алгоритмов чаше всего опираются на какие-либо не доказанные, но правдоподобные гипотезы, обычно относящиеся к аналитической теории чисел.

Для некоторых задач эффективные алгоритмы вообще не известны. Иногда в таких случаях все же можно предложить последовательность действий, которая, «если повезет», быстро приводит к требуемому результату. Существует класс так называемых вероятностных алгоритмов, которые дают правильный результат, но имеют вероятностную опенку времени работы. Обычно работа этих алгоритмов зависит от одного или нескольких параметров. В худшем случае они работают достаточно



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9]