% Content-encoding: UTF-8
\documentclass[ngerman]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\setcounter{secnumdepth}{0}
\setcounter{tocdepth}{0}

\renewcommand{\reftextbefore}{auf der vorherigen Seite}
\renewcommand{\reftextfacebefore}{auf der vorherigen Seite}
\renewcommand{\reftextafter}{auf der nächsten Seite}
\renewcommand{\reftextfaceafter}{auf der nächsten Seite}
\renewcommand{\figurename}{Listing}

\begin{document}

\title{Ramanujans bemerkenswerte Taxi–Nummer 1729 und schnelle Forth–Lösungen}
\ifx\shorttitle\undefined\else
\shorttitle{Taxi–Nummer 1729}
\fi
\author{Henry Vinerts, SVFIG USA}
\maketitle

Aus den E--Mail--Korrespondenzen des Jahres 2005 herausgesucht und
übersetzt von Fred Behringer

(Es ging um die Übertragung nach Turbo--Forth, dem von Fred bevorzugten
16--Bit--Forth. Beispielsweise entspricht das von F83 her bekannte und
überaus brauchbare schöne Wort \verb|DARK| dem Wort \verb|PAGE| aus ANS--Forth.)


\begin{multicols}{2}

27.9.2005

Hallo Fred, da bin ich wieder!

Die Zeit ist für mich wie im Flug vergangen, wahrscheinlich deswegen,
weil inzwischen alles etwas langsamer abzulaufen scheint. Meiner neuen
Hüfte geht es gut. Ich stütze mich noch auf einen Stock, aber nur, um
sicher zu gehen, dass ich die Hüfte nicht zu stark beanspruche. Kürzere
Strecken kann ich schon wieder ohne Stock gehen und das Autofahren
gelingt auch immer besser. Nur zum Arbeiten mit Forth bin ich eine Weile
lang nicht gekommen. Ich will dir aber heute über ein Problem berichten,
das mich seit einiger Zeit beschäftigt.

Es geht um ein schnelles Forth--Programm zur Lösung eines Problems, das
von Hardy und Ramanujan um die Taxinummer 1729 berichtet wird. Es
handelt sich um Summen von Kubikzahlen. Die Geschichte soll sich wie
folgt zugetragen haben:

Hardy war mit einem Taxi zu Ramanujans Haus gefahren und hatte sich
darüber ausgelassen, dass das Taxi, mit dem er hergekommen sei, eine
ziemlich uninteressante Nummer habe, nämlich 1729. Ganz im Gegenteil,
soll Ramanujan geantwortet haben: Die Zahl ist sehr bedeutungsvoll. Sie
ist die erste Zahl, die auf zwei verschiedene Arten als Summe zweier
Kubikzahlen dargestellt werden kann.
\end{multicols}

\begin{figure*}[b]
\listinginput[1]{1}{2007-0304/taxi1.fs}
\caption{\label{taxilisting1}Lösung des Taxi--1729--Problems für F--PC}
\end{figure*}

\begin{figure*}
\listinginput[1]{1}{2007-0304/taxi2.fs}
\caption{\label{taxilisting2}Eine andere Lösung des Taxi--1729--Problems für Turbo--Forth}
\end{figure*}

\begin{multicols}{2}
Paul Snyder präsentierte den SVFIG--Mitgliedern im September 1993 das
Problem, die ersten 10 Zahlen mit der eben genannten Eigenschaft
herauszufinden.  
Sieger sollte derjenige sein, dessen Forth--Routine die
Antwort in der kürzesten Zeit findet. Drei Wettbewerbsteilnehmer fanden
die richtige Antwort. Absoluter Sieger war Art Hampton mit dem unten
stehenden F--PC--Programm. Er machte dabei einige logische Annahmen und
setzte mathematische Tricks ein, um übermäßig starke Berechnungen zu
vermeiden.

Gib \verb|SUMCUBES| ein und lass dich überraschen. Die Antwortzahlen kommen in
ungeordneter Reihenfolge heraus. Aber das ist ja bei nur 10 Zahlen nicht
gar so schlimm. Ich habe mir nun, getreu unserer seit einiger Zeit
geführten Diskussionen, den Spaß erlaubt zu überprüfen, ob Arts Programm
auch in Turbo--Forth läuft. Es läuft, es läuft --- ohne die geringste
Änderung. Und hier das Programm: [Listing \vref{taxilisting1}]

% listing

Ein paar Tage später:

Hallo Fred, und noch einmal ich!

