Comment detail

ダブル完全数 (Nested Flatten)
既出のロジックを使わせてもらいました。
(test 10001)
=>(672 120)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
(define (test limit)
  (define (pnumber k limit)
    (do ((i 1 (+ i 1)) (v (make-vector limit 0))
         (a '() (if (= (vector-ref v i) (* i k)) (cons i a) a)))
        ((= i limit) a)
      (do ((n i (+ n i)))
          ((>= n limit))
        (vector-set! v n (+ (vector-ref v n) i)))))
  (pnumber 3 limit)
  )
同じく、Emacs Lispでも。ベクタを使えば速いので、調子に乗って 1000000 まで調べてみました。
(test 1000001)
=>(523776 672 120)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
(defun test (limit)
  (require 'cl)
  (defun pnumber (k limit)
    (do ((i 1 (+ i 1)) (v (make-vector limit 0))
	 (a nil (if (= (aref v i) (* i k)) (cons i a) a)))
        ((= i limit) a)
      (do ((n i (+ n i)))
          ((>= n limit))
        (aset v n (+ (aref v n) i)))))
  (byte-compile 'pnumber)
  (pnumber 3 limit)
  )

Index

Feed

Other

Link

Pathtraq

loading...