CJam (59 bajtów)
{[WZ~C24X8TT]f*[4XGYC6 4Y].+_0=!>2%Z65135Zb+:(3/.f#:.*)W*+}
Jest to anonimowy blok (funkcja), który przyjmuje liczbę całkowitą lub podwójną na stos i tworzy tablicę z trzema podwójnymi liczbami. Ma wewnętrznie dwa przypadki do obsługi wszystkich nieujemnych danych wejściowych, ponieważ tylko jeden przypadek spowodowałby uszkodzenie jednego 0.25
lub drugiego 4
. To wciąż łamie dla wejść -12
i -1.3333333333333333
, ale spec pozwala, że ...
Demo on-line wykonuje go, a następnie sumuje wartości, drukuje wszystkie cztery, i mnoży im pokazać, że pobiera wartość pierwotną (modulo zaokrąglenia o błędzie).
Tło matematyczne
w = - x - y- zx + y+ z+ w = 0- x yzw = ax yzw + a = 0
Elkies daje cztery rodziny zestawów rozwiązań. Euler:
xyzw====6 a s t3)( a t4- 2 s4)2)( 4 a t4+ s4) ( 2 a2)t8+ 10 a s4t4- s8)3 s5( 4 a t4+ s4)2)2 t ( a t4- 2 s4) ( 2 a2)t8+ 10 a s4t4- s8)2 ( 2 a2)t8+ 10 a s4t4- s8)3 s3)t ( 4 a t4+ s4)- ( 2 a2)t8+ 10 a s4t4- s8)6s3t(at4−2s4)
Jeden związany z Eulerem:
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)
Prostszy:
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.