ФРАКТРАН - FRACTRAN

ФРАКТРАН это Полный по Тьюрингу эзотерический язык программирования изобретен математиком Джон Конвей. Программа FRACTRAN - это упорядоченный список положительных фракции вместе с исходным положительным целым числом п. Программа запускается обновлением целого числа п следующее:

  1. для первой фракции ж в списке для которых нф целое число, заменить п к нф
  2. повторяйте это правило, пока ни одна дробь в списке не даст целое число при умножении на п, затем остановитесь.

Конвей 1987 дает следующие формула для простых чисел во ФРАКТРАНЕ:[примечание 1]

Начиная с п= 2, эта программа FRACTRAN генерирует следующую последовательность целых чисел:

  • 2, 15, 825, 725, 1925, 2275, 425, 390, 330, 290, 770, ... (последовательность A007542 в OEIS )

После 2 эта последовательность содержит следующие степени двойки:

(последовательность A034785 в OEIS )

которые являются простыми степенями двойки.

Понимание программы 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 из v2B
v7 = 0 и
v2 = 0 и
v3> 0
Вычтите 1 из v3А
v7 = 0 и
v2 = 0 и
v3 = 0
Останавливаться
Bv3> 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 из v2B
v7 = 0 и
v2 = 0 и
v3> 0
Вычтите 1 из v3А
v7 = 0 и
v2 = 0 и
v3 = 0
Останавливаться
Bv11, v13v3> 0Вычтите 1 из v3
Добавить 1 в v5
Добавить 1 в v7
B
v3 = 0НиктоА

Когда мы записываем инструкции FRACTRAN, мы должны помещать инструкции состояния A последними, потому что состояние A не имеет индикаторов состояния - это состояние по умолчанию, если индикаторы состояния не установлены. Итак, для программы FRACTRAN множитель становится:

Со входом 2а3б эта программа производит вывод 5ab. [заметка 3]

Вышеупомянутая программа FRACTRAN, вычисляющая 3 раза по 2 (так что ее вход и его вывод должен быть потому что 3 умножить на 2 равно 6.

Вычитание и деление

Аналогичным образом мы можем создать «вычитатель» FRACTRAN, а повторные вычитания позволяют нам создать алгоритм «частное и остаток» следующим образом:

ФРАКТРАН
Инструкция
Текущее состояниеСостояние
Индикаторы
УсловиеДействиеСледующее состояние
Аv11, v13v2> 0 и
v3> 0
Вычтите 1 из v2
Вычтите 1 из v3
Добавить 1 в v7
А
v2 = 0 и
v3> 0
Вычтите 1 из v3Икс
v3 = 0Добавить 1 в v5B
Bv17, v19v7> 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, v11v2> 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
Останавливаться

Примечания

  1. ^ В Книга чисел, Джон Конвей и Ричард Гай дал несколько иную последовательность:
  2. ^ Гёделевская нумерация нельзя напрямую использовать для отрицательных целых чисел, чисел с плавающей запятой или текстовых строк, хотя могут быть приняты соглашения для косвенного представления этих типов данных. Предлагаемые расширения FRACTRAN включают: FRACTRAN ++ и Мешок.
  3. ^ Аналогичный алгоритм умножения описан в Страница Esolang FRACTRAN.

Рекомендации

  1. ^ Джон Баэз, Головоломка # 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.

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

внешняя ссылка