From 8f5004d6ff65bd78ee745cd70fe52cb9ec50cf65 Mon Sep 17 00:00:00 2001 From: Bill Ewanick Date: Fri, 15 Sep 2023 02:47:36 -0400 Subject: [PATCH] Performance improvements with math --- src/projectEuler/question12.hs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/projectEuler/question12.hs diff --git a/src/projectEuler/question12.hs b/src/projectEuler/question12.hs new file mode 100644 index 0000000..afe1a00 --- /dev/null +++ b/src/projectEuler/question12.hs @@ -0,0 +1,32 @@ +-- module Main where +import Data.IntSet (size) +import Data.List (unfoldr) +import Math.NumberTheory.ArithmeticFunctions (divisorsSmall) + +main :: IO () +main = print ans + +-- triangleNumber :: Integer -> [Integer] +-- triangleNumber 1 = [1] +-- triangleNumber n = sum [1..n] : triangleNumber (n-1) +triangleNumber i = (i * (i + 1)) `div` 2 +triangleNumbers = map triangleNumber [1..] +-- triangleNumbers :: [Int] +-- triangleNumbers = unfoldr (\b-> Just (sum [1..b],b+1)) 1 + +-- isDivisible a b = a `rem` b == 0 +-- divisors n = filter (isDivisible n) [1..(floor . sqrt) n ] + +-- Triangle Numbers With More than N divisors +tnwmtNd :: Int -> [Int] +tnwmtNd n = filter ((>= n) . size . divisorsSmall) triangleNumbers + +ans :: Int +ans = head $ tnwmtNd 500 +{- +λ> main +76576500 +(0.00 secs, 114,944 bytes) + +First triangle number to have over 500 divisors is 76576500 +-}