Skip to content

Instantly share code, notes, and snippets.

@iizukak
Created September 12, 2012 13:19
Show Gist options
  • Select an option

  • Save iizukak/3706539 to your computer and use it in GitHub Desktop.

Select an option

Save iizukak/3706539 to your computer and use it in GitHub Desktop.
Project Euler Problem 027 with Scheme
;エラトステネスのふるいで素数を生成する手続き
;ソース http://practical-scheme.net/wiliki/wiliki.cgi?Project%20Euler
(define (primes n)
(if (<= n 2)
'()
(let loop ((l (unfold (cut > <> n) values (cut + <> 2) 3))
(prime-list '(2)))
(let1 m (car l)
(if (> (expt m 2) n)
(append (reverse prime-list) l)
(loop (remove (lambda (x) (zero? (modulo x m))) l) (cons m prime-list)))))))
;a, b, n が与えられたとき、n^2 + an + b という二次式を計算する手続き
(define (quadra a b n)
(+ (* n n ) (* a n) b))
;a, b, 十分な大きさの素数のリスト, が与えられたとき、
;n が0, 1, 2, ...と動くとき、連続で生成できる素数のリストを計算する手続き
(define (gen-prime a b lst)
(let loop ((ans '()) (n 0))
(cond ((not (member (quadra a b n) lst)) (list (list a b) (length ans)))
(else (loop (cons (quadra a b n) ans) (+ n 1))) ) ))
(define (problem027)
(let loop ((a -1000)
(b -1000)
(lst (primes 10000))
(ans (list (list 0 0) 0) ))
(cond ((< 1000 a) ans)
((< 1000 b) (loop (+ a 1) -1000 lst ans))
((< (cadr ans) (cadr (gen-prime a b lst)))
(loop a (+ b 1) lst (gen-prime a b lst)))
(else (loop a (+ b 1) lst ans)) )))
(print (problem027))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment