% 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}