A fast function to generate all prime numbers less than or equal to a given number
(define (primes-to num)
"Generate all prime numbers less than or equal to a given number"
(cond ((< num 2) '())
((< num 3) '(2))
(true
(letn ((m (/ (- num 3) 2))
(arr (array (+ m 1)))
(lim (/ (- (int (sqrt num)) 3) 2))
(lst '(2)))
(for (i 0 lim)
(when (nil? (arr i))
(letn ((p (+ (* 2 i) 3))
(j (/ (- (* p p) 3) 2)))
(for (k j m p (> k m))
(setf (arr k) true)))))
(for (i 0 m)
(when (nil? (arr i))
(push (+ (* 2 i) 3) lst -1)))
lst))))
(time (println (length (primes-to 1e6))))
;-> 78498
;-> 100.292
(time (println (length (primes-to 1e7))))
;-> 664579
;-> 1396.784
(time (println (length (primes-to 1e8))))
;-> 5761455
;-> 15544.004
(time (println (length (primes-to 1e9))))
;-> 50847534
;-> 178960.989
S.O.: Windows 10
CPU: intel i7
RAM: 32 GB