-- Euler discovered the remarkable quadratic formula: -- -- n^2+n+41 -- -- It turns out that the formula will produce 40 primes for the consecutive integer values 0≤n≤39. However, when n=40,402+40+41=40(40+1)+41 is -- divisible by 41, and certainly when n=41,412+41+41 is clearly divisible by 41. -- -- The incredible formula n^2−79n+1601 was discovered, which produces 80 primes for the consecutive values 0≤n≤79. -- The product of the coefficients, −79 and 1601, is −126479. -- -- Considering quadratics of the form: -- -- n^2+an+b, where |a|<1000 and |b|≤1000 -- -- where |n| is the modulus/absolute value of n -- e.g. |11|=11 and |−4|=4 -- -- Find the product of the coefficients, a and b, for the quadratic expression that produces the maximum number of primes for consecutive values of n, -- starting with n=0. module P027 (p027) where import Data.Function (on) import Data.List (maximumBy) import ProjectEuler (isPrime) findLengthPrimeSequence :: Int -> Int -> Int findLengthPrimeSequence a b = length $ takeWhile isPrime [n * n + a * n + b | n <- [0 ..]] findCoefficients = let as = [-999 .. 999] bs = filter isPrime [2 .. 1000] cs = [(a, b) | a <- as, b <- bs] in fst $ maximumBy (compare `on` snd) [(c, l) | c <- cs, let l = uncurry findLengthPrimeSequence c] p027 :: IO () p027 = do let coefficients = findCoefficients result = uncurry (*) coefficients putStrLn $ "Project Euler, Problem 27\n" ++ "Answer: " ++ show result