Created
September 12, 2012 13:19
-
-
Save iizukak/3706539 to your computer and use it in GitHub Desktop.
Project Euler Problem 027 with Scheme
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ;エラトステネスのふるいで素数を生成する手続き | |
| ;ソース 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