ФРАКТРАН
FRACTRAN — это тьюринг-полный эзотерический язык программирования, изобретенный математиком Джоном Конвеем . Программа FRACTRAN представляет собой упорядоченный список положительных дробей вместе с начальным входным положительным целым числом n . Программа запускается путем обновления целого числа n следующим образом:
- для первой дроби f в списке, для которой nf является целым числом, замените n на nf
- повторяйте это правило до тех пор, пока ни одна дробь в списке не даст целое число при умножении на n , затем остановитесь.
Конвей 1987 предлагает следующую программу FRACTRAN под названием PRIMEGAME, которая находит последовательные простые числа :
Начиная с n = 2, программа FRACTRAN генерирует следующую последовательность целых чисел:
После 2 эта последовательность содержит следующие степени двойки:
Показательной частью этих степеней двойки являются простые числа: 2, 3, 5 и т. д.
Понимание программы FRACTRAN [ править ]
Программу FRACTRAN можно рассматривать как тип регистровой машины , в которой регистры хранятся в простых показателях в аргументе n .
Используя нумерацию Гёделя , положительное целое число n может кодировать произвольное количество сколь угодно больших положительных целочисленных переменных. [примечание 1] Значение каждой переменной кодируется как показатель степени простого числа при простой факторизации целого числа. Например, целое число
представляет состояние регистра, в котором одна переменная (которую мы назовем 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 | Б | |
v7 = 0 и v2 = 0 и v3 > 0 | Вычтите 1 из v3 | А | |
v7 = 0 и v2 = 0 и v3 = 0 | Останавливаться | ||
Б | v3 > 0 | Вычтите 1 из v3 Добавьте 1 к v5 Добавить 1 в v7 | Б |
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 | Б | |||
v7 = 0 и v2 = 0 и v3 > 0 | Вычтите 1 из v3 | А | |||
v7 = 0 и v2 = 0 и v3 = 0 | Останавливаться | ||||
Б | в11, в13 | v3 > 0 | Вычтите 1 из v3 Добавьте 1 к v5 Добавить 1 в v7 | Б | |
v3 = 0 | Никто | А |
Когда мы записываем инструкции FRACTRAN, мы должны помещать инструкции состояния A последними, поскольку состояние A не имеет индикаторов состояния — это состояние по умолчанию, если индикаторы состояния не установлены. Таким образом, в программе FRACTRAN множитель принимает вид:
Со входом 2 а 3 б эта программа выдает результат 5 аб . [примечание 2]

Вычитание и деление [ править ]
Аналогичным образом мы можем создать «вычитатель» FRACTRAN, а повторяющиеся вычитания позволяют нам создать алгоритм «частного и остатка» следующим образом:
ФРАКТРАН инструкция | Текущее состояние | Состояние индикаторы | Состояние | Действие | Следующее состояние |
---|---|---|---|---|---|
А | в11, в13 | v2 > 0 и v3 > 0 | Вычтите 1 из v2 Вычтите 1 из v3 Добавить 1 в v7 | А | |
v2 = 0 и v3 > 0 | Вычтите 1 из v3 | Х | |||
v3 = 0 | Добавьте 1 к v5 | Б | |||
Б | в17, в19 | v7 > 0 | Вычтите 1 из v7 Добавить 1 в v3 | Б | |
v7 = 0 | Никто | А | |||
Х | v3 > 0 | Вычтите 1 из v3 | Х | ||
v3 = 0 | Останавливаться |
Записав программу FRACTRAN, мы имеем:
и вход 2 н 3 д 11 производит результат 5 д 7 р где n = qd + r и 0 ≤ r < d .
Простой алгоритм Конвея [ править ]
Приведенный выше алгоритм генерации простых чисел Конвея по сути представляет собой алгоритм частного и остатка в двух циклах. Учитывая ввод формы где 0 ≤ m < n , алгоритм пытается разделить n +1 на каждое число от n до 1, пока не найдет наибольшее число k, которое является делителем n +1. Затем он возвращает 2 п +1 7 к -1 и повторяется. Единственный раз, когда последовательность номеров состояний, сгенерированная алгоритмом, дает степень 2, - это когда k равен 1 (так что показатель степени 7 равен 0), что происходит только в том случае, если показатель степени 2 является простым числом. Пошаговое объяснение алгоритма Конвея можно найти у Havil (2007).
Для этой программы достижение простых чисел 2, 3, 5, 7... требует соответственно 19, 69, 281, 710,... шагов (последовательность A007547 в OEIS ).
Существует также вариант программы Конвея. [1] который отличается от приведенной выше версии на две дроби:
Этот вариант немного быстрее: достижение 2, 3, 5, 7... занимает 19, 69, 280, 707... шагов (последовательность A007546 в OEIS ). Одна итерация этой программы, проверяющая конкретное число N на простоту, занимает следующее количество шагов:
В 1999 году Девин Килминстер продемонстрировал более короткую программу из десяти инструкций: [3]
Другие примеры [ править ]
Следующая программа FRACTRAN:
вычисляет вес Хэмминга H( a ) двоичного разложения a, т.е. количество единиц в двоичном разложении a . [4] Учитывая ввод 2 а , его выход равен 13 Ч( а ) . Программу можно проанализировать следующим образом:
ФРАКТРАН инструкция | Текущее состояние | Состояние индикаторы | Состояние | Действие | Следующее состояние |
---|---|---|---|---|---|
А | v5, v11 | v2 > 1 | Вычтите 2 из v2 Добавить 1 в v3 | А | |
v2 = 1 | Вычтите 1 из v2 Добавить 1 в v13 | Б | |||
v2 = 0 | Никто | Б | |||
Б | Никто | v3 > 0 | Вычтите 1 из v3 Добавить 1 к версии 2 | Б | |
v3 = 0 и v7 > 0 | Вычтите 1 из v7 Добавить 1 к версии 2 | А | |||
v3 = 0 и v7 = 0 и v2 > 0 | Вычтите 1 из v2 добавить 1 к v7 | Б | |||
v2 = 0 и v3 = 0 и v7 = 0 | Останавливаться |
Примечания [ править ]
- ^ Нумерацию Гёделя нельзя напрямую использовать для отрицательных целых чисел, чисел с плавающей запятой или текстовых строк, хотя можно принять соглашения для косвенного представления этих типов данных. Предлагаемые расширения FRACTRAN включают FRACTRAN++ и Bag .
- ^ Похожий алгоритм умножения описан на странице Esolang FRACTRAN .
См. также [ править ]
Ссылки [ править ]
- ^ Гай 1983 , с. 26; Конвей и Гай 1996 , с. 147
- ^ Гай 1983 , с. 33
- ^ Хэвил 2007 , с. 176
- ^ Джон Баэз, Головоломка № 4 , n -Категории. Кафе
- Гай, Ричард К. (1983). «Основная производственная машина Конвея» . Журнал «Математика» . 56 (1). Тейлор и Фрэнсис : 26–33. дои : 10.1080/0025570X.1983.11977011 .
- Конвей, Джон Х. (1987). «FRACTRAN: простой универсальный язык программирования для арифметики». Открытые проблемы коммуникации и вычислений . Springer-Verlag New York, Inc., стр. 4–26. дои : 10.1007/978-1-4612-4808-8_2 . ISBN 978-1-4612-9162-6 .
- Конвей, Джон Х.; Гай, Ричард К. (1996). Книга чисел . Springer-Verlag New York, Inc. ISBN 0-387-97993-Х .
- Хэвил, Джулиан (2007). В замешательстве! . Издательство Принстонского университета. ISBN 978-0-691-12056-0 .
- Робертс, Шивон (2015). «Критерии добродетели». Гений в игре - Пытливый ум Джона Хортона Конвея . Блумсбери. стр. 115–119. ISBN 978-1-62040-593-2 .
Внешние ссылки [ править ]

- Лекция Джона Конвея: «Фрактран: смешной логический язык»
- «Патология простых чисел: фрактран»
- Вайсштейн, Эрик В. «ФРАКТРАН» . Математический мир .
- Патология простых чисел
- ФРАКТРАН — (Esolang wiki)
- Реализация Ruby и примеры программ
- Задача Эйлера 308 проекта
- «Создание Fizzbuzz во Fractran снизу вверх»
- Крис Ломонт, «Универсальный интерпретатор FRACTRAN во FRACTRAN»