FRACTRAN es un lenguaje de programación esotérico Turing-completo inventado por el matemático John Conway . Un programa FRACTRAN es una lista ordenada de fracciones positivas junto con un entero positivo inicial n . El programa se ejecuta actualizando el entero n de la siguiente manera:
- Para la primera fracción f de la lista para la cual nf es un número entero, reemplace n por nf.
- Repite esta regla hasta que ninguna fracción de la lista produzca un número entero al multiplicarse por n , y luego detente.
Conway (1987) presenta el siguiente programa FRACTRAN, llamado PRIMEGAME, que encuentra números primos sucesivos :
A partir de n = 2, este programa FRACTRAN genera la siguiente secuencia de números enteros:
- 2, 15, 825, 725, 1925, 2275, 425, 390, 330, 290, 770, ... (secuencia A007542 en el OEIS ) , es decir, la secuencia de números de PRIMEGAME
Después del 2, esta secuencia contiene las siguientes potencias de 2:
(secuencia A034785 en el OEIS )
La parte exponencial de estas potencias de dos son números primos: 2, 3, 5, etc.
Comprender un programa FRACTRAN
Un programa FRACTRAN puede considerarse como un tipo de máquina de registros donde los registros se almacenan en exponentes primos en el argumento..
Utilizando la numeración de Gödel , un número entero positivopuede codificar un número arbitrario de variables enteras positivas arbitrariamente grandes. [ nota 1 ] El valor de cada variable se codifica como el exponente de un número primo en la factorización prima del entero. Por ejemplo, el entero
representa un estado de registro en el que una variable (que llamaremos) contiene el valor 2 y otras dos variables (y) mantiene el valor 1. Todas las demás variables mantienen el valor 0.
Un programa FRACTRAN es una lista ordenada de fracciones positivas. Cada fracción representa una instrucción que prueba una o más variables, representadas por los factores primos de su denominador . Por ejemplo:
pruebasy. Siy, luego resta 2 dey 1 dey suma 1 ay 1 a. Por ejemplo:
Dado que el programa FRACTRAN es simplemente una lista de fracciones, estas instrucciones de prueba, decremento e incremento son las únicas permitidas en el lenguaje FRACTRAN. Además, se aplican las siguientes restricciones:
- Cada vez que se ejecuta una instrucción, las variables que se están evaluando también se decrementan.
- Una misma variable no puede ser incrementada y decrementada simultáneamente en una sola instrucción (de lo contrario, la fracción que representa dicha instrucción no estaría en su mínima expresión ). Por lo tanto, cada instrucción FRACTRAN consume variables a medida que las evalúa.
- No es posible que una instrucción FRACTRAN compruebe directamente si una variable es 0 (sin embargo, se puede implementar una comprobación indirecta creando una instrucción predeterminada que se coloque después de otras instrucciones que comprueben una variable en particular).
Creación de programas sencillos
Suma
El programa FRACTRAN más simple es una sola instrucción como por ejemplo:
Este programa se puede representar como un algoritmo (muy simple) de la siguiente manera:
Dado un ingreso inicial de la formaEste programa calculará la secuencia,, etc., hasta que finalmente, despuéspasos, no quedan factores de 2 y el producto conya no produce un número entero; el programa se detiene entonces con una salida final dePor lo tanto, suma dos números enteros.
Multiplicación
Podemos crear un "multiplicador" mediante un "bucle" a través del "sumador". Para ello, necesitamos introducir estados en nuestro algoritmo. Este algoritmo tomará un númeroy producir:
El estado B es un bucle que añadeay también se mueveay el estado A es un bucle de control externo que repite el bucle en el estado B.veces. El estado A también restablece el valor dedeuna vez que el bucle en el estado B se haya completado.
Podemos implementar estados utilizando nuevas variables como indicadores de estado. Los indicadores de estado para el estado B serán:y. Tenga en cuenta que requerimos dos indicadores de control de estado para un bucle; un indicador primario () y una bandera secundaria (Dado que cada indicador se consume cada vez que se prueba, necesitamos un indicador secundario que indique "continuar en el estado actual"; este indicador secundario se reemplaza por el indicador principal en la siguiente instrucción y el bucle continúa.
Al agregar los indicadores de estado e instrucciones de FRACTRAN a la tabla del algoritmo de multiplicación , tenemos:
Cuando escribimos las instrucciones FRACTRAN, debemos colocar las instrucciones del estado A al final, porque el estado A no tiene indicadores de estado; es el estado predeterminado si no se establecen indicadores de estado. Por lo tanto, como programa FRACTRAN, el multiplicador queda así:
Con la entrada 2 a 3 b este programa produce la salida 5 ab . [ nota 2 ]

Resta y división
De manera similar, podemos crear un "restador" FRACTRAN, y las restas repetidas nos permiten crear un algoritmo de "cociente y resto" como sigue:
Al escribir el programa FRACTRAN, tenemos:
y la entrada 2 n 3 d 11 produce la salida 5 q 7 r donde n = qd + r y 0 ≤ r < d .
El algoritmo principal de Conway
El algoritmo generador de primos de Conway descrito anteriormente es esencialmente un algoritmo de cociente y resto dentro de dos bucles. Dada una entrada de la formadonde 0 ≤ m < n , el algoritmo intenta dividir n + 1 por cada número desde n hasta 1, hasta encontrar el mayor número k que sea divisor de n + 1. Luego devuelve 2 n + 1 7 k - 1 y repite el proceso. La única vez que la secuencia de números de estado generada por el algoritmo produce una potencia de 2 es cuando k es 1 (de modo que el exponente de 7 es 0), lo cual solo ocurre si el exponente de 2 es un número primo. Una explicación paso a paso del algoritmo de Conway se puede encontrar en Havil (2007).
Para este programa, llegar al número primo 2, 3, 5, 7... requiere respectivamente 19, 69, 281, 710,... pasos (secuencia A007547 en el OEIS ) .
También existe una variante del programa de Conway, [ 1 ] que difiere de la versión anterior en dos fracciones:
Esta variante es un poco más rápida: llegar a 2, 3, 5, 7... le lleva 19, 69, 280, 707... pasos (secuencia A007546 en el OEIS ) . Una sola iteración de este programa, que comprueba si un número N es primo, requiere la siguiente cantidad de pasos: dóndees el mayor divisor entero de N yes la función piso . [ 2 ]
En 1999, Devin Kilminster demostró un programa más corto de diez instrucciones: [ 3 ] Para una entrada inicial n = 10, se generan números primos sucesivos mediante potencias de 10 subsiguientes.
Otros ejemplos
El siguiente programa FRACTRAN:
Calcula el peso de Hamming H( a ) de la expansión binaria de a, es decir, el número de 1s en la expansión binaria de a . [ 4 ] Dado un valor de entrada de 2a , su salida es 13H ( a ) . El programa se puede analizar de la siguiente manera:
Notas
- ↑ La numeración de Gödel no se puede utilizar directamente para enteros negativos, números de punto flotante o cadenas de texto, aunque se podrían adoptar convenciones para representar estos tipos de datos indirectamente. Las extensiones propuestas para FRACTRAN incluyen FRACTRAN++ y Bag .
- ↑ En la página de Esolang FRACTRAN se describe un algoritmo multiplicador similar .
Véase también
Referencias
- Guy, Richard K. (1983). "La máquina productora de números primos de Conway" . Mathematics Magazine . 56 (1). Taylor & Francis : 26–33 . doi : 10.1080/0025570X.1983.11977011 .
- Conway, John H. (1987). «FRACTRAN: Un lenguaje de programación universal y sencillo para la aritmética». Problemas abiertos en comunicación y computación . Springer-Verlag New York, Inc. pp. 4–26 . doi : 10.1007/978-1-4612-4808-8_2 . ISBN 978-1-4612-9162-6.
- Conway, John H.; Guy, Richard K. (1996). El libro de los números . Springer-Verlag New York, Inc. ISBN 0-387-97993-X.
- Havil, Julian (2007). ¡Desconcertado! Princeton University Press. ISBN 978-0-691-12056-0.
- Roberts, Siobhan (2015). «Criterios de virtud». Genius At Play - The Curious Mind of John Horton Conway . Bloomsbury. pp. 115–119 . ISBN 978-1-62040-593-2.
Enlaces externos
- Conferencia de John Conway: "Fractran: Un lenguaje lógico ridículo"
- "Patología de los números primos: Fractran"
- Weisstein, Eric W. "FRACTRAN" . MathWorld .
- Patología de los números primos
- FRACTRAN - (wiki de Esolang)
- Implementación en Ruby y programas de ejemplo
- Problema 308 del Proyecto Euler
- "Desarrollar Fizzbuzz en Fractran desde la base"
- Chris Lomont, "Un intérprete universal de FRACTRAN en FRACTRAN"
- Modelos de computación
- Lenguajes de programación esotéricos
- matemáticas recreativas