aboutsummaryrefslogtreecommitdiff
path: root/haskell/027-quadratic_primes.hs
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2019-09-04 20:18:27 +0200
committerCharles <sircharlesaze@gmail.com>2019-09-04 20:18:27 +0200
commit69d729849ec734b3798eaab941c29febf37c9a68 (patch)
tree127e916b2e2badfe2078dca69995d5c99feb124f /haskell/027-quadratic_primes.hs
parent90ee38953d70b66aa78b5d09da53a63d3dba9f65 (diff)
downloadproject_euler-69d729849ec734b3798eaab941c29febf37c9a68.tar.gz
project_euler-69d729849ec734b3798eaab941c29febf37c9a68.tar.bz2
project_euler-69d729849ec734b3798eaab941c29febf37c9a68.zip
problem 027 haskell, wip 057 and 145
Diffstat (limited to 'haskell/027-quadratic_primes.hs')
-rw-r--r--haskell/027-quadratic_primes.hs43
1 files changed, 43 insertions, 0 deletions
diff --git a/haskell/027-quadratic_primes.hs b/haskell/027-quadratic_primes.hs
new file mode 100644
index 0000000..b971b18
--- /dev/null
+++ b/haskell/027-quadratic_primes.hs
@@ -0,0 +1,43 @@
+------
+-- Quadratic primes
+-- Problem 27
+--
+-- 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 \le n \le 39$. However, when $n = 40, 40^2 + 40 + 41 = 40(40 + 1) + 41$
+-- is divisible by 41, and certainly when $n = 41, 41^2 + 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 \le n \le 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| \le 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$.
+------
+
+
+import Data.List(maximumBy)
+
+main = do
+ let maxTuple = fst $ maximumBy (\(_, l1) (_, l2) -> compare l1 l2)
+ [((a, b), length (quadraticPrimes a b)) | a <- [-999..999], b <- [-1000..1000]]
+ print (fst maxTuple * snd maxTuple)
+
+quadraticPrimes :: Int -> Int -> [Int]
+quadraticPrimes a b = takeWhile isPrime [n ^ 2 + a * n + b | n <- [0..]]
+
+isPrime :: Int -> Bool
+isPrime 2 = True
+isPrime 3 = True
+isPrime x
+ | x < 2 = False
+ | x `mod` 2 == 0 || x `mod` 3 == 0 = False
+ | otherwise = divCheck 5
+ where divCheck d
+ | d * d > x = True
+ | x `mod` d == 0 || x `mod` (d + 2) == 0 = False
+ | otherwise = divCheck (d + 6)