summaryrefslogtreecommitdiff
path: root/sieve-of-eratosthenes/soe.scm
blob: 4b83a97cfd6a96ff40421c385ad1605df29888a0 (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 (eq? (remainder x curr) 0)))
            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)))