Project Euler – 問題35

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