Hitung Ultraradikal

24

Apa itu Ultraradikal

The ultraradical , atau Bawa radikal, dari sejumlah nyata Sebuah didefinisikan sebagai akar hanya nyata dari quintic persamaan .x5+x+Sebuah=0

Di sini kita menggunakan untuk menunjukkan fungsi ultraradikal. Misalnya, , karena .UR()UR(-100010)=10105+10-100010=0

Tantangan

Tulis sebuah program atau fungsi lengkap, yang menggunakan bilangan real sebagai input, dan mengembalikan atau menampilkan ultraradikalnya.

Persyaratan

Tidak ada celah standar yang diizinkan. Hasil untuk kasus uji di bawah ini harus akurat hingga setidaknya 6 digit signifikan, tetapi secara umum program harus menghitung nilai yang sesuai untuk setiap input bilangan real yang valid.

Uji Kasus

9 tempat desimal dibulatkan ke 0 diberikan untuk referensi. Penjelasan ditambahkan untuk beberapa kasus uji.

 a                         | UR(a)
---------------------------+---------------------
             0             |   0.000 000 000        # 0
             1             |  -0.754 877 (666)      # UR(a) < 0 when a > 0
            -1             |   0.754 877 (666)      # UR(a) > 0 when a < 0
             1.414 213 562 |  -0.881 616 (566)      # UR(sqrt(2))
            -2.718 281 828 |   1.100 93(2 665)      # UR(-e)
             3.141 592 653 |  -1.147 96(5 385)      # UR(pi)
            -9.515 716 566 |   1.515 71(6 566)      # 5th root of 8, fractional parts should match
            10             |  -1.533 01(2 798)
          -100             |   2.499 20(3 570)
         1 000             |  -3.977 89(9 393)
      -100 010             |  10.000 0(00 000)      # a = (-10)^5 + (-10)
 1 073 741 888             | -64.000 0(00 000)      # a = 64^5 + 64

Kriteria Menang

Pengajuan terpendek yang valid dalam setiap bahasa akan menang.

Shieru Asakoto
sumber

Jawaban:

12

Bahasa Wolfram (Mathematica) , 20 byte

