FRACTRAN

esoterische Programmiersprache

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

Bearbeiten

FRACTRAN, von Conway auch als fraction game bezeichnet,[1] wird folgendermaßen „gespielt“:

  1. 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.
  2. 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

Bearbeiten

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

Bearbeiten

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

Bearbeiten

Das (a - b) - Programm

Bearbeiten
 

Die Startzahl ist wiederum   wobei a größer oder gleich b sein sollte. Die erzeugte Folge endet mit  

Das 2a - Programm

Bearbeiten
 

Die Startzahl ist   Die erzeugte Folge endet mit  

Das max (a, b) - Programm

Bearbeiten
 

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

Bearbeiten

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

Bearbeiten

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

Bearbeiten

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.

Einzelnachweise

Bearbeiten
  1. 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.
  2. Dimitri Hendriks: FRACTRAN, 2011 (PDF; 256 kB)
  3. The On-Line Encyclopedia of Integer Sequences, Folge A007542

Literatur

Bearbeiten
  • 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.
Bearbeiten