stringtranslate.com

Алгоритм

В цикле вычтите большее число из меньшего. Остановите цикл, когда вычитание сделает число отрицательным. Оцените два числа, равно ли одно из них нулю или нет. Если да, то другое число примите за наибольший общий делитель. Если нет, снова поместите два числа в цикл вычитания.
Блок-схема использования последовательных вычитаний для нахождения наибольшего общего делителя чисел r и s

В математике и информатике алгоритм ( / ˈ æ l ɡ ə r ɪ ð əm / _ ) — это конечная последовательностьстрогихинструкций, обычно используемая для решения класса конкретныхзадачили выполнениявычислений.[1]Алгоритмы используются в качестве спецификаций для выполнениявычисленийиобработки данных. Более продвинутые алгоритмы могут использоватьусловные выражения, чтобы перенаправить выполнение кода по различным маршрутам (так называемоеавтоматическое принятие решений) и сделать правильныевыводы(так называемыеавтоматические рассуждения), в конечном итоге достигаяавтоматизации. Использование человеческих характеристик в качестве метафорического описания машин уже практиковалосьАланом Тьюрингомс такими терминами, как «память», «поиск» и «стимул».[2]

Напротив, эвристика — это подход к решению проблем, который может быть не полностью определен или не может гарантировать правильные или оптимальные результаты, особенно в проблемных областях, где нет четко определенного правильного или оптимального результата. [3] Например, рекомендательные системы социальных сетей полагаются на эвристику таким образом, что, хотя в популярных средствах массовой информации 21-го века их широко называют «алгоритмами», они не могут дать правильные результаты из-за характера проблемы.

В качестве эффективного метода алгоритм может быть выражен в пределах конечного объема пространства и времени [4] и на четко определенном формальном языке [5] для вычисления функции . [6] Начиная с начального состояния и начального ввода (возможно, пустого ), [7] инструкции описывают вычисление, которое при выполнении проходит через конечное [8] число четко определенных последовательных состояний, в конечном итоге производя «выход» [ 9] и завершается в конечном конечном состоянии. Переход от одного состояния к другому не обязательно является детерминированным ; некоторые алгоритмы, известные как рандомизированные алгоритмы , включают случайные входные данные. [10]

История

Древние алгоритмы

С древности были засвидетельствованы пошаговые процедуры решения математических задач. Сюда входит вавилонская математика (около 2500 г. до н. э.), [11] египетская математика (около 1550 г. до н. э.), [11] индийская математика (около 800 г. до н. э. и позже; например , Шулба-сутры , школа Кералы и Брахмасфутасиддханта ), [12] [13] Оракул Ифа (около 500 г. до н. э.), греческая математика (около 240 г. до н. э., например , решето Эратосфена и алгоритм Евклида ), [14] и арабская математика (9 век, например, криптографические алгоритмы для взлома кода, основанные на частотном анализе ). [15]

Аль-Хорезми и термин алгоритм

Около 825 года иранский ученый и эрудит Мухаммад ибн Муса аль-Хорезми написал «Китаб аль-Хисаб аль-хинди» («Книга индийских вычислений») и « Китаб аль-джам' ва'ль-тафрик аль-Хисаб аль-хинди» («Сложение и вычитание в индийской арифметике»). Оба эти текста в настоящее время утеряны в оригинальном арабском языке. (Однако другая его книга по алгебре сохранилась.) [16]

В начале XII века появились латинские переводы указанных текстов аль-Хорезми, включающие индуистско-арабскую систему счисления и арифметику : Liber Alghoarismi de practica arismetrice (приписывается Иоанну Севильскому ) и Liber Algorismi de numero Indorum (приписывается Аделарду Батскому ). . [17] Таким образом, alghoarismi или algorismi — это латинизация имени Аль-Хорезми; текст начинается с фразы Dixit Algorismi («Так говорил Аль-Хорезми»). [18]

В 1240 году Александр Вильдье пишет латинский текст под названием «Кармен де Альгорисмо» . Оно начинается с:

Haec algorismus ars praesens dicitur, in qua / Talibus Indorum fruimur bis quinque figuris.

что переводится как:

Алгоризм — это искусство, с помощью которого мы в настоящее время пользуемся теми индийскими цифрами, которых число два раза по пять.

Стихотворение состоит из нескольких сотен строк и обобщает искусство вычислений с помощью индийских игральных костей нового стиля ( Тали Индорум ) или индуистских цифр. [19]

Английская эволюция слова

Около 1230 года английское слово «алгоризм» засвидетельствовано, а затем Чосером в 1391 году. Английский язык принял французский термин. [20] [21]

В 15 веке под влиянием греческого слова ἀριθμός ( арифмос , «число»; ср. «арифметика») латинское слово было изменено на алгоритмус .

В 1656 году в английском словаре Glossographia сказано: [22]

Алгоризм ([ лат. algorismus ] ) Искусство использования шифров или нумерации с помощью шифров; навыки ведения бухгалтерского учета.

Augrime ([ латинский ] алгоритмус ) умение вести бухгалтерский учет или нумерацию.

В 1658 году в первом издании «Нового мира английских слов» говорится: [23]

Алгоритм (слово, составленное из арабского и испанского языков ), искусство расчета с помощью шифров.

В 1706 году в шестом издании « Нового мира английских слов» говорится: [24]

Алгоритм , искусство вычислений или счета с помощью чисел, которое содержит пять основных правил арифметики, а именно. Нумерация , сложение , вычитание , умножение и деление ; к этому можно добавить «Извлечение корней ». Его также называют Logistica Numeralis .

Алгоризм , практическая операция в нескольких частях ложной арифметики или алгебры ; иногда его принимают за практику общей арифметики с использованием десяти цифр.

В 1751 году в «Спутнике молодого алгебраиста» Дэниел Феннинг противопоставляет термины «алгоризм» и «алгоритм» следующим образом: [25]

Алгоритм означает первые принципы , а алгоритм — практическую часть, или знание того, как применить алгоритм на практике.

По крайней мере , с 1811 года термин « алгоритм » на английском языке означает «пошаговая процедура». [26] [27]

В 1842 году в «Словаре науки, литературы и искусства» говорится:

АЛГОРИТМ означает искусство вычислений применительно к какому-то конкретному предмету или каким-то особым способом; как алгоритм чисел; алгоритм дифференциального исчисления. [28]

Использование машины

Диаграмма Ады Лавлейс из « Note G », первого опубликованного компьютерного алгоритма.

В 1928 году началась частичная формализация современной концепции алгоритмов с попыток решить Entscheidungsproblem ( проблему принятия решения), поставленную Дэвидом Гильбертом . Более поздние формализации были оформлены как попытки определить « эффективную вычислимость » [29] или «эффективный метод». [30] Эти формализации включали рекурсивные функции ГёделяЭрбранаКлини 1930, 1934 и 1935 годов, лямбда -исчисление Алонзо Чёрча 1936 года, формулу 1 Эмиля Поста 1936 года и машины Тьюринга Алана Тьюринга 1936–37 годов. и 1939 год.

Неформальное определение

Одним из неофициальных определений является «набор правил, который точно определяет последовательность операций», [31] [ для проверки требуется цитата ] , который включает в себя все компьютерные программы (включая программы, которые не выполняют числовые вычисления) и (например) любые предписанная бюрократическая процедура [32] или кулинарная книга рецептов . [33]

В общем, программа является алгоритмом только в том случае, если она в конечном итоге останавливается [34] — даже несмотря на то, что иногда могут оказаться желательными бесконечные циклы .

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

Булос, Джеффри и 1974, 1999 предлагают неформальное значение слова «алгоритм» в следующей цитате:

Ни один человек не может писать достаточно быстро, или достаточно долго, или достаточно мало† («†«меньше и меньше без ограничений… вы будете пытаться писать на молекулах, на атомах, на электронах»), чтобы перечислить всех членов перечислимо бесконечное множество, записывая их имена одно за другим в некоторых обозначениях. Но люди могут сделать кое-что не менее полезное в случае некоторых перечислимо бесконечных множеств: они могут дать явные инструкции по определению n-го члена множества для произвольного конечного n . Такие инструкции должны быть даны совершенно явно, в такой форме, в которой их могла бы выполнить вычислительная машина или человек , способный выполнять лишь самые элементарные операции с символами. [35]

« Счетно бесконечное множество» — это такое множество, элементы которого можно привести во взаимно однозначное соответствие с целыми числами. Таким образом, Булос и Джеффри говорят, что алгоритм подразумевает инструкции для процесса, который «создает» выходные целые числа из произвольного « входного» целого числа или целых чисел, которые теоретически могут быть сколь угодно большими. Например, алгоритм может представлять собой алгебраическое уравнение, такое как y = m + n (т. е. две произвольные «входные переменные» m и n , которые производят выход y ), но попытки различных авторов дать определение этому понятию показывают, что это слово подразумевает гораздо больше, что-то порядка (для примера сложения):

Точные инструкции (на языке, понятном «компьютеру») [36] для быстрого, эффективного, «хорошего» [37] процесса, определяющего «движения» «компьютера» (машины или человека, оснащенного необходимыми внутренними средствами). содержащаяся информация и возможности) [38] находить, декодировать и затем обрабатывать произвольные входные целые числа/символы m и n , символы + и = ... и «эффективно» [39] производить в «разумное» время [40 ] выходное целое число y в указанном месте и в указанном формате.

Понятие алгоритма также используется для определения понятия разрешимости — понятия, которое является центральным для объяснения того, как формальные системы возникают, исходя из небольшого набора аксиом и правил. В логике время, необходимое для выполнения алгоритма, не может быть измерено, поскольку оно явно не связано с обычным физическим измерением. Такая неопределенность, которая характеризует продолжающуюся работу, приводит к отсутствию определения алгоритма , которое подходило бы как к конкретному (в некотором смысле), так и к абстрактному использованию этого термина.

Большинство алгоритмов предназначены для реализации в виде компьютерных программ . Однако алгоритмы реализуются и другими средствами, например, в биологической нейронной сети (например, человеческий мозг , реализующий арифметику , или насекомое, ищущее пищу), в электрической цепи или в механическом устройстве.

Формализация

Алгоритмы играют важную роль в том, как компьютеры обрабатывают данные. Многие компьютерные программы содержат алгоритмы, в которых подробно описываются конкретные инструкции, которые компьютер должен выполнять — в определенном порядке — для выполнения определенной задачи, например расчета зарплаты сотрудников или печати табелей успеваемости студентов. Таким образом, алгоритмом можно считать любую последовательность операций, которую можно смоделировать с помощью полной по Тьюрингу системы. Среди авторов, отстаивающих этот тезис, — Мински (1967), Сэвидж (1987) и Гуревич (2000):

Мински: «Но вместе с Тьюрингом мы также будем утверждать... что любая процедура, которую можно было бы «естественно» назвать эффективной, на самом деле может быть реализована с помощью (простой) машины. Хотя это может показаться крайностью, аргументы... ...в ее пользу трудно опровергнуть». [41] Гуревич: «… Неофициальный аргумент Тьюринга в пользу его тезиса оправдывает более сильный тезис: каждый алгоритм может быть смоделирован машиной Тьюринга … согласно Сэвиджу [1987], алгоритм — это вычислительный процесс, определяемый машиной Тьюринга». [42]

