素因数分解 英語でいうとファクタライゼーション
- みずぴー日記 素因数分解がナメたコードを書くことでおれの怒りが有頂天
- Gaucheでエラトステネスの篩で素数ストリーム(世間一般のやつより速い)で破壊力ばつ牛ン
(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)
- http://twitter.com/mzp/status/1902085754
- おいィ?お前らは今の言葉聞こえたか?
- みずぴー日記 素因数分解(コードジェネレータ版)
- ほう、経験が生きたな