44 lines
1.5 KiB
Haskell
44 lines
1.5 KiB
Haskell
-- 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
|