3.n=x3+y3+2z3 の場合


まず、この場合6の倍数については恒等的な解が存在する。

(x+1)3 + (x-1)3 = 2x3 + 6x

だから

6x = (x+1)3 + (x-1)3 - 2x3

nxyz
602-1
1213-2
1824-3
2435-4
3046-5
............


一般の場合を考える。0 ≦ |x| ≦ |y| ≦ |z| とする。
係数の2がない場合は、x, y, z の符号の取り得る場合は8通りだった。
この8通りについて、z, y, x の順に係数2を付加すると、 調べるべきケースは以下の24通りとなる。

(1) x, y, 2z
(2) -x, y, 2z
(3) x, -y, 2z
(4) -x, -y, 2z
(5) x, y, -2z
(6) -x, y, -2z
(7) x, -y, -2z
(8) -x, -y, -2z

(9) x, 2y, z
(10) -x, 2y, z
(11) x, -2y, z
(12) -x, -2y, z
(13) x, 2y, -z
(14) -x, 2y, -z
(15) x, -2y, -z
(16) -x, -2y, -z

(17) 2x, y, z
(18) -2x, y, z
(19) 2x, -y, z
(20) -2x, -y, z
(21) 2x, y, -z
(22) -2x, y, -z
(23) 2x, -y, -z
(24) -2x, -y, -z

(z, y, x の順の辞書式)。これらについて、

(5) = -(4)
(6) = -(3)
(7) = -(2)
(8) = -(1)

(13) = -(12)
(14) = -(11)
(15) = -(10)
(16) = -(9)

(21) = -(20)
(22) = -(19)
(23) = -(18)
(24) = -(17)

であるから調べるべきケースは、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

この章の目次

E-mail : kc2h-msm@asahi-net.or.jp
三島 久典