豊福です。

> def ramanujan(f)
>   s = fsort(f, 1)
>   s.zip(s.tail).filter{|u| f[u[0]] == f[u[1]]}
> end

  面白い。でも fsort が一見では理解しにくいですね。

> def fsort(f, k)
>   List([k, k]){fmerge(f, integers(k+1).map{|b| [k, b]}, fsort(f, k+1))}
> end

  この fsort は「f([x,y]) は x と y に関して単調増加」を
想定しているんですよね。
(私の前のメールで書いた [a,b,c,d]列も f(a,b,c,d) = a+b+c+d
としたら fsortもどきで書けるのかな)
  [x,y]列の(例えば x+y順の)生成と f によるソートをわけたら
見やすいのではと思ったのですがそう単純にはいかないですね。

> いままで役に立つ例として、エラストテネスのふるいしか無かったの
> だけど、ひとつ増えてうれしいです。

  ゴールドバッハの問題なんか List 使って書けないでしょうか。

>>p take 10,filter(zip(fsort(1),cdr(fsort(1)))){|x|  f(x[0]) == f(x[1]) }
>> 実行は、非常に効率が悪いので、全然終わらないんですが ^^;
>
> あれ、こっちでは一つも出力がない。Ruby のバグ?

  この件と関係あるかどうかわからないのですが
ramanujan(proc{|v| v[0]**3 + v[1]**3}).take(2).each do |x|
  p x
end
と解を2個書かせると2個目を書いた後終了するまでかなり時間が
かかります。2個目を書いた後も tail.take(0) などを実行するの
はわかりますがそんなに時間かかるものでしょうか。
---
                        豊福
                        ttoyofukujp / yahoo.co.jp