- •Введение
- •Глава 1
- •§ 1. «Алгоритмические джунгли»
- •§ 2. Исходные данные и результаты. Массовость алгоритма
- •§ 4. Понятность алгоритма
- •§ 5. Рекурсивные определения
- •§ 6. Определенность алгоритма
- •§ 1. Роль алгоритмов в науке и технике
- •§ 7. Выводы
- •Глава 2 создание алгоритмов
- •§ 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. Сознание машин. Алгоритмическое моделирование
§ 6. Алгоритм разложения на простые множители. Определение наименьшего кратного двух чисел
В соответствии с нашей точкой зрения, изложенной в предыдущем параграфе, нахождение очередного простого числа и нахождение общего наибольшего делителя двух чисел будем считать действиями простыми. Они потенциально осуществимы (как это видно из алгоритмов Евклида и Эратосфена).
Теперь нетрудно составить алгоритм разложения произвольного числа на простые сомножители. Предварительно рассмотрим один вид действия, с которым мы уже встречались раньше, но не обратили на него особого внимания. Это — проверка условия. Пункты 1 и 2 алгоритма Евклида и п. 3 алгоритма Эратосфена требуют проверки условия. У нас эти пункты сформулированы так: «если... (условие)... то... иначе...». Это значит, что они требуют проверки условия, и если оно выполнено, то предписывают один образ действий, а если не выполнено, то другой.
В результате проверки условия мы получаем либо ответ «да», либо ответ «нет». Само условие имеет вид утверждения, например: р2>п. В математической логике условия называются предикатами. В общем случае условие в своем тексте содержит одно или несколько групповых имен9 каких-либо предметов и утверждает наличие некоторого свойства у предметов или отношения между ними. Так, условие «р2>п» содержит два групповых имени: р (или «простое число») и п (или «заданное положительное целое число»). В этом условии утверждается наличие отношения между числами, выражаемого тем, что квадрат простого числа больше заданного положительного целого.
В простейшем случае кажется, что достаточно взглянуть на конкретные предметы, к которым приложимы групповые имена, указанные в условии, чтобы узнать, выполняются ли для этих предметов условия или нет. Но в более сложных случаях одного взгляда заведомо мало.
Представьте себе, например, условие «р — простое число». Легко ли проверить это условие для числа 1037, т. е. увидеть, является ли оно простым? Тем не менее проверить это можно с помощью алгоритма Эратосфена.
В математической логике, изучающей предикаты, говорят, что предикаты ставят в соответствие набору предметов, для которых проверяется условие, определенное логическое значение.
Что же представляет собой это логическое значение? Одним таким логическим значением является истина, а другим — ложь. Но сами эти слова не являются логическими значениями, а лишь обозначают их собой, подобно тому, как числом два является не само слово «два».
Частным случаем предиката является условие, в котором групповые имена вырождены в индивидуальные имена. Это имеет место, например, для условия
22>5.
При его проверке мы получили бы логическое значение ложь.
Предикаты, содержащие в своем тексте не групповые, а только индивидуальные имена, называются высказываниями. Каждое высказывание имеет неизменное логическое значение (в нашем примере — ложь), тогда как в 1учае невырожденных групповых имен для их конкретных значений (т. е. при их замене индивидуальными именами) могут получаться различные логические значения: иногда истина, иногда ложь.
При составлении алгоритмов нужно следить за тем, чтобы способ проверки включаемых в них условий был известен (в виде соответствующего алгоритма).
Теперь приступим к составлению алгоритма разложения положительного целого числа N на простые множители для N ≥ 2.
1. Составить в порядке возрастания последовательность всех простых чисел, каждое из которых не больше N. Именем р называть простое число 2. Считать, что произведение П состоит из единственного множителя, равного единице. Перейти к п. 2.
2. Если N является простым числом (в этом случае оно стоит среди полученных простых чисел на последнем месте), то перейти к п. 7, иначе перейти к п. 3.
3. Если наибольший общий делитель чисел N и р равен 1, перейти к п. 4, иначе перейти к п. 6.
4. Найти следующее за р по величине простое число. Впредь его называть именем р. Перейти к п. 5.
5. Если p2>N, то перейти к п. 7, иначе перейти к п. 3.
6. Разделить N на р.Частное считать новым значением N. К произведению П приписать точку (знак умножения) и за ней число, являющееся значением р. В дальнейшем именем П называть новое произведение. Вернуться к п. 3.
7. Приписать к произведению П точку (знак умножения) и за ней число N. В дальнейшем буквой П будем обозначать новое произведение. Перейти к п. 8.
8. В произведении П произведения одинаковых простых чисел заменить их степенями, стоящую на первом месте единицу отбросить. Ответ получен. Процесс окончен.
Читатель может сам выполнить этот алгоритм применительно к числу N=504 и при этом получить N=23∙32∙7.
Корректность алгоритма разложения положительного целого на простые сомножители доказать очень просто. Предоставим это читателю.
Очень просто теперь составить алгоритм получения наименьшего кратного нескольких чисел. Он будет состоять в следующем.
1. Заданные числа N1, N2,…, Nn разложить на простые сомножители и получить произведения их степеней П1, П2, …, Пn. Перейти к п. 2.
2. Составить строку К, выписывая в порядке возрастания простые числа, присутствующие хотя бы в одном из разложений, и разделяя их знаками умножения. Перейти к и. 3.
3. Каждое из простых чисел, входящих в К, возвести в степень, показатель которой равен наибольшему показателю степени того же простого числа в разложениях П1, П2, …, Пn. Полученный результат впредь именовать К. Перейти к п. 4.
4. В К произвести все возведения в степень и все умножения. Полученный результат является ответом. Конец.
Корректность этого алгоритма вытекает из того, что: а) для любого Пi (1<i<n) путем несложных преобразований и перегруппировки в составе К можно выделить группу сомножителей, совпадающих с Пi откуда следует, что полученный результат кратен числу Nt; б) уменьшить полученный результат нельзя, так как уменьшение показателя степени хотя бы одного сомножителя в К привело бы к тому, что результат перестал бы быть кратным хотя бы одному из Пi.
