Pentagonal numbers are generated by the formula, Pn=n(3n1)/2. The first ten pentagonal numbers are:
1, 5, 12, 22, 35, 51, 70, 92, 117, 145, ...
It can be seen that P4 + P7 = 22 + 70 = 92 = P8. However, their difference, 70 22 = 48, is not pentagonal.
Find the pair of pentagonal numbers, Pj and Pk, for which their sum and difference is pentagonal and D = |Pk Pj| is minimised; what is the value of D?
#integer_sqrt #pentagonals #is_pentagonal? def memoize_pent(n) $p44_pents[n]||=pentagonals(n) end def p44 $p44_pents=[] diff_i=1 counters=[] while true v=memoize_pent(diff_i) gap=1 until(memoize_pent(1+gap)-memoize_pent(1)>v) start=counters[gap]||=1 until(memoize_pent(start+gap)-memoize_pent(start)>v) if(memoize_pent(start+gap)-memoize_pent(start)==v) if(is_pentagonal?(memoize_pent(start+gap)+memoize_pent(start))) puts v return end end counters[gap]=start+=1 end gap+=1 end diff_i+=1 end end