ruby 初心者の近岡です。

私が[ruby-math:00856]に記載して、
原さんが[ruby-math:00859]でコード化して下さった
アルゴリズムについて自己レスですが…

A**3 + B**3 = C**3 + D**3 のとき、A + B ≡ C + D (mod 6)
となることを使い、外から3重目のループ変数として
  S=C+D
を用いていますが、これは必ずしも高速化につながっているとは限りません。

実は、変数AとBの大きさが著しく違っている場合は
  X=A**3+B**3
  S=A+B-6
  while S<(x**(1.0/3))
    中略
    S-=6
  end
よりも
  X=A**3+B**3
  C=A+1
  while C<(x**(1.0/3))
    中略
    C+=1
  end
とした方がループの回数が少なくなります。

# 後者の場合、C を1増やすと、それにつれて対応する
# D の値が急速に(約(C/D)**2ぐらい)減ります。
# そのため、C/D>sqrt(7)の場合、S=C+Dを6減らすより速くなります。

でも、前者(ループ変数がSの場合)は、ループ内での条件判断が
 (1) S**3-X が 3*S の倍数であるか
 (2) (4*X-S**3)/(3*S) が平方数であるか
の2段階になっています。
ほとんどの場合、条件判断(1)ではねられます。(1)では、
(乗法3回、減法1回、除法1回)で判断がつきます。

一方、後者(ループ変数がCの場合)は、ループ内での条件判断が
 (1) X-C**3 が立方数であるか
の1段階です。
ですが、(X-C**3)の立方根を求めるなど、コストの高い演算が
必要になってきます。

0----+----1----+----2----+----3----+----4----+----5----+----6
近岡 宣吉  Chikaoka, Nobuyoshi
富山県立高岡西高等学校(数楽科)
 E-mail : chikaoka-nobuyoshi / tym.ed.jp