; Copyright (C) 2011 Toby Thain, toby@telegraphics.com.au (define (primes-up-to n) (let ((sieve (make-vector (+ n 1) #t))) (define (test-prime i) (define (is-prime? idx) (vector-ref sieve idx)) (define (not-prime! idx) (vector-set! sieve idx #f)) (define (remove-multiples i step) (when (<= i n) (not-prime! i) (remove-multiples (+ i step) step))) (if (> i n) '() (if (is-prime? i) (begin (remove-multiples i i) (cons i (test-prime (+ i 1)))) (test-prime (+ i 1))))) (test-prime 2)))