Рациональное разложение 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
orlp
источник
Можем ли мы написать одну функцию, которая выводит их все вместе (скажем, в массиве)?
Утренняя монахиня
Можем ли мы ввести числитель и знаменатель как два числа?
Утренняя монахиня
@ LeakyNun Да и да.
17
1
Это доказуемо выполнимо для любого a?
Fatalize
2
Я предполагаю, что вы не хотите показывать доказательство, потому что оно даст решение, но ваше слово на самом деле не является доказательством.
Fatalize

Ответы:

10

CJam (59 байт)

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

Это анонимный блок (функция), который принимает целое или двойное число в стеке и создает массив с тремя двойными числами. У него есть два случая для обработки всех неотрицательных входных данных, так как только в одном случае он будет разбит на один 0.25или 4. Это все еще ломается для входов -12и -1.3333333333333333, но спецификация позволяет это ...

Онлайн демо выполняет его , а затем складывает значения, печатает все четыре, и умножает их , чтобы показать , что он получает исходное значение (ошибка округления по модулю).

Математическое обоснование

весзнак равно-Икс-Y-ZИкс+Y+Z+весзнак равно0-ИксYZвесзнак равноaИксYZвес+aзнак равно0

Elkies дает четыре семейства наборов решений. Эйлера:

Иксзнак равно6asT3(aT4-2s4)2(4aT4+s4)(2a2T8+10as4T4-s8)Yзнак равно3s5(4aT4+s4)22T(aT4-2s4)(2a2T8+10as4T4-s8)Zзнак равно2(2a2T8+10as4T4-s8)3s3T(4aT4+s4)весзнак равно-(2a2T8+10as4T4-s8)6s3T(aT4-2s4)

Один, связанный с Эйлера:

Иксзнак равно(8s8+a2)(8s8-88as4-a2)12s3(s4-a)(8s8+20as4-a2)Yзнак равно(8s8+a2)(8s8-88as4-a2)12s3(8s4+a)(8s8+20as4-a2)Zзнак равно192as5(s4-a)2(8s4+a)2(8s8+a2)(8s8-88as4-a2)(8s8+20as4-a2)весзнак равно-3s(8s8+20as4-a2)34(s4-a)(8s4+a)(8s8+a2)(8s8-88as4-a2)

Проще:

Иксзнак равно(s4-4a)22s3(s4+12a)Yзнак равно2a(3s4+4a)2s3(s4-4a)(s4+12a)Zзнак равноs5+12as2(3s4+4a)весзнак равно-2s5(s4+12a)(s4-4a)(3s4+4a)

И один, связанный с этим:

Иксзнак равноs5(s4-3a)32(s4+a)(s12+12as8-3a2s4+2a3)Yзнак равноs12+12as8-3a2s4+2a32s3(s4-3a)(3s4-a)Zзнак равно2a(s4+a)2(3s4-a)2s3(s4-3a)(s12+12as8-3a2s4+2a3)весзнак равно-2s(s12+12as8-3a2s4+2a3)(s4-3a)(s4+a)(3s4-a)

пs4-QaпQaasзнак равно1sзнак равно2

Питер Тейлор
источник
1

Аксиома, 191 байт

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

Это перенос формулы отчета Питера Тейлора на этой странице с некоторым кодом сделает знаменатели не равными 0. Один тест

(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
источник