solution.scm 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. ;; Summation of primes
  2. ;; Problem 10
  3. ;; The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.
  4. ;; Find the sum of all the primes below two million.
  5. (import
  6. (except (rnrs base)
  7. let-values
  8. map)
  9. (only (guile)
  10. lambda* λ)
  11. (ice-9 futures)
  12. (lib rabin-miller-test)
  13. (lib naive-prime-test))
  14. (define even?
  15. (λ (num)
  16. (= (remainder num 2) 0)))
  17. (define next
  18. (λ (num)
  19. (cond
  20. [(even? num) (+ num 1)]
  21. [else (+ num 2)])))
  22. (define sum-of-primes
  23. (λ (start limit)
  24. (let loop ([num start]
  25. [acc 0]
  26. [primes-count 1])
  27. (cond
  28. [(> num limit)
  29. (display (simple-format #f "number of primes: ~a\n" primes-count))
  30. acc]
  31. [(prime? num)
  32. (loop (next num)
  33. (+ acc num)
  34. (+ primes-count 1))]
  35. [else
  36. (loop (next num)
  37. acc
  38. primes-count)]))))
  39. (define make-segment
  40. (λ (start end)
  41. (cons start end)))
  42. (define segment-start
  43. (λ (seg)
  44. (car seg)))
  45. (define segment-end
  46. (λ (seg)
  47. (cdr seg)))
  48. (define segment
  49. (λ (start end segment-count)
  50. "Make segments of equal size, except for rounding to whole numbers, which might result in slightly more "
  51. (let ([segment-size
  52. (ceiling
  53. (/ (- end start)
  54. segment-count))])
  55. (let loop ([pos start])
  56. (cond
  57. [(>= (+ pos segment-size) end)
  58. (list (make-segment pos end))]
  59. [else
  60. (cons (make-segment pos (+ pos segment-size))
  61. (loop (next (+ pos segment-size))))])))))
  62. (let* ([start 2]
  63. [limit (- (* 2 (expt 10 6)) 1)]
  64. [cores-count 32]
  65. [segments (segment start limit cores-count)])
  66. (let ([futures
  67. (map (λ (seg)
  68. (future
  69. (sum-of-primes (segment-start seg)
  70. (segment-end seg))))
  71. segments)])
  72. (apply + (map touch futures))))