Question
Triangle, pentagonal, and hexagonal numbers are generated by the following formulae:
It can be verified that .
Find the next triangle number that is also pentagonal and hexagonal.
Haskell
import qualified Data.Set as Set
triangles :: [Int]
triangles = [(n*(n + 1)) `quot` 2 | n <- [1..]]
pentagonals :: [Int]
pentagonals = [(n*(3*n - 1)) `quot` 2 | n <- [1..100000]]
hexagonals :: [Int]
hexagonals = [n*(2*n - 1) | n <- [1..100000]]
candidates :: [Int]
candidates = dropWhile (<= 40755) [t | t <- triangles, isPentagonal t, isHexagonal t]
where isPentagonal = (`Set.member` Set.fromList pentagonals)
isHexagonal = (`Set.member` Set.fromList hexagonals)
main :: IO ()
main = print $ head candidates
$ ghc -O2 -o tri-pen-hex tri-pen-hex.hs
$ time ./tri-pen-hex
real 0m0.036s
user 0m0.036s
sys 0m0.000s
Python
#!/usr/bin/env python
def triangle(n):
return n*(n+1)//2
def pentagonal(n):
return n*(3*n-1)//2
def hexagonal(n):
return n*(2*n-1)
def main():
p = set(pentagonal(n) for n in range(100000))
h = set(hexagonal(n) for n in range(100000))
for n in range(100000):
t = triangle(n)
if t in p and t in h and t > 40755:
print(t)
if __name__ == "__main__":
main()