- •Введение
- •Глава 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. Сознание машин. Алгоритмическое моделирование
§ 5. Решето Эрагосфена
Целые положительные числа, отличные от единицы, которые без остатка делятся только на единицу и на самих себя, называются простыми. Первым из таких чисел является 2. Все остальные четные числа уже не будут простыми, так как допускают деление без остатка на 2 (а не только на 1 и на себя). Нетрудно указать и еще несколько простых чисел: 3, 5, 7, 11, 13.
Древнегреческий ученый Эратосфен (III—II вв. до н. э.) предложил способ получения простых чисел, не превосходящих заданного числа п. Этот способ можно описать в виде следующего алгоритма Эратосфена.
1. Выписать последовательные целые числа, начиная с 2 и кончая числом п. Перейти к п. 2.
2. Считать, что р является именем числа 2. Перейти к п. 3.
3. Если р2≤n, то перейти к п. 4, иначе перейти к п. 6.
4. Начиная с числа р+1 в последовательности чисел зачеркнуть (не отбрасывая его и не обращая внимания на то, было ли оно уже зачеркнуто) каждое р-е число. Перейти к п. 5.
5. Первое после р незачеркнутое число последовательности считать новым значением имени р. Вернуться к п. 3.
6. Процесс окончен. Все незачеркнутые числа последовательности являются простыми.
Обосновать корректность алгоритма Эратосфена нетрудно. Каждое р-е число, если считать начиная с kp+1 (где k — целое положительное), равно kр+р= (k+1)p - Кроме числа р, которое имеет вид р = 1*р, мы вычеркиваем последовательно все числа 2-р, 3-р, …, которые не превосходят заданного числа n.
Выбирая первое после р незачеркнутое число, мы, естественно, находим новое наименьшее из простых чисел, превосходящих р, потому что оно не делится на р и на все меньшие его простые числа, а делится только на себя и на единицу (на большее число деление без остатка невозможно, а на меньшее число оно не делится, так как если бы оно имело простой делитель, то было бы вычеркнуто, а если бы имело непростой делитель, то каждый простой делитель этого непростого делителя был бы также его делителем, т. е. опять-таки оно оказалось бы зачеркнутым).
Остается только убедиться в том, что, прекращая процесс после того, как получено простое число р, которое не удовлетворяет условию р2≤n, т. е. такое, что р2>n, мы не оставляем среди оставшихся чисел ни одного составного. Но это понятно, потому что если бы среди оставшихся было хотя бы одно непростое, то оно не могло бы иметь делителя, меньшего чем р (так как все числа, имеющие делитель, равный простому числу, меньшему чем р, уже зачеркнуты). Не может оно быть равно и р*р=р2, так как р2 больше п. Значит, оно должно быть произведением чисел, из которых хотя бы одно больше р, а другое не меньше р. Это невозможно, так как такое число больше р2, а значит, и больше n, у нас же могут быть только числа, которые меньше или равны п.
Читатель без труда и довольно быстро может убедиться в том, что простыми числами, не превосходящими 100, являются: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97. Для получения этого ряда простых чисел нам пришлось выполнять процесс для р=2, р=3, р=5, р=7. Уже р = 11 дало 112=121>100, что послужило сигналом для прекращения процесса. Как видит читатель, отбросив числа, делящиеся на первые 4 простых числа, мы получили 25 простых чисел, среди которых наибольшее 97.
В алгоритме Эратосфена мы встречаемся со случаем, в котором в процессе выполнения алгоритма получается очень большой промежуточный результат (последовательность п —- 1 чисел, начинающаяся с числа 2). Слово «большой» здесь надо понимать в смысле числа символов, которые необходимо хранить в течение некоторого времени. Но это число для каждого п конечно, и потому алгоритм Эратосфена потенциально осуществим для любого п, хотя автор не советует читателю применять его к числу n = 1 000 000000 (1 млрд.). Не хватит ни бумаги, ни времени.
Как уже упоминалось, в простейших случаях алгоритмический процесс состоит из очень простых шагов. Но можно ли считать простым такой шаг, как выписывание последовательности п — 1 чисел при больших значениях n? Или отсчитывание р чисел начиная с (р + 1)-го при больших значениях р? А ведь значения р могут быть как угодно велики (доказано, что среди простых чисел не г наибольшего; после каждого простого числа можно найти еще большее простое число).
Многие специалисты по теории алгоритмов считают, что такие шаги алгоритмического процесса недопустимы. С их точки зрения алгоритм Эратосфена не является алгоритмом, хотя и служит правилом для получения простых чисел. В чем же возражение против шагов, на которых могут преобразовываться объекты, состоящие хотя и из конечного, но не ограниченного числа символов? В том, что умственные способности исполнителя ограничены и поэтому ему доступны только операции ограниченной сложности. Возражение, конечно, резонное. Но для него существует и контрвозражение. Если мы абстрагируемся от ограниченности ресурсов времени и материалов (например, бумаги и карандашей), то почему бы не абстрагироваться и от ограниченности наших умственных ресурсов? Ведь можно создавать все более и более мощные вычислительные машины так, что благодаря их использованию с течением времени наши умственные способности будут совершенствоваться и когда-нибудь наступит такой момент, что алгоритмический процесс, который мы прежде не могли осуществить, станет легко осуществимым.
Автор считает это контрвозражение уважительным и не согласен с определением простоты действия, основанным на отрицании потенциальной возможности выполнять действия над объектами, образованными из сколь угодно большого (но конечного) числа символов.
Если нам известен алгоритм, определяющий действие, то это действие потенциально осуществимо, и поэтому нет никакого основания считать его слишком сложным. Другое дело, если какое-либо действие не является потенциально осуществимым. Но об этом речь будет впереди (см. § 1 гл. 8).
Ну, а как же с алгоритмом Эратосфена? Мы с вами, читатель, будем его признавать алгоритмом. А тем, кто с этим не согласится, предоставим право его преобразовать так, чтобы на каждом шаге выполнялось только очень простое действие.
