2024-07-10 21:11:53 +02:00
|
|
|
( comments refer to the Pascal implementation )
|
2024-07-09 18:07:02 +02:00
|
|
|
|
2024-07-10 21:11:53 +02:00
|
|
|
8190 CONSTANT SIZE ( const size = 8190; )
|
|
|
|
VARIABLE FLAGS SIZE ALLOT ( flagType = array[ 0..size ] of boolean; var flags : flagType )
|
|
|
|
|
|
|
|
: SIEVE ( program sieve{ OUTPUT }; )
|
|
|
|
10 0 DO ( for iter := 1 to 10 do begin )
|
|
|
|
FLAGS SIZE -1 FILL ( for i := 0 to size do flags[ i ] := true; )
|
|
|
|
0 ( count := 0; -- push it on the stack )
|
|
|
|
SIZE 0 DO ( for i := 0 to size do begin )
|
|
|
|
I FLAGS + C@ IF ( if flags[ i ] then begin -- do loop index is i, c@ reads byte from flags element i )
|
|
|
|
I I + 3 + ( prime := i + i + 3; )
|
|
|
|
DUP I + ( k := i + prime; -- DUP duplicates the top of stack )
|
|
|
|
BEGIN DUP SIZE < WHILE ( while k <= size do begin )
|
|
|
|
DUP FLAGS + 0 SWAP C! ( flags[ k ] := false; -- c! writes to address with value both on stack )
|
|
|
|
OVER + ( k := k + prime; -- OVER copies second item [prime] to the top )
|
|
|
|
REPEAT
|
|
|
|
DROP DROP ( remove k and prime from stack )
|
|
|
|
1 + ( count := count + 1; -- count is on the top of the stack )
|
|
|
|
THEN ( end the if block )
|
|
|
|
LOOP
|
|
|
|
LOOP
|
|
|
|
." count of primes: " . ( writeln{ 'count of primes: ', count }; )
|
|
|
|
; ( end. )
|
2024-07-09 18:07:02 +02:00
|
|
|
|