Dekomposisi rasional a = xyz (x + y + z)


21

Tulis fungsi x(a), y(a)dan z(a)sedemikian rupa sehingga untuk setiap rasional a semua fungsi mengembalikan angka rasional dan x(a)*y(a)*z(a)*(x(a) + y(a) + z(a)) == a. Anda dapat mengasumsikan ≥ 0.

Anda tidak perlu menggunakan tipe rasional atau operasi dalam program Anda, selama program Anda secara matematis sehat. Misalnya, jika Anda menggunakan akar kuadrat dalam jawaban Anda, Anda harus menunjukkan bahwa argumennya selalu kuadrat dari bilangan rasional.

Anda dapat menulis tiga fungsi bernama x, y, z atau menulis tiga program sebagai gantinya jika fungsi tidak praktis atau tidak ada untuk bahasa Anda. Atau Anda juga dapat menulis satu program / fungsi yang mengembalikan tiga angka x, y, z. Akhirnya, jika Anda menginginkannya, Anda dapat memasukkan / mengeluarkan bilangan rasional sebagai pasangan pembilang / penyebut. Skor Anda adalah ukuran total dari tiga fungsi atau tiga program dalam byte. Kemenangan skor terkecil.

Pemaksaan kasar tidak diizinkan. Untuk setiap a = p / q di mana p, q ≤ 1000 program Anda harus berjalan dalam waktu kurang dari 10 detik.


Contoh (ini tidak berarti dekomposisi Anda harus memberikan angka-angka ini):

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

Bisakah kita menulis satu fungsi yang menampilkan semuanya secara bersamaan (katakanlah, dalam sebuah array)?
Leaky Nun

Bisakah kita memasukkan pembilang dan penyebut sebagai dua angka?
Leaky Nun

@ LeakyNun Ya dan ya.
orlp

1
Apakah terbukti bisa dilakukan untuk apa pun a?
Fatalkan

2
Saya berasumsi Anda tidak ingin menunjukkan bukti karena itu akan memberikan solusi, tetapi kata-kata Anda tidak benar-benar bukti.
Fatalkan

Jawaban:


10

CJam (59 byte)

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

Ini adalah blok anonim (fungsi) yang mengambil bilangan bulat atau ganda pada tumpukan dan menghasilkan array dengan tiga ganda. Ini memiliki dua kasus internal untuk menangani semua input non-negatif, karena dengan hanya satu kasus itu akan pecah pada salah satu 0.25atau 4. Masih rusak untuk input -12dan -1.3333333333333333, tetapi spek memungkinkan ...

The demo online mengeksekusinya dan kemudian menambahkan sampai nilai-nilai, mencetak keempat, dan mengalikan mereka untuk menunjukkan bahwa itu mendapat nilai asli (modulo kesalahan pembulatan).

Latar belakang matematika

Mengikuti Noam Elkies kami mendefinisikan bantu . Kemudian dan atau . Ini memiliki banyak simetri; solusi apa pun akan memiliki empat formula dan kita bisa memilih tiga yang paling golf.w=xyzx+y+z+w=0xyzw=axyzw+a=0

Rusa memberikan empat keluarga set solusi. 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)

Satu terkait dengan Euler:

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)

Yang lebih sederhana:

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)

Dan satu yang terkait dengan yang itu:

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)

Perhatikan bahwa setiap keluarga memiliki setidaknya dua penyebut dari bentuk untuk dan positif : karena semua istilah yang terlibat adalah rasional, itu berarti ada beberapa positif dengannya kita mendapatkan pembagian dengan nol. Karena itu kita harus menggunakan setidaknya dua set solusi yang memiliki singularitas pada nilai yang berbeda dari . Secara intuitif akan menjadi golfiest untuk memilih dua set dari keluarga yang sama. Saya telah memilih keluarga paling sederhana (yang ketiga) dengan parameter dan .p q a a s = 1 s = 2ps4qapqaas=1s=2


1

Aksioma, 191 byte

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

Ini adalah traslation dari formula yang dilaporkan Peter Taylor di halaman ini dengan beberapa kode akan membuat penyebutnya menjadi 0. satu tes

(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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.