回文素数

30分プログラム、その741。回文素数を求めてみる。
旅先の宿からこんにちは。ただいま旅行中につき、ほとんどネットワークにつなげません。というわけで、今日の30分プログラムは一切ぐぐらずに書いてます。かなりつらいですが、なんとかなるものですね。
Twitterのだれかの発言で知ったのだけれども、回文素数なるものがあるらしい。詳しくは調べてないけど、きっと素数+回文数なんでしょうね。
回文数の判定も素数の計算もやったことあるので、さくさくっと書いちゃいましょう。

使い方

gosh> (take-kaibun-primes 20)
(2 3 5 7 11 101 131 151 181 191 313 353 373 383 727 757 787 797 919 929)

ソースコード

#! /opt/local/bin/gosh
;; -*- mode:scheme; coding:utf-8 -*-

(use util.stream)

(define (sieve xs)
  (let1 x (stream-car xs)
	(stream-cons x
		     (sieve (stream-filter (lambda (n)
					     (not (= 0 (modulo n x))))
					   (stream-cdr xs))))))
(define (ints n)
  (stream-cons n (ints (+ n 1))))

(define (kaibun? n)
  (let1 xs (string->list (number->string n))
	(equal? xs (reverse xs))))

(define primes (sieve (ints 2)))
(define kaibun-primes (stream-filter kaibun? primes))
(define (take-kaibun-primes n)
  (stream->list (stream-take kaibun-primes n)))

参考