;;; Determina os primos entre K e N (defun primes-between (k n) (if (or (< n 1) (< n k)) () (remove-smaller k (primes-up-to n)) ) ) ;;; Remove menores que K de uma LISTA (defun remove-smaller (k lista) (remove-if #'(lambda (x) (< x k)) lista) ) ;;; Retorna a lista com os primos ate' N ;;; em ordem crescente (defun primes-up-to (n) (primes-up-to-aux () 2 n) ) ;;; Funcao auxiliar acumuladora para o calculo ;;; dos primos ate' N. ;;; L e' a lista parcial de primos ja' obtidos ;;; Deseja-se complementar L com os primos entre ;;; K e N (defun primes-up-to-aux (l k n) (cond ((> k n) l) ((any-divides l k) (primes-up-to-aux l (1+ k) n)) (t (primes-up-to-aux (append l (list k)) (1+ k) n)) ) ) ;;; Predicate. True when some integer from the list ;;; LISTA divides K (defun any-divides (lista k) (some #'(lambda (x) (= 0 (mod k x))) lista) )