有理分解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以上と仮定することができます。

プログラムが数学的に健全である限り、プログラムで合理的なタイプまたは操作を使用する必要はありません。たとえば、答えに平方根を使用する場合、引数が常に有理数の平方であることを示す必要があります。

あなたの言語にとって関数が扱いにくいか存在しない場合、3つの名前付き関数x、y、zを書くか、代わりに3つのプログラムを書くことができます。または、3つの数値x、y、zを返す単一のプログラム/関数を作成することもできます。最後に、必要に応じて、有理数を分子/分母のペアとして入出力できます。スコアは、3つの関数または3つのプログラムの合計サイズ(バイト単位)です。最小スコアが勝ちます。

ブルートフォーシングは許可されていません。任意のa = p / q(p、q≤1000)の場合、プログラムは10秒以内に実行されます。


例(これは、分解がこれらの数値を提供する必要があるという意味ではありません):

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

すべてを一緒に(たとえば、配列で)出力する1つの関数を作成できますか?
リーキー修道女

分子と分母を2つの数値として入力できますか?
リーキー修道女

@LeakyNunはい、はい。
orlp

1
それは証明可能ですかa
致命的

2
私はあなたがそれが解決策を与えるだろうので証明を見せたくないと思いますが、あなたの言葉は実際に証明ではありません。
致命的

回答:


10

CJam(59バイト)

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

これは、スタックで整数または倍精度浮動小数点数型を取り、3つの倍精度浮動小数点数型を持つ配列を生成する匿名ブロック(関数)です。1つのケースでのみ0.25またはで中断するため、すべての非負入力を処理するために内部的に2つのケースがあります4。入力に対してはまだ壊れています-12-1.3333333333333333でますが、仕様ではそれが可能です...

オンラインデモそれを実行して、値を加算し、4つのすべてを印刷し、乗算彼らはそれが元の値(モジュロ丸め誤差)を取得していることを示すために。

数学的背景

w=xyzx+y+z+w=0xyzw=axyzw+a=0。これには多くの対称性があります。どのソリューションにも4つのフォーミュラがあり、3つの最もゴルフらしいフォーミュラを選択できます。

Elkiesは、ソリューションの4つのファミリーを提供します。オイラー:

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)

オイラーに関連するもの:

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)

より簡単なもの:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.