素因数分解 英語でいうとファクタライゼーション

(use util.stream)
    
(define (composites s)
  (stream-delay
   (let1 p (stream-car s)
     (stream-cons (expt p 2)
                  (xor (stream-map (pa$ * p) (xor (stream-cdr s) (composites s)))
                       (composites (stream-cdr s)))))))

(define (xor s0 s1)
  (stream-delay
   (let ((x (stream-car s0))
         (y (stream-car s1)))
     (cond
      ((= x y) (xor (stream-cdr s0) (stream-cdr s1)))
      ((< x y) (stream-cons x (xor (stream-cdr s0) s1)))
      ((> x y) (stream-cons y (xor s0 (stream-cdr s1))))))))

(define primes (stream-cons 2 (xor (stream-iota -1 3) (composites primes))))

(define (divisor n m count)
  (if (zero? (modulo n m))
    (divisor (quotient n m) m (+ 1 count))
    (values n count)))

;;素因数分解 英語でいうとファクタライゼーション
(define (factor n strm)
  (let ((p  (stream-car strm))
        (ps (stream-cdr strm)))
    (if (< n p)
      ;;この再帰は早くも終了ですね  
       '()
      (receive (r count) (divisor n p 0)
        (if (zero? count)
          (factor r ps) ;;一度も割れなかった→いくえ不明
          (append (make-list count p) (factor r ps))))))) ;;count回割れた→約数ができる

(define (main args)
  (for-each (compose print 
                     (cut factor <> primes)
                     string->number)
            (cdr args)))

% gosh prime.scm 42
(2 3 7)
% gosh prime.scm 84
(2 2 3 7)

(追記 2009/5/25)