FRACTRAN

Материал из testwiki
Версия от 05:32, 6 декабря 2024; imported>OneLittleMouse (отклонено последнее 1 изменение от 95.26.66.5)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

FRACTRANполный по Тьюрингу эзотерический язык программирования, предложенный Джоном Конвеем.

Описание

Программа на FRACTRAN записывается как упорядоченный список положительных дробей вместе с начальным положительным целочисленным входом n. Программа запускается путём обновления целого числа n следующим образом:

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

Например следующая программа генерирует простые числа:

(1791,7885,1951,2338,2933,7729,9523,7719,117,1113,1311,152,17,551)

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

2, 15, 825, 725, 1925, 2275, 425, 390, 330, 290, 770, ... Шаблон:OEIS

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

22=4,23=8,25=32,27=128,211=2048,213=8192,217=131072,219=524288, Шаблон:OEIS

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

Понимание программы FRACTRAN

Программа FRACTRAN может рассматриваться как тип машины Минского, где регистры хранятся в простых показателях в аргументе n.

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

60=22×31×51

представляет состояние регистра, в котором одна переменная (которую мы будем называть v2) содержит значение 2, а две другие переменные (v3 и v5) содержат значение 1. Все остальные переменные содержат значение 0.

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

f1=2120=3×722×51

проверяет две переменные v2 и v5. Если v22 и v51, то выполняются присвоения v2:=v22, v5:=v51, v3:=v3+1, v7:=v7+1. Например:

60f1=22×31×513×722×51=32×71

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

  • Каждый раз, когда выполняется инструкция, проверяемые переменные также уменьшаются.
  • Одна и та же переменная не может быть одновременно уменьшена и увеличена в одной инструкции (в противном случае дробь, представляющая эту инструкцию, не будет несократимой).
  • Инструкция FRACTRAN неспособна непосредственно проверить, равна ли переменная 0. Однако есть непрямой способ это сделать путём создания инструкции, которая помещается после других инструкций, которые проверяют конкретную переменную.

Ссылки