Welcome to the CHICKEN Scheme pasting service

no title added by anonymous on Tue Jun 14 22:52:26 2011

(define (atkin.init lim)
  (let ((vec (make-vector (+ lim 1) #f)))
    (let rec ((x 0))
      (if (> x (min lim 5)) vec
        (begin 
          (if (or (= x 2) (= x 3)) (vector-set! vec x #t))
          (rec (+ x 1)))))))

(define (atkin lim)
  (let ((vec (atkin.init lim)) (m (ceiling (sqrt lim))))
    (let recx ((x 1))
      (if (= x m) #t
        (begin 
          (let recy ((y 1))
            (if (= y m) #t
              (begin
                (let* ((n (+ (* 4 (expt x 2)) (expt y 2))) (rem (remainder n 12)))
                  (if (and (<= n lim) (or (= rem 1) (= rem 5))) (vector-set! vec n (not (vector-ref vec n)))))
                (let* ((n (+ (* 3 (expt x 2)) (expt y 2))) (rem (remainder n 12)))
                  (if (and (<= n lim) (= rem 7)) (vector-set! vec n (not (vector-ref vec n)))))
                (let* ((n (- (* 3 (expt x 2)) (expt y 2))) (rem (remainder n 12)))
                  (if (and (> x y) (<= n lim) (= rem 11)) (vector-set! vec n (not (vector-ref vec n)))))
                (recy (+ y 1)))))
          (recx (+ x 1)))))
    (let rec ((x 5))
      (if (= x m) (cons vec lim)
        (begin
          (if (vector-ref vec x)
            (let recs ((k 1))
              (if (> (* k (expt x 2)) lim) #t
                (begin
                  (vector-set! vec (* k (expt x 2)) #f)
                  (recs (+ k 1))))))
          (rec (+ x 1)))))))

(define (isprime? pl x)
  (if (<= x (cdr pl)) (vector-ref (car pl) x)))

(define (atkin.print pl)
  (let rec ((x 0))
    (if (> x (cdr pl)) #t
      (begin
        (if (isprime? pl x) (begin (display x)(newline)))
        (rec (+ x 1))))))

(define (rotate n)
  (let ((rem (remainder n 10)) (q (quotient n 10)))
    (let rec ((quot q) (b 0))
      (if (zero? quot) (+ q (* (expt 10 b) rem))
        (rec (quotient quot 10) (+ b 1))))))

(define (check pl n)
  (let rec ((x (rotate n)))
    (if (= x n) #t
      (if (isprime? pl x) (rec (rotate x)) #f))))

(define euler35 
  (let ((pl (atkin 1000000)))
    (let rec ((x 1) (c 0))
      (if (= x 1000000) c
        (rec (+ x 1) (if (isprime? pl x) (if (check pl x) (+ c 1) c) c))))))

(display euler35)(newline)

Your annotation:

Enter a new annotation:

Your nick:
The title of your paste:
Your paste (mandatory) :
Which R5RS procedure can be used to concatenate strings?
Visually impaired? Let me spell it for you (wav file) download WAV