プロジェクト

全般

プロフィール

Problem 10 » 履歴 » リビジョン 4

リビジョン 3 (Noppi, 2023/12/27 04:04) → リビジョン 4/8 (Noppi, 2023/12/27 04:55)

[ホーム](https://redmine.noppi.jp) - [[Wiki|Project Euler]] 
 # [[Problem 10]] 

 ```scheme 
 #!r6rs 
 #!chezscheme 

 (import (chezscheme)) 

 (define (sum-prime prime?-table) 
   (let* ([len ((len (vector-length prime?-table)] prime?-table)) 
          [index-list (index-list (iota len)] len)) 
          [prime?-list (prime?-list (vector->list prime?-table)]) prime?-table))) 
     (fold-left 
       (lambda (sum index prime?) 
         (if prime? 
           (+ sum index) 
           sum)) 
       0 
       index-list 
       prime?-list))) 

 (define (eratosthenes-sub! table erase-num) 
   (assert (vector-ref table erase-num)) 
   (let loop ([current ((current (* erase-num 2)]) 2))) 
     (cond 
       [(<= (vector-length table) current) table] 
       [else 
         (vector-set! table current #f) 
         (loop (+ current erase-num))]))) 

 (define (eratosthenes num) 
   (let ([table ((table (make-vector num #t)] #t)) 
         [count (count (isqrt (sub1 num))]) num)))) 
     (vector-set! table 0 #f) 
     (vector-set! table 1 #f) 
     (let loop ([index 2] [table table]) ((index 2) (table table)) 
       (cond 
         [(< count index) table] 
         [(vector-ref table index) 
          (loop (add1 index) (eratosthenes-sub! table index))] 
         [else (loop (add1 index) table)])))) 

 ;;; Problem 10 
 (define answer-10 
   (sum-prime (eratosthenes 2000001))) 

 (printf "10: ~D~%" answer-10) 
 ```