Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;; Try the number against a list of all the previous primes
- ;; slow :(
- (define primes (list 11 13 17 19 23 29)) ; the not-loop-unrolled primes
- (define count (+ 4 (length primes)))
- (define (is-prime? candidate)
- (define max (sqrt candidate))
- (define (loop-through pr)
- (cond
- [(> (car pr) max) #t]
- [(= 0 (remainder candidate (car pr))) #f]
- [else (loop-through (cdr pr))]))
- ;; first do some "loop unrolling"
- (cond
- [(= 0 (remainder candidate 3)) #f]
- [(= 0 (remainder candidate 5)) #f]
- [(= 0 (remainder candidate 7)) #f]
- [else (loop-through primes)]))
- (define (get-10001st-prime)
- (let loop ([n 31])
- (cond
- [(is-prime? n)
- (if (= count 10001)
- n
- (begin
- (append! primes (list n))
- (set! count (+ 1 count))
- (loop (+ n 2))))]
- [else (loop (+ n 2))])))
- ; While this is a lot faster
- (define (is-prime2? candidate)
- (define max (sqrt candidate))
- (let loop ([n 3])
- (cond
- [(> n max) #t]
- [(= 0 (remainder candidate n)) #f]
- [else (loop (+ n 2))])))
- (define (get-10001st-prime2)
- (let loop ([i 5]
- [c 2])
- (if (is-prime2? i)
- (if (= c 10001)
- i
- (loop (+ i 2) (+ c 1)))
- (loop (+ i 2) c))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement