blob: f0067c483501dd2d32997e8694146fa2fbed5eed (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
(define-module (soe)
#:export (generate-primes-to
generate-initial-lst))
(define (generate-primes-to n)
(define (sieve buffer accept prev-size)
(if (or (null? buffer)
;; if filter removes nothing, we are done.
;; sub one because we always move an element into accepted
(eq? (length buffer) (1- prev-size)))
(append (reverse accept) buffer)
(let ((curr (car buffer))
(size (length buffer)))
(sieve
(filter
(lambda (x) (not (zero? (remainder x curr))))
buffer)
(cons curr accept)
size))))
(let ((buffer (generate-initial-lst n))
(accept '(2)))
(if (> 2 n)
'()
(sieve buffer accept -1))))
(define (generate-initial-lst n)
"Generates a list of odd numbers
up to N."
(if (> 3 n)
'()
(iota (floor (/ (1- n) 2)) 3 2)))
|