Машины Тьюринга могут определять вычислительные процессы, которые не завершаются. Неформальные определения алгоритмов обычно требуют, чтобы алгоритм всегда завершался. Это требование делает задачу определения того, является ли формальная процедура алгоритмом, невозможной в общем случае — из-за основной теоремы теории вычислимости , известной как проблема остановки .

Обычно, когда алгоритм связан с обработкой информации, данные могут быть прочитаны из источника ввода, записаны на устройство вывода и сохранены для дальнейшей обработки. Сохраненные данные рассматриваются как часть внутреннего состояния объекта, выполняющего алгоритм. На практике состояние хранится в одной или нескольких структурах данных .

Для некоторых из этих вычислительных процессов алгоритм должен быть строго определен и указан таким образом, чтобы он применялся во всех возможных обстоятельствах, которые могут возникнуть. Это означает, что любые условные шаги должны рассматриваться систематически, в каждом конкретном случае; критерии для каждого случая должны быть ясными (и вычислимыми).

Поскольку алгоритм представляет собой точный список точных шагов, порядок вычислений всегда имеет решающее значение для функционирования алгоритма. Обычно предполагается, что инструкции перечислены в явном виде и описываются как начинающиеся «сверху» и идущие «вниз» — идея, которая более формально описывается потоком управления .

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

Некоторые альтернативные концепции того, что представляет собой алгоритм, см. в функциональном программировании и логическом программировании .

Выражение алгоритмов

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

Существует большое разнообразие возможных представлений, и можно выразить данную программу машины Тьюринга как последовательность машинных таблиц ( подробнее см. Конечный автомат , таблица переходов состояний и таблица управления ), как блок-схемы и драконовые диаграммы ( см. диаграмму для получения дополнительной информации) или как форму элементарного машинного кода или ассемблерного кода, называемого «наборами четверок» ( более подробную информацию см. в разделе «Машина Тьюринга »).

Представления алгоритмов можно разделить на три принятых уровня описания машины Тьюринга, а именно: [43]

1 Общее описание
«...проза описать алгоритм, игнорируя детали реализации. На этом уровне нам не нужно упоминать, как машина управляет своей лентой или головкой».
2 Описание реализации
«...проза использовалась для определения того, как машина Тьюринга использует свою голову и как она хранит данные на своей ленте. На этом уровне мы не даем подробностей о состояниях или функции перехода».
3 Формальное описание
Самый подробный, «самый низкий уровень», дает «таблицу состояний» машины Тьюринга.

Пример простого алгоритма «Сложить m+n», описанного на всех трех уровнях, см. в разделе «Примеры».

Дизайн

Разработка алгоритма относится к методу или математическому процессу решения проблем и разработки алгоритмов. Разработка алгоритмов является частью многих теорий решения, таких как «разделяй и властвуй» или динамическое программирование в рамках исследования операций . Методы проектирования и реализации алгоритмов также называются шаблонами проектирования алгоритмов [44] с примерами, включая шаблон метода шаблона и шаблон декоратора.

Одним из наиболее важных аспектов разработки алгоритмов является эффективность использования ресурсов (время выполнения, использование памяти); Обозначение «большое О» используется, например, для описания роста алгоритма во время выполнения по мере увеличения размера входных данных.

Типичные этапы разработки алгоритмов:

  1. Определение проблемы
  2. Разработка модели
  3. Спецификация алгоритма
  4. Разработка алгоритма
  5. Проверка правильности алгоритма
  6. Анализ алгоритма
  7. Реализация алгоритма
  8. Тестирование программы
  9. Подготовка документации [ необходимы разъяснения ]

Компьютерные алгоритмы

Логический алгоритм NAND реализован в электронном виде в чипе 7400.
Примеры блок-схем канонических структур Бема-Якопини : ПОСЛЕДОВАТЕЛЬНОСТЬ (прямоугольники, спускающиеся по странице), WHILE-DO и IF-THEN-ELSE. Эти три структуры состоят из примитивного условного GOTO ( IF test THEN GOTO step xxx, показанного ромбом), безусловного GOTO (прямоугольник), различных операторов присваивания (прямоугольник) и HALT (прямоугольник). Вложение этих структур внутри блоков присваивания приводит к образованию сложных диаграмм (ср. Tausworthe 1977: 100, 114).

«Элегантные» (компактные) программы, «хорошие» (быстрые) программы : Понятие «простота и элегантность» неофициально появляется у Кнута и именно у Хайтина :

Кнут: «...нам нужны хорошие алгоритмы в некотором свободно определенном эстетическом смысле. Одним из критериев... является время, необходимое для выполнения алгоритма.... Другими критериями являются адаптируемость алгоритма к компьютерам, его простота и элегантность и т. д.». [45]
Чайтин: «...программа «элегантна», под этим я подразумеваю, что это наименьшая возможная программа для получения результата, который она делает» [46]

Чайтин предваряет свое определение словами: «Я покажу, что невозможно доказать, что программа «элегантна » » — такое доказательство решило бы проблему остановки (там же).

Алгоритм и функция, вычислимая алгоритмом : для данной функции может существовать несколько алгоритмов. Это справедливо даже без расширения доступного программисту набора команд. Роджерс отмечает, что «... важно различать понятие алгоритма , то есть процедуры, и понятие функции, вычислимой алгоритмом , то есть отображения, полученного с помощью процедуры. Одна и та же функция может иметь несколько разных алгоритмов». [47]

К сожалению, может существовать компромисс между качеством (скоростью) и элегантностью (компактностью) — элегантная программа может выполнить больше шагов для завершения вычислений, чем менее элегантная. Ниже приведен пример использования алгоритма Евклида.

Компьютеры (и компьютеры), модели вычислений : Компьютер (или человеческий «компьютер» [48] ) — это машина ограниченного типа, «дискретное детерминированное механическое устройство» [49] , которое слепо следует своим инструкциям. [50] Примитивные модели Мельзака и Ламбека [51] свели это понятие к четырем элементам: (i) дискретные, различимые местоположения , (ii) дискретные, неразличимые счетчики [52] (iii) агент и (iv) список инструкций которые эффективны относительно возможностей агента. [53]

Мински описывает более подходящий вариант модели «абака» Ламбека в своей книге «Очень простые основы для вычислимости ». [54] Машина Мински последовательно выполняет свои пять (или шесть, в зависимости от того, как считать) инструкций, если только условный IF-THEN GOTO или безусловный GOTO не изменят ход программы вне последовательности. Помимо HALT, машина Мински включает три операции присваивания (замены, подстановки) [55] : ZERO (например, содержимое ячейки заменяется на 0: L ← 0), SUCCESSOR (например, L ← L+1) и DECREMENT (например, L ← L − 1). [56] Редко программисту приходится писать «код» с таким ограниченным набором команд. Но Минский показывает (как и Мельзак и Ламбек), что его машина Тьюринга имеет только четыре основных типа инструкций: условный GOTO, безусловный GOTO, присвоение/замена/подстановка и HALT. Однако для полноты по Тьюрингу также требуется несколько различных инструкций присваивания (например, DECREMENT, INCREMENT и ZERO/CLEAR/EMPTY для машины Мински); их точная спецификация в некоторой степени зависит от проектировщика. Безусловный GOTO удобен; его можно создать, инициализируя выделенную ячейку нулем, например, командой «Z ← 0»; после этого инструкция IF Z=0 THEN GOTO xxx является безусловной.

Моделирование алгоритма: компьютерный (компьютерный) язык : Кнут советует читателю, что «лучший способ изучить алгоритм — это попробовать его… немедленно возьмите ручку и бумагу и проработайте пример». [57] А как насчет симуляции или исполнения реальной вещи? Программист должен перевести алгоритм на язык, который сможет эффективно выполнять симулятор/компьютер/компьютер. Стоун приводит пример: при вычислении корней квадратного уравнения компьютер должен знать, как извлечь квадратный корень. Если это не так, то для того, чтобы алгоритм был эффективным, он должен предоставлять набор правил для извлечения квадратного корня. [58]

Это означает, что программист должен знать «язык», эффективный по отношению к целевому вычислительному агенту (компьютер/компьютер).

Но какую модель следует использовать для моделирования? Ван Эмде Боас отмечает, что «даже если мы основываем теорию сложности на абстрактных, а не на конкретных машинах, произвольность выбора модели сохраняется. Именно в этот момент вступает в силу понятие моделирования ». [59] При измерении скорости набор команд имеет значение. Например, подпрограмма в алгоритме Евклида для вычисления остатка выполнялась бы намного быстрее, если бы у программиста была доступна инструкция « модуля », а не просто вычитание (или, что еще хуже: просто «уменьшение» Мински).

Структурированное программирование, канонические структуры : Согласно тезису Чёрча-Тьюринга , любой алгоритм может быть вычислен с помощью модели, известной как полная по Тьюрингу , и, согласно демонстрациям Мински, полнота по Тьюрингу требует только четырех типов инструкций — условный GOTO, безусловный GOTO, присваивание, HALT. Кемени и Курц отмечают, что, хотя «недисциплинированное» использование безусловных GOTO и условных IF-THEN GOTO может привести к « спагетти-коду », программист может писать структурированные программы, используя только эти инструкции; с другой стороны, «также возможно и не слишком сложно писать плохо структурированные программы на структурированном языке». [60] Таусворт дополняет три канонические структуры Бема-Якопини : [61] ПОСЛЕДОВАТЕЛЬНОСТЬ, ЕСЛИ-ТО-ЛИБО и ПОКА-ДЕЛАТЬ, еще двумя: ДЕЛАТЬ-ПОКА и СЛУЧАЙ. [62] Дополнительным преимуществом структурированной программы является то, что ее корректность можно доказать с помощью математической индукции . [63]

Символы канонических блок-схем [64] : графическое средство, называемое блок-схемой, предлагает способ описания и документирования алгоритма (и соответствующей ему компьютерной программы). Подобно потоку программы на машине Мински, блок-схема всегда начинается вверху страницы и продолжается вниз. Его основных символов всего четыре: направленная стрелка, показывающая ход выполнения программы, прямоугольник (SEQUENCE, GOTO), ромб (IF-THEN-ELSE) и точка (ИЛИ-связь). Канонические структуры Бема – Якопини состоят из этих примитивных форм. Подструктуры могут «вкладываться» в прямоугольники, но только в том случае, если из надстройки происходит единственный выход. Символы и их использование для построения канонических структур показаны на схеме.

Примеры

Пример алгоритма

Один из простейших алгоритмов — найти наибольшее число в списке чисел случайного порядка. Чтобы найти решение, необходимо просмотреть каждое число в списке. Отсюда следует простой алгоритм, который можно сформулировать в высокоуровневом описании в английской прозе следующим образом:

Описание высокого уровня:

  1. Если в наборе нет чисел, то нет и старшего числа.
  2. Предположим, что первое число в наборе является самым большим числом в наборе.
  3. Для каждого оставшегося числа в наборе: если это число больше текущего самого большого числа, считайте это число самым большим числом в наборе.
  4. Если в наборе не осталось чисел для перебора, считайте, что текущее наибольшее число является самым большим числом в наборе.

