10以下の素数の和は 2 + 3 + 5 + 7 = 17 である.
200万以下の全ての素数の和を求めよ.
200万以下の全ての素数の和を求めよ.
問題7でエラトステネスのふるいを実装したので, その成果を使います.
- エラトステネスのふるいを使って200万以下の素数のリストを求める.
- 求めた整数のリストの和を求める.
手続きは次のとおりです.
(require srfi/1)
(define (sieve pv n)
(define (loop i)
(when (< i (vector-length pv))
(vector-set! pv i #f)
(loop (+ i n))))
(loop (+ n n)))
(define (find-prime pv start)
(cond ((<= (vector-length pv) start) #f)
((vector-ref pv start) start)
(else (find-prime pv (+ start 1)))))
(define (eratosthenes pv)
(define (loop n)
(when (and n (< n (sqrt (vector-length pv))))
(sieve pv n)
(loop (find-prime pv (+ n 1)))))
(loop 2))
(define (prime-vector n)
(let ((pv (make-vector (+ n 1) #t)))
(eratosthenes pv)
pv))
(define (prime-vect-to-list pv)
(define (loop ans n)
(if (< n (vector-length pv))
(let ((p (find-prime pv n)))
(if p
(loop (cons p ans) (+ p 1))
(reverse ans)))
(reverse ans)))
(loop () 2))
計算結果は次のとおりです.
ようこそ DrRacket, バージョン 5.3.3 [3m]. 言語: Pretty Big; memory limit: 512 MB. > (fold + 0 (prime-vect-to-list (prime-vector 10))) 17 > (fold + 0 (prime-vect-to-list (prime-vector 2000000))) 142913828922 >
0 件のコメント:
コメントを投稿