
- •Введение
- •Глава 1
- •§ 1. «Алгоритмические джунгли»
- •§ 2. Исходные данные и результаты. Массовость алгоритма
- •§ 4. Понятность алгоритма
- •§ 5. Рекурсивные определения
- •§ 6. Определенность алгоритма
- •§ 7. Выводы
- •Глава 2 создание алгоритмов
- •§ 1. Роль алгоритмов в науке и технике
- •§ 2. Как возникают алгоритмы
- •§ 3. Алгоритмы в математике
- •§ 4. Алгоритм Евклида
- •§ 5. Решето Эрагосфена
- •§ 6. Алгоритм разложения на простые множители. Определение наименьшего кратного двух чисел
- •§ 7. Распознавание алгебраического тождества
- •§ 8. Задачи на построение алгоритмов
- •Глава 3 кризис математики в начале XX века
- •§ 1. Арифметизация математики
- •§ 2. Теория множеств
- •§ 3. Кардинальные числа
- •§ 4. Антиномии
- •§ 5. Выводы из антиномий
- •Глава 4 логические теории алгоритмов
- •§ 1. Рекурсивные функции
- •§ 2. Машины Тьюринга
- •§ 3. Нормальные алгоритмы Маркова
- •§ 4. Эквивалентность описанных теорий
- •Глава 5
- •§ 1. Массовые проблемы. Неразрешимость проблем
- •§ 2. Экстраалгоритм и три неразрешимые проблемы
- •§ 3, Некоторые замечания
- •Глава 6 электронные вычислительные машины и программирование
- •§ 1. Устройство эвм
- •§ 2. Процессоры эвм. Рабочий цикл
- •§ 3. Что такое программа
- •§ 4. Особенности современных эвм
- •§ 5. Входные языки программирования
- •§ 6. Необходимость содержательной теории алгоритмов. Какой она должна быть
- •Г л а в а 7 формальные языки
- •§ 1. Анализ естественного языка
- •§ 2. Искусственные языки. Формальные языки
- •§ 3. Буквы, связи, оболочки, конструкции
- •§ 4. Формальные грамматики
- •§ 5. Нотация Бекуса. Тезаурусы
- •§ 1. Что такое операция?
- •§ 2. Натуральные операции
- •§ 4. Первичные алгоритмы
- •§ 5. Натуральные алгоритмы
- •§ 6. Ограничения на структуру исходных данных сняты
- •§ 8. Соотношение с алгоритмами в интуитивном смысле
- •§ 10. Исследование тупиков (клинчей)
- •§ 11. Формальная семантика формального языка
- •Глава 9 математическое обеспечение эвм
- •§ 1. Анализ эвм и программ
- •§ 2. Что такое математическое обеспечение эвм
- •§ 3. Функциональная классификация программ математического обеспечения эвм
- •§ 4. Операционные системы
- •И автоматизация процессов
- •§ I. Использование эвм для управления
- •§ 2. Информационные системы
- •§ 3. Алгоритмизация процессов
- •§ 4. Язык алгоритмизации процессов
- •§ 5. Наука и искусство алгоритмизации
- •Заключение
- •§ 1. Может ли машина мыслить? Может ли человек решить алгоритмически неразрешимую проблему?
- •§ 2. Детерминированность машин. Самообучение
- •§ 3. Сознание машин. Алгоритмическое моделирование
§ 3. Алгоритмы в математике
Изобилие математических алгоритмов особенно бросается в глаза. Приведем наиболее известные из них.
Прежде всего следует указать уже упомянутый алгоритм сложения положительных десятичных дробей. Не менее известны алгоритмы вычитания положительных десятичных дробей для случая, когда уменьшаемое не больше вычитаемого, умножения положительных десятичных дробей «столбиком» (так школьники называют этот алгоритм) и деления положительных десятичных дробей «крючком» (о котором уже упоминалось в § 3 гл. 1).
Эти алгоритмы в свою очередь являются результатами «развития» алгоритмов сложения, вычитания, умножения и деления натуральных чисел. Не очень бросается в глаза, что последние алгоритмы тоже «составные», поскольку построены из более простых. А между тем каждый помнит тот неприятный период своей учебы, когда ему приходилось осваивать один из таких простых алгоритмов: «вызубривать» таблицу умножения. При этом школьник учился выполнять алгоритм выбора из таблицы умножения произведения по заданным двум положительным целым сомножителям, каждый из которых не превосходит десяти.
Здесь мы встречаемся с новой разновидностью так называемых табличных алгоритмов, имеющих большое практическое и принципиальное значение. Табличный алгоритм в своей записи содержит таблицу. Если бы мы пожелали точно сформулировать табличный алгоритм умножения, он выглядел бы так:
1. Найти в таблице, указанной в п. 2, столбец соответствующий первому сомножителю. Перейти к п. 3.
2. (Содержит всю таблицу умножения,)
3. В найденном столбце найти строку, соответствующую второму сомножителю, и из нее взять произведение. Конец.
Интересно, что табличный алгоритм умножения является не первым подобным алгоритмом, который нам известен. Еще ранее каждый школьник изучает табличные алгоритмы а) сложения натуральных чисел, не превосходящих девяти, и б) вычитания натуральных чисел для случая, в котором уменьшаемое не больше восемнадцати, а вычитаемое не превосходит девяти. Обучение выполнению этих табличных алгоритмов оставляет в нашей памяти менее заметные неприятные следы, потому что соответствующие таблицы проще, чем таблица умножения. Впрочем, автор до сих пор не забыл, что в то далекое время предпочитал более простой алгоритм «сложения на пальцах», чем вызывал гнев своих первых учителей.
Может быть, перечисленные алгоритмы в силу своей «избитости» мало интересуют читателя. Но все же их просмотр позволил нам выделить еще один новый вид алгоритмов. Рассмотрим теперь более интересные случаи.
§ 4. Алгоритм Евклида
Еще в III в. до н. э. математик Евклид, известный автор первого дошедшего до нас теоретического трактата по математике «Начала», в геометрической форме изложил правило получения наибольшего общего делителя двух натуральных чисел. Идея этого правила (обоснование его корректности) заключается в том, что если z — наибольший общий делитель двух натуральных чисел х и у, то в случае равенства этих чисел он совпадает с любым из них, а в случае их неравенства разность между большим и меньшим вместе с меньшим имеет тот же самый наибольший общий делитель г. Назовем число, равное тому из двух чисел х, у, которое не меньше другого, их верхней гранью и обозначим g, а второе обозначим h. После вычитания одного числа из другого получим новую пару чисел g — h и h, верхняя грань g' которых строго меньше g. Новые числа имеют тот же наибольший общий делитель z. Значит, мы свели задачу к нахождению наибольшего общего делителя натуральных чисел, верхняя грань которых меньше первоначальной.
Повторяя прием, мы должны в конце концов прийти к случаю, когда новые полученные натуральные числа между собой равны, так как безграничное число шагов уменьшения верхней грани невозможно (потому что натуральных чисел, не превосходящих числа g, всего несколько).
Сам алгоритм нахождения наибольшего общего делителя z двух натуральных чисел х и у (алгоритм Евклида) можно изложить так:
1. Если х>у, то перейти к п. 4, иначе перейти к п. 2.
2. Если у>х, то перейти к п. 5, иначе перейти к п. 3.
3. Считать, что z=x. Конец.
4. От х отнять у и впредь считать, что эта разность является значением х. Возвратиться к п. 1.
5. От у отнять х и впредь считать эту разность значением у. Возвратиться к п. 1.
Можно было бы получить другую разновидность алгоритма Евклида, если учесть, что деление является многократным вычитанием. При этом нужно будет большее из чисел х, у делить на меньшее и остаток в дальнейшем считать значением буквы, которая при этом обозначала делимое.
Это позволит, не меняя первых трех пунктов, прежние пп. 4, 5 заменить следующими:
4. Остаток от деления х на у впредь считать значением х. Перейти к п. 1.
5. Остаток от деления у на х считать новым значением у. Вернуться к п. 1.
Новый алгоритм тоже называют алгоритмом Евклида. Он окажется удобнее первоначального, если для выполнения операции деления с остатком мы располагаем, например, настольной клавишной вычислительной машиной.
В алгоритме Евклида мы замечаем интересный прием: изменяя величину, мы сохраняем за ней ее исходное имя. При этом возникает понятие величины, значение которой может изменяться. Пункты алгоритма, изменяющие значения величин, относятся к числу так называемых операторов, о которых подробнее мы будем говорить в § 4 гл. 10.