Jump to content

ФРАКТРАН

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

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

Конвей 1987 предлагает следующую программу FRACTRAN под названием PRIMEGAME, которая находит последовательные простые числа :

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

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

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

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

Показательной частью этих степеней двойки являются простые числа: 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, вычисляющая 3 раза по 2 (так что ее входные данные и его вывод должен быть потому что 3×2 равно 6.

Вычитание и деление [ править ]

Аналогичным образом мы можем создать «вычитатель» 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 на простоту, занимает следующее количество шагов:

где является наибольшим целым делителем N и это функция пола . [2]

В 1999 году Девин Килминстер продемонстрировал более короткую программу из десяти инструкций: [3]

Для начального ввода n = 10 последовательных простых чисел генерируются последующими степенями 10.

Другие примеры [ править ]

Следующая программа 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
Останавливаться

Примечания [ править ]

  1. ^ Нумерацию Гёделя нельзя напрямую использовать для отрицательных целых чисел, чисел с плавающей запятой или текстовых строк, хотя можно принять соглашения для косвенного представления этих типов данных. Предлагаемые расширения FRACTRAN включают FRACTRAN++ и Bag .
  2. ^ Похожий алгоритм умножения описан на странице Esolang FRACTRAN .

См. также [ править ]

Ссылки [ править ]

  1. ^ Гай 1983 , с. 26; Конвей и Гай 1996 , с. 147
  2. ^ Гай 1983 , с. 33
  3. ^ Хэвил 2007 , с. 176
  4. ^ Джон Баэз, Головоломка № 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 .

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: c69025fc0231500383d8c7976cf35202__1714925280
URL1:https://arc.ask3.ru/arc/aa/c6/02/c69025fc0231500383d8c7976cf35202.html
Заголовок, (Title) документа по адресу, URL1:
FRACTRAN - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)