fork(2) download
  1. ; triperfect numbers
  2.  
  3. (define (factors n)
  4. (let ((wheel (vector 1 2 2 4 2 4 2 4 6 2 6)))
  5. (let loop ((n n) (f 2) (w 0) (fs (list)))
  6. (cond ((< n (* f f)) (reverse (cons n fs)))
  7. ((zero? (modulo n f))
  8. (loop (/ n f) f w (cons f fs)))
  9. (else (loop n (+ f (vector-ref wheel w))
  10. (if (= w 10) 3 (+ w 1)) fs))))))
  11.  
  12. (define (divisors n) ; divisors of n, including 1 and n
  13. (let ((divs (list 1)))
  14. (do ((fs (factors n) (cdr fs))) ((null? fs) (sort divs <))
  15. (let ((temp (list)))
  16. (do ((ds divs (cdr ds)))
  17. ((null? ds) (set! divs (append divs temp)))
  18. (let ((d (* (car fs) (car ds))))
  19. (when (not (member d divs))
  20. (set! temp (cons d temp)))))))))
  21.  
  22. (define (multi-perfect k)
  23. (do ((n 1 (+ n 1))) ((= n 1000))
  24. (when (= (apply + (divisors n)) (* k n))
  25. (display n) (newline))))
  26.  
  27. (multi-perfect 3)
Success #stdin #stdout 0.31s 51608KB
stdin
Standard input is empty
stdout
120
672