近岡です。

スピード部門、シンプル部門の他に、
「姑息な手段」部門の新設につながるようなアイデアを思いつきました。

私が[ruby-math:00856]に記載して、
原さんが[ruby-math:00859]でコード化して下さった
アルゴリズムですが
A**3 + B**3 = C**3 + D**3 のとき、A + B ≡ C + D (mod 6)
となることを用い、ループ変数 S=C+D を6づつ減じています。

ですが、A,Bの値によっては、ループ変数 S=C+D の刻み幅を
もっと大きく取ることができます。
例えば、 
 X**2-X*Y+Y**2 ≡ 0 (mod 5) ならば X ≡ Y ≡ 0 (mod 5) 
ですから、A+B が5の倍数の場合には、刻み幅も5倍にできます。

# 姑息な手段ですが、このプログラムは前のものに対し速さが2倍になりました。
# ループ変数 S=C+D の刻み幅を配列に保存すればもっと速くなりますが、
# どうせ、メモリを大量に使うのならば、3乗和(A**3+B**3)の方を
# ハッシュに保存したほうが良いので、今回は見送っています。

# ---- 引用ここから ----
#
# a**3 + b**3 == c**3 + d**3 (c>a>b>d)を見つける
#
d16=[4,2,8,2, 16,2,8,2, 2,2,8,2, 16,2,8,2]
d27=[3,3,9, 1,1,1, 1,9,3,  9,3,9, 1,1,1, 1,9,3,  9,3,9, 1,1,1, 1,9,3]
# 例えば、
#    a**3+b**3≡4(mod 16)のとき、c+d≡a+b(mod 16)
# 一般に、
#    a**3+b**3≡k(mod 16)のとき、c+d≡a+b(mod d16[k])
#    a**3+b**3≡k(mod 27)のとき、c+d≡a+b(mod d27[k])
a=1
cnt=0
while cnt<100
  a3=a**3
  lowerb3=(a+1)**3-a3
  b=a-1
  while (b3=b**3)>lowerb3
    x=a3+b3
    delta=d16[x%16]*d27[x%27]
    if 0==(a+b)%5 then delta*=5  end
    if 0==(a+b)%11 then delta*=11 end
#    if 0==(a+b)%17 then delta*=17 end
#    if 0==(a+b)%23 then delta*=23 end
#    if 0==(a+b)%29 then delta*=29 end
#     ....
#   素数 P=5,11,17,23,29,41,47,53,59,,,, に対して
#   a+b≡0(mod P)ならばc+d≡a+b(mod P)
    s=a+b-delta        # S≡A+B (mod delta)
    while (s3=s**3)>x
      if (s3-x).modulo(3*s) == 0 then
        t=Integer(Math.sqrt((4*x-s3)/(3*s)))
        if 3*t*t*s==4*x-s3 then
          cnt=cnt+1
          c=(s+t)/2
          d=(s-t)/2
          print cnt,"\t",x," = ",a,"**3 + ",b,"**3 = ",c,"**3 + ",d,"**3","\n"
        end # if 
      end # if 
      s=s-delta
    end # while
    b=b-1
  end # while
  a=a+1
end # while

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