Décomposition rationnelle a = xyz (x + y + z)


21

Écrire des fonctions x(a), y(a)et z(a)telles que pour tout rationnel a toutes les fonctions renvoient des nombres rationnels et x(a)*y(a)*z(a)*(x(a) + y(a) + z(a)) == a. Vous pouvez supposer un ≥ 0.

Vous n'avez pas besoin d'utiliser des types rationnels ou des opérations dans votre programme, tant que votre programme est mathématiquement solide. Par exemple, si vous utilisez une racine carrée dans votre réponse, vous devez montrer que son argument est toujours un carré d'un nombre rationnel.

Vous pouvez écrire trois fonctions nommées x, y, z ou écrire trois programmes à la place si les fonctions sont lourdes ou inexistantes pour votre langue. Alternativement, vous pouvez également écrire un seul programme / fonction qui renvoie trois nombres x, y, z. Enfin, si vous préférez, vous pouvez entrer / sortir les nombres rationnels comme une paire de numérateur / dénominateur. Votre score est la taille totale des trois fonctions ou trois programmes en octets. Le plus petit score l'emporte.

Le forçage brutal n'est pas autorisé. Pour tout a = p / q où p, q ≤ 1000, votre programme devrait s'exécuter en moins de 10 secondes.


Un exemple (cela ne signifie pas que votre décomposition doit donner ces chiffres):

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

Pouvons-nous écrire une fonction qui les renvoie toutes ensemble (disons, dans un tableau)?
Leaky Nun

Pouvons-nous entrer le numérateur et le dénominateur comme deux nombres?
Leaky Nun

@LeakyNun Oui et oui.
orlp

1
Est-il prouvable pour tout le monde a?
Fatalize

2
Je suppose que vous ne voulez pas montrer de preuve car cela donnerait une solution, mais votre parole n'est pas vraiment une preuve.
Fatalize

Réponses:


10

CJam (59 octets)

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

Il s'agit d'un bloc (fonction) anonyme qui prend un entier ou un double sur la pile et produit un tableau avec trois doubles. Il a deux cas en interne pour gérer toutes les entrées non négatives, car avec un seul cas, il se briserait sur l'un 0.25ou l' autre 4. Il casse toujours pour les entrées -12et -1.3333333333333333, mais la spécification permet que ...

La démo en ligne l' exécute puis additionne les valeurs, imprime les quatre et les multiplie pour montrer qu'elle obtient la valeur d'origine (erreur d'arrondi modulo).

Contexte mathématique

w=xyzx+y+z+w=0xyzw=axyzw+a=0

Elkies propose quatre familles d'ensembles de solutions. 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)

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.