P41: goldbach conjecture その2

指定した範囲に対するgoldbach conjectureの結果を整形して表示。

goldbach-rangeは後の、条件を超える素数の組の数を求める問題のために分離しておいた。

;; P41
(defun goldbach-range (start end &optional (pred #'identity))
  (remove-if #'(lambda (n)
		 (cond
		   ((null n))
		   ((not (funcall pred n)))))
	     (mapcar #'goldbach (range start end))))

(defun goldbach-list (start end &optional (limit 1))
  (dolist (n (goldbach-range start end
			     #'(lambda (n) (< limit (car n)))))
    (destructuring-bind (p1 p2) n
      (format t "~s = ~s + ~s~%" (+ p1 p2) p1 p2))))

(goldbach-list 1 2000 50)
;; => nil

表示するので当然評価結果はnilに…。
P41に来て初めて表示使ったな。

1〜2000の範囲で素数の組の内小さい素数が50を超えるケースは以下の通り。

CL-USER> (goldbach-list 1 2000 50)
992 = 73 + 919
1382 = 61 + 1321
1856 = 67 + 1789
1928 = 61 + 1867
NIL
CL-USER> 

1〜3000の範囲で、素数の組の内小さい素数が50を超える偶数の数は9つ。

(length (goldbach-range 1 3000
		#'(lambda (n) (< 50 (car n)))))
;; => 9 (#x9, #o11, #b1001)