Root[xx^5+x+#,1]&

Cobalah online!

Masih built-in, tapi setidaknya tidak UltraRadical.

(karakter ditampilkan seperti |->di Mathematica, mirip dengan =>di JS)

pengguna202729
sumber
9
Saya terus bertanya-tanya mengapa Mathematica menggunakan dan bukannya dan
Adám
2
@ Adam apakah saya seharusnya hanya melihat kotak untuk dua yang pertama, atau apakah saya kehilangan beberapa jenis font ...
mbrig
6
@ Mbrig Hanya kotak. Itu maksudku. Mathematica menggunakan karakter di Private Gunakan Area meskipun Unicode tidak memiliki sebagian besar dari mereka.
Adám
8

Python 3.8 (pra-rilis) , 60 byte

f=lambda n,x=0:x!=(a:=x-(x**5+x+n)/(5*x**4+1))and f(n,a)or a

Cobalah online!

Metode iterasi Newton. x=x-f(x)f(x)=x-x5+x+n5x4+1

Saat menggunakan 4x5-n5x4+1 secara matematis setara, itu membuat loop program selamanya.


Pendekatan lain:

Python 3.8 (pra-rilis) , 102 byte

lambda x:a(x,-x*x-1,x*x+1)
a=lambda x,l,r:r<l+1e-9and l or(m:=(l+r)/2)**5+m+x>0and a(x,l,m)or a(x,m,r)

Cobalah online!

Pencarian biner, mengingat bahwa fungsinya x^5+x+ameningkat. Atur batas ke -abs(x)dan abs(x)cukup tetapi -x*x-1dan x*x+1lebih pendek.

Batas rekursi BTW Python agak terlalu rendah sehingga perlu memiliki 1e-9, dan :=itu disebut operator walrus.

pengguna202729
sumber
Apakah pencarian linear akan memakan waktu lebih sedikit byte?
user202729
8

JavaScript (ES7), 44 byte

Versi yang lebih aman menggunakan rumus yang sama seperti di bawah ini tetapi dengan jumlah iterasi yang tetap.

n=>(i=1e3,g=x=>i--?g(.8*x-n/(5*x**4+5)):x)``

Cobalah online!


JavaScript (ES7),  43  42 byte

Metode Newton, menggunakan 5x4+5 sebagai pendekatan f(x)=5x4+1 .

n=>(g=x=>x-(x-=(x+n/(x**4+1))/5)?g(x):x)``

Cobalah online!

Bagaimana?

Kita mulai dengan x0=0 dan menghitung secara rekursif:

xk+1=xk-xk5+xk+n5xk4+5=xk-xk+nxk4+15

sampai xk-xk+1 tidak signifikan.

Arnauld
sumber
Karena membandingkan kesetaraan angka mengambang tidak akurat, saya tidak yakin apakah penghentian program dapat dijamin untuk setiap input yang mungkin ( jawaban Python 3 di bawah ini sudah mengalami masalah ketika mencoba mempersingkat rumus).
Joel
1
@ Joel Saya telah menambahkan versi yang lebih aman.
Arnauld
7

Jelly , 8 byte

;17B¤ÆrḢ

Cobalah online!

Bagaimana itu bekerja:

  • Membangun daftar [a, 1, 0, 0, 0, 1]dengan menambahkan ake representasi biner dari 17. Kenapa daftar ini? Karena sesuai dengan koefisien yang kami cari:

    [a, 1, 0, 0, 0, 1] -> P(x) := a + 1*x^1 + 0*x^2 + 0*x^3 + 0*x^4 + 1*x^5 = a + x + x^5
    
  • Kemudian, Æradalah built-in yang memecahkan persamaan polinomial P(x) = 0, diberi daftar koefisien (apa yang kami bangun sebelumnya).

  • Kami hanya tertarik pada solusi nyata, jadi kami mengambil entri pertama dalam daftar solusi .

Tuan Xcoder
sumber
6

APL (Dyalog Unicode) , 11 10 byte SBCS

-1 berkat dzaima

Fungsi awalan diam-diam anonim.

(--*∘5)⍣¯1

Cobalah online!

(... )⍣¯1 terapkan fungsi tacit berikut negatif satu kali:

- argumen yang dinegasikan

- minus

*∘5 argumen yang diangkat menjadi kekuatan 5

Intinya, ini bertanya: x mana yang harus saya beri makan ke f ( x ) = - x - x 5 sehingga hasilnya menjadi y .xf(x)=-x-x5y

Adm
sumber
Ini keren sekali. Sedihnya J tampaknya tidak dapat melakukan inversi ini
Yunus
@zaza Kenapa aku tidak melihat itu‽ Terima kasih.
Adám
5

R , 43 byte

function(a)nlm(function(x)abs(x^5+x+a),a)$e

Cobalah online!

nlmx|x5+x+Sebuah|nlma

Robin Ryder
sumber
@ TheSimpliFire Secara matematis, ini setara, tetapi secara numerik, tidak: menggunakan kuadrat alih-alih nilai absolut mengarah ke nilai yang salah untuk input besar. ( Cobalah online. )
Robin Ryder
4

R , 56 byte

function(x)(y=polyroot(c(x,1,0,0,0,1)))[abs(Im(y))<1e-9]

Cobalah online!

polyrootSebuahpolyroot

Nick Kennedy
sumber
2
43 byte
Robin Ryder
@RobinRyder itu cukup berbeda sehingga saya pikir Anda harus memposting jawaban Anda sendiri. Terimakasih Meskipun!
Nick Kennedy
1
Ok terima kasih. Ini dia .
Robin Ryder
"Sayangnya", polyrootmengembalikan semua akar yang kompleks ... Kalau tidak, ia akan menang.
Roland
3

J , 14 byte

{:@;@p.@,#:@17

Cobalah online!

J memiliki built in untuk memecahkan polinomial ... p.

Batas waktu 4 kasus uji terakhir pada TIO, tetapi secara teori masih benar.

bagaimana

Koefisien polinomial untuk builtin J diambil sebagai daftar numerik, dengan koefisien untuk yang x^0pertama. Ini artinya daftarnya adalah:

a 1 0 0 0 1

1 0 0 0 1adalah 17 dalam biner, jadi kami menyatakannya sebagai #:@17, lalu tambahkan input ,, lalu terapkan p., lalu hapus kotak hasilnya dengan raze ;, lalu ambil elemen terakhir{:

Jonah
sumber
3

Ruby , 53 41 byte

->a{x=a/=5;99.times{x-=a/(x**4+1)+x/5};x}

Cobalah online!

Menggunakan Newton-Raphson dengan jumlah iterasi yang tetap, dan trik aproksimasi yang sama seperti Arnauld

GB
sumber
2

Pari / GP , 34 32 26 24 byte

a->-solve(X=0,a,a-X-X^5)

Cobalah online!

TheSimpliFire
sumber
Jawaban yang bagus, tetapi karena penasaran: mengapa s(-100010)menghasilkan -8.090... - 5.877...*Ibukan hanya 10? Apakah ini batasan bahasa untuk kasus uji besar? PS: Anda dapat menyimpan 2 byte mengubah keduanya 0.2menjadi .2. :)
Kevin Cruijssen
R-
Anda dapat menggunakan fungsi anonim: a->solve(X=-a,a,X^5+X+a).
alephalpha
Terima kasih @alephalpha.
TheSimpliFire
2

k4, 33 31 byte

{{y-(x+y+*/5#y)%5+5*/4#y}[x]/x}

newton-raphson dihitung secara iteratif hingga suatu angka terkonvergensi

sunting: -2 terima kasih kepada ngn!


wah, salah semua ini ...

K (oK), 10 byte

{-x+*/5#x}
tulisan cakar ayam
sumber
@ ngn lol, itu ceroboh ... diperbarui tetapi sekarang di k4 karena saya terlalu malas untuk melakukannya di ngn / k atau oK :)
scrawl
keren! pasangan terakhir [ ]tampaknya tidak perlu
ngn
hmm kamu benar Saya pernah mengalami perilaku aneh sebelumnya di mana over / konvergensi menghasilkan loop tak terbatas karena kurung asing / dihilangkan (satu atau yang lain, saya lupa). itu sebabnya saya meninggalkan mereka tetapi saya harus memeriksa. Terima kasih!
coretan
1

C, 118b / 96b

#include<math.h>
double ur(double a){double x=a,t=1;while(fabs(t)>1e-6){t=x*x*x*x;t=(x*t+x+a)/(5*t+1);x-=t;}return x;}

118 byte dengan nama fungsi asli dan dengan akurasi ekstra (ganda). Dengan sedikit peretasan mungkin lebih baik, tetapi tidak dapat digunakan.

96 byte dengan iterasi tetap.

double ur(double a){double x=a,t;for(int k=0;k<99;k++){t=x*x*x*x;x=(4*x*t-a)/(5*t+1);}return x;}

Sebenarnya, fungsi kita sangat baik sehingga kita dapat menggunakan adaptasi yang lebih baik dari metode Newton. Implementasi yang jauh lebih cepat dan praktis (150 byte)

#include<math.h>
double ur(double a){double x=a/5,f=1,t;while(fabs(f)>1e-6){t=x*x*x*x;f=(t*(5*t*x+5*a+6*x)+a+x)/(15*t*t-10*a*x*x*x+1);x-=f;}return x;}

Saya memeriksanya, tapi saya terlalu malas untuk mengetahui seberapa cepat itu. Harus setidaknya satu urutan lebih cepat daripada Newton.

sanaris
sumber
Apakah sesuatu seperti x-=t=...pekerjaan?
user202729
1
82 bytes
ceilingcat
0

Bersih , 61 60 byte

import StdEnv
$a=iter 99(\x=(3.0*x^5.0-a)/inc(4.0*x^4.0))0.0

Cobalah online!

Metode Newton, pertama kali diterapkan di jawaban user202729 .

Bersihkan , 124 byte

import StdEnv
$a= ?a(~a)with@x=abs(x^5.0+x+a);?u v|u-d==u=u|v+d==v=v= ?(u+if(@u< @v)0.0d)(v-if(@u> @v)0.0d)where d=(v-u)/3E1

Cobalah online!

Pencarian "biner", mempersempit area pencarian ke atas atau bawah 99,6% dari rentang antara batas tinggi dan rendah pada setiap iterasi, bukannya 50%.

Suram
sumber
0

Python 3 + sympy, 72 byte

lambda y:float(sympy.poly("x**5+x+"+str(y)).all_roots()[0])
import sympy

Cobalah online!

Nick Kennedy
sumber
0

Maplesoft Maple , 23 byte

f:=a->fsolve(x^5+x+a=0)

Sayangnya, tidak ada kompiler / kalkulator Maple online di luar sana AFAIK. Tetapi kodenya cukup mudah.

polfosol ఠ_ఠ
sumber