約数のわっ!
もとい、約数の和について。
Project Eulerで約数の和をそこそこ使うから書いていた。
(let1 x 12 (apply + (filter (^n (zero? (mod x n))) (iota x 1))))
例えば、こんな感じのロジックを実装していた。
なんだけど、例えばこれを多用するような処理を書いちゃうとボトルネックになっちゃう。
なので、実装しなおしてみた。
(use math.prime) (use gauche.sequence) (define (sum-of-divisor x) (apply * (map (^l (apply + (map-with-index (lambda (x y) (expt y x)) l))) (map (^l (make-list (+ (length l) 1) (car l))) (group-sequence (mc-factorize x))))))
まぁ、そこそこの速さになりましたとさ♪
ちなみにmake-listのとこは、(mc-factorize 12)だと(2 2 3)と返ってくるので、(group-sequence (mc-factorize 12))としてやって、( (2 2) (3) )というリストに変換してあげている。
これだと2の2乗と3の1乗という情報になっているんだけど、この計算するときに2の0乗+2の1乗+2の2乗という風にしたくて、このままだと使いづらいのでリストを作り直している感じ。