; highly composite numbers

(define (zip . xss) (apply map list xss))

(define (nod x)
  (let loop ((n 2) (z 2))
    (if (= z x) n
      (if (zero? (modulo x z))
          (loop (+ n 1) (+ z 1))
          (loop n (+ z 1))))))

(define (hcp limit)
  (let loop ((x 2) (y (list 1)) (z (list 1)))
    (if (< limit x) (reverse (zip y z))
      (let ((n (nod x)))
        (if (< (car z) n)
            (loop (+ x 1) (cons x y) (cons n z))
            (loop (+ x 1) y z))))))

(display (hcp 1000)) (newline)