fork(2) download
  1. ; fenwick trees
  2.  
  3. (define size 100)
  4.  
  5. (define fen (make-vector (+ size 1) 0))
  6.  
  7. (define (lsb i) (logand i (- i)))
  8.  
  9. (define (incr i k) ; add k to element at index i
  10. (do ((i i (+ i (lsb i))))
  11. ((< size i))
  12. (vector-set! fen i (+ (vector-ref fen i) k))))
  13.  
  14. (define (sum i) ; cumulative sum through index i
  15. (let loop ((i i) (sum 0))
  16. (if (zero? i) sum
  17. (loop (- i (lsb i))
  18. (+ sum (vector-ref fen i))))))
  19.  
  20. (do ((n 1 (+ n 1))) ((< 100 n)) (incr n n))
  21.  
  22. (display fen) (newline)
  23.  
  24. (define-syntax assert
  25. (syntax-rules ()
  26. ((assert expr result)
  27. (if (not (equal? expr result))
  28. (for-each display `(
  29. #\newline "failed assertion:" #\newline
  30. expr #\newline "expected: " ,result
  31. #\newline "returned: " ,expr #\newline))))))
  32.  
  33. (define (gauss n) (* n (+ n 1) 1/2))
  34.  
  35. (do ((n 1 (+ n 1))) ((< 100 n))
  36. (assert (sum n) (gauss n)))
Success #stdin #stdout 0.06s 8248KB
stdin
Standard input is empty
stdout
#(0 1 3 3 10 5 11 7 36 9 19 11 42 13 27 15 136 17 35 19 74 21 43 23 164 25 51 27 106 29 59 31 528 33 67 35 138 37 75 39 292 41 83 43 170 45 91 47 648 49 99 51 202 53 107 55 420 57 115 59 234 61 123 63 2080 65 131 67 266 69 139 71 548 73 147 75 298 77 155 79 1160 81 163 83 330 85 171 87 676 89 179 91 362 93 187 95 2576 97 195 99 394)