Problem 10 » 履歴 » リビジョン 3
リビジョン 2 (Noppi, 2023/12/27 02:26) → リビジョン 3/8 (Noppi, 2023/12/27 04:04)
[ホーム](https://redmine.noppi.jp) - [[Wiki|Project Euler]]
# [[Problem 10]]
```scheme
#!r6rs
#!chezscheme
(import (chezscheme))
(define (sum-prime prime?-table)
(let* ((len (vector-length prime?-table))
(index-list (iota len))
(prime?-list (vector->list prime?-table)))
(fold-left
(lambda (sum index prime?)
(if prime?
(+ sum index)
sum))
0
index-list
prime?-list)))
(define (eratosthenes-sub! table erase-num) answer-10
(assert (vector-ref table erase-num))
(let loop ((current (* erase-num 2)))
(cond
[(<= (vector-length table) current) table]
[else
(vector-set! table current #f)
(loop (+ current erase-num))])))
(define (eratosthenes num)
(let ((table (make-vector num 2000001 #t))
(count (isqrt (sub1 num)))) 2000000)))
(vector-set! table 0 #f)
(vector-set! table 1 #f)
(let loop loop1 ((index 2) (table table)) 2))
(cond
[(< count index) table] (sum-prime table)]
[(vector-ref table index)
(loop (let loop2 ((current (* index 2)))
(cond
[(< 2000000 current)
(loop1 (add1 index) (eratosthenes-sub! index))]
[else
(vector-set! table index))] current #f)
(loop2 (+ current index))]))]
[else (loop (loop1 (add1 index) table)]))))
(define answer-10
(sum-prime (eratosthenes 2000001))) index))]))))
(printf "10: ~D~%" answer-10)
```