|
||||
Меню:
Главная
Форум
Литература: Программирование и ремонт Импульсные блоки питания Неисправности и замена Радиоэлектронная аппаратура Микросхема в ТА Рубрикатор ТА Кабельные линии Обмотки и изоляция Радиоаппаратура Гибкие диски часть 2 часть 3 часть 4 часть 5 Ремонт компьютера часть 2 Аналитика: Монтаж Справочник Электроника Мощные высокочастотные транзисторы 200 микросхем Полупроводники ч.1 Часть 2 Алгоритмические проблемы 500 микросхем 500 микросхем Сортировка и поиск Монады Передача сигнала Электроника Прием сигнала Телевидиние Проектирование Эвм Оптимизация Автомобильная электроника Поляковтрансиверы Форт Тензодатчик Силовые полевые транзисторы Распределение частот Резисторные и термопарные Оберон Открытые системы шифрования Удк |
[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. Полиномиальные алгоритмы в теории чисел - большая редкость. Да и оценки сложности алгоритмов чаше всего опираются на какие-либо не доказанные, но правдоподобные гипотезы, обычно относящиеся к аналитической теории чисел. Для некоторых задач эффективные алгоритмы вообще не известны. Иногда в таких случаях все же можно предложить последовательность действий, которая, «если повезет», быстро приводит к требуемому результату. Существует класс так называемых вероятностных алгоритмов, которые дают правильный результат, но имеют вероятностную опенку времени работы. Обычно работа этих алгоритмов зависит от одного или нескольких параметров. В худшем случае они работают достаточно |
Среды: Smalltalk80 MicroCap Local bus Bios Pci 12С ML Микроконтроллеры: Atmel Intel Holtek AVR MSP430 Microchip Книги: Емкостный датчик 500 схем для радиолюбителей часть 2 (4) Структура компьютерных программ Автоматическая коммутация Кондиционирование и вентиляция Ошибки при монтаже Схемы звуковоспроизведения Дроссели для питания Блоки питания Детекторы перемещения Теория электропривода Адаптивное управление Измерение параметров Печатная плата pcad pcb Физика цвета Управлении софтверными проектами Математический аппарат Битовые строки Микроконтроллер nios Команды управления выполнением программы Перехода от ahdl к vhdl Холодный спай Усилители hi-fi Электронные часы Сердечники из распылённого железа Анализ алгоритмов 8-разрядные КМОП Классификация МПК История Устройства автоматики Системы и сети Частотность Справочник микросхем Вторичного электропитания Типы видеомониторов Радиобиблиотека Электронные системы Бесконтекстный язык Управление техническими системами Монтаж печатных плат Работа с коммуникациями Создание библиотечного компонента Нейрокомпьютерная техника Parser Пи-регулятор ч.1 ПИ-регулятор ч.2 Обработка списков Интегральные схемы Шина ISAВ Шина PCI Прикладная криптография Нетематическое: Взрывной автогидролиз Нечеткая логика Бытовые установки (укр) Автоматизация проектирования Сбор и защита Дискретная математика Kb радиостанция Энергетика Ретро: Прием в автомобиле Управление шаговым двигателем Магнитная запись Ремонт микроволновки Дискретные системы часть 2 | ||