100 // The Sieve of Eratosthenes 110 // 120 nPrimes = WIDTH * (HEIGHT - 1) - 1 130 PRINT nPrimes 140 DIM primes(nPrimes) 150 FOR i = 0 TO nPrimes CYCLE 160 primes(i) = TRUE 170 REPEAT 180 CLS 190 PROC display(nPrimes) 200 WAIT (2) 210 PROC sieve(nPrimes) 220 PROC display(nPrimes) 230 END 500 // 510 // Procedure to display the primes array 520 // 530 DEF PROC display(num) 540 LOCAL i 550 HVTAB (0, 0) 560 FOR i = 0 TO num CYCLE 570 IF primes(i) THEN 580 PRINT "*"; 590 ELSE 600 PRINT " "; 610 ENDIF 620 REPEAT 630 ENDPROC 1000 // 1010 // Procedure to calculate the Sieve 1020 // Uses the global array primes() 1030 // 1040 DEF PROC sieve(num) 1050 LOCAL i, limit, pointer 1060 // Initialise 1070 primes(0) = FALSE 1080 primes(1) = FALSE 1090 limit = SQRT (num) 1100 pointer = 1 1110 CYCLE 1120 // Find the next number flagged as a prime 1130 pointer = pointer + 1 1140 WHILE NOT primes(pointer) CYCLE 1150 pointer = pointer + 1 1160 IF pointer > limit THEN ENDPROC 1170 REPEAT 1180 // Now strike-off all its multiples 1190 FOR i = pointer + pointer TO num STEP pointer CYCLE 1200 primes(i) = FALSE 1210 REPEAT 1220 PROC display(num) 1230 WAIT (0.5) 1240 REPEAT