Performance improvements with math
parent
38ba59c3e4
commit
8f5004d6ff
|
@ -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
|
||||
-}
|
Loading…
Reference in New Issue