User talk:Retroburrowers

From Rosetta Code

Our 1st response is posted here: U r critiquing alphaversions abandoned infavor of a beta which may find the answer -as well as false positives due to lack of precision. Please test the beta on fuse, and post your versions after our beta, which we can't run not having a Next w/1.5 MB ram.

 --Frisian wrote:
 A little info why your programs did not give results.

<lang zxbasic> 5 FOR r=34 TO 5 STEP -1 10 FOR m=r TO 249 STEP 30 20 FOR w=4 TO (m-1):FOR x=3 TO (w-1):FOR y=2 TO (x-1):FOR z=1 TO (y-1) 30 LET sum=INT(w^4/m*w + x^4/m*x + y^4/m*y + z^4/m*z + 0.5) 40 LET s1=m^4 45 IF sum>s1 THEN GO TO 65 50 IF s1=sum THEN PRINT w;"^5+";x;"^5+";y;"^5+";z;"^5=";m;"^5": STOP 60 NEXT z: NEXT y: NEXT x: NEXT w 65 NEXT m: NEXT r</lang>

<lang zxbasic> 2 DIM p(249) : DIM q(249)

4 FOR i=1 TO 249 
5  LET p(i)=i*i : LET q(i)=p(i)*i
6 NEXT i
8 FOR r=34 TO 5 STEP -1

10 FOR m=r TO 249 STEP 30 20 FOR w=4 TO (m-1): FOR x=3 TO (w-1): FOR y=2 TO (x-1): FOR z=1 TO (y-1) 30 LET sum=INT(q(w)/q(m)*p(w) + q(x)/q(m)*p(x) + q(y)/q(m)*p(y) + q(z)/q(m)*p(z) +0.5) 40 LET s1=p(m) 45 IF sum>s1 THEN GO TO 65 50 IF s1=sum THEN PRINT w;"^5+";x;"^5+";y;"^5+";z;"^5=";m;"^5": STOP 60 NEXT z: NEXT y: NEXT x: NEXT w 65 NEXT m: NEXT r<lang>

<lang zxbasic> 2 DIM p(249) : DIM q(249)

4 FOR i=1 TO 249 
5  LET q(i)=LN i
6 NEXT i
8 FOR r=34 TO 5 STEP -1

10 FOR m=r TO 249 STEP 30 20 FOR w=4 TO (m-1): FOR x=3 TO (w-1): FOR y=2 TO (x-1): FOR z=1 TO (y-1) 30 LET sum=EXP(q(w)-q(m)) + EXP(q(x)-q(m)) + EXP(q(y)-q(m)) + EXP(q(z)-q(m)) 35 IF sum>1 THEN GO TO 65 50 IF sum=1 THEN PRINT w;"^5+";x;"^5+";y;"^5+";z;"^5=";m;"^5": STOP 60 NEXT z: NEXT y: NEXT x: NEXT w 65 NEXT m: NEXT r</lang>

All these versions have 1 fatal flaw. When sum it greater then a certain value they jump to <lang zxbasic>NEXT m</lang> instead they should jump to <lang zxbasic>NEXT y</lang>

Let's say that m = 10 and

 w     x     y     z
8^5 + 7^5 + 6^5 + 5^5 = 32768 + 16807 + 7776 + 3125 = 60476 
9^5 + 3^5 + 2^5 + 1^5 = 59049 +   243 +   32 +    1 = 59325

To demonstrate this let's take version and alter it a little bit in order to give a fast result.
We set m to 144, w to 133 ,x to 110, and y = 70 to speed things up.
<lang zxbasic> 2 DIM p(249) : DIM q(249)
4 FOR i=1 TO 249 
5 LET p(i)=i*i : LET q(i)=p(i)*i
6 NEXT i

10 FOR m=144 TO 144 STEP 30 : let s1=p(m) 20 FOR w=133 TO (m-1): FOR x=110 TO (w-1): FOR y=70 TO (x-1): FOR z=1 TO (y-1) 30 LET sum=INT(q(w)/q(m)*p(w) + q(x)/q(m)*p(x) + q(y)/q(m)*p(y) + q(z)/q(m)*p(z) +0.5) 45 IF sum>s1 THEN GO TO 65 50 IF s1=sum THEN PRINT w;"^5+";x;"^5+";y;"^5+";z;"^5=";m;"^5": STOP 60 NEXT z 61 NEXT y: NEXT x: NEXT w 65 NEXT m: </lang>

Run it and simple stops with out a result, since m does not increase we can check the value of y and z, y = 74, z = 73. In line 45 change <lang zxbasic>GO TO 65</lang> to <lang zxbasic>GO TO 61</lang>. Rerun it and after a while it will produce the correct answer 133^5+110^5+84^5+27^5=144^5.

Please remember that the ZX Spectrum is 38 years old and it was not designed for this kind of tasks, it was a cheap and simple computer. --Frisian (talk) 15:15, 30 April 2020 (UTC)

<lang zxbasic> 5 DIM p(249): DIM q(249): DIM r(249,249) 10 FOR i=1 TO 249: LET q(i)=5*LN i: LET p(i)=q(i)/2: NEXT i 15 FOR j=1 TO 249: FOR k=1 TO 249: LET r(j,k)=EXP(q(j)-p(k)): NEXT k: NEXT j 20 FOR w=7 TO 245 STEP 7: FOR x=5 TO 245 STEP 5: FOR y=3 TO 246 STEP 3: FOR z=2 TO 248 STEP 2 25 FOR m=8 TO 249 30 LET sum=r(w,m)+ r(x,m) + r(y,m) + r(z,m) 35 LET lnsum=LN sum 50 IF lnsum=p(m) THEN PRINT w;"^5+";x;"^5+";y;"^5+";z;"^5=";m;"^5": STOP 55 IF lnsum>p(m) THEN NEXT m 60 NEXT z: NEXT y: NEXT x: NEXT w </lang>

This code will not run on ZX Spectrum nor on Fuse. In line 5 the last dim statement uses to much memory 249*249*5 = 310005 Bytes, this is even more then the total amount of memory for a ZX Spectrum 128. Therefore it´s not a ZX Spectrum program. Also it has the same flaw as the other version it will not find the solution.

Please check [ZX Spectrum page] --Frisian (talk) 17:44, 30 April 2020 (UTC)

 Our 2nd reply: 
 actually 249^2*5^2, which is just under the internal limit of a Spectrum Next, & can be madesmaller by shifting indices down to 0 

TO 248 and changing the code accordingly. Yet this beta does not have the same flaw as the alpha, as the m loop runs within the 4 others. The error should be different: in taking logs, subtracting them, exponentiating differences, and taking the log of their sums, and comparing that to a log in the p array. That ought to compound rounding errors, so we wouldn't be surprised if it didn't find the correct solution. Even so, we'd settle for it not finding false solutions. So we'll test it on a 2 MB QL on Q-emuLator sometime next week, and also test trying to balance out the rounding errors on each side of the IF =sign. It seems that Sinclair BASICs calculate an extra digit in FP functions so as to know which way to round the least significant digit. Comparing the 2.5 powers is to attempt a "meet inthe middle" hack to a discrete log problem. Thus, taking INTs becomes superfluous-& even when comparing integers after taking INTs, which seems like shooting yourself in the foot: you may find the correct solution, but you also may round some FP Nos the wrong way and thereby find false solutions.

The point is taken that a Spectrum Next is no ZX Spectrum, inwhich case one can revert back to no precalculated differences, and run that at full speed on Fuse.