Problem 10 - 力業

お、やっと終わった。

20分くらい放置。

(define (primers n)
  (define (iter l)
    (if (null? l)
        '()
        (cons (car l)
              (iter (filter
                      (lambda (o)
                        (not (zero? (modulo o (car l)))))
                      (cdr l))))))
  (iter (cons 2 
              (list-tabulate (quotient (- n 1) 2) (lambda (x)
                                                      (+ (* x 2) 3)))))) 

(apply + (primers 2000000)) ; 142913828922 


30問達成!!


解答を見て勉強します。はい。

お勉強ノート1

人のソースを見ながらお勉強1

srfi-1を使って、改造してみた。

(define (prime? n)
  (define (trial-divisor t)
    (or (< n (* t t))
        (and (not (zero? (remainder n t)))
             (trial-divisor (+ t 2)))))
  (if (even? n)
      (= n 2)
      (trial-divisor 3)))

(apply + (filter prime? (iota (- 2000000 1) 2))) ; 142913828922

適当に割ってみる。これでも結構早い。20秒くらい。

素数判定した方が早いようだ。