(Квази-)формальное описание: Написанное прозой, но гораздо ближе к языку высокого уровня компьютерной программы, ниже приводится более формальное кодирование алгоритма в псевдокоде или пиджин-коде :

Алгоритм наибольшего числаВходные данные: список чисел L .Выходные данные: Самое большое число в списке L .
если  L.size = 0 вернуть нулевой наибольшийL [0] для каждого  элемента  в  L , сделать,  если  элемент > самый большой , то  самый большойэлемент вернуть  самый большой

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

В математике алгоритм Евклида или алгоритм Евклида — это эффективный метод вычисления наибольшего общего делителя (НОД) двух целых чисел (числ), наибольшего числа, которое делит их оба без остатка . Оно названо в честь древнегреческого математика Евклида , впервые описавшего его в своих «Началах» ( ок.  300 г. до н. э. ). [65] Это один из старейших широко используемых алгоритмов. Его можно использовать для приведения дробей к их простейшей форме , а также он является частью многих других теоретико-числовых и криптографических вычислений.

Пример диаграммы алгоритма Евклида от Т.Л. Хита (1908) с добавлением более подробной информации. Евклид не идет дальше третьего измерения и не приводит числовых примеров. Никомах приводит пример 49 и 21: «От большего вычитаю меньшее; остается 28; затем снова вычитаю из этого то же самое 21 (ибо это возможно); остается 7; вычитаю это из 21, 14 составляет осталось; из чего я снова вычитаю 7 (ибо это возможно); осталось 7, но 7 нельзя вычесть из 7». Хит комментирует: «Последняя фраза любопытна, но ее значение достаточно очевидно, как и значение фразы об окончании «на одно и то же число»» (Heath 1908:300).

Евклид ставит задачу так: «Давны два числа, не простые друг другу, найти их наибольшую общую меру». Он определяет «число, [чтобы быть] множеством, состоящим из единиц»: счетное число, положительное целое число, не включая ноль. «Измерить» значит разместить более короткую измерительную длину s последовательно ( q раз) вдоль большей длины l до тех пор, пока оставшаяся часть r не станет меньше более короткой длины s . [66] Говоря современными словами, остаток r = lq × s , q — частное, или остаток r — это «модуль», цело-дробная часть, оставшаяся после деления. [67]

Чтобы метод Евклида был успешным, начальные длины должны удовлетворять двум требованиям: (i) длины не должны быть равны нулю, И (ii) вычитание должно быть «правильным»; т. е. тест должен гарантировать, что меньшее из двух чисел вычитается из большего (или они могут быть равны, поэтому их вычитание дает ноль).

Первоначальное доказательство Евклида добавляет третье требование: две длины не должны быть простыми друг другу. Евклид оговорил это для того, чтобы построить доведение до абсурда доказательство того, что общая мера этих двух чисел на самом деле является наибольшей . [68] Хотя алгоритм Никомаха такой же, как и алгоритм Евклида, когда числа просты друг с другом, он дает число «1» для их общей меры. Итак, если быть точным, то на самом деле это алгоритм Никомаха.

Графическое выражение алгоритма Евклида по нахождению наибольшего общего делителя для 1599 и 650.
1599 = 650×2 + 299 650 = 299×2 + 52 299 = 52×5 + 39 52 = 39×1 + 1339 = 13×3 + 0

Компьютерный язык для алгоритма Евклида

Для выполнения алгоритма Евклида требуется всего несколько типов инструкций — некоторые логические проверки (условный переход), безусловный переход, присваивание (замена) и вычитание.

Неэлегантная программа для алгоритма Евклида

«Неэлегантный» - это перевод версии алгоритма Кнута с циклом остатка на основе вычитания, заменяющим его использование деления (или инструкции «модуля»). Получено из Кнута 1973: 2–4. В зависимости от двух чисел «Неэлегантный» может вычислить НОД за меньшее количество шагов, чем «Элегантный».

Следующий алгоритм оформлен как четырехшаговая версия алгоритмов Евклида и Никомаха, разработанная Кнутом, но вместо использования деления для нахождения остатка он использует последовательные вычитания более короткой длины s из оставшейся длины r до тех пор, пока r не станет меньше s . Описание высокого уровня, выделенное жирным шрифтом, адаптировано из Knuth 1973:2–4:

ВХОД :

1 [В две ячейки L и S поместите числа l и s , обозначающие две длины]:ВХОД Л, С2 [Инициализировать R: сделать оставшуюся длину r равной начальной/начальной/входной длине l ]:Р ← Л

E0: [Убедитесь, что rs .]

3 [Убедитесь, что меньшее из двух чисел находится в S, а большее – в R]:ЕСЛИ R > S, ТОсодержимое L — это большее число, поэтому пропустите шаги обмена 4, 5 и 6:ПЕРЕЙТИ К шагу 7ЕЩЕпоменяйте местами содержимое R и S.4 L ← R (этот первый шаг излишен, но полезен для дальнейшего обсуждения).5 Р ← С6 С ← Л

E1: [Найти остаток] : до тех пор, пока оставшаяся длина r в R не станет меньше более короткой длины s в S, несколько раз вычтите число измерений s в S из оставшейся длины r в R.

7 ЕСЛИ S > R ТОзакончил измерения, так чтоПЕРЕЙТИ К 10ЕЩЕизмерьте еще раз,8 Р ← Р - С9 [Остаточный цикл]:ПЕРЕЙДИТЕ К 7.

E2: [Остаток равен нулю?] : ЛИБО (i) последнее измерение было точным, остаток в R равен нулю, и программа может остановиться, ИЛИ (ii) алгоритм должен продолжить работу: последнее измерение оставило остаток в R меньше, чем измерительное число в S.

10 ЕСЛИ R = 0 ТОсделал этоПЕРЕЙДИТЕ к шагу 15ЕЩЕПРОДОЛЖАЙТЕ К шагу 11,

E3: [Поменять местами s и r ] : суть алгоритма Евклида. Используйте остаток r для измерения того, что ранее было меньшим числом s ; L служит временным местом.

11 Л ← П12 Р ← С13 С ← Л14 [Повторите процесс измерения]:ПЕРЕЙТИ К 7

ВЫХОД :

15 [Готово. S содержит наибольший общий делитель ]:ПЕЧАТЬ С

СДЕЛАННЫЙ :

16 СТОП, КОНЕЦ, СТОП.

Элегантная программа для алгоритма Евклида

Следующая версия алгоритма Евклида требует всего шесть основных инструкций, чтобы выполнить то, что для «Неэлегантного» требуется тринадцать; хуже того, «Неэлегантный» требует больше типов инструкций. [ уточнить ] Блок-схему «Elegant» можно найти вверху этой статьи. В (неструктурированном) языке Basic шаги пронумерованы, а инструкция представляет собой инструкцию присваивания, обозначенную ←.LET [] = []

5 REM Алгоритм Евклида для определения наибольшего общего делителя 6 PRINT «Введите два целых числа больше 0» 10 INPUT A , B 20 IF B = 0 THEN GOTO 80 30 IF A > B THEN GOTO 60 40 LET B = B - A 50 GOTO 20 60 ПУСТЬ A = A - B 70 ПЕРЕХОД К 20 80 ПЕЧАТЬ A 90 КОНЕЦ                            

Как работает «Элегантный» : вместо внешнего «евклидового цикла» «Элегантный» вычисляет остаток от деления по модулю и сдвигает переменные A и B на каждой итерации. Следующий алгоритм можно использовать с языками программирования семейства C :

// Алгоритм Евклида для определения наибольшего общего делителя int euclidAlgorithm ( int A , int B ) { A = abs ( A ); В = абс ( В ); если ( A == 0 || B == 0 ) { return 0 ; } do { int res = A % B ; А = Б ; Б = рез ; } Пока ( B > 0 ); вернуть А ;                                               

Тестирование алгоритмов Евклида

Делает ли алгоритм то, чего хочет его автор? Несколько тестовых случаев обычно дают некоторую уверенность в основных функциях. Но тестов недостаточно. Для тестовых случаев один источник [69] использует числа 3009 и 884. Кнут предложил 40902, 24140. Другой интересный случай — два относительно простых числа 14157 и 5950.

Но «исключительные случаи» [70] необходимо выявлять и проверять. Будет ли «Неэлегантный» работать правильно, когда R > S, S > R, R = S? То же самое для «Элегантного»: B > A, A > B, A = B? (Да для всех). Что произойдет, если одно число равно нулю, а оба числа равны нулю? («Неэлегантный» вычисляет всегда во всех случаях; «Элегантный» вычисляет всегда, когда A = 0.) Что произойдет, если введены отрицательные числа? Дробные числа? Если входные числа, т. е. область определения функции, вычисленной алгоритмом/программой, должны включать только положительные целые числа, включая ноль, то сбои в нуле указывают на то, что алгоритм (и программа, которая его реализует ) является частичной функцией, а не общая функция . Заметной неудачей из-за исключений является авария ракеты Ariane 5 рейса 501 (4 июня 1996 г.).

Доказательство правильности программы с помощью математической индукции : Кнут демонстрирует применение математической индукции к «расширенной» версии алгоритма Евклида и предлагает «общий метод, применимый для доказательства достоверности любого алгоритма». [71] Таусворт предлагает, чтобы мерой сложности программы была длина доказательства ее корректности. [72]

Измерение и улучшение алгоритмов Евклида

Элегантность (компактность) против качества (скорость) . Имея всего шесть основных инструкций, «Элегантный» является явным победителем по сравнению с «Неэлегантным» с тринадцатью инструкциями. Однако «Неэлегантный» быстрее (он достигает HALT за меньшее количество шагов). Анализ алгоритма [73] показывает, почему это так: «Элегантный» выполняет две условные проверки в каждом цикле вычитания, тогда как «Неэлегантный» выполняет только одну. Поскольку алгоритм (обычно) требует множества проходов, в среднем много времени тратится на выполнение «B = 0?» тест, который необходим только после вычисления остатка.

Можно ли улучшить алгоритмы? : Как только программист считает программу «подходящей» и «эффективной», то есть вычисляет функцию, задуманную ее автором, возникает вопрос: можно ли ее улучшить?

Компактность «Неэлегантного» можно улучшить, исключив пять ступеней. Но Чайтин доказал, что сжатие алгоритма не может быть автоматизировано с помощью обобщенного алгоритма; [74] скорее, это можно сделать только эвристически ; т. е. путем исчерпывающего поиска (примеры можно найти в Busy Beaver ), проб и ошибок, сообразительности, проницательности, применения индуктивных рассуждений и т. д. Обратите внимание, что шаги 4, 5 и 6 повторяются в шагах 11, 12 и 13. Сравнение с «Элегантный» подсказывает, что эти шаги вместе с шагами 2 и 3 можно исключить. Это уменьшает количество основных инструкций с тринадцати до восьми, что делает его «более элегантным», чем «Элегантный», с девятью шагами.

Скорость «Элегантного» можно улучшить, переместив «B=0?» тест за пределами двух циклов вычитания. Это изменение требует добавления трех инструкций (B = 0?, A = 0?, GOTO). Теперь «Elegant» быстрее вычисляет числа примеров; всегда ли это так для любых данных A, B и R, S потребует детального анализа.

Алгоритмический анализ

