project euler problem 27

なんどやってもおかしいと思ったのは n^2+a*n+bの値がマイナスになっていてもisPrimeがTrueを出すときがあったせいだ。

import Data.Numbers.Primes
import Data.Ord
import Data.List

main=print $  uncurry (*) $ maximumBy (comparing (length.plist)) ab
m=1000
ab = [(a,b)|a<-[(-m)..m],b<- takeWhile (<m) primes ]
plist (a,b) = takeWhile ck [0..]
    where f n = n*n+a*n+b
          ck n | f n < 0 = False  -- isPrimeがマイナスを素数として判定するため                      
               | otherwise = isPrime $ f n

素数列を生み出すライブラリのおかげで6秒で計算できた。