(define (gen-primes-init n) (let loop ((i 3) (l '(2))) (if (>= i n) (cons i l) (let loop2 ((p l)) (if (null? p) (loop (fx+ 2 i) (append l (list i))) (if (fx= 0 (fxmod i (car p))) (loop (fx+ 2 i) l) (loop2 (cdr p)))))))) (define (gen-primes n) (let ((sl (gen-primes-init (sqrt n))) (l '()) (i 0)) (set! i (car sl)) (set! sl (cdr sl)) (let loop ((i i)) (if (>= i n) (append sl (reverse l)) (let loop2 ((p sl)) (cond ((null? p) (set! l (cons i l)) (loop (fx+ 2 i))) ((fx= 0 (fxmod i (car p))) (loop (fx+ 2 i))) (else (loop2 (cdr p)))))))))