Project Euler

Problem #44

Pentagonal numbers are generated by the formula, P_(n)=n(3n−1)/2. The first ten pentagonal numbers are:

1, 5, 12, 22, 35, 51, 70, 92, 117, 145, ...

It can be seen that P_(4) + P_(7) = 22 + 70 = 92 = P_(8). However, their difference, 70 − 22 = 48, is not pentagonal.

Find the pair of pentagonal numbers, P_(j) and P_(k), for which their sum and difference is pentagonal and D = |P_(k) − P_(j)| is minimised; what is the value of D?

Ruby: Running time = 45.97s
+#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