/* Euler #45 in Picat. """ Triangle, pentagonal, and hexagonal numbers are generated by the following formulae: Triangle Tn=n(n+1)/2 1, 3, 6, 10, 15, ... Pentagonal Pn=n(3n−1)/2 1, 5, 12, 22, 35, ... Hexagonal Hn=n(2n−1) 1, 6, 15, 28, 45, ... It can be verified that T(285) = P(165) = H(143) = 40755. Find the next triangle number that is also pentagonal and hexagonal. """ This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import cp. main => go. go => time(euler45). % 0.016s euler45 => T = 285+1, TT = tri(T), P = 165, PP = pent(P), H = 143, HH = hex(H), while (TT != PP; PP != HH) T := T+1, TT := tri(T), if TT > PP then P := P+1, PP := pent(P) end, if PP > HH then H := H+1, HH := hex(H) end, if TT > HH then H := H+1, HH := hex(H) end end, println(TT). % 0.025s euler45b_(P,T,H,N) => PP = pent(P), TT = tri(T), HH = hex(H), if PP == TT, TT == HH then N = PP else T2 = T+1, TT2 = tri(T2), P2 = cond(TT2 > PP, P+1,P), H2 = cond((PP > HH ; TT2 > HH), H+1,H), euler45b_(P2,T2,H2,N) end. euler45b => euler45b_(166,286,144,T), println(T). % Very slow euler45c => % N :: 0..1000000, pent(N,G), tri(N,G), hex(N,G), N #> 40755, solve($[ff,down],[N,G]), println([n=N,g=G]), nl. pent(N) = N*(3*N-1) div 2. tri(N) = N*(N+1) div 2. hex(N) = N*(2*N-1). pent(N,P) => P #= N*(3*N-1) div 2. tri(N,T) => T #= N*(N+1) div 2. hex(N,H) => H #= N*(2*N-1).