素因数分解をしてみた

素因数分解をしてみたのでメモ

(defun primep-1 (n i)
    (cond
        ((> i (sqrt n)) T)
        ((zerop (mod n i)) nil)
        (t
            (primep-1 n (1+ i)))))
(defun primep (number)
    (primep-1 number 2))

(defun next-prime (n)
    (cond
        ((primep n) n)
        (t
            (next-prime (1+ n)))))

(defun factoring-1 (n divisor)
    (cond
        ((zerop n) n)
        ((primep n)
            (format t  "    ~A ~%" n)
            n)
        ((zerop (mod n divisor))
            (format t  "~A| ~A ~%----------~%" divisor n)
            (list divisor (factoring-1 (floor (/ n divisor)) divisor)))
        (t
            (factoring-1 n (next-prime (1+ divisor))))))
(defun factoring (n)
    (factoring-1 n 2))

こんな感じで使います

$ ros run
? (factoring 360)
2| 360
----------
2| 180
----------
2| 90
----------
3| 45
----------
3| 15
----------
    5
(2 (2 (2 (3 (3 5)))))
? 

※ 標準出力をちょっとだけ整えました