CJam (59 Bytes)
{[WZ~C24X8TT]f*[4XGYC6 4Y].+_0=!>2%Z65135Zb+:(3/.f#:.*)W*+}
Dies ist ein anonymer Block (eine Funktion), der eine Ganzzahl oder ein Doppel auf dem Stapel annimmt und ein Array mit drei Doppelwerten erzeugt. Es hat intern zwei Fälle, um alle nicht negativen Eingaben zu behandeln, da es bei nur einem Fall entweder auf 0.25
oder abbrechen würde 4
. Es bricht immer noch für Eingaben -12
und -1.3333333333333333
, aber die Spezifikation erlaubt, dass ...
Die Online-Demo führt es aus und addiert dann die Werte, druckt alle vier aus und multipliziert sie, um zu zeigen, dass es den ursprünglichen Wert erhält (Modulo-Rundungsfehler).
Mathematischer Hintergrund
w=−x−y−zx+y+z+w=0−xyzw=axyzw+a=0
Elkies gibt vier Familien von Lösungssätzen an. Euler's:
xyzw====6ast3(at4−2s4)2(4at4+s4)(2a2t8+10as4t4−s8)3s5(4at4+s4)22t(at4−2s4)(2a2t8+10as4t4−s8)2(2a2t8+10as4t4−s8)3s3t(4at4+s4)−(2a2t8+10as4t4−s8)6s3t(at4−2s4)
One related to Euler's:
xyzw====(8s8+a2)(8s8−88as4−a2)12s3(s4−a)(8s8+20as4−a2)(8s8+a2)(8s8−88as4−a2)12s3(8s4+a)(8s8+20as4−a2)192as5(s4−a)2(8s4+a)2(8s8+a2)(8s8−88as4−a2)(8s8+20as4−a2)−3s(8s8+20as4−a2)34(s4−a)(8s4+a)(8s8+a2)(8s8−88as4−a2)
A simpler one:
xyzw====(s4−4a)22s3(s4+12a)2a(3s4+4a)2s3(s4−4a)(s4+12a)s5+12as2(3s4+4a)−2s5(s4+12a)(s4−4a)(3s4+4a)
And one related to that one:
xyzw====s5(s4−3a)32(s4+a)(s12+12as8−3a2s4+2a3)s12+12as8−3a2s4+2a32s3(s4−3a)(3s4−a)2a(s4+a)2(3s4−a)2s3(s4−3a)(s12+12as8−3a2s4+2a3)−2s(s12+12as8−3a2s4+2a3)(s4−3a)(s4+a)(3s4−a)
Observe that every family has at least two denominators of the form ps4−qa for positive p and q: since all the terms involved are rational, that means that there's some positive a for which we get division by zero. Therefore we must use at least two sets of solutions which have their singularities at different values of a. Intuitively it's going to be golfiest to choose two sets from the same family. I've chosen the simplest family (the third one) with parameters s=1 and s=2.