P36: 素因数分解 その2

;; P36
(defun prime-factor-mult (n)
  (labels ((append-val (m res)
	     (cond
	       ((null res) (list (list m 1)))
	       ((= m (caar res)) (incf (cadar res)) res)
	       (t
		(cons (list m 1) res))))
	   (iter (n m limit res)
	     (cond
	       ((> m limit) (reverse (append-val n res)))
	       ((= (mod n m) 0) (iter (/ n m) m (sqrt (/ n m)) (append-val m res)))
	       (t
		(iter n (1+ m) limit res)))))
    (cond
      ((or (< n 1) (not (integerp n)))
       (error "n=~a: 1以上の整数を指定してください。" n))
      ((= n 1) (list 1))
      ((iter n 2 (sqrt n) '())))))

(prime-factor-mult 315)
;; => ((3 2) (5 1) (7 1))