Часто важно знать, сколько определенного ресурса (например, времени или памяти) теоретически требуется для данного алгоритма. Разработаны методы анализа алгоритмов получения таких количественных ответов (оценок); например, алгоритм, который складывает элементы списка из n чисел, потребует времени , используя обозначение большого О. Алгоритму всегда нужно помнить только два значения: сумму всех элементов на данный момент и его текущую позицию во входном списке. Поэтому говорят, что требуется пространство , равное , если пространство, необходимое для хранения входных чисел, не учитывается или если оно учитывается.

Разные алгоритмы могут выполнять одну и ту же задачу с разным набором инструкций за меньшее или большее время, пространство или « усилия », чем другие. Например, алгоритм двоичного поиска (со стоимостью ) превосходит последовательный поиск (стоимостью ) при использовании для поиска по таблицам в отсортированных списках или массивах.

Формальный против эмпирического

Анализ и изучение алгоритмов — это дисциплина информатики , которая часто практикуется абстрактно, без использования конкретного языка программирования или реализации. В этом смысле анализ алгоритмов похож на другие математические дисциплины, поскольку он фокусируется на основных свойствах алгоритма, а не на особенностях какой-либо конкретной реализации. Обычно для анализа используется псевдокод , поскольку это самое простое и общее представление. Однако в конечном итоге большинство алгоритмов обычно реализуются на определенных аппаратных/программных платформах, и их алгоритмическая эффективность в конечном итоге проверяется с использованием реального кода. Для решения «разовой» проблемы эффективность конкретного алгоритма может не иметь существенных последствий (если только n не чрезвычайно велико), но для алгоритмов, предназначенных для быстрого интерактивного, коммерческого или длительного научного использования, это может иметь решающее значение. Масштабирование от маленького n до большого n часто приводит к появлению неэффективных алгоритмов, которые в остальном безвредны.

Эмпирическое тестирование полезно, поскольку оно может выявить неожиданные взаимодействия, влияющие на производительность. Тесты можно использовать для сравнения возможных улучшений алгоритма до/после после оптимизации программы. Однако эмпирические тесты не могут заменить формальный анализ, и их не так просто выполнить честно. [75]

Эффективность исполнения

Чтобы проиллюстрировать потенциальные улучшения, возможные даже в хорошо зарекомендовавших себя алгоритмах, недавнее значительное нововведение, касающееся алгоритмов БПФ (широко используемых в области обработки изображений), может сократить время обработки до 1000 раз для таких приложений, как медицинская визуализация. [76] В общем, повышение скорости зависит от особых свойств задачи, которые очень распространены в практических приложениях. [77] Ускорение такого масштаба позволяет вычислительным устройствам, широко использующим обработку изображений (например, цифровым камерам и медицинскому оборудованию), потреблять меньше энергии.

Классификация

Существуют различные способы классификации алгоритмов, каждый из которых имеет свои преимущества.

По реализации

Один из способов классификации алгоритмов — по средствам реализации.

Рекурсия
Рекурсивный алгоритм — это алгоритм, который неоднократно вызывает себя (ссылается на него) до тех пор, пока не будет достигнуто определенное условие (также известное как условие завершения), что является общим методом функционального программирования . Итеративные алгоритмы используют повторяющиеся конструкции, такие как циклы , а иногда и дополнительные структуры данных, такие как стеки, для решения заданных задач. Некоторые задачи естественным образом подходят для той или иной реализации. Например, Ханойские башни хорошо понимаются с помощью рекурсивной реализации. Каждая рекурсивная версия имеет эквивалентную (но, возможно, более или менее сложную) итеративную версию, и наоборот.
Последовательный, параллельный или распределенный
Алгоритмы обычно обсуждаются в предположении, что компьютеры выполняют одну инструкцию алгоритма за раз. Эти компьютеры иногда называют последовательными компьютерами. Алгоритм , разработанный для такой среды, называется последовательным алгоритмом, в отличие от параллельных алгоритмов или распределенных алгоритмов . Параллельные алгоритмы — это алгоритмы, использующие преимущества компьютерной архитектуры, в которой несколько процессоров могут одновременно работать над проблемой. Распределенные алгоритмы — это алгоритмы, в которых используются несколько машин, подключенных к компьютерной сети. Параллельные и распределенные алгоритмы делят проблему на более симметричные или асимметричные подзадачи и собирают результаты обратно. Например, ЦП может быть примером параллельного алгоритма. Потребление ресурсов в таких алгоритмах — это не только циклы работы каждого процессора, но и накладные расходы на связь между процессорами. Некоторые алгоритмы сортировки можно эффективно распараллелить, но их связь требует больших затрат. Итеративные алгоритмы, как правило, поддаются распараллеливанию, но некоторые задачи не имеют параллельных алгоритмов и называются по своей сути последовательными задачами.
Детерминированный или недетерминированный
Детерминированные алгоритмы решают задачу с точным решением на каждом этапе алгоритма, тогда как недетерминированные алгоритмы решают проблемы путем угадывания, хотя типичные предположения становятся более точными за счет использования эвристики .
Точный или приблизительный
Хотя многие алгоритмы достигают точного решения, алгоритмы аппроксимации ищут приближение, которое ближе к истинному решению. Аппроксимация может быть достигнута с использованием детерминированной или случайной стратегии. Такие алгоритмы имеют практическую ценность для решения многих сложных задач. Одним из примеров приближенного алгоритма является задача о рюкзаке , где имеется набор заданных предметов. Его цель – упаковать рюкзак так, чтобы получить максимальную общую ценность. Каждый предмет имеет некоторый вес и некоторую ценность. Общий вес, который можно перевезти, не превышает некоторого фиксированного числа X. Таким образом, решение должно учитывать вес предметов, а также их стоимость. [78]
Квантовый алгоритм
Они работают на реалистичной модели квантовых вычислений . Этот термин обычно используется для тех алгоритмов, которые по своей сути кажутся квантовыми или используют некоторые существенные особенности квантовых вычислений , такие как квантовая суперпозиция или квантовая запутанность .

По дизайнерской парадигме

Другой способ классификации алгоритмов — по методологии или парадигме их проектирования . Существует определенное количество парадигм, каждая из которых отличается от другой. Более того, каждая из этих категорий включает в себя множество различных типов алгоритмов. Некоторые распространенные парадигмы:

Грубая сила или полный перебор
Грубая сила — это метод решения проблем, который включает в себя систематическое перебор всех возможных вариантов, пока не будет найдено оптимальное решение. Этот подход может занять очень много времени, поскольку требует анализа всех возможных комбинаций переменных. Однако его часто используют, когда другие методы недоступны или слишком сложны. Грубую силу можно использовать для решения множества задач, включая поиск кратчайшего пути между двумя точками и взлом паролей.
Разделяй и властвуй
Алгоритм «разделяй и властвуй» неоднократно сводит экземпляр проблемы к одному или нескольким более мелким экземплярам той же проблемы (обычно рекурсивно ), пока экземпляры не станут достаточно маленькими, чтобы их можно было легко решить. Одним из таких примеров принципа «разделяй и властвуй» является сортировка слиянием . Сортировка может выполняться для каждого сегмента данных после разделения данных на сегменты, а сортировка всех данных может быть получена на этапе захвата путем объединения сегментов. Более простой вариант «разделяй и властвуй» называется алгоритмом «уменьшай и властвуй» , который решает идентичную подзадачу и использует решение этой подзадачи для решения более крупной проблемы. Метод «разделяй и властвуй» делит проблему на несколько подзадач, поэтому этап завоевания более сложен, чем алгоритмы «уменьшай и властвуй». Примером алгоритма уменьшения и завоевания является алгоритм бинарного поиска .
Поиск и перечисление
Многие задачи (например, игра в шахматы ) можно смоделировать как задачи на графах . Алгоритм исследования графа определяет правила перемещения по графу и полезен для решения таких задач. В эту категорию также входят алгоритмы поиска , перечисление ветвей и границ и возврат .
Рандомизированный алгоритм
Такие алгоритмы делают некоторые выборы случайным (или псевдослучайным) образом. Они могут быть очень полезны при поиске приближенных решений задач, для которых поиск точных решений может быть непрактичным (см. эвристический метод ниже). Известно, что для некоторых из этих задач самые быстрые приближения должны включать в себя некоторую случайность . [79] Могут ли рандомизированные алгоритмы с полиномиальной временной сложностью быть самыми быстрыми алгоритмами для некоторых задач — открытый вопрос, известный как проблема P и NP . Существует два больших класса таких алгоритмов:
  1. Алгоритмы Монте-Карло возвращают правильный ответ с высокой вероятностью. Например , RP является их подклассом, который работает за полиномиальное время .
  2. Алгоритмы Лас-Вегаса всегда возвращают правильный ответ, но время их работы ограничено только вероятностно, например ZPP .
Уменьшение сложности
Этот метод предполагает решение сложной проблемы путем преобразования ее в более известную задачу, для которой у нас есть (надеюсь) асимптотически оптимальные алгоритмы. Цель состоит в том, чтобы найти сокращающий алгоритм, сложность которого не будет зависеть от результирующего сокращенного алгоритма. Например, один из алгоритмов выбора для поиска медианы в несортированном списке включает сначала сортировку списка (дорогая часть), а затем извлечение среднего элемента из отсортированного списка (дешевая часть). Эта техника также известна как трансформация и завоевание .
обратное отслеживание
В этом подходе несколько решений создаются постепенно и от них отказываются, когда выясняется, что они не могут привести к действительному полному решению.

Проблемы оптимизации

Для задач оптимизации существует более конкретная классификация алгоритмов; алгоритм решения таких задач может относиться к одной или нескольким общим категориям, описанным выше, а также к одному из следующих:

