197の各桁を回転させた数、197,971,719は全て素数なので197を循環素数と呼ぶ ことにする。
100未満の数でそういう素数が13個あり、 2,3,5,7,11,13,17,31,37,71,73,79,97である。
1000000未満の循環素数の数を求めよ
問題10で定義した素数のリストから1000000未満の部分を取り出す。その中で循 環した数が素数になっているものをfilterで取り出しリストの長さを求める。 循環した数は素数になっているかはローカル関数circularでチェックする。こ こで2以外の偶数は素数ではないので、nが2か全ての桁の数が奇数であるかの条 件でチェックすることで多少高速化できる。次に対象の数を各桁の数に分解し たリストを回転させて、再び数に変換したものが全て素数であるかをチェック する。素数の判定は問題27で定義した関数を用いる。
euler035 = length $ filter circular $ takeWhile (< 1000000) primes
where circular n = (n == 2 || (all odd ns))
&& (all isPrime [listToInt $ rotate i ns
| i <- [1..(length ns - 1)]])
where ns = intToList n
rotate i ns = let (a, b) = splitAt i ns
in b ++ a
