\documentclass[a4paper]{article} \usepackage[utf-8]{inputenc} \usepackage[german]{babel} \usepackage{url} \usepackage{alltt} \usepackage{multicol} \title{Projekt Euler - Problem 9} \ifx\shorttitle\undefined\else \shorttitle{Euler 9} \fi \author{Michael Kalus} \begin{document} \maketitle Vorsicht, die mathematischen Knobeleien in dem Projekt Euler machen süchtig. Hier eine weitere Lösung. Mögen noch viele in Forth folgen. \section{Die Aufgabe} Ein pythagoreisches Triplet ist ein Satz natürlicher Zahlen, $a<b<c$, für den $a^2 + b^2 = c^2$ gilt. Zum Beispiel $3^2 + 4^2 = 9 + 16 = 25 = 5^2$. Es existiert genau ein pythagoreisches Triplet, für das gilt: $a + b + c = 1000$ Finde das Produkt $a b c$. Quelle: \url{http://projecteuler.net/} \section{Eine Lösung} \begin{quote} \begin{listing}[1]{1} decimal vocabulary euler euler definitions \ Satz des Pythagoras: a^2 + b^2 = c^2 : pyt ( a b -- c^2 ) dup * swap dup * + ; \ Quadratwurzel ziehen: Heron-Verfahren (Heron von Alexandria) \ Die Iterationsvorschrift lautet: xn+1 = ( xn + a/xn ) / 2 \ In RPN: a xn / xn + 2 / --> xn+1 \ Weil nur die natürlichen Werte der Wurzel aus c^2 gebraucht werden, \ wird ganzzahlig kalkuliert. \ Quelle: forth-ev wiki \ http://www.forth-ev.de/wiki/doku.php : sqrt ( a -- s ) DUP 0= ?EXIT DUP >R BEGIN R@ OVER / OVER + 2/ DUP ROT - ABS 1 <= UNTIL R> DROP ; \ Wir brauchen nur die Werte von c, für die c eine natürliche Zahl ist. : nsqrt? ( a b -- f ) pyt dup sqrt ( -- n s ) dup * ( -- n s*s ) - 0= ; ( -- f ) \ if zero, s is natural number. \ Ist a+b+c=1000? : 1000? ( a b -- f ) 2dup pyt sqrt + + 1000 = ; \ Hübsche Ausgabe der gefundenen Lösungen (!) : .solution ( a b -- ) cr ." -------------------" cr 2dup swap ." a=" . ." b=" . 2dup pyt sqrt ." c=" . cr 2dup 2dup pyt sqrt + + ." a+b+c=" . cr 2dup pyt sqrt * * ." abc=" . ; \ Teste a,b bis zum Wert a=b=xx variable xx 1000 xx ! : p9 ( -- ) xx @ 0 DO xx @ 0 DO i j nsqrt? IF i j 1000? IF i j .solution THEN THEN LOOP LOOP cr ." -------------------" ; words cr cr \end{listing} \end{quote} \end{document}