Линейное программирование
При поиске оптимальных решений линейной функции, связанной с ограничениями линейного равенства и неравенства, ограничения задачи могут быть использованы непосредственно для получения оптимальных решений. Существуют алгоритмы, способные решить любую задачу этой категории, например популярный симплекс-алгоритм . [80] Проблемы, которые можно решить с помощью линейного программирования, включают задачу максимального потока для ориентированных графов. Если задача дополнительно требует, чтобы одно или несколько неизвестных были целыми числами , тогда это классифицируется как целочисленное программирование . Алгоритм линейного программирования может решить такую ​​задачу, если можно доказать, что все ограничения на целочисленные значения поверхностны, т. е. решения в любом случае удовлетворяют этим ограничениям. В общем случае используется специализированный алгоритм или алгоритм, находящий приближенные решения, в зависимости от сложности задачи.
Динамическое программирование
Когда проблема имеет оптимальные подструктуры (это означает, что оптимальное решение проблемы может быть построено из оптимальных решений подзадач) и перекрывающиеся подзадачи (то есть одни и те же подзадачи используются для решения многих разных экземпляров проблемы), более быстрый подход, называемый динамическим программированием, позволяет избежать повторного вычисления решений, которые уже вычислены. Например, алгоритм Флойда-Уоршалла , кратчайший путь к цели из вершины во взвешенном графе можно найти, используя кратчайший путь к цели из всех соседних вершин. Динамическое программирование и мемоизация идут рука об руку. Основное различие между динамическим программированием и «разделяй и властвуй» заключается в том, что подзадачи в «разделяй и властвуй» более или менее независимы, тогда как в динамическом программировании подзадачи перекрываются. Разница между динамическим программированием и простой рекурсией заключается в кэшировании или запоминании рекурсивных вызовов. Когда подзадачи независимы и нет повторения, запоминание не помогает; следовательно, динамическое программирование не является решением всех сложных проблем. Используя мемоизацию или ведение таблицы уже решенных подзадач, динамическое программирование сводит экспоненциальный характер многих задач к полиномиальной сложности.
Жадный метод
Жадный алгоритм похож на алгоритм динамического программирования тем, что он работает, исследуя подструктуры, в данном случае не проблемы, а заданного решения. Такие алгоритмы начинаются с некоторого решения, которое может быть задано или было построено каким-либо образом, и улучшают его путем внесения небольших модификаций. Для некоторых задач они могут найти оптимальное решение, а для других останавливаются на локальных оптимумах , то есть на решениях, которые не могут быть улучшены алгоритмом, но не являются оптимальными. Наиболее популярное использование жадных алгоритмов — поиск минимального остовного дерева, где с помощью этого метода возможно найти оптимальное решение. Huffman Tree , Kruskal , Prim , Sollin — жадные алгоритмы, способные решить эту задачу оптимизации.
Эвристический метод
В задачах оптимизации эвристические алгоритмы могут использоваться для поиска решения, близкого к оптимальному, в тех случаях, когда поиск оптимального решения нецелесообразен. Эти алгоритмы работают, все ближе и ближе приближаясь к оптимальному решению по мере своего развития. В принципе, если бежать бесконечное количество времени, они найдут оптимальное решение. Их заслуга в том, что они могут за относительно короткое время найти решение, очень близкое к оптимальному. К таким алгоритмам относятся локальный поиск , поиск с запретами , имитация отжига и генетические алгоритмы . Некоторые из них, например имитация отжига, являются недетерминированными алгоритмами, тогда как другие, например поиск с запретами, являются детерминированными. Когда известна граница ошибки неоптимального решения, алгоритм далее классифицируется как алгоритм аппроксимации .

По области обучения

Каждая область науки имеет свои проблемы и нуждается в эффективных алгоритмах. Связанные проблемы в одной области часто изучаются вместе. Некоторыми примерами классов являются алгоритмы поиска , алгоритмы сортировки , алгоритмы слияния , числовые алгоритмы , графовые алгоритмы , строковые алгоритмы , вычислительные геометрические алгоритмы , комбинаторные алгоритмы , медицинские алгоритмы , машинное обучение , криптография , алгоритмы сжатия данных и методы синтаксического анализа .

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

По сложности

Алгоритмы можно классифицировать по количеству времени, которое им необходимо для выполнения, по сравнению с размером входных данных:

Некоторые задачи могут иметь несколько алгоритмов разной сложности, в то время как другие задачи могут не иметь алгоритмов или не иметь известных эффективных алгоритмов. Также существуют отображения некоторых проблем на другие проблемы. Благодаря этому оказалось более целесообразным классифицировать сами задачи, а не алгоритмы, на классы эквивалентности на основе сложности наилучших возможных алгоритмов для них.

Непрерывные алгоритмы

Прилагательное «непрерывный» в применении к слову «алгоритм» может означать:

Алгоритм = Логика + Управление

В логическом программировании алгоритмы рассматриваются как имеющие как «логический компонент, который определяет знания, которые будут использоваться при решении проблем, так и компонент управления, который определяет стратегии решения проблем, посредством которых эти знания используются». [82]

Алгоритм Евклида иллюстрирует такой взгляд на алгоритм. [83] [84] Вот представление логического программирования, в котором используется :- для обозначения «if» и отношение gcd(A, B, C) для представления функции gcd(A, B) = C:

НОД ( А ,  А ,  А ). НОД ( A ,  B ,  C )  :-  A  >  B ,  НОД ( A - B ,  B ,  C ). НОД ( A ,  B ,  C )  :-  B  >  A ,  НОД ( A ,  B - A ,  C ).

В языке логического программирования Ciao отношение НОД может быть представлено непосредственно в функциональной записи:

НОД ( А ,  А )  :=  А . НОД ( A ,  B )  :=  НОД ( A - B ,  B )  :-  A  >  B . НОД ( A ,  B )  :=  НОД ( A ,  B - A )  :-  B  >  A .

Реализация Ciao преобразует функциональную нотацию в реляционное представление на Прологе , извлекая встроенные вычитания AB и BA как отдельные условия:

НОД(А, А, А).НОД(A, B, C):- A > B, A' есть AB, gcd(A', B, C).НОД(А, В, С):- В > А, В' есть ВА, НОД(А, В, С).

Результирующая программа имеет чисто логическое«декларативное» ) чтение как рекурсивное (или индуктивное) определение, независимое от того, как логика используется для решения задач:

НОД чисел A и A равен A.НОД A и B равен C, если A > B и A' равен AB, а НОД A' и B равен C.НОД A и B равен C, если B > A и B' равен BA, а НОД A и B' равен C.

Различные стратегии решения проблем превращают логику в разные алгоритмы. Теоретически, учитывая пару целых чисел A и B, рассуждения вперед (или «снизу вверх») могут использоваться для генерации всех экземпляров отношения НОД, завершающегося, когда генерируется желаемый НОД из A и B. Конечно, предварительные рассуждения в этом случае совершенно бесполезны. Но в других случаях, таких как определение последовательности Фибоначчи [82] и Datalog , предварительные рассуждения могут быть эффективной стратегией решения проблем. (См., например, логическую программу для вычисления чисел Фибоначчи в Algorithm = Logic + Control ).

В отличие от неэффективности прямого рассуждения в этом примере, обратное (или «сверху вниз») рассуждение с использованием разрешения SLD превращает логику в алгоритм Евклида:

Чтобы найти НОД C двух заданных чисел A и B:Если А = В, то С = А.Если A > B, то пусть A' = AB и найдите НОД A' и B, который равен C.Если B > A, то пусть B' = BA и найдите НОД A и B', который равен C.

Одним из преимуществ представления алгоритма в виде логического программирования является то, что его чисто логическое чтение облегчает проверку правильности алгоритма по сравнению со стандартным нерекурсивным определением НОД. [83] Вот стандартное определение, написанное на Прологе:

НОД ( A ,  B ,  C )  :-  делит ( C ,  A ),  делит ( C ,  B ),  forall (( делит ( D ,  A ),  делит ( D ,  B )),  D  =<  C ).  делит ( C ,  Number )  :-  между ( 1 ,  Number ,  C ),  0  - это  число  по модулю  C .

Это определение, которое является спецификацией алгоритма Евклида, также можно выполнить на Прологе: обратные рассуждения рассматривают спецификацию как алгоритм грубой силы, который перебирает все целые числа C от 1 до A, проверяя, делит ли C оба A и B. , а затем для каждого такого C снова перебирает все целые числа D между 1 и A, пока не найдет C такое, что C больше или равно всем D, которые также делят A и B. Хотя этот алгоритм безнадежно неэффективен, он показывает, что формальные спецификации часто могут быть написаны в форме логического программирования и могут выполняться на Прологе для проверки того, что они правильно представляют неформальные требования .

Правовые вопросы

Сами по себе алгоритмы обычно не патентоспособны. В Соединенных Штатах заявка, состоящая исключительно из простых манипуляций с абстрактными понятиями, числами или сигналами, не представляет собой «процессы» (USPTO 2006), поэтому алгоритмы не подлежат патентованию (как в деле Готшалк против Бенсона ). Однако практическое применение алгоритмов иногда патентоспособно. Например, в деле Даймонд против Дира применение простого алгоритма обратной связи для отверждения синтетического каучука было признано патентоспособным. Патентование программного обеспечения является спорным [85] , и существуют критикуемые патенты, связанные с алгоритмами, особенно алгоритмами сжатия данных , такие как патент Unisys LZW .

Кроме того, некоторые криптографические алгоритмы имеют ограничения на экспорт (см. экспорт криптографии ).

История: Развитие понятия «алгоритм».

Древний Ближний Восток

Самые ранние свидетельства существования алгоритмов можно найти в вавилонской математике древней Месопотамии (современный Ирак). Шумерская глиняная табличка , найденная в Шуруппаке недалеко от Багдада и датированная ок.  В 2500 году до нашей эры был описан самый ранний алгоритм деления . [11] Во времена династии Хаммурапи ок.  1800  – ок.  1600 г. до н.э. на вавилонских глиняных табличках описаны алгоритмы вычисления формул . [86] Алгоритмы также использовались в вавилонской астрономии . Вавилонские глиняные таблички описывают и используют алгоритмические процедуры для расчета времени и места важных астрономических событий. [87]

Алгоритмы арифметики также встречаются в древнеегипетской математике , начиная с Математического папируса Ринда ок.  1550 г. до н.э. [11] Позднее алгоритмы использовались в древней эллинистической математике . Двумя примерами являются Решето Эратосфена , которое было описано во «Введении в арифметику» Никомаха , [88] [14] : Глава 9.2  , и алгоритм Евклида , который был впервые описан в «Началах» Евклида ( ок.  300 г. до н. э .). [14] : Глава 9.1. 

Дискретные и различимые символы

Метки для подсчета: Чтобы отслеживать свои стада, мешки с зерном и деньги, древние использовали подсчет: накапливали камни или отметки, нацарапанные на палках, или делали отдельные символы из глины. Благодаря использованию знаков и символов вавилонянами и египтянами в конечном итоге появились римские цифры и счеты (Дилсон, стр. 16–41). Метки счета занимают видное место в арифметике унарной системы счисления, используемой в вычислениях на машине Тьюринга и машине Пост-Тьюринга .

Манипулирование символами как «заполнителями» чисел: алгебра

Мухаммад ибн Муса аль-Хорезми , персидский математик , написал « Аль-Джабр» в 9 веке. Термины « алгоризм » и «алгоритм» произошли от имени аль-Хваризми, а термин « алгебра » — из книги «Аль-Джабр» . В Европе слово «алгоритм» первоначально использовалось для обозначения набора правил и методов, используемых Аль-Хорезми для решения алгебраических уравнений, а затем было обобщено для обозначения любого набора правил или методов. [89] В конечном итоге это привело к появлению у Лейбница идеи рационального исчисления ( около  1680 г. ):

На полтора столетия опередив свое время, Лейбниц предложил алгебру логики, алгебру, которая определяла бы правила манипулирования логическими понятиями так же, как обычная алгебра определяет правила манипулирования числами. [90]

Криптографические алгоритмы

Первый криптографический алгоритм дешифрования зашифрованного кода был разработан Аль-Кинди , арабским математиком 9-го века , в «Рукописи о расшифровке криптографических сообщений» . Он дал первое описание криптоанализа с помощью частотного анализа , самого раннего алгоритма взлома кода . [15]

Механические устройства с дискретными состояниями

Часы : Болтер считает изобретение часов с весовым приводом «ключевым изобретением [Европы в средние века]», в частности, спусковой механизм [91] , который обеспечивает нам тикание и такт механических часов. «Точная автоматическая машина» [92] немедленно привела к «механическим автоматам », начиная с XIII века, и, наконец, к «вычислительным машинам» — разностной машине и аналитическим машинам Чарльза Бэббиджа и графини Ады Лавлейс , середина XIX века. [93] Лавлейсу приписывают первое создание алгоритма, предназначенного для обработки на компьютере — аналитической машины Бэббиджа, первого устройства, считавшегося настоящим Тьюринг-полным компьютером, а не просто калькулятором — и иногда его называют «первым программистом в истории», как В результате, хотя полная реализация второго устройства Бэббиджа будет реализована только спустя десятилетия после ее жизни.

