Rationale Zerlegung a = xyz (x + y + z)


21

Schreibe Funktionen x(a), y(a)und zwar z(a)so, dass für jedes Rationale a alle Funktionen rationale Zahlen und zurückgeben x(a)*y(a)*z(a)*(x(a) + y(a) + z(a)) == a. Sie können eine ≥ 0 annehmen.

Sie müssen in Ihrem Programm keine rationalen Typen oder Operationen verwenden, solange Ihr Programm mathematisch korrekt ist. Wenn Sie in Ihrer Antwort beispielsweise eine Quadratwurzel verwenden, müssen Sie zeigen, dass das Argument immer ein Quadrat einer rationalen Zahl ist.

Sie können stattdessen drei benannte Funktionen x, y, z oder drei Programme schreiben, wenn Funktionen für Ihre Sprache umständlich oder nicht vorhanden sind. Alternativ können Sie auch ein einzelnes Programm / eine einzelne Funktion schreiben, die drei Zahlen x, y, z zurückgibt. Wenn Sie es vorziehen, können Sie die rationalen Zahlen als Paar von Zähler / Nenner eingeben / ausgeben. Ihre Punktzahl ist die Gesamtgröße der drei Funktionen oder drei Programme in Bytes. Kleinste Punktzahl gewinnt.

Brute Forcing ist nicht erlaubt. Für jedes a = p / q mit p, q ≤ 1000 sollte Ihr Programm in weniger als 10 Sekunden ausgeführt werden.


Ein Beispiel (dies bedeutet nicht, dass Ihre Zerlegung diese Zahlen ergeben muss):

x = 9408/43615
y = 12675/37576
z = 1342/390
x*y*z*(x+y+z) = 1

Können wir eine Funktion schreiben, die alle zusammen ausgibt (zum Beispiel in einem Array)?
Undichte Nonne

Können wir den Zähler und den Nenner als zwei Zahlen eingeben?
Undichte Nonne

@LeakyNun Ja und ja.
Orlp

1
Ist es nachweislich für irgendjemanden machbar a?
Fatalize

2
Ich gehe davon aus, dass Sie keinen Beweis vorlegen möchten, weil dies eine Lösung hergibt, aber Ihr Wort ist kein wirklicher Beweis.
Fatalize

Antworten:


10

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.25oder abbrechen würde 4. Es bricht immer noch für Eingaben -12und -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=xyzx+y+z+w=0xyzw=axyzw+a=0

Elkies gibt vier Familien von Lösungssätzen an. Euler's:

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)

One related to Euler's:

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)

A simpler one:

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.