\ Benchmark mit der Collatz-Funktion V1.1 RG 2017-10-05 \ c[n+1] = if even(c[n]) then c[n]/2 else 3*c[n]+1 fi \ Da der zweite Term immer gerade ist, wird \ c[n+1] = if odd(c[n]) then c[n]/2 else (3*c[n]+1)/2 fi \ Seien r[n] der Rest und q[n] der Quotient von c[n]/2, also c[n] = 2*q[n] + r[n], somit bei r[n] = 1: \ (3*c[n]+1)/2 = 3*q[n] + 2 \ Diese Version für 16-bit Rechner prüft vor einem Überlauf und bricht die Folge ab: \ Damit 3*q+2<32767 ist, muss q<10922 sein. \ Collatz-Schritt. Null wenn Ueberlauf : cn+1 ( cn -- cm ) 2 /mod swap if dup 10922 < ( ueberlauf ? ) if 3 * 2 + else drop 0 endif endif ; \ Collatz-Folge drucken : coll. ( cn -- ) begin dup 1 > while cn+1 dup . repeat drop ( always 1 ) ; \ Collatz-Folge zaehlen. Null wenn Überlauf : ccnt ( cn -- cnt) 0 swap ( cnt cn ) begin dup 1 > while cn+1 dup if swap 1+ swap ( zaehlen ) else drop 0 endif repeat drop ; \ Maximum fuer alle Folgen bis k bestimmen : cmax ( k -- max ) 0 swap ( max k ) begin dup 0> while dup ccnt ( max k cnt ) rot ( k cnt max ) max ( k max ) swap ( max k ) 1 - ( max k-1 ) repeat drop ; 32101 cmax . ." = 126 ! " : bench 99 0 do 32101 cmax drop loop ;