Логические машины 1870 г. – «Логические счеты» и «логическая машина» Стэнли Джевонса : техническая проблема заключалась в сокращении булевых уравнений , когда они представлены в форме, аналогичной тому, что сейчас известно как карты Карно . Джевонс (1880) описывает сначала простые «счеты» из «деревянных пластинок, снабженных булавками, устроенных так, чтобы любую часть или класс [логических] комбинаций можно было выбрать механически ... Однако совсем недавно я сократил систему в полностью механическую форму и, таким образом, воплотили весь косвенный процесс вывода в том, что можно назвать логической машиной . фортепиано [и т. д.]…». С помощью этой машины он мог проанализировать « силлогизм или любой другой простой логический аргумент». [94]

Эту машину он продемонстрировал в 1870 году членам Королевского общества. [95] Другой логик, Джон Венн , однако, в своей книге «Символическая логика» 1881 года предвзято отнесся к этим усилиям: «Я не слишком высоко оцениваю интерес или важность того, что иногда называют логическими машинами… это не кажется Я считаю, что любые устройства, известные в настоящее время или которые могут быть открыты, действительно заслуживают названия логических машин»; подробнее см. в разделе «Характеристики алгоритмов» . Но чтобы не отставать, он также представил «план, несколько аналогичный, насколько я понимаю, счетам профессора Джевона [И] [а] выигрыш, соответствующий логической машине профессора Джевонса, можно описать следующее изобретение. Я предпочитаю называть ее просто машиной логических диаграмм... но я полагаю, что она могла бы делать в полной мере все, что можно рационально ожидать от любой логической машины». [96]

Жаккардовый ткацкий станок, перфокарты Холлерита, телеграфия и телефония - электромеханическое реле : Белл и Ньюэлл (1971) указывают, что жаккардовый ткацкий станок (1801 г.), предшественник карт Холлерита (перфокарты, 1887 г.), и «технологии телефонной коммутации» были корнями дерева, что привело к созданию первых компьютеров. [97] К середине 19-го века телеграф , предшественник телефона, использовался во всем мире, его дискретное и различимое кодирование букв в виде «точек и тире» было обычным звуком. К концу 19 века использовалась бегущая лента ( около  1870-х годов ), а также карты Холлерита при переписи населения США 1890 года. Затем появился телетайп ( ок.  1910 г. ) с перфолентой, в которой код Бодо был записан на ленте.

Телефонно-коммутационные сети электромеханических реле (изобретены в 1835 г.) легли в основу работ Джорджа Стибица (1937 г.), изобретателя цифрового суммирующего устройства. Работая в Bell Laboratories, он наблюдал «обременительное» использование механических калькуляторов с шестернями. «Однажды вечером в 1937 году он пошел домой, намереваясь проверить свою идею… Когда работа была окончена, Стибиц сконструировал устройство двоичного сложения». [98 ]

Математик Мартин Дэвис отмечает особую важность электромеханического реле (с двумя его «двоичными состояниями» — разомкнутым и замкнутым ):

И только с разработкой, начавшейся в 1930-х годах, электромеханических калькуляторов, использующих электрические реле, машины были построены так, как предполагал Бэббидж» .

Математика в период с XIX до середины XX века.

Символы и правила . Математика Джорджа Буля (1847, 1854), Готтлоба Фреге (1879) и Джузеппе Пеано (1888–1889) в быстрой последовательности свела арифметику к последовательности символов, управляемых правилами. «Принципы арифметики» Пеано , изложенные новым методом (1888 г.), были «первой попыткой аксиоматизации математики на символическом языке ». [100]

Но Хейеноорт отдает должное Фреге (1879): «Это, пожалуй, самая важная работа, когда-либо написанная по логике... в которой мы видим « язык формул», то есть lingua характерика , язык, написанный специальными символами. «для чистой мысли», то есть свободной от риторических украшений... построенной из конкретных символов , которыми манипулируют в соответствии с определенными правилами » . их Principia Mathematica (1910–1913).

Парадоксы : В то же время в литературе появился ряд тревожных парадоксов, в частности парадокс Бурали-Форти (1897), парадокс Рассела (1902–03) и парадокс Ричарда . [102] Полученные соображения привели к появлению статьи Курта Гёделя (1931) — он конкретно цитирует парадокс лжеца — которая полностью сводит правила рекурсии к числам.

Эффективная вычислимость . Пытаясь решить проблему Entscheidungsproblem , определенную Гильбертом в 1928 году, математики сначала приступили к определению того, что подразумевается под «эффективным методом», или «эффективным расчетом», или «эффективной вычислимостью» (т. е. расчетом, который приведет к успеху). ). В быстрой последовательности появились следующие: Алонсо Чёрч , Стивен Клини и Дж. Б. Россер , λ-исчисление [103] — тонко отточенное определение «общей рекурсии» из работы Гёделя, действующее на основе предложений Жака Эрбрана (ср. Принстонские лекции Гёделя в 1934) и последующие упрощения Клини. [104] Доказательство Чёрча [105] о том, что проблема Entscheidungsproblem неразрешима, определение Эмилем Постом эффективной вычислительной способности, когда рабочий бездумно следует списку инструкций, чтобы двигаться влево или вправо через последовательность комнат и в то же время либо отмечать, либо стирать бумагу. или просмотрите бумагу и примите решение «да» или «нет» относительно следующей инструкции. [106] Доказательство Алана Тьюринга неразрешимости проблемы Entscheidungsproblem с помощью его «автоматической машины» [107] — по сути, почти идентично «формулировке» Поста, определению «эффективного метода», данному Дж. Баркли Россером. «в смысле «машина». [108] Предложение Клини о предшественнике « Тезиса Чёрча », который он назвал «Тезисом I», [109] и несколько лет спустя Клини переименовал свою диссертацию в «Тезис Чёрча» [110] и предложил «Тезис Тьюринга». [111]

Эмиль Пост (1936) и Алан Тьюринг (1936–37, 1939)

Эмиль Пост (1936) описал действия «компьютера» (человека) следующим образом:

«...здесь задействованы две концепции: концепция символического пространства , в котором должна выполняться работа, ведущая от проблемы к ответу, и фиксированный неизменяемый набор направлений .

Его символическое пространство будет

«двусторонняя бесконечная последовательность пространств или блоков... Решатель проблем или рабочий должен двигаться и работать в этом символьном пространстве, имея возможность находиться и действовать только в одном блоке за раз. ... ящик значит допускать только два возможных состояния, т. е. быть пустым или немаркированным и иметь одну отметку, скажем, вертикальную черту.
«Одну ячейку следует выделить и назвать отправной точкой... конкретная проблема должна быть задана в символической форме с помощью конечного числа ячеек [т. е. ВХОД], отмеченных штрихом. Аналогично, ответ [т. е. , OUTPUT] должно быть задано в символической форме с помощью такой конфигурации отмеченных полей...
«Набор направлений, применимых к общей проблеме, устанавливает детерминированный процесс при применении к каждой конкретной проблеме. Этот процесс завершается только тогда, когда дело доходит до направления типа (C) [т. е. СТОП]». [112] Подробнее см. на странице «Машина Пост-Тьюринга».
Статуя Алана Тьюринга в Блетчли-парке

Работа Алана Тьюринга [113] предшествовала работе Стибитца (1937); неизвестно, знал ли Стибиц о работах Тьюринга. Биограф Тьюринга считал, что использование Тьюрингом модели, похожей на пишущую машинку, проистекает из юношеского интереса: «Алан мечтал изобрести пишущие машинки еще мальчиком; у миссис Тьюринг была пишущая машинка, и он вполне мог бы начать с вопроса, что означало, называя пишущая машинка «механическая » . [114] Учитывая распространенность в то время азбуки Морзе, телеграфии, телеграфных машин и телетайпов, вполне возможно, что все они оказали влияние на Тьюринга в юности.

Тьюринг — его модель вычислений теперь называется машиной Тьюринга — начинает, как и Пост, с анализа человеческого компьютера, который он сводит к простому набору основных движений и «состояний ума». Но он идет еще дальше и создает машину как модель вычисления чисел. [115]

«Вычисления обычно выполняются путем написания определенных символов на бумаге. Мы можем предположить, что эта бумага разделена на квадраты, как детский учебник по арифметике... Тогда я предполагаю, что вычисления выполняются на одномерной бумаге, т. е. на ленте, разделенной Я также буду предполагать, что число символов, которые могут быть напечатаны, конечно...
«Поведение компьютера в любой момент определяется символами, которые он наблюдает, и его «состоянием ума» в этот момент. Мы можем предположить, что существует ограничение B на количество символов или квадратов, которые компьютер может наблюдать в один момент. Если он хочет наблюдать больше, он должен использовать последовательные наблюдения. Мы также предположим, что число состояний ума, которые необходимо принять во внимание, конечно...
«Давайте представим, что операции, выполняемые компьютером, можно разделить на «простые операции», которые настолько элементарны, что нелегко представить их дальнейшее разделение». [116]

Сокращение Тьюринга дает следующее:

«Поэтому простые операции должны включать в себя:
«(a) Изменения символа на одном из наблюдаемых квадратов
«(b) Изменения одного из наблюдаемых квадратов в другой квадрат в пределах L квадратов одного из ранее наблюдаемых квадратов.

«Возможно, некоторые из этих изменений обязательно вызывают изменение состояния ума. Следовательно, наиболее общую операцию следует рассматривать как одну из следующих:

«(А) Возможное изменение (а) символа вместе с возможным изменением состояния ума.
«(Б) Возможное изменение (б) наблюдаемых квадратов вместе с возможным изменением душевного состояния»
«Теперь мы можем сконструировать машину, выполняющую работу этого компьютера». [116]

Несколько лет спустя Тьюринг расширил свой анализ (тезис, определение) таким убедительным выражением:

«Функция называется «эффективно вычислимой», если ее значения могут быть найдены с помощью какого-то чисто механического процесса. Хотя интуитивно понять эту идею довольно легко, тем не менее желательно иметь какое-то более определенное, математически выразимое определение. ... [он обсуждает историю определения, представленного выше, в отношении Гёделя, Эрбрана, Клини, Чёрча, Тьюринга и Поста] ... Мы можем понимать это утверждение буквально, понимая его под чисто механическим процессом, который может быть осуществлена ​​машиной. Можно дать математическое описание в некоторой нормальной форме структур этих машин. Развитие этих идей приводит к авторскому определению вычислимой функции и выявлению вычислимость † с эффективной вычислимостью...
«† Мы будем использовать выражение «вычислимая функция» для обозначения функции, вычислимой машиной, и позволим «эффективно вычислимой» относиться к интуитивной идее без особого отождествления с каким-либо из этих определений». [117]

Дж. Б. Россер (1939) и С. К. Клини (1943)

Дж. Баркли Россер определил «эффективный [математический] метод» следующим образом (курсив добавлен):

