Racjonalny rozkład a = xyz (x + y + z)

21

Funkcje zapisu x(a), y(a)i z(a)takie, że dla każdego racjonalnego a wszystkie funkcje zwracają liczby wymierne i x(a)*y(a)*z(a)*(x(a) + y(a) + z(a)) == a. Możesz założyć ≥ 0.

Nie musisz używać racjonalnych typów ani operacji w swoim programie, o ile twój program ma solidne podstawy matematyczne. Np. Jeśli użyjesz pierwiastka kwadratowego w swojej odpowiedzi, musisz pokazać, że jego argumentem jest zawsze kwadrat liczby wymiernej.

Możesz napisać trzy nazwane funkcje x, y, z lub zamiast tego napisać trzy programy, jeśli funkcje są uciążliwe lub nie istnieją w twoim języku. Alternatywnie możesz napisać pojedynczy program / funkcję, która zwraca trzy liczby x, y, z. Wreszcie, jeśli wolisz, możesz wprowadzić / wyprowadzić liczby wymierne jako parę licznika / mianownika. Twój wynik to całkowity rozmiar trzech funkcji lub trzech programów w bajtach. Najmniejszy wynik wygrywa.

Brutalne zmuszanie jest niedozwolone. Dla dowolnego a = p / q, gdzie p, q ≤ 1000, twój program powinien uruchomić się w ciągu 10 sekund.


Przykład (nie oznacza to, że twój rozkład musi podawać te liczby):

x = 9408/43615
y = 12675/37576
z = 1342/390
x*y*z*(x+y+z) = 1
orlp
źródło
Czy możemy napisać jedną funkcję, która wyprowadza je wszystkie razem (powiedzmy w tablicy)?
Leaky Nun
Czy możemy wprowadzić licznik i mianownik jako dwie liczby?
Leaky Nun
@LeakyNun Tak i tak.
lub
1
Czy jest to wykonalne dla każdego a?
Fatalize
2
Zakładam, że nie chcesz pokazać dowodu, ponieważ dałby rozwiązanie, ale twoje słowo tak naprawdę nie jest dowodem.
Fatalize

Odpowiedzi:

10

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.25lub drugiego 4. To wciąż łamie dla wejść -12i -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-xyzw=zaxyzw+za=0

Elkies daje cztery rodziny zestawów rozwiązań. Euler:

x=6ast3(at42s4)2(4at4+s4)(2a2t8+10as4t4s8)y=3s5(4at4+s4)22t(at42s4)(2a2t8+10as4t4s8)z=2(2a2t8+10as4t4s8)3s3t(4at4+s4)w=(2a2t8+10as4t4s8)6s3t(at42s4)

Jeden związany z Eulerem:

x=(8s8+a2)(8s888as4a2)12s3(s4a)(8s8+20as4a2)y=(8s8+a2)(8s888as4a2)12s3(8s4+a)(8s8+20as4a2)z=192as5(s4a)2(8s4+a)2(8s8+a2)(8s888as4a2)(8s8+20as4a2)w=3s(8s8+20as4a2)34(s4a)(8s4+a)(8s8+a2)(8s888as4a2)

Prostszy:

x=(s44a)22s3(s4+12a)y=2a(3s4+4a)2s3(s44a)(s4+12a)z=s5+12as2(3s4+4a)w=2s5(s4+12a)(s44a)(3s4+4a)

And one related to that one:

x=s5(s43a)32(s4+a)(s12+12as83a2s4+2a3)y=s12+12as83a2s4+2a32s3(s43a)(3s4a)z=2a(s4+a)2(3s4a)2s3(s43a)(s12+12as83a2s4+2a3)w=2s(s12+12as83a2s4+2a3)(s43a)(s4+a)(3s4a)

Observe that every family has at least two denominators of the form ps4qa 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.

Peter Taylor
źródło
1

Axiom, 191 bytes

f(s,a)==(b:=s^4-4*a;c:=s^4+12*a;x:=3*s^4+4*a;[b^2/(2*c*s^3),2*a*x^2/(b*c*s^3),s*c/(2*x)])
g(a:FRAC INT):List FRAC INT==(s:=1;repeat(s^4=4*a or s^4=-12*a or 3*s^4=4*a=>(s:=s+1);break);f(s,a))

It is the traslation of the formula Peter Taylor report in this page with some code would make the denominators not be 0. one test

(7) -> y:=g(1)
          9   98 13
   (7)  [--,- --,--]
         26   39 14
                                              Type: List Fraction Integer
(8) -> y.1*y.2*y.3*(y.1+y.2+y.3)
   (8)  1
                                              Type: Fraction Integer
RosLuP
źródło