project euler problem 26

フェルマーの小定理をみると
mod a^(p-1) p == 1 (pは2,5以外の素数
aを10とすると 10^(p-1)は p-1桁のなかに循環少数が含まれている
また、余りが1になったとき循環が終わることがわかる

http://www.math.kindai.ac.jp/~chinen/junkan_f/junkan.html

ということで割り算の筆算を実装して余りが1になったときに循環しているとやればOK

import Data.List
import Data.Ord
main = print $ maximumBy (comparing (length.recurringCycle)) $ drop 3 $ takeWhile (<1000) primes

recurringCycle n = rc 1 n
    where rc n d
              | mod (n*10) d == 1 = [div (n*10) d] --余りが1のとき循環終了                          
              | otherwise = (div (n*10) d):(rc (mod (n*10) d) d )

primes = 2:[x|x<-[3,5..],isPrime x]
    where isPrime x = all ((/=0).(mod x)) $ takeWhile (<= (floor.sqrt.fromIntegral) x) primes

maximumBy で comparingをやるのをわすれてて苦労した。