[tex:1\leq j
(define (square x) (* x x)) (define (smallest-divisor n) (find-divisor n 2)) (define (find-divisor n test-divisor) (cond ((> (square test-divisor) n) n) ((divides? test-divisor n) test-divisor) (else (find-divisor n (+ test-divisor 1))))) (define (divides? a b) (= (remainder b a) 0)) (define (prime? n) (= n (smallest-divisor n)))
まずは[tex: 1\leq j
(define (enumerate-interval low high) (if (> low high) () (cons low (enumerate-interval (+ low 1) high))))
これに対して、こんな風なunique-pairsをつくります。
(define (flatmap proc seq) (accumulate append () (map proc seq))) (define (unique-pairs n) (flatmap (lambda (i) (map (lambda (j) (list i j)) (enumerate-interval 1 (- i 1)))) (enumerate-interval 1 n)))
実行結果はこうなるよ。
gosh> (unique-pairs 5) ((2 1) (3 1) (3 2) (4 1) (4 2) (4 3) (5 1) (5 2) (5 3) (5 4))
そしたら後はSICPに書いてあるprime-sum-pairsを置き換えればいいですね!
(use srfi-1) (define (make-pair-sum pair) (list (car pair) (cadr pair) (+ (car pair) (cadr pair)))) (define (prime-sum? pair) (prime? (+ (car pair) (cadr pair)))) (define (prime-sum-pairs n) (map make-pair-sum (filter prime-sum? (unique-pairs n))))
3つ組は最初の2つがi,jで、最後の値がi+jです。
gosh> (prime-sum-pairs 6) ((2 1 3) (3 2 5) (4 1 5) (4 3 7) (5 2 7) (6 1 7) (6 5 11))