```原です。

>　こんにちは。ささだです。
>
>  [ [ruby-math:00851] Ramanujan Number ]
>  Mon, 12 May 2003 10:19:05 +0900 への返信です。
>
>　はじめて投稿させていただきます。

>def sumcube e
>  e[0]**3+e[1]**3
>end
>
>def taxi_nums n
>  b = yield ; found = 0
>  while found < n
>    a = yield
>    #puts "#{a.inspect} => #{sumcube a}"
>    if a[0] == b[0]
>      a,b = b,a if a[1][0] > b[1][0]
>      puts "#{a[1].inspect} , #{b[1].inspect} => #{a[0]}"
>      found += 1
>    end
>    b = a
>  end
>end
>
>queue = [[9,[1,2]]]
>
>taxi_nums(30){
>  r = queue.shift
>  a = r[1][0]
>  b = r[1][1]
>  c = [a,b+1]
>  queue << [sumcube(c),c]
>  if a+2 == b
>    c = [a+1,b]
>    queue << [sumcube(c),c]
>  end
>
>  queue.sort!{|a,b|
>    a[0] <=> b[0]
>  }
>  r
>}

を自前でやったものでした。一応書いておきます。

def fsort(a)
n = a.size
v = a[0][2]
i = 1
i += 1 while i < n && a[i][2] < v
if i > 1
a[i, 0] = [a[0]]
a.shift
end
end

def ramanujan(f)
prev = nil
axis = [0, 0, 0]

while true
first = axis[0]
if prev &&  prev[2] == first[2]
yield [prev[2], prev[0, 2], first[0, 2]]
end
prev = first.dup
first[1] += 1
first[2] = f[first[0], first[1]]
fsort(axis)
n = axis.size
if first[1] == n + 2
axis.push [n, n, f[n, n]]
fsort(axis)
end
end
end

i = 0
ramanujan(proc{|x, y| x**3 + y**3}) do |v, x, y|
i += 1
puts("%d = %d**3 + %d**3 = %d**3 + %d**3" % [v, x[0], x[1], y[0], y[1]])
break if i == 100
end

>　速くするために、児玉さんの priority queue for Ruby.
>(http://www.math.kobe-u.ac.jp/~kodama/tips-ruby-pqueue.html) を利用したバージョン。
>----------------------------------------------------------------------
>def sumcube e
>  e[0]**3+e[1]**3
>end
>
>def taxi_nums n
>  b = yield ; found = 0
>  while found < n
>    a = yield
>    #puts "#{a.inspect} => #{sumcube a}"
>    if a[0] == b[0]
>      a,b = b,a if a[1][0] > b[1][0]
>      puts "#{a[1].inspect} , #{b[1].inspect} => #{a[0]}"
>      found += 1
>    end
>    b = a
>  end
>end
>
># http://www.math.kobe-u.ac.jp/~kodama/tips-ruby-pqueue.html
>require 'pqueue'
>queue = PQueue.new lambda{|x,y|
>  x[0] < y[0]
>}
>queue.push [9,[1,2]]
>
>taxi_nums(30){
>  r = queue.pop
>  a = r[1][0]
>  b = r[1][1]
>  c = [a,b+1]
>  queue.push [sumcube(c),c]
>  if a+2 == b
>    c = [a+1,b]
>    queue.push [sumcube(c),c]
>  end
>  r
>}

これは大分速くなりますね。pqueue.rb の使い方を初めて知りました。
(^^;

priority queue がこんなに威力があるとは思いませんでした。これっ
てヒープ構造を使っているんですね。

```