\ $Id: sieve.gforth,v 1.2 2001/05/25 16:49:59 doug Exp $
\ http://www.bagley.org/~doug/shootout/
\ adapted from a program in the gforth distribution
\ modified and annotated by doug bagley
\ find and count all primes from 2 to 8192
decimal
\ read NUM from last command line argument
0. argc @ 1- arg >number 2drop drop constant NUM
\ we search for primes up to this SIZE
8192 constant SIZE
\ Flags is an array of chars of length SIZE
\ we'll mark all non-prime indexes in this array as false
\ the remaining indexes will be prime numbers
create Flags SIZE allot
\ EndFlags points to end of array Flags
Flags SIZE + constant EndFlags
\ FLAGMULTS
\ flag all multiples of n in array as not prime
\ array has address range: fromaddr toaddr
\ starting value for fromaddr should be
\ arraystart n n + +
: flagmults
do
0 i c! dup
+loop ;
\ END FLAGMULTS
\ PRIMES
\ find all primes from 2 to SIZE
: primes
\ fill array Flags with 1's
Flags SIZE 1 fill
0 2
\ index i ranges from Flags to EndFlags
EndFlags Flags
do
i c@
\ If the current Flags[i] is true (i.e. i is prime)
if
dup i + dup EndFlags <
\ If we aren't at end of flags array yet
if
EndFlags swap flagmults
else
drop
then
\ Increment our Count of Primes
swap 1+ swap
then
1+
loop
drop \ your pants!
;
\ END PRIMES (Returns: Count)
\ BENCHMARK
\ run the test NUM times
: benchmark 0 NUM 0 do primes nip loop ;
\ now print count of how many Flags are now "true"
." Count: " benchmark 1 u.r cr
\ PPRIMES
\ for testing, we can print out all the prime numbers
: pprimes
SIZE 0 do Flags i + c@ if i 2 + . then loop cr ;
\ uncomment the following to print the primes or debug
\ pprimes
\ flags 100 dump
bye \ th-th-that's all folks!