\ Copyright(2006): Albert van der Horst, HCC FIG Holland by GNU Public License
\ Eratosthenes sliding sieve.
6 CONSTANT ppn 256 CONSTANT root
VARIABLE round VARIABLE prime
: cp. round @ root * prime @ + . ;
: inc prime @ 1+ root MOD DUP prime !
0= IF 1 round +! THEN ;
\ buf is a circular buffer that tabulates all prime divisors
\ for cp .. cp+root
root ppn [*] constant /buf
/buf string buf
: buf[] root MOD ppn * buf + ; ( offset -- adr)
: nodiv? prime @ buf[] C@ 0= ; ( -- flag)
: << DUP 1+ SWAP ppn 1- MOVE ; ( adr -- )
: >> DUP 1+ ppn 1- MOVE ; ( adr -- )
: remove prime @ buf[] DUP C@ SWAP << ; ( -- p)
: add prime @ OVER + buf[] DUP >> C! ; ( p -- )
: transport BEGIN remove add nodiv? UNTIL ;
: investigate nodiv? IF cp. ELSE transport THEN ;
: investigate1 nodiv? IF cp. prime @ add ELSE transport THEN ;
: check ; ( limit -- limit ) \ left as an ETTR.
: init 2 prime ! 0 round ! buf /buf ERASE ;
: primes ( limit --)
check init
DUP root MIN 2 ?DO investigate1 inc LOOP
root ?DO investigate inc LOOP ;
10000 primes
|