Decomposição racional a = xyz (x + y + z)

21

Escreva funções x(a), y(a)e z(a)tais que, para qualquer racional, a todas as funções retornem números racionais e x(a)*y(a)*z(a)*(x(a) + y(a) + z(a)) == a. Você pode assumir um valor ≥ 0.

Você não precisa usar tipos ou operações racionais em seu programa, desde que seja matematicamente correto. Por exemplo, se você usar uma raiz quadrada em sua resposta, deverá mostrar que seu argumento é sempre o quadrado de um número racional.

Você pode escrever três funções nomeadas x, y, z ou escrever três programas, se as funções forem complicadas ou inexistentes para o seu idioma. Como alternativa, você também pode escrever um único programa / função que retorne três números x, y, z. Finalmente, se você preferir, poderá inserir / emitir os números racionais como um par de numerador / denominador. Sua pontuação é o tamanho total das três funções ou três programas em bytes. Menor pontuação ganha.

Forçar força bruta não é permitido. Para qualquer a = p / q em que p, q ≤ 1000, seu programa deve ser executado em menos de 10 segundos.


Um exemplo (isso não significa que sua decomposição deve fornecer esses números):

x = 9408/43615
y = 12675/37576
z = 1342/390
x*y*z*(x+y+z) = 1
orlp
fonte
Podemos escrever uma função que produz todas elas juntas (digamos, em uma matriz)?
Leaky Nun
Podemos inserir o numerador e o denominador como dois números?
Leaky Nun
@LeakyNun Sim e sim.
orlp
11
É comprovadamente factível para qualquer um a?
Fatalize
2
Suponho que você não queira mostrar uma prova, porque isso daria uma solução, mas sua palavra não é realmente uma prova.
Fatalize

Respostas:

10

CJam (59 bytes)

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

Este é um bloco anônimo (função) que pega um número inteiro ou duplo na pilha e produz uma matriz com três duplos. Ele possui dois casos internamente para lidar com todas as entradas não negativas, pois com apenas um caso ele seria interrompido em um 0.25ou em 4. Ainda quebra para entradas -12e -1.3333333333333333, mas a especificação permite que ...

A demonstração online o executa e, em seguida, soma os valores, imprime todos os quatro e os multiplica para mostrar que ele obtém o valor original (erro de arredondamento do módulo).

Formação matemática

Seguindo Noam Elkies , definimos o auxiliar . Então x + y + z + w = 0 e - x y z w = a ou x y z w + a = 0W=-x-y-zx+y+z+W=0 0-xyzW=umaxyzW+uma=0 0 . Isso tem muita simetria; qualquer solução terá quatro fórmulas e podemos escolher as três mais golfistas.

Elkies fornece quatro famílias de conjuntos de soluções. Euler:

x=6umast3(umat4-2s4)2(4umat4+s4)(2uma2t8+10umas4t4-s8)y=3s5(4umat4+s4)22t(umat4-2s4)(2uma2t8+10umas4t4-s8)z=2(2uma2t8+10umas4t4-s8)3s3t(4umat4+s4)W=-(2uma2t8+10umas4t4-s8)6s3t(umat4-2s4)

Um relacionado ao Euler:

x=(8s8+uma2)(8s8-88umas4-uma2)12s3(s4-uma)(8s8+20umas4-uma2)y=(8s8+uma2)(8s8-88umas4-uma2)12s3(8s4+uma)(8s8+20umas4-uma2)z=192umas5(s4-uma)2(8s4+uma)2(8s8+uma2)(8s8-88umas4-uma2)(8s8+20umas4-uma2)W=-3s(8s8+20umas4-uma2)34(s4-uma)(8s4+uma)(8s8+uma2)(8s8-88umas4-uma2)

Um mais simples:

x=(s4-4uma)22s3(s4+12uma)y=2uma(3s4+4uma)2s3(s4-4uma)(s4+12uma)z=s5+12umas2(3s4+4uma)W=-2s5(s4+12uma)(s4-4uma)(3s4+4uma)

E um relacionado a esse:

x=s5(s4-3uma)32(s4+uma)(s12+12umas8-3uma2s4+2uma3)y=s12+12umas8-3uma2s4+2uma32s3(s4-3uma)(3s4-uma)z=2uma(s4+uma)2(3s4-uma)2s3(s4-3uma)(s12+12umas8-3uma2s4+2uma3)W=-2s(s12+12umas8-3uma2s4+2uma3)(s4-3uma)(s4+uma)(3s4-uma)

Observe que toda família tem pelo menos dois denominadores da forma ps4-quma para positivo p e q: como todos os termos envolvidos são racionais, isso significa que há algumas umapara o qual obtemos divisão por zero. Portanto, devemos usar pelo menos dois conjuntos de soluções que tenham suas singularidades em diferentes valores deuma. Intuitivamente, será mais difícil escolher dois conjuntos da mesma família. Eu escolhi a família mais simples (a terceira) com parâmetross=1 1 e s=2.

Peter Taylor
fonte
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))

É a tradução da fórmula do relatório de Peter Taylor nesta página com algum código que faria os denominadores não serem 0. um teste

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