fork download
  1. ; mertens' conjecture
  2.  
  3. (define range
  4. (case-lambda
  5. ((stop) (range 0 stop (if (negative? stop) -1 1)))
  6. ((start stop) (range start stop (if (< start stop) 1 -1)))
  7. ((start stop step)
  8. (let ((le? (if (negative? step) >= <=)))
  9. (let loop ((x start) (xs (list)))
  10. (if (le? stop x) (reverse xs)
  11. (loop (+ x step) (cons x xs))))))
  12. (else (error 'range "too many arguments"))))
  13.  
  14. (define (factors n)
  15. (let ((wheel (vector 1 2 2 4 2 4 2 4 6 2 6)))
  16. (let loop ((n n) (f 2) (w 0) (fs (list)))
  17. (if (< n (* f f)) (reverse (cons n fs))
  18. (if (zero? (modulo n f))
  19. (loop (/ n f) f w (cons f fs))
  20. (loop n (+ f (vector-ref wheel w))
  21. (if (= w 10) 3 (+ w 1)) fs))))))
  22.  
  23. (define (moebius n)
  24. (if (< n 1) (error 'moebius "must be positive")
  25. (if (= n 1) 1
  26. (let loop ((m 1) (f 0) (fs (factors n)))
  27. (if (null? fs) m
  28. (if (= f (car fs)) 0
  29. (loop (- m) (car fs) (cdr fs))))))))
  30.  
  31. (define (mertens n)
  32. (do ((k 1 (+ k 1))
  33. (m 0 (+ m (moebius k))))
  34. ((< n k) m)))
  35.  
  36. (define (a008683 n) ; moebius function
  37. (map moebius (range 1 (+ n 1))))
  38.  
  39. (display (a008683 25)) (newline)
  40.  
  41. (define (a002321 n) ; mertens function
  42. (map mertens (range 1 (+ n 1))))
  43.  
  44. (display (a002321 20)) (newline)
  45.  
  46. (define (a028442 n)
  47. ; numbers k such that mertens(k) == 0
  48. (let loop ((k 1) (M 0) (ks (list)))
  49. (if (< n k) (reverse ks)
  50. (let* ((m (moebius k)) (M (+ M m)))
  51. (if (zero? M)
  52. (loop (+ k 1) M (cons k ks))
  53. (loop (+ k 1) M ks))))))
  54.  
  55. (display (a028442 200)) (newline)
  56.  
  57. (define (a100306 n)
  58. ; numbers k such that moebius(k) == mertens(k)
  59. (let loop ((k 1) (M 0) (ks (list)))
  60. (if (< n k) (reverse ks)
  61. (let* ((m (moebius k)) (M (+ M m)))
  62. (if (= m M)
  63. (loop (+ k 1) M (cons k ks))
  64. (loop (+ k 1) M ks))))))
  65.  
  66. (display (a100306 200)) (newline)
Success #stdin #stdout 0.02s 8388KB
stdin
Standard input is empty
stdout
(1 -1 -1 0 -1 1 -1 0 0 1 -1 0 -1 1 1 0 -1 0 -1 0 1 1 -1 0 0)
(1 0 -1 -1 -2 -1 -2 -2 -2 -1 -2 -2 -3 -2 -1 -1 -2 -2 -3 -3)
(2 39 40 58 65 93 101 145 149 150 159 160 163 164 166)
(1 3 40 41 59 66 94 102 146 150 151 160 161 164 165 167)