Du hast mir verschiedene Fragen gestellt. Ich will versuchen, sie zu
beantworten --- soweit ich Antworten dazu finde.

Welche Forths sind zugelassen?  --- Ich denke, dass ich dich (und
Friederich) fragen muss, für welche Systeme das Problem bei den heutigen
Forth--Programmierern auf Interesse stoßen würde. Damals, als Paul Snyder
das Problem in der SVFIG bekannt machte, arbeiteten die meisten Forthler
mit F--PC. Einer der drei jedoch, die Lösungen einreichten, Jerry
Mueller, programmierte das Problem in einem Upper--Deck--Forth der Version
2.00 aus dem Jahre 1991. Ich habe den Eindruck, dass es umso
interessanter sein könnte, die Programme miteinander zu vergleichen, je
mehr verschiedene Forth--Versionen zugelassen werden. Was mich betrifft,
ich würde mich dafür interessieren, wie elegant man das Problem mit
einem Forth--System von minimaler Größe lösen kann.

Welche Maschinen sind zugelassen? --- Paul Snyder beschränkte den
Wettbewerb nicht auf irgendwelche Maschinen.


Wie sollen die Zeiten verglichen werden? --- Ich meine nicht, dass die
Zeitfrage bei den heutigen schnellen Maschinen eine wesentliche Rolle
spielt. Zwei Programmierer verwendeten die F--PC--Worte \verb|TIME-RESET| und
\verb|.ELAPSED| am Anfang und am Ende der Colon--Definition, die das Ergebnis
lieferte. Ich kann die entsprechenden Worte in Turbo--Forth nicht finden.
Also habe ich die Zeitmessfunktionen aus Art Hamptons Programm, das ich
dir in einer Turbo--Forth--Fassung geschickt habe, weggelassen. Sein
Programm umfasst 29679 Bytes. Als ich sein \verb|SUMFINAL.EXE| auf meinem
AMD--500--MHz--Desktop laufen ließ, wurde die Lösungszeit mit 0.05 Sekunden
angegeben.

Dürfen die Routinen auch Forth--Assembler enthalten? --- Ich weiß nicht
so recht, was ich sagen soll. Wenn wir uns dazu durchringen könnten, die
Lösungszeit als sekundär zu betrachten und mehr Wert auf clevere
Programmierung mit minimalem Speicheraufwand zu legen, wäre das
heutzutage nicht wichtiger?

Ein Verbot von Assembler könnte ich dadurch umgehen, dass ich Teile von
bestehenden \emph{Primitives} kunstvoll in ein High--Level--Forth--Wort einbaue.
Sind solche Tricks erlaubt? --- Auch hierzu finde ich keine Antwort. Ich
bin sicher, du findest geeignete Regeln selbst. Du kennst den
State--of--the--Art und weißt, für was sich die VD--Leser am meisten
interessieren.

Ich schicke dir hiermit also \verb|CUBES.FTH|, das ich von Jerry Muellers
Lösung der Kubikzahlen von Ramanujan entnommen habe. Nach Entfernung der
Zeitmessfunktionen lief das Programm ohne irgendwelche Veränderungen
auch in Turbo--Forth. Jerry schrieb es ursprünglich in Upper--Deck--Forth
und passte es an F--PC an. Von dort übernahm ich den folgenden Teil für
Turbo--Forth. [Listing \vref{taxilisting2}]

% listing

Das, Fred, stellt meine momentane Beschäftigung mit Turbo--Forth dar.
Durch die dritte Lösung (von Paul Snyder selbst) konnte ich mich bisher
noch nicht durcharbeiten. Man hat nicht den Eindruck, dass sie kompakter
als die beiden anderen ist. Meine eigene Lösung war seinerzeit in
AutoLISP programmiert und verschlang viele Stunden Rechenzeit auf einer
80386/7--Maschine.

Ich danke dir, Fred, für die Erklärungen zum An-- und Ausschalten des
Cursors. Im Augenblick ist das alles, was ich wissen wollte. Ich habe
nur selten Veranlassung gehabt, in die Tiefen des BIOSses
hinabzusteigen. Das Beste, was ich in dieser Hinsicht je zustande
brachte, war ein Progrämmchen, das automatisch CAPSLOCK beim Booten von
PygmyForth in die Wege leitete. Das hat damals, soweit ich mich
erinnere, auf Frank Sergeant Eindruck gemacht.

Für heute verbleibe ich mit den besten Wünschen,

\hspace*{\fill}Henry
\end{multicols}

%\end{document}
