fork(1) download
  1. ; excellent numbers
  2.  
  3. (define (filter pred? xs)
  4. (let loop ((xs xs) (ys '()))
  5. (cond ((null? xs) (reverse ys))
  6. ((pred? (car xs))
  7. (loop (cdr xs) (cons (car xs) ys)))
  8. (else (loop (cdr xs) ys)))))
  9.  
  10. (define (range . args)
  11. (case (length args)
  12. ((1) (range 0 (car args) (if (negative? (car args)) -1 1)))
  13. ((2) (range (car args) (cadr args) (if (< (car args) (cadr args)) 1 -1)))
  14. ((3) (let ((le? (if (negative? (caddr args)) >= <=)))
  15. (let loop ((x(car args)) (xs '()))
  16. (if (le? (cadr args) x)
  17. (reverse xs)
  18. (loop (+ x (caddr args)) (cons x xs))))))
  19. (else (error 'range "unrecognized arguments"))))
  20.  
  21. (define (sum xs) (apply + xs))
  22.  
  23. (define (isqrt n)
  24. (if (not (and (positive? n) (integer? n)))
  25. (error 'isqrt "must be positive integer")
  26. (let loop ((x n))
  27. (let ((y (quotient (+ x (quotient n x)) 2)))
  28. (if (< y x) (loop y) x)))))
  29.  
  30. (define (ilog b n)
  31. (let loop1 ((lo 0) (b^lo 1) (hi 1) (b^hi b))
  32. (if (< b^hi n) (loop1 hi b^hi (* hi 2) (* b^hi b^hi))
  33. (let loop2 ((lo lo) (b^lo b^lo) (hi hi) (b^hi b^hi))
  34. (if (<= (- hi lo) 1) (if (= b^hi n) hi lo)
  35. (let* ((mid (quotient (+ lo hi) 2))
  36. (b^mid (* b^lo (expt b (- mid lo)))))
  37. (cond ((< n b^mid) (loop2 lo b^lo mid b^mid))
  38. ((< b^mid n) (loop2 mid b^mid hi b^hi))
  39. (else mid))))))))
  40.  
  41. (define (xl? n)
  42. (let* ((k (/ (+ (ilog 10 n) 1) 2))
  43. (ten (expt 10 k))
  44. (a (quotient n ten))
  45. (b (modulo n ten)))
  46. (= (- (* b b) (* a a)) n)))
  47.  
  48. (time (display (sum (filter xl? (range 1000 10000)))) (newline))
  49.  
  50. (define (xl-sum k)
  51. (let ((ten (expt 10 k))
  52. (start (expt 10 (+ k k -1)))
  53. (stop (expt 10 (+ k k))))
  54. (let loop ((n start) (sum 0))
  55. (if (= n stop) sum
  56. (let ((a (quotient n ten))
  57. (b (modulo n ten)))
  58. (if (= (- (* b b) (* a a)) n)
  59. (loop (+ n 1) (+ sum n))
  60. (loop (+ n 1) sum)))))))
  61.  
  62. (time (display (xl-sum 2)) (newline))
  63.  
  64. (define (xl-list k)
  65. (let ((ten (expt 10 k))
  66. (start (expt 10 (- k 1)))
  67. (stop (expt 10 k)))
  68. (let loop ((a start) (xls (list)))
  69. (if (= a stop) (reverse xls)
  70. (let* ((b (+ (isqrt (* a (+ ten a))) 1))
  71. (n (+ (* a ten) b)))
  72. (if (= (- (* b b) (* a a)) n)
  73. (loop (+ a 1) (cons n xls))
  74. (loop (+ a 1) xls)))))))
  75.  
  76. (define xl-ten #f)
  77. (time (set! xl-ten (xl-list 5)))
  78. (display xl-ten) (newline)
  79. (display (sum xl-ten)) (newline)
Success #stdin #stdout #stderr 3.42s 7388KB
stdin
Standard input is empty
stdout
3468
3468
(3333466668.0 4848484848.0 4989086476.0)
13171037992.0

stderr
0.271s CPU time, 0.064s GC time (major), 108022 mutations, 47/2079 GCs (major/minor)
0.016s CPU time, 16 mutations, 0/173 GCs (major/minor)
3.113s CPU time, 0.301s GC time (major), 540017 mutations, 159/24111 GCs (major/minor)