« Эффективный метод» используется здесь в довольно специальном смысле метода, каждый шаг которого точно определен и который наверняка даст ответ за конечное число шагов. В этом специальном значении были даны три различных точных определения. [его сноска № 5; см. обсуждение непосредственно ниже]. Самый простой из них (принадлежащий Посту и Тьюрингу), по сути, говорит о том, что эффективный метод решения определенного набора задач существует, если можно построить машину, которая затем будет решить любую задачу набора без вмешательства человека, кроме вставки вопроса и (позже) чтения ответа.Все три определения эквивалентны, поэтому не имеет значения, какое из них используется.Более того, тот факт, что все три эквивалентны, является очень сильный аргумент в пользу правоты любого человека». (Россер 1939: 225–226)

Сноска Россера № 5 ссылается на работу (1) Чёрча и Клини и их определение λ-определимости, в частности, на использование его Чёрчем в его « Неразрешимой проблеме элементарной теории чисел» (1936); (2) Эрбранд и Гёдель и их использование рекурсии, в частности, использование Гёделем в его знаменитой статье « О формально неразрешимых утверждениях принципов математики и родственных систем I» (1931); и (3) Пост (1936) и Тьюринг (1936–37) в их моделях механизмов вычислений.

Стивен К. Клини определил свой ныне знаменитый «Тезис I», известный как тезис Чёрча-Тьюринга . Но он сделал это в следующем контексте (жирный шрифт в оригинале):

«12. Алгоритмические теории ... При создании полной алгоритмической теории мы описываем процедуру, выполнимую для каждого набора значений независимых переменных, причем эта процедура обязательно завершается и таким образом, что по результату мы можем прочитайте однозначный ответ «да» или «нет» на вопрос «истинно ли значение предиката?» (Kleene 1943:273)

История после 1950 года

Ряд усилий был направлен на дальнейшее уточнение определения «алгоритма», и эта деятельность продолжается из-за проблем, касающихся, в частности, оснований математики (особенно тезиса Чёрча-Тьюринга ) и философии разума (особенно аргументов об искусственном интеллекте ). Дополнительные сведения см. в разделе Характеристики алгоритмов .

Смотрите также

Примечания

  1. ^ «Определение АЛГОРИТМА». Интернет-словарь Мерриам-Вебстера . Архивировано из оригинала 14 февраля 2020 года . Проверено 14 ноября 2019 г.
  2. ^ Блер, Энн, Дугид, Пол, Гоинг, Аня-Сильвия и Графтон, Энтони. Информация: Исторический спутник, Принстон: Princeton University Press, 2021. с. 247
  3. ^ Дэвид А. Гроссман, Офир Фридер, Информационный поиск: алгоритмы и эвристика , 2-е издание, 2004 г., ISBN 1402030045 
  4. ^ «Например, любой классический математический алгоритм можно описать конечным числом английских слов» (Роджерс 1987:2).
  5. ^ Четко определено в отношении агента, выполняющего алгоритм: «Существует вычислительный агент, обычно человек, который может реагировать на инструкции и выполнять вычисления» (Роджерс 1987:2).
  6. ^ «Алгоритм - это процедура вычисления функции (относительно некоторых выбранных обозначений целых чисел) ... это ограничение (числовых функций) не приводит к потере общности» (Rogers 1987: 1).
  7. ^ «Алгоритм имеет ноль или более входных данных, то есть величин , которые ему задаются изначально до начала работы алгоритма» (Кнут 1973:5).
  8. ^ «Процедура, которая обладает всеми характеристиками алгоритма, за исключением того, что ей, возможно, не хватает конечности, может быть названа« вычислительным методом » » (Кнут 1973:5).
  9. ^ «Алгоритм имеет один или несколько выходных данных, то есть величины, которые имеют определенное отношение к входным данным» (Кнут 1973:5).
  10. ^ Является ли процесс со случайными внутренними процессами (не включая входные) алгоритмом, является дискуссионным. Роджерс полагает, что: «вычисления выполняются дискретно, поэтапно, без использования непрерывных методов или аналоговых устройств... проводятся детерминированно, без обращения к случайным методам или устройствам, например, играм в кости» (Rogers 1987:2) .
  11. ^ abcd Шабер, Жан-Люк (2012). История алгоритмов: от камешка до микрочипа . Springer Science & Business Media. стр. 7–8. ISBN 9783642181924.
  12. ^ Шрирам, MS (2005). «Алгоритмы в индийской математике». В Эмче, Джерард Г.; Шридхаран, Р.; Шринивас, доктор медицины (ред.). Вклад в историю индийской математики . Спрингер. п. 153. ИСБН 978-93-86279-25-5.
  13. ^ Хаяши, Т. (1 января 2023 г.). Брахмагупта. Британская энциклопедия.
  14. ^ abc Cooke, Роджер Л. (2005). История математики: Краткий курс . Джон Уайли и сыновья. ISBN 978-1-118-46029-0.
  15. ^ Аб Дули, Джон Ф. (2013). Краткая история криптологии и криптографических алгоритмов . Springer Science & Business Media. стр. 12–3. ISBN 9783319016283.
  16. ^ Бернетт, Чарльз (2017). "Арабские цифры". В Томасе Ф. Глике (ред.). Возрождение Рутледжа: средневековая наука, технологии и медицина (2006): Энциклопедия . Тейлор и Фрэнсис. п. 39. ИСБН 978-1-351-67617-5. Архивировано из оригинала 28 марта 2023 года . Проверено 5 мая 2019 г.
  17. ^ «Алгоризм» . Оксфордский словарь английского языка (онлайн-изд.). Издательство Оксфордского университета . (Требуется подписка или членство участвующей организации.)
  18. ^ Брезина, Корона (2006). Аль-Хорезми: изобретатель алгебры. Издательская группа Розен. ISBN 978-1-4042-0513-0.
  19. ^ «Абу Джафар Мухаммад ибн Муса аль-Хорезми». Members.peak.org . Архивировано из оригинала 21 августа 2019 года . Проверено 14 ноября 2019 г.
  20. ^ Мехри, Бахман (2017). «От Аль-Хорезми к алгоритму». Олимпиады по информатике . 11 (2): 71–74. doi :10.15388/ioi.2017.special.11.
  21. ^ «алгористический». Бесплатный словарь . Архивировано из оригинала 21 декабря 2019 года . Проверено 14 ноября 2019 г.
  22. ^ Блаунт, Томас (1656). Глоссография или словарь... Лондон: Хамфри Мозли и Джордж Собридж.
  23. ^ Филлипс, Эдвард (1658). Новый мир английских слов, или Общий словарь, содержащий толкования сложных слов, заимствованных из других языков...
  24. ^ Филлипс, Эдвард; Керси, Джон (1706). Новый мир слов: или Универсальный словарь английского языка. Содержит описание первоначального или собственного смысла и различных значений всех сложных слов, заимствованных из других языков... Вместе с кратким и ясным объяснением всех терминов, относящихся к любому из искусств и наук... к которому добавлено: толкование имен собственных. Напечатано для J. Phillips и т. д.
  25. ^ Феннинг, Дэниел (1751). Спутник юного алгебраиста, или Новое и простое руководство по алгебре; введено доктриной вульгарных дробей: предназначено для использования в школах... иллюстрировано множеством числовых и буквальных примеров... Напечатано для Г. Кейта и Дж. Робинсона. п. xi.
  26. ^ The Electric Review 1811-07: Том 7. Open Court Publishing Co., июль 1811 г., с. [1]. Однако ему нужен новый алгоритм, исчерпывающий метод, с помощью которого теоремы могут быть установлены без двусмысленности и многословия, [...]
  27. ^ «Алгоритм» . Оксфордский словарь английского языка (онлайн-изд.). Издательство Оксфордского университета . (Требуется подписка или членство участвующей организации.)
  28. Уже в 1684 году в книге Nova Methodus pro Maximis et Minimis Лейбниц использовал латинский термин «алгоритм».
  29. ^ Клини 1943 в Дэвисе 1965: 274
  30. ^ Россер 1939 в Дэвисе 1965: 225
  31. ^ Стоун 1973: 4
  32. ^ Симановский, Роберто (2018). Алгоритм смерти и другие цифровые дилеммы. Несвоевременные размышления. Том. 14. Перевод Чейза, Джефферсона. Кембридж, Массачусетс: MIT Press. п. 147. ИСБН 9780262536370. Архивировано из оригинала 22 декабря 2019 года . Проверено 27 мая 2019 г. [...] следующий уровень абстракции центральной бюрократии: глобально действующие алгоритмы.
  33. ^ Дитрих, Эрик (1999). "Алгоритм". В Уилсоне, Роберт Эндрю; Кейл, Фрэнк С. (ред.). Энциклопедия когнитивных наук Массачусетского технологического института. Библиотека MIT Cognet. Кембридж, Массачусетс: MIT Press (опубликовано в 2001 г.). п. 11. ISBN 9780262731447. Проверено 22 июля 2020 г. Алгоритм — это рецепт, метод или техника выполнения чего-либо.
  34. ^ Стоун требует, чтобы «он заканчивался за конечное число шагов» (Stone 1973:7–8).
  35. ^ Булос и Джеффри 1974,1999:19
  36. ^ см. Стоун 1972: 5.
  37. ^ Кнут 1973:7 утверждает: «На практике нам нужны не только алгоритмы, но и хорошие алгоритмы… одним критерием качества является продолжительность времени, затраченного на выполнение алгоритма… другими критериями являются адаптируемость алгоритма». алгоритм для компьютеров, его простота и элегантность и т. д.».
  38. ^ см. Стоун 1973: 6.
  39. ^ Stone 1973:7–8 утверждает, что должна существовать «... процедура, которой робот [т. е. компьютер] может следовать, чтобы точно определить, как подчиняться инструкции». Стоун добавляет к этому определению конечность процесса и определенность (не имеющую двусмысленности в инструкциях).
  40. ^ Кнут, лок. цит -
  41. ^ Минский 1967, с. 105
  42. ^ Гуревич 2000:1, 3
  43. ^ Сипсер 2006: 157
  44. ^ Гудрич, Майкл Т .; Тамассия, Роберто (2002). Разработка алгоритмов: основы, анализ и примеры из Интернета. Джон Уайли и сыновья, Inc. ISBN 978-0-471-38365-9. Архивировано из оригинала 28 апреля 2015 года . Проверено 14 июня 2018 г.
  45. ^ Кнут 1973:7
  46. ^ Чайтин 2005:32
  47. ^ Роджерс 1987: 1–2
  48. ^ В своем эссе «Расчеты человеком и машиной: концептуальный анализ» Сейг 2002:390 приписывает это отличие Робину Ганди, см. Уилфред Сейг и др., 2002 Размышления об основах математики: Очерки в честь Соломона Фефермана , Ассоциация Символическая логика, AK Peters Ltd, Натик, Массачусетс.
  49. ^ см. Gandy 1980:126, « Диссертация и принципы механизмов Робина Ганди Чёрча», опубликованные на стр. 123–148 в книге J. Barwise et al. 1980 Симпозиум Клини , Издательская компания Северной Голландии.
  50. ^ «Робот»: «Компьютер — это робот, выполняющий любую задачу, которую можно описать как последовательность инструкций». см. Стоун 1972: 3
  51. ^ «Счеты» Ламбека - это «счетное бесконечное количество мест (отверстий, проводов и т. д.) вместе с неограниченным запасом фишек (камешков, бусинок и т. д.). Места различимы, фишки - нет». Дыры имеют неограниченную емкость, и рядом находится агент, который понимает и способен выполнить список инструкций» (Ламбек 1961: 295). Ламбек ссылается на Мельзака, который определяет свою Q-машину как «неопределенно большое количество мест… ... неопределенно большой запас счетчиков, распределенных по этим местам, программу и оператора, единственная цель которого - выполнить программу» (Melzak 1961: 283). BBJ (loc. cit.) добавляет условие, что отверстия «способен держать любое количество камней» (стр. 46). И Мельзак, и Ламбек появляются в The Canadian Mathematical Bulletin , т. 4, № 3, сентябрь 1961 г.
  52. ^ Если путаницы не возникает, слово «счетчики» можно опустить и сказать, что местоположение содержит одно «число».
  53. ^ «Мы говорим, что инструкция эффективна, если существует процедура, которой робот может следовать, чтобы точно определить, как подчиняться инструкции». (Стоун 1972:6)
  54. ^ см. Мински 1967: глава 11 «Компьютерные модели» и глава 14 «Очень простые основы вычислимости», стр. 255–281, в частности,
  55. ^ см. Кнут 1973:3.
  56. ^ Но всегда предшествует ЕСЛИ-ТО, чтобы избежать неправильного вычитания.
  57. ^ Кнут 1973: 4
  58. ^ Стоун 1972:5. Методы извлечения корней нетривиальны: см. Методы вычисления квадратных корней.
  59. ^ Леувен, Январь (1990). Справочник по теоретической информатике: алгоритмы и сложность. Том А. Эльзевир. п. 85. ИСБН 978-0-444-88071-0.
  60. ^ Джон Г. Кемени и Томас Э. Курц, 1985 г. «Возвращение к основам: история, коррупция и будущее языка» , Addison-Wesley Publishing Company, Inc. Ридинг, Массачусетс, ISBN 0-201-13433-0
  61. ^ Таусворт 1977: 101
  62. ^ Таусворт 1977: 142
  63. ^ Кнут 1973, раздел 1.2.1, расширен Таусвортом 1977 на стр. 100 и далее и в главе 9.1.
  64. ^ см. Таусворт, 1977 г.
  65. ^ Хит 1908:300; Издание Хокинга «Дувр» 2005 года происходит от Хита.
  66. ^ " 'Пусть CD, измеряя BF, оставит FA меньше самого себя.' Это аккуратное сокращение, означающее: измерять вдоль BA последовательные длины, равные CD, пока не будет достигнута точка F, в которой оставшаяся длина FA будет меньше CD; другими словами, пусть BF будет наибольшим точным кратным CD, содержащимся в BA». (Хит 1908:297)
  67. ^ О современных методах лечения, использующих деление в алгоритме, см. Hardy and Wright 1979:180, Knuth 1973:2 (Том 1), а также дополнительное обсуждение алгоритма Евклида в Knuth 1969:293–297 (Том 2).
  68. ^ Евклид освещает этот вопрос в своем предложении 1.
  69. ^ «Элементы Евклида, Книга VII, Предложение 2». Aleph0.clarku.edu. Архивировано из оригинала 24 мая 2012 года . Проверено 20 мая 2012 г.
  70. ^ Хотя это понятие широко используется, его невозможно определить точно.
  71. ^ Кнут 1973: 13–18. Он приписывает «формулировку доказательства алгоритмов в терминах утверждений и индукции» Р. У. Флойду, Питеру Науру, К. А. Хоару, Х. Х. Голдстайну и Дж. фон Нейману. Таусворт 1977 заимствует пример Евклида Кнута и расширяет метод Кнута в разделе 9.1 « Формальные доказательства» (стр. 288–298).
  72. ^ Таусворт 1997: 294
  73. ^ см. Кнут 1973:7 (Том I) и его более подробный анализ на стр. 1969:294–313 (Том II).
  74. ^ Поломка происходит, когда алгоритм пытается сжать себя. Успех решит проблему остановки .
  75. ^ Кригель, Ганс-Петер ; Шуберт, Эрих; Зимек, Артур (2016). «(Черное) искусство оценки во время выполнения: сравниваем ли мы алгоритмы или реализации?». Знания и информационные системы . 52 (2): 341–378. дои : 10.1007/s10115-016-1004-2. ISSN  0219-1377. S2CID  40772241.
  76. ^ Джиллиан Конахан (январь 2013 г.). «Лучшая математика делает сети передачи данных быстрее». Discovermagazine.com. Архивировано из оригинала 13 мая 2014 года . Проверено 13 мая 2014 г.
  77. ^ Хайтам Хассание, Петр Индик , Дина Катаби и Эрик Прайс, «Симпозиум ACM-SIAM по дискретным алгоритмам (SODA). Архивировано 4 июля 2013 г., в Wayback Machine , Киото, январь 2012 г. См. Также веб-страницу sFFT, архивированную 21 февраля. , 2012 год, в Wayback Machine .
  78. ^ Келлерер, Ганс; Пферши, Ульрих; Пизингер, Дэвид (2004). Проблемы с рюкзаком | Ганс Келлерер | Спрингер. Спрингер. дои : 10.1007/978-3-540-24777-7. ISBN 978-3-540-40286-2. S2CID  28836720. Архивировано из оригинала 18 октября 2017 года . Проверено 19 сентября 2017 г.
  79. ^ Например, объем выпуклого многогранника ( описанного с помощью оракула членства) может быть аппроксимирован с высокой точностью с помощью алгоритма рандомизированного полиномиального времени, но не детерминированного: см. Дайер, Мартин; Фриз, Алан; Каннан, Рави (январь 1991 г.). «Случайный полиномиальный алгоритм аппроксимации объема выпуклых тел». Дж. АКМ . 38 (1): 1–17. CiteSeerX 10.1.1.145.4600 . дои : 10.1145/102782.102783. S2CID  13268711. 
  80. ^ Джордж Б. Данциг и Мукунд Н. Тапа. 2003. Линейное программирование 2: теория и расширения . Спрингер-Верлаг.
  81. ^ Цыпкин (1971). Адаптация и обучение в автоматических системах. Академическая пресса. п. 54. ИСБН 978-0-08-095582-7.
  82. ^ Аб Ковальски, Роберт (1979). «Алгоритм=Логика+Управление». Коммуникации АКМ . 22 (7): 424–436. дои : 10.1145/359131.359136 . S2CID  2509896.
  83. ^ ab Warren, DS, 2023. Написание правильных программ на прологе. В Прологе: Следующие 50 лет (стр. 62–70). Чам: Springer Nature, Швейцария.
  84. ^ Ковальски Р., Давила Дж., Сартор Г. и Калехо М., 2023. Логический английский для права и образования. В Прологе: Следующие 50 лет (стр. 287–299). Чам: Springer Nature, Швейцария.
  85. ^ «Эксперты: поощряет ли патентная система инновации?» Журнал "Уолл Стрит . 16 мая 2013 г. ISSN  0099-9660 . Проверено 29 марта 2017 г.
  86. ^ Кнут, Дональд Э. (1972). «Древние вавилонские алгоритмы» (PDF) . Коммун. АКМ . 15 (7): 671–677. дои : 10.1145/361454.361514. ISSN  0001-0782. S2CID  7829945. Архивировано из оригинала (PDF) 24 декабря 2012 г.
  87. ^ Аабо, Асгер (2001). Эпизоды из ранней истории астрономии . Нью-Йорк: Спрингер. стр. 40–62. ISBN 978-0-387-95136-2.
  88. ^ Аст, Кортни. «Эратосфен». Государственный университет Уичито: факультет математики и статистики. Архивировано из оригинала 27 февраля 2015 года . Проверено 27 февраля 2015 г.
  89. ^ Шабер, Жан-Люк (2012). История алгоритмов: от камешка до микрочипа . Springer Science & Business Media. п. 2. ISBN 9783642181924.
  90. ^ Дэвис 2000:18
  91. ^ Болтер 1984:24
  92. ^ Болтер 1984:26
  93. ^ Болтер 1984: 33–34, 204–206.
  94. ^ Все цитаты из книги У. Стэнли Джевонса «Элементарные уроки логики: дедуктивная и индуктивная», 1880 г. , Macmillan and Co., Лондон и Нью-Йорк. Переиздано как Googlebook; см. Джевонс 1880: 199–201. Луи Кутюра, 1914 г. , «Алгебра логики» , издательство Open Court, Чикаго и Лондон. Переиздано как Googlebook; см. Couturat 1914 в: 75–76, дает несколько дополнительных подробностей; он сравнивает это с пишущей машинкой и с фортепиано. Джевонс утверждает, что отчет можно найти в « Записках Королевского общества» от 20 января 1870 года .
  95. ^ Джевонс 1880: 199–200
  96. ^ Все цитаты из книги Джона Венна «Символическая логика» 1881 года , Macmillan and Co., Лондон. Переиздано как Googlebook. см. Венн 1881: 120–125. Заинтересованный читатель может найти более глубокое объяснение на этих страницах.
  97. ^ Диаграмма Белла и Ньюэлла 1971:39, ср. Дэвис 2000
  98. ^ * Мелина Хилл, корреспондент Valley News, Мастер получает место в истории , Valley News Западный Ливан, Нью-Хэмпшир, четверг, 31 марта 1983 г., стр. 13.
  99. ^ Дэвис 2000:14
  100. ^ ван Хейеноорт 1967: 81 и далее
  101. ^ Комментарий ван Хейеноорта к Begriffsschrift Фреге, языку формул, созданному по образцу языка арифметики, для чистой мысли в van Heijenoort 1967:1
  102. ^ Диксон 1906, ср. Клини 1952: 36–40.
  103. ^ см. сноска в Алонсо Чёрч 1936a в Дэвисе 1965:90 и 1936b в Дэвисе 1965:110
  104. ^ Клини 1935–6 в Дэвисе 1965: 237 и далее, Клини 1943 в Дэвисе 1965: 255 и далее
  105. ^ Церковь 1936 года в Дэвисе, 1965: 88 и далее.
  106. ^ см. «Конечные комбинаторные процессы - формулировка 1», после 1936 г. в Дэвисе, 1965: 289–290.
  107. ^ Тьюринг 1936–37 в Дэвисе 1965: 116ff.
  108. ^ Россер 1939 в Дэвисе 1965: 226
  109. ^ Клини 1943 в Дэвисе 1965: 273–274
  110. ^ Клини 1952: 300, 317.
  111. ^ Клини 1952:376
  112. ^ Тьюринг 1936–37 в Дэвисе 1965: 289–290
  113. ^ Тьюринг 1936 в Дэвисе 1965, Тьюринг 1939 в Дэвисе 1965: 160
  114. ^ Ходжес, с. 96
  115. ^ Тьюринг 1936–37: 116
  116. ^ ab Тьюринг 1936–37 в Дэвисе 1965: 136
  117. ^ Тьюринг 1939 в Дэвисе 1965: 160

Библиография

дальнейшее чтение

Внешние ссылки

Хранилища алгоритмов