Problem 21 - 友愛数

オイラーは60余りの友愛数を求めたらしい。僕も挑戦するぞ(嘘

d(n)をnの真の約数の和と定義する。(真の約数とはn以外の約数のことである。)
もし、d(a) = b かつ d(b) = a を満たすとき、aとbは友愛数(親和数)であるという。

例えば、220の約数は1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 100なのでd(220) = 284とである。
また、284の約数は1, 2, 4, 71, 142なのでd(284) = 220である。

それでは10000未満の友愛数の合計を求めよ。

またも素数絡み。


素因数分解&約数は前の流用。

(define (problem21 n)
  (cond ((= n 1) '())
        ((let ((d (apply + (cdr (reverse (divisor n))))))
              (if (= d n)
                  #f
                  (= n (apply + (cdr (reverse (divisor d))))))) (cons n (problem21 (- n 1))))
        (else
          (problem21 (- n 1)))))

(problem21 10000) ; (6368 6232 5564 5020 2924 2620 1210 1184 284 220)
(apply + (problem21 10000)) ; 31626

完全数は外さないとダメらしい。

僕の素因数分解ライブラリにバグがあるっぽい・・・たまにキャッシュがぶっ壊れる(汗