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