Русская Википедия:FRACTRAN

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

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

Описание

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

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

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

<math>\left( \frac{17}{91}, \frac{78}{85}, \frac{19}{51}, \frac{23}{38}, \frac{29}{33}, \frac{77}{29}, \frac{95}{23}, \frac{77}{19}, \frac{1}{17}, \frac{11}{13}, \frac{13}{11}, \frac{15}{2}, \frac{1}{7}, \frac{55}{1} \right)</math>

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

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

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

<math>2^2=4,\, 2^3=8,\, 2^5=32,\, 2^7=128,\, 2^{11}=2048,\, 2^{13}=8192,\, 2^{17}=131072,\, 2^{19}=524288,\, \dots</math> Шаблон:OEIS

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

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

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

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

<math>60 = 2^2 \times 3^1 \times 5^1</math>

представляет состояние регистра, в котором одна переменная (которую мы будем называть <math>v_2</math>) содержит значение 2, а две другие переменные (<math>v_3</math> и <math>v_5</math>) содержат значение 1. Все остальные переменные содержат значение 0.

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

<math>f_1 = \frac{21}{20} = \frac{3 \times 7}{2^2 \times 5^1}</math>

проверяет две переменные <math>v_2</math> и <math>v_5</math>. Если <math>v_2 \ge 2</math> и <math>v_5 \ge 1</math>, то выполняются присвоения <math>v_2:=v_2-2</math>, <math>v_5:=v_5-1</math>, <math>v_3:=v_3+1</math>, <math>v_7:=v_7+1</math>. Например:

<math>60 \cdot f_1 = 2^2 \times 3^1 \times 5^1 \cdot \frac{3 \times 7}{2^2 \times 5^1} = 3^2 \times 7^1</math>

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

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

Ссылки