FRACTRAN
FRACTRAN ist eine Turing-vollständige esoterische Programmiersprache des englischen Mathematikers John H. Conway. Ein FRACTRAN-Programm besteht aus einer endlichen Folge positiver Brüche Der Name FRACTRAN ist ein Wortspiel und bezieht sich auf die Programmiersprache FORTRAN (FORmula TRANslation = Formelübersetzung) und das englische Wort für Bruch (fraction). FRACTRAN heißt also so viel wie FRACtion TRANslation = Bruchübersetzung.
FRACTRAN ausführen
FRACTRAN, von Conway auch als fraction game bezeichnet,[1] wird folgendermaßen „gespielt“:
- Eine positive ganze Zahl als Startzahl wird nacheinander mit den Brüchen multipliziert, solange bis das Produkt wiederum eine ganze Zahl ist. In diesem Fall wird durch ersetzt und man beginnt mit der neuen Zahl wieder von vorne.
- Wenn keiner der Brüche eine ganze Zahl erzeugt, endet das Programm bzw. Spiel.
FRACTRAN lässt sich auch formaler beschreiben,[2] wobei das FRACTRAN-Programm, die erzeugte Folge und die Menge aller Indizes ist, für die das Produkt zu einer ganzen Zahl wird:
FRACTRAN erzeugt eine endliche oder auch unendliche Folge von natürlichen Zahlen. Wenn der letzte Bruch im FRACTRAN-Programm als Nenner eine 1 hat, ist die Folge der natürlichen Zahlen auf jeden Fall unendlich. Wenn ein früherer Bruch im FRACTRAN-Programm als Nenner eine 1 hat, werden die nachfolgenden Brüche beim Multiplizieren nie erreicht und sind somit unnötig für das Programm. Allerdings können auch FRACTRAN-Programme, in denen keiner der Nenner eine 1 ist, bei bestimmten Eingaben eventuell endlos laufen.
Ein erstes Beispiel
Das kurze Programm
erzeugt mit der Startzahl die Folge Aber was hat das mit einem Programm zu tun, warum ist die Startzahl 72 und warum endet das Programm?
Das erste Beispiel genauer betrachtet
Um ein FRACTRAN-Programm besser zu verstehen, ist es sinnvoll, die Zahlen der erzeugten Folge in Primfaktoren zu zerlegen:
Wir betrachten jetzt in erster Linie die Exponenten der Startzahl als Eingaben in das Programm, also Wenn wir uns nun die Exponenten der erzeugten Folge anschauen, dann sehen wir, dass zunächst durch zweimalige Multiplikation mit dem ersten Bruch der Exponent von 3 jeweils um 1 verringert und der Exponent von 5, der ursprünglich 0 war, um 1 vergrößert wird, bis der Exponent von 3 den Wert 0 erreicht hat. Da die nächsten beiden Zahlen der Folgen, nämlich 200 und 80, nicht durch 3, aber durch 5 geteilt werden können, kommt nun der zweite Bruch zweimal zum Tragen: der Exponent von 2 wird jeweils um 1 vergrößert und der Exponent von 5 um 1 verringert, bis auch er den Wert 0 erreicht hat. Da nun die Exponenten von 3 und 5 beide den Wert 0 haben, führt keiner der beiden Brüche bei der Multiplikation zu einer ganzen Zahl, das Programm endet und der Exponent von 2 ist die Summe der ursprünglichen Exponenten von 2 und 3.
Allgemein wird durch das obige FRACTRAN-Programm die Startzahl in die Zahl überführt. Es handelte sich also um ein Additionsprogramm. Das hätte man mit dem FRACTRAN-Programm allerdings auch kürzer haben können, zumal es auch nur halb so viele Schritte bis zur Lösung benötigt.
Weitere Beispiele
Das (a - b) - Programm
Die Startzahl ist wiederum wobei a größer oder gleich b sein sollte. Die erzeugte Folge endet mit
Das 2a - Programm
Die Startzahl ist Die erzeugte Folge endet mit
Das max (a, b) - Programm
Die Startzahl ist Nach max (a, b) Schritten endet die erzeugte Folge mit Das Programm arbeitet folgendermaßen: Zunächst werden durch Multiplikation mit dem ersten Bruch die Werte von a und b gleichzeitig jeweils um 1 verringert, während c, das am Anfang 0 war, um 1 vergrößert wird, bis a oder b gleich 0 ist. Mit den beiden Brüchen wird nun auch der Wert von a oder b, der noch nicht 0 war, schrittweise auf 0 gebracht, während c weiterhin um 1 vergrößert wird.
Das max (a, b) - Programm lässt sich sehr einfach zu einem min (a, b) - Programm umschreiben, indem die beiden letzten Zähler von 5 auf 1 geändert werden.
Das Fibonacci - Programm
Das folgende FRACTRAN-Programm berechnet die n-te Fibonacci-Zahl :
Die Startzahl ist Die erzeugte Folge endet mit der Zahl . So führt z. B. die Startzahl zum Ergebnis , wobei 13 die 7. Fibonaccizahl ist.
Conways PRIMEGAME
Das sicherlich bekannteste FRACTRAN-Programm ist Conways PRIMEGAME[3]:
- Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://wikimedia.org/api/rest_v1/“:): {\displaystyle \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}}
Mit der Startzahl Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://wikimedia.org/api/rest_v1/“:): {\displaystyle N = 2} wird eine Folge erzeugt, die in der richtigen Reihenfolge genau die Zweierpotenzen enthält, deren Exponent eine Primzahl ist. Mit anderen Worten, PRIMEGAME generiert alle Primzahlen, allerdings sehr langsam: Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://wikimedia.org/api/rest_v1/“:): {\displaystyle N_{19} = 2^2, N_{69} = 2^3, N_{281} = 2^5, N_{710} = 2^7, N_{2375} = 2^{11}.}
Ein Java-Programm
Das folgende Java-Programm multipliziert 5 mit 2: Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://wikimedia.org/api/rest_v1/“:): {\displaystyle N = 288 = 2^5 \cdot 3^2, N_{42} = 9765625 = 5^{10}.}
public class Fractran {
public static void main(String[] args) {
long N = 288;
long[] zaehler = {455, 11, 1, 3, 11, 1};
long[] nenner = {33, 13, 11, 7, 2, 3};
int i = 0, j;
boolean halt = false;
System.out.println(i + ": " + N);
while (!halt) {
j = 0;
while (!halt && ((N*zaehler[j])%nenner[j] != 0)) {
j++;
if (j == zaehler.length) halt = true;
}
i++;
if (!halt) {
N = (N*zaehler[j])/nenner[j];
System.out.println(i + ": " + N);
}
}
}
}
Da N im Verlauf des Programms sehr groß werden kann, ist es sinnvoll, das obige Programm so zu erweitern, dass nicht mehr die Zahl N, sondern nur noch die Exponenten von N verarbeitet werden.
Einzelnachweise
- ↑ J. H. Conway: FRACTRAN: A Simple Universal Programming Language for Arithmetic. In: T. Jeffrey C. Lagarias (Hrsg.):The Ultimate Challenge: The 3x+1 Problem. American Mathematical Soc., 2010, ISBN 978-0-8218-4940-8, S. 249–264.
- ↑ Dimitri Hendriks: FRACTRAN, 2011 (PDF; 256 kB)
- ↑ The On-Line Encyclopedia of Integer Sequences, Folge A007542
Literatur
- John Horton Conway: FRACTRAN: A Simple Universal Programming Language for Arithmetic. In: Thomas M. Cover, B. Gopinath: Open Problems in Communication and Computation. Springer-Verlag, 1987, ISBN 0-387-96621-8, S. 4–26.
- Julian Havil: Verblüfft?!: Mathematische Beweise unglaublicher Ideen. Springer-Verlag, Berlin/ Heidelberg 2009, ISBN 978-3-642-32318-8, S. 155–170.
- Dominic Olivastro: Das chinesische Dreieck: Die kniffligsten Rätsel aus 10.000 Jahren. Zweitausendeins, Frankfurt 2006, ISBN 3-86150-764-1, S. 30–38.
Weblinks
- Online-Rechner für FRACTRAN-Programme
- Die einfachste Programmiersprache der Welt: FRACTRAN auf YouTube von Edmund Weitz