P40: goldbach conjecture

g000001さんの解法を参考にさせてもらいました。

まずは、次の素数を見つける関数next-primeを定義。
例によって、P31のprime-pを使います。

(defun next-prime (n)
  (if (prime-p (1+ n))
      (1+ n)
      (next-prime (1+ n))))

(next-prime 40)
;; => 41

奇数と2は対象外なので、nilを返します。

;; P40
(defun goldbach (m)
  (if (or (oddp m) (<= m 2))
      nil
      (do ((l 2 (next-prime l)))
	  ((or (prime-p (- m l))
	       (> l (/ m 2)))
	   (if (> l m)
	       (error "goldbach conjecture is not solved")
	       (list l (- m l)))))))
CL-USER> (mapcar #'goldbach (remove-if #'oddp (range 1 100)))
(NIL (2 2) (3 3) (3 5) (3 7) (5 7) (3 11) (3 13) (5 13) (3 17) (3 19) (5 19)
 (3 23) (5 23) (7 23) (3 29) (3 31) (5 31) (7 31) (3 37) (5 37) (3 41) (3 43)
 (5 43) (3 47) (5 47) (7 47) (3 53) (5 53) (7 53) (3 59) (3 61) (5 61) (7 61)
 (3 67) (5 67) (3 71) (3 73) (5 73) (7 73) (3 79) (5 79) (3 83) (5 83) (7 83)
 (3 89) (5 89) (7 89) (19 79) (3 97))
CL-USER>