(defun primes (n) (flet ((divisible-p (a b) (= 1 (denominator (/ a b))))) (cond ((< n 2) ()) ((= n 2) (list 2)) (T (let ((primes (primes (1- n)))) (if (find n primes :test #'divisible-p) primes (list* n primes))))))) (defun prime-factors (n) (let ((primes (primes (ceiling (sqrt n))))) (loop for prime in primes for next = (/ n prime) when (= 1 (denominator next)) collect prime when (= 1 (denominator next)) do (setf n next))))