Benutzer:Simeon-ohne-Hund/Entwurf
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). FRACTRAN heißt also soviel 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 so lange mit den Brüchen multipliziert, bis das Podukt 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äßt 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 nachfolgen 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äßt 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]:
Mit der Startzahl 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:
Ein Java-Programm
Das folgende Java-Programm multipliziert 5 mit 2:
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.
Notiz
Weitere Beispiele zu FRACTRAN-Programmen finden Sie auf der englisch-sprachigen Wikipedia-Seite.
Einzelnachweise
- ↑ J. H. Conway: FRACTRAN: A Simple Universal Programming Language for Arithmetc, in: T. Jeffrey C. Lagarias (Hrsg.): The Ultimate Challenge: The 3x+1 Problem American Mathematical Soc., 2010, S. 249 - 264, ISBN 978-8218-4940-8
- ↑ Dimitri Hendriks: FRACTRAN, 2011 (PDF; 256 kB)
- ↑ The On-Line Encyclopedia of Integer Sequences, Folge A007542
Literatur
- Julian Havil: Verblüfft?!: Mathematische Beweise unglaublicher Ideen, Springer-Verlag, Berlin Heidelberg 2009, S. 155 - 170, ISBN 978-3-642-32318-8
- Dominic Olivastro: Das chinesische Dreieck: Die kniffligsten Rätsel aus 10.000 Jahren, Zweitausendeins, Frankfurt 2006, S. 30 - 38, ISBN 3-86150-764-1
Weblinks
- Online-Rechner für FRACTRAN-Programme