Descomposición racional a = xyz (x + y + z)

21

Escribir funciones x(a), y(a)y z(a)tal que para cualquier racional a todas las funciones devuelvan números racionales y x(a)*y(a)*z(a)*(x(a) + y(a) + z(a)) == a. Puede suponer un ≥ 0.

No necesita usar tipos u operaciones racionales en su programa, siempre que su programa sea matemáticamente sólido. Por ejemplo, si usa una raíz cuadrada en su respuesta, debe demostrar que su argumento es siempre un cuadrado de un número racional.

Puede escribir tres funciones con nombre x, y, z o escribir tres programas en su lugar si las funciones son engorrosas o inexistentes para su idioma. Alternativamente, también puede escribir un solo programa / función que devuelva tres números x, y, z. Finalmente, si así lo prefiere, puede ingresar / emitir los números racionales como un par de numerador / denominador. Su puntaje es el tamaño total de las tres funciones o tres programas en bytes. El puntaje más pequeño gana.

El forzamiento bruto no está permitido. Para cualquier a = p / q donde p, q ≤ 1000 su programa debería ejecutarse en menos de 10 segundos.


Un ejemplo (esto no significa que su descomposición tenga que dar estos números):

x = 9408/43615
y = 12675/37576
z = 1342/390
x*y*z*(x+y+z) = 1
orlp
fuente
¿Podemos escribir una función que las muestre todas juntas (por ejemplo, en una matriz)?
Leaky Nun
¿Podemos ingresar el numerador y el denominador como dos números?
Leaky Nun
@LeakyNun Sí y sí.
orlp
1
¿Es factiblemente factible para alguno a?
Fatalize
2
Supongo que no desea mostrar una prueba porque daría una solución, pero su palabra no es realmente una prueba.
Fatalize

Respuestas:

10

CJam (59 bytes)

{[WZ~C24X8TT]f*[4XGYC6 4Y].+_0=!>2%Z65135Zb+:(3/.f#:.*)W*+}

Este es un bloque anónimo (función) que toma un número entero o doble en la pila y produce una matriz con tres dobles. Tiene dos casos internos para manejar todas las entradas no negativas, ya que con solo un caso se rompería en cualquiera 0.25o 4. Todavía se rompe para las entradas -12y -1.3333333333333333, pero la especificación permite que ...

La demostración en línea lo ejecuta y luego suma los valores, imprime los cuatro y los multiplica para mostrar que obtiene el valor original (error de redondeo del módulo).

Antecedentes matemáticos

w=-X-y-zX+y+z+w=0 0-Xyzw=unaXyzw+una=0 0

Elkies ofrece cuatro familias de conjuntos de soluciones. Euler:

X=6 6unast3(unat4 4-2s4 4)2(4 4unat4 4+s4 4)(2una2t8+10unas4 4t4 4-s8)y=3s5 5(4 4unat4 4+s4 4)22t(unat4 4-2s4 4)(2una2t8+10unas4 4t4 4-s8)z=2(2una2t8+10unas4 4t4 4-s8)3s3t(4 4unat4 4+s4 4)w=-(2una2t8+10unas4 4t4 4-s8)6 6s3t(unat4 4-2s4 4)

Uno relacionado con Euler:

X=(8s8+una2)(8s8-88unas4 4-una2)12s3(s4 4-una)(8s8+20unas4 4-una2)y=(8s8+una2)(8s8-88unas4 4-una2)12s3(8s4 4+una)(8s8+20unas4 4-una2)z=192unas5 5(s4 4-una)2(8s4 4+una)2(8s8+una2)(8s8-88unas4 4-una2)(8s8+20unas4 4-una2)w=-3s(8s8+20unas4 4-una2)34 4(s4 4-una)(8s4 4+una)(8s8+una2)(8s8-88unas4 4-una2)

Una más simple:

X=(s4 4-4 4una)22s3(s4 4+12una)y=2una(3s4 4+4 4una)2s3(s4 4-4 4una)(s4 4+12una)z=s5 5+12unas2(3s4 4+4 4una)w=-2s5 5(s4 4+12una)(s4 4-4 4una)(3s4 4+4 4una)

Y uno relacionado con ese:

X=s5 5(s4 4-3una)32(s4 4+una)(s12+12unas8-3una2s4 4+2una3)y=s12+12unas8-3una2s4 4+2una32s3(s4 4-3una)(3s4 4-una)z=2una(s4 4+una)2(3s4 4-una)2s3(s4 4-3una)(s12+12unas8-3una2s4 4+2una3)w=-2s(s12+12unas8-3una2s4 4+2una3)(s4 4-3una)(s4 4+una)(3s4 4-una)

pagss4 4-qunapagsqunaunas=1s=2

Peter Taylor
fuente
1

Axioma, 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))

Es la traducción del informe de fórmula Peter Taylor en esta página con algún código que haría que los denominadores no sean 0. una prueba

(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
fuente