まず、この場合6の倍数については恒等的な解が存在する。
(x+1)3 + (x-1)3 = 2x3 + 6x
だから
6x = (x+1)3 + (x-1)3 - 2x3
n | x | y | z |
---|---|---|---|
6 | 0 | 2 | -1 |
12 | 1 | 3 | -2 |
18 | 2 | 4 | -3 |
24 | 3 | 5 | -4 |
30 | 4 | 6 | -5 |
... | ... | ... | ... |
一般の場合を考える。0 ≦ |x| ≦ |y| ≦ |z| とする。
係数の2がない場合は、x, y, z の符号の取り得る場合は8通りだった。
この8通りについて、z, y, x の順に係数2を付加すると、
調べるべきケースは以下の24通りとなる。
(1) x, y, 2z |
(9) x, 2y, z |
(17) 2x, y, z |
(z, y, x の順の辞書式)。これらについて、
(5) = -(4) |
(13) = -(12) |
(21) = -(20) |
であるから調べるべきケースは、12通り。
(1) (2) (3) (4) (9) (10) (11) (12) (17) (18) (19) (20)
これらのうち、(1) (9) (17) は任意の x, y, z について明らかに正となる。
また (2) (3) (4) (10) (18) (19) についても、任意の x, y, z について常に正となる。
0 ≦ |x| ≦ |y| ≦ |z| ≦ 10 の範囲で、12個の式について、n = x3+y3+z3+t3
(ただし、t = x, y, z)の絶対値が 1000以下になるような x, y, z を求めてみる。プログラムは以下のとおり。
10 ' cube3.ub 20 M%=1000 : dim T%(M%) : for I%=1 to M% : T%(I%)=0 : next I% 30 ' 40 for Z%=0 to 10 50 for Y%=0 to Z% 60 for X%=0 to Y% 70 R%=fnSub(X% , Y% , Z% ,"z") : ' (1) 80 R%=fnSub(-X% , Y% , Z% ,"z") : ' (2) 90 R%=fnSub(X% , -Y% , Z% ,"z") : ' (3) 100 R%=fnSub(-X% , -Y% , Z% ,"z") : ' (4) 110 R%=fnSub(X% , Y% , Z% ,"y") : ' (9) 120 R%=fnSub(-X% , Y% , Z% ,"y") : ' (10) 130 R%=fnSub(X% , Y% , Z% ,"z") : ' (17) 140 R%=fnSub(-X% , Y% , Z% ,"z") : ' (18) 150 R%=fnSub(X% , -Y% , Z% ,"z") : ' (19) 160 next X% 170 next Y% 180 next Z% 190 end 200 ' 210 fnSub(X% , Y% , Z% , C) 220 local N , S% 230 N=X%^3+Y%^3+Z%^3 240 if C="x" then N=N+X%^3 250 if C="y" then N=N+Y%^3 260 if C="z" then N=N+Z%^3 270 if abs(N)>M% then 300 280 if T%(abs(N))=1 then 300 290 S%=sgn(N) : print S%*N , S%*X% , S%*Y% , S%*Z% , C : T%(S%*N)=1 300 return(0)
(11)(12)(20) について。
(11) x, -2y, z
(12) -x, -2y, z
(20) -2x, -y, z
は正負両方の値を取り得る。
-x3-y3+z3=n の場合と同様に、まず (11) x, -2y, z について
z の値を固定したときの y, x の取り得る値の範囲を求める。
-1000 ≦ x3 - 2y3 + z3 ≦ 1000
z3-1000 ≦ - x3 + 2y3 ≦ z3+1000
y の下限を求める。
-x3 + 2y3 ≦ 2y3
だから、
z3-1000 ≦ 2y3
cbrt((z3-1000)/2) ≦ y
整数化すると、
int(cbrt((z3-1000)/2))+1 ≦ y
上限は、
-x3 + 2y3 ≧ y3
だから、
y3 ≦ z3+1000
y ≦ cbrt(z3+1000)
整数化すると、
y ≦ int(cbrt(z3+1000))
この値は z が十分大きいときはほぼ y に等しくなるので、y の上限値は z-1 としてよい。
(y=z のとき、x3-2y3+z3 = x3-y3
この値が -1000 ≦ x3-y3 ≦ 1000 となるような x, y の組み合わせは有限個。
x>10 のとき |x3 - y3|>1000 となる。)
次に x の範囲を求める。
-1000 ≦ x3 - 2y3 + z3 ≦ 1000
-z3+2y3-1000 ≦ x3 ≦ -z3+2y3+1000
x の下限は
max{0, int(cbrt(-z3+2y3-1000))+1} ≦ x
x の上限は
x ≦ int(cbrt(-z3+2y3+1000))
(12) -x, -2y, z
(20) -2x, -y, z
の場合についても同様にして y, x の取り得る値の範囲を定めることができる。
10 ≦ |z| ≦ 100000 の範囲で、(11)(12)(20) について n = x3+y3+z3+t3
(ただし、t = x, y, z)の絶対値が 1000以下になるような x, y, z を求めてみる。
(11) の場合のプログラムは以下のとおり。
10 ' cube4.ub : n = x^3 - 2y^3 + z^3 20 M%=1000:dim T%(M%):for I%=1 to M%:T%(I%)=0:next I% 30 ' 40 for Z=10 to 100000:Z3=Z^3 50 Ys=int(exp(log((Z3-M%)/2)/3))+1 60 for Y=Ys to Z-1:W=Z3-2*Y^3 70 Xs=-M%-W:if Xs<=0 then Xs=1 else Xs=int(exp(log(Xs)/3))+1 80 Xe=M%-W:Xe=int(exp(log(Xe)/3))+1 90 for X=Xs to Xe:gosub 140:next X 100 next Y 110 next Z 120 end 130 ' 140 N=W+X^3:V=abs(N):S=sgn(N):if V>M% then return 150 if T%(V)=1 then return 160 print V;":";X*S;",";-Y*S;",";Z*S;": y":T%(V)=1:return
前 | この章の目次 | 次 |
---|