ФРАКТРАН - FRACTRAN
ФРАКТРАН это Полный по Тьюрингу эзотерический язык программирования изобретен математиком Джон Конвей. Программа FRACTRAN - это упорядоченный список положительных фракции вместе с исходным положительным целым числом п. Программа запускается обновлением целого числа п следующее:
- для первой фракции ж в списке для которых нф целое число, заменить п к нф
- повторяйте это правило, пока ни одна дробь в списке не даст целое число при умножении на п, затем остановитесь.
Конвей 1987 дает следующие формула для простых чисел во ФРАКТРАНЕ:[примечание 1]
Начиная с п= 2, эта программа FRACTRAN генерирует следующую последовательность целых чисел:
После 2 эта последовательность содержит следующие степени двойки:
которые являются простыми степенями двойки.
Понимание программы FRACTRAN
Программу FRACTRAN можно рассматривать как тип зарегистрировать машину где регистры хранятся в простых показателях в аргументе п.
С помощью Гёделевская нумерация, положительное целое число п может кодировать произвольное количество произвольно больших положительных целочисленных переменных.[заметка 2] Значение каждой переменной кодируется как показатель степени простого числа в простые множители целого числа. Например, целое число
представляет состояние регистра, в котором одна переменная (которую мы назовем v2) содержит значение 2, а две другие переменные (v3 и v5) содержат значение 1. Все остальные переменные содержат значение 0.
Программа FRACTRAN представляет собой упорядоченный список положительных дробей. Каждая дробь представляет собой инструкцию, которая проверяет одну или несколько переменных, представленных простыми множителями ее знаменатель. Например:
тесты v2 и v5. Если и , затем он вычитает 2 из v2 и 1 из v5 и прибавляет 1 к v3 и 1 к v7. Например:
Поскольку программа FRACTRAN - это просто список дробей, эти инструкции «тест-декремент-инкремент» - единственные разрешенные инструкции на языке FRACTRAN. Кроме того, действуют следующие ограничения:
- Каждый раз, когда выполняется инструкция, проверяемые переменные также уменьшаются.
- Одна и та же переменная не может быть одновременно уменьшена и увеличена в одной инструкции (в противном случае дробная часть, представляющая эту инструкцию, не была бы в ее самые низкие сроки ). Поэтому каждая инструкция FRACTRAN использует переменные при их проверке.
- Команда FRACTRAN не может напрямую проверить, равна ли переменная 0 (однако, косвенный тест может быть реализован путем создания инструкции по умолчанию, которая помещается после других инструкций, проверяющих конкретную переменную).
Создание простых программ
Добавление
Простейшая программа FRACTRAN - это отдельная инструкция, например
Эту программу можно представить в виде (очень простого) алгоритма следующим образом:
ФРАКТРАН Инструкция | Условие | Действие |
---|---|---|
v2> 0 | Вычтите 1 из v2 Добавить 1 в v3 | |
v2 = 0 | Останавливаться |
Учитывая начальный ввод формы , эта программа вычислит последовательность , и т. д., пока, наконец, после шагов, множители 2 не остаются, и продукт с больше не дает целого числа; затем машина останавливается с окончательным выводом . Поэтому он складывает два целых числа.
Умножение
Мы можем создать «множитель», «пропуская» через «сумматор». Для этого нам нужно ввести состояния в наш алгоритм. Этот алгоритм займет число и производить :
Текущее состояние | Условие | Действие | Следующее состояние |
---|---|---|---|
А | v7> 0 | Вычтите 1 из v7 Добавить 1 в v3 | А |
v7 = 0 и v2> 0 | Вычтите 1 из v2 | B | |
v7 = 0 и v2 = 0 и v3> 0 | Вычтите 1 из v3 | А | |
v7 = 0 и v2 = 0 и v3 = 0 | Останавливаться | ||
B | v3> 0 | Вычтите 1 из v3 Добавить 1 в v5 Добавить 1 в v7 | B |
v3 = 0 | Никто | А |
Состояние B - это цикл, который добавляет v3 к v5, а также перемещает v3 в v7, а состояние A - это внешний цикл управления, который повторяет цикл в состоянии B v2 раз. Состояние A также восстанавливает значение v3 из v7 после завершения цикла в состоянии B.
Мы можем реализовать состояния, используя новые переменные в качестве индикаторов состояния. Индикаторы состояния для состояния B будут v11 и v13. Обратите внимание, что нам требуется два индикатора контроля состояния для одного цикла; основной флаг (v11) и дополнительный флаг (v13). Поскольку каждый индикатор потребляется всякий раз, когда он тестируется, нам нужен вторичный индикатор, который сказал бы «продолжить в текущем состоянии»; этот вторичный индикатор заменяется обратно на первичный индикатор в следующей инструкции, и цикл продолжается.
Добавляя индикаторы состояния FRACTRAN и инструкции в таблицу алгоритма умножения, мы имеем:
ФРАКТРАН Инструкция | Текущее состояние | Состояние Индикаторы | Условие | Действие | Следующее состояние |
---|---|---|---|---|---|
А | Никто | v7> 0 | Вычтите 1 из v7 Добавить 1 в v3 | А | |
v7 = 0 и v2> 0 | Вычтите 1 из v2 | B | |||
v7 = 0 и v2 = 0 и v3> 0 | Вычтите 1 из v3 | А | |||
v7 = 0 и v2 = 0 и v3 = 0 | Останавливаться | ||||
B | v11, v13 | v3> 0 | Вычтите 1 из v3 Добавить 1 в v5 Добавить 1 в v7 | B | |
v3 = 0 | Никто | А |
Когда мы записываем инструкции FRACTRAN, мы должны помещать инструкции состояния A последними, потому что состояние A не имеет индикаторов состояния - это состояние по умолчанию, если индикаторы состояния не установлены. Итак, для программы FRACTRAN множитель становится:
Со входом 2а3б эта программа производит вывод 5ab. [заметка 3]
Вычитание и деление
Аналогичным образом мы можем создать «вычитатель» FRACTRAN, а повторные вычитания позволяют нам создать алгоритм «частное и остаток» следующим образом:
ФРАКТРАН Инструкция | Текущее состояние | Состояние Индикаторы | Условие | Действие | Следующее состояние |
---|---|---|---|---|---|
А | v11, v13 | v2> 0 и v3> 0 | Вычтите 1 из v2 Вычтите 1 из v3 Добавить 1 в v7 | А | |
v2 = 0 и v3> 0 | Вычтите 1 из v3 | Икс | |||
v3 = 0 | Добавить 1 в v5 | B | |||
B | v17, v19 | v7> 0 | Вычтите 1 из v7 Добавить 1 в v3 | B | |
v7 = 0 | Никто | А | |||
Икс | v3> 0 | Вычтите 1 из v3 | Икс | ||
v3 = 0 | Останавливаться |
Записывая программу FRACTRAN, мы имеем:
и ввод 2п3d11 производит вывод 5q7р куда п = qd + р и 0 ≤ р < d.
Простой алгоритм Конвея
Алгоритм генерации простых чисел Конвея, описанный выше, по сути, является алгоритмом частного и остатка в двух циклах. Учитывая ввод формы где 0 ≤ м < п, алгоритм пытается разделить п+1 на каждое число из п до 1, пока не найдет наибольшее число k это делитель п+1. Затем он возвращает 2п+1 7k-1 и повторяется. Единственный случай, когда последовательность номеров состояний, сгенерированная алгоритмом, дает степень двойки, - это когда k равен 1 (так что показатель степени 7 равен 0), что происходит только в том случае, если показатель степени 2 является простым. Пошаговое объяснение алгоритма Конвея можно найти в Havil (2007).
Другие примеры
Следующая программа FRACTRAN:
вычисляет Вес Хэмминга ЧАС(а) двоичного разложения а то есть количество единиц в двоичном разложении а.[1] Учитывая ввод 2а, его выход 13ЧАС(а). Программу можно проанализировать следующим образом:
ФРАКТРАН Инструкция | Текущее состояние | Состояние Индикаторы | Условие | Действие | Следующее состояние |
---|---|---|---|---|---|
А | v5, v11 | v2> 1 | Вычтите 2 из v2 Добавить 1 в v3 | А | |
v2 = 1 | Вычтите 1 из v2 Добавить 1 к v13 | B | |||
v2 = 0 | Никто | B | |||
B | Никто | v3> 0 | Вычтите 1 из v3 Добавить 1 в v2 | B | |
v3 = 0 и v7> 0 | Вычтите 1 из v7 Добавить 1 в v2 | А | |||
v3 = 0 и v7 = 0 и v2> 0 | Вычтите 1 из v2 добавить 1 к v7 | B | |||
v2 = 0 и v3 = 0 и v7 = 0 | Останавливаться |
Примечания
- ^ В Книга чисел, Джон Конвей и Ричард Гай дал несколько иную последовательность:
- ^ Гёделевская нумерация нельзя напрямую использовать для отрицательных целых чисел, чисел с плавающей запятой или текстовых строк, хотя могут быть приняты соглашения для косвенного представления этих типов данных. Предлагаемые расширения FRACTRAN включают: FRACTRAN ++ и Мешок.
- ^ Аналогичный алгоритм умножения описан в Страница Esolang FRACTRAN.
Рекомендации
- ^ Джон Баэз, Головоломка # 4, The п-Категория кафе
- Конвей, Джон Х. (1987). «FRACTRAN: простой универсальный язык программирования для арифметики». Открытые проблемы в коммуникации и вычислениях. Springer-Verlag New York, Inc .: 4–26. Дои:10.1007/978-1-4612-4808-8_2. ISBN 978-1-4612-9162-6.CS1 maint: ref = harv (связь)
- Конвей, Джон Х .; Гай, Ричард К. (1996). Книга чисел. Springer-Verlag New York, Inc. ISBN 0-387-97993-X.
- Хэвил, Джулиан (2007). В замешательстве!. Издательство Принстонского университета. ISBN 0-691-12056-0.
- Робертс, Шивон (2015). «Критерии добродетели». Гений в игре - Загадочный разум Джона Хортона Конвея. Блумсбери. С. 115–119. ISBN 978-1-62040-593-2.