有理分解a = xyz(x + y + z)


21

写功能x(a)y(a)z(a)使得对任何理性a 所有函数返回有理数x(a)*y(a)*z(a)*(x(a) + y(a) + z(a)) == a。您可以假设≥0。

只要程序在数学上是合理的,就不需要在程序中使用有理类型或运算。例如,如果您在答案中使用平方根,则必须表明其自变量始终是有理数的平方。

如果您的语言繁琐或不存在函数,则可以编写三个命名函数x,y,z或编写三个程序。或者,您也可以编写一个返回三个数字x,y,z的程序/函数。最后,如果您愿意,可以输入/输出有理数作为一对分子/分母。您的得分是三个函数或三个程序的总大小(以字节为单位)。分数最低者获胜。

不允许强行强制。对于任何a = p / q,其中p,q≤1000,您的程序应在10秒内运行。


一个例子(这并不意味着您的分解必须给出这些数字):

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

我们可以编写一个将所有函数一起输出的函数(例如,以数组的形式)吗?
Leaky Nun

我们可以将分子和分母输入为两个数字吗?
Leaky Nun

@LeakyNun是的,是的。
orlp

1
证明对任何人都可行a吗?
Fatalize

2
我认为您不想提供证明,因为它会给出解决方案,但是您的话并不是真正的证明。
Fatalize

Answers:


10

CJam(59字节)

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

这是一个匿名块(函数),它在堆栈上取一个整数或双精度数,并产生一个具有三个双精度数的数组。内部有两种情况可以处理所有非负输入,因为只有一种情况会在0.25或时中断4。输入仍然中断-12-1.3333333333333333,但规范允许...

在线演示执行它,然后添加了值,打印所有4个,将它们相乘,以表明它得到原始值(模舍入误差)。

数学背景

根据Noam Elkies,我们定义辅助。则x + y + z + w = 0x y z w = ax y z w + a = 0。这具有很多对称性。任何解决方案都有四个公式,我们可以选择三个最复杂的公式。w=xyzx+y+z+w=0xyzw=axyzw+a=0

Elkies提供了四套解决方案。欧拉的:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.