;; (select even? '(1 2 3 4) '(foo bar fred barney)) => (bar barney) (define select (lambda (pred ls1 ls2) (if (null? ls1) () (if (pred (car ls1)) (cons (car ls2) (select pred (cdr ls1) (cdr ls2))) (select pred (cdr ls1) (cdr ls2)))))) ;; (outer-product cons '(a b) '(c d)) => ;; (((a . c) (a . d)) ((b . c) (b . d))) (define outer-product (lambda (proc u v) (map (lambda (u_i) (map (lambda (v_j) (proc u_i v_j)) v)) u))) ;; 7 => (1 2 3 4 5 6 7) (define iota (lambda (n) (letrec ((loop (lambda (n acc) (if (= n 0) acc (loop (- n 1) (cons n acc)))))) (loop n ())))) ;; 4 => ((0 1 1 1) (0 0 2 2) (0 1 0 3) (0 0 1 0)) (define matrix-of-remainders (lambda (n) (let ((v (iota n))) (outer-product remainder v v)))) ;; ((0 1 1 1) (0 0 2 2) (0 1 0 3) (0 0 1 0)) => (1 2 2 3) (define rows->number-of-zeros (lambda (list-of-rows) (map (lambda (row) (length (filter zero? row))) list-of-rows))) ;; 30 => (2 3 5 7 11 13 17 19 23 29) (define primes (lambda (n) (select (lambda (x) (= x 2)) (rows->number-of-zeros (matrix-of-remainders n)) (iota n))))