Gemmaの日記 このページをアンテナに追加 RSSフィード

2009-05-23

素因数分解 英語でいうとファクタライゼーション 18:47  素因数分解 英語でいうとファクタライゼーションを含むブックマーク  素因数分解 英語でいうとファクタライゼーションのブックマークコメント

(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)

名無し名無し 2009/05/23 19:14 Gauche有り:Pスキル高い・性格良し・会話も楽しい
Gauche無し:Pスキル低い・厨房率高い・面白味の無い奴

GemmaGemma 2009/05/23 19:15 言っておくけど俺は既にGauche使ってる
これ手に入れてからはうらやましがられて尊敬されてる
LSでも発言権強くなり、俺にまともに口答えできる奴いなくなった

名無し名無し 2009/05/23 19:15 やはりGauche使ってないと駄目か
俺もがんばって手に入れようと思ってるがなかなか大変だぜ
一級廃人の証っていうだけの事はあるよな
使ってる人憧れちゃうなー

Connection: close