Ulam number とは以下の性質を持つ数である。
http://en.wikipedia.org/wiki/Ulam_number
①今まで現れた相異なる2つの Ulam number の和で表そうとしたとき、1通りしか出来ない。
  注)相異なる2つの Ulam number の和で表せないときは、Ulam number ではない。

N = 339 とし、
N 以下の Ulam number を次のように求めてみた。

N = 339
ary = [1, 2]
(3..N).each{|i|
  cnt = 0
  (0..ary.size - 2).each{|j|
    break if ary[j] + ary[j + 1] > i
    (j + 1..ary.size - 1).each{|k|
      l = ary[j] + ary[k]
      break if l > i
      cnt += 1 if l == i 
    }
  }
  ary.push(i) if cnt == 1
}
p ary

しかし、このコードは
相異なる2つの Ulam number の和が i となるものを数えるのに、
逐一調べている。
(例えば、i = 100 のときでも、1 + 2 から調べている。)

どのように Ulam number を探せば効率が良いか教えていただけないでしょうか?