; almost-primes (define (factors n) (let ((wheel (vector 1 2 2 4 2 4 2 4 6 2 6))) (let loop ((n n) (f 2) (w 0) (fs (list))) (if (< n (* f f)) (reverse (cons n fs)) (if (zero? (modulo n f)) (loop (/ n f) f w (cons f fs)) (loop n (+ f (vector-ref wheel w)) (if (= w 10) 3 (+ w 1)) fs)))))) (define (kap? k n) (= (length (factors n)) k)) (define (distinct? xs) (if (or (null? xs) (null? (cdr xs))) #t (if (= (car xs) (cadr xs)) #f (distinct? (cdr xs))))) (define (sfkap? k n) (let ((fs (factors n))) (and (= (length fs) k) (distinct? fs)))) (define (seq test? k len) (let loop ((k k) (m len) (n 2) (ks (list)) (kss (list))) (if (zero? k) kss (if (zero? m) (loop (- k 1) len 2 (list) (cons (reverse ks) kss)) (if (test? k n) (loop k (- m 1) (+ n 1) (cons n ks) kss) (loop k m (+ n 1) ks kss)))))) (for-each (lambda (ks) (display ks) (newline)) (seq kap? 5 10)) (newline) (for-each (lambda (ks) (display ks) (newline)) (seq sfkap? 5 10))