The "Sieve of Eratosthenes" is simple algorithm for finding primes. It starts with a big table of numbers and "crosses out" all multiples of 2, 3, 5, 7...
;; return a a byte vector representation of the primes between 3 and
;; `size'
(define (make-base-blocksize)
(let ((block (make-byte-vectorsize1))
(limit (inexact->exact (truncate (/ (sqrt (*size2)) 2)))))
(do ((i0 (+1i)))
((>=ilimit) block)
(if (= (byte-vector-refblocki) 1)
(let ((prime (+ (*i2) 3)))
(do ((k (+iprime) (+kprime)))
((>=ksize) #t)
(byte-vector-set!blockk0)))))))
;; Given a block of primes in base-block (which must cover the primes
;; up to `(sqrt (+ base (byte-vector-length block)))', set all
;; locations in `block' to 1 that are prime and all others to 0.
(define (sieve-block!base-blockbaseblock)
(byte-vector-fill!block1)
(let* ((size (byte-vector-lengthblock))
(limit (quotient (truncate (sqrt (+base (*size2)))) 2)))
(do ((i0 (+i1)))
((>=ilimit) block)
(if (= (byte-vector-refbase-blocki) 1)
(let* ((prime (+ (*i2) 3))
(multiple (letloop ((multiple (* (quotientbaseprime) prime)))
(if (or (<multiplebase)
(= (remaindermultiple2) 0))
(loop (+multipleprime))
multiple))))
(do ((k (quotient (-multiplebase) 2) (+kprime)))
((>=ksize) #t)
(byte-vector-set!blockk0)))))))