Ultraradikal hesaplayın


24

Ultraradikal Nedir?

Ultraradical gerçek numarası, veya getirmek radikali quintic denkleminin tek gerçek kökü olarak tayin edilir .birx5+x+a=0

Burada ultra radikal işlevi belirtmek için kullanıyoruz. Örneğin, , beri .UR()UR,(-100010)=10105+10-100010=0

Meydan okuma

Girdi olarak gerçek bir sayı alan ve ultra radikalini döndüren veya çıkaran tam bir program veya işlev yazın.

Gereksinimler

Standart boşluklara izin verilmez. Aşağıdaki test durumları için sonuçların en az 6 önemli haneye kadar doğru olması gerekir, ancak genel olarak program herhangi bir geçerli gerçek sayı girişi için karşılık gelen değerleri hesaplamalıdır.

Test Kılıfları

0'a yuvarlanan 9 ondalık basamak referans için verilmiştir. Bazı test durumları için açıklama eklendi.

 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

Kazanma Kriterleri

Her dilde en kısa geçerli gönderim kazanır.

Yanıtlar:


12

Wolfram Dili (Mathematica) , 20 bayt

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

Çevrimiçi deneyin!

Hala bir yerleşik, ama en azından değil UltraRadical.

(karakter , JS'deki gibi |->, Mathematica'daki gibi görüntülenir =>)


9
Mathematica kullandığı neden merak tutmak ve yerine ve
ADAM

2
@ Adám sadece ilk ikisinin karelerini görmem gerekiyor mu, yoksa bazı yazı tiplerini
özlüyorum

6
@ mbrig Sadece kareler. Bu benim amacım. Mathematica karakterleri kullanan Özel Kullanım Alanları Unicode olsa yapar çoğu var.
Adam

8

Python 3.8 (yayın öncesi) , 60 bayt

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

Çevrimiçi deneyin!

Newton yineleme yöntemi. x'=x-f(x)f'(x)=x-x5+x+n5x4+1

Kullanırken 4x5-n5x4+1 matematiksel olarak eşdeğerdir, program döngüsünü sonsuza dek yapar.


Diğer yaklaşım:

Python 3.8 (yayın öncesi) , 102 bayt

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)

Çevrimiçi deneyin!

İkili arama, işlevin x^5+x+aarttığı göz önüne alındığında . İçin sınır ayarlayın -abs(x)ve abs(x)yeterli ama -x*x-1ve x*x+1kısadır.

BTW Python'un özyineleme sınırı biraz düşük, bu nedenle 1e-9 değerine sahip olmak gerekiyor ve :=buna mors operatörü denir.


Doğrusal arama daha az bayt alır mı?
user202729

8

JavaScript (ES7), 44 bayt

Aşağıdaki gibi aynı formülü kullanan ancak sabit sayıda yinelemeye sahip daha güvenli bir sürüm.

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

Çevrimiçi deneyin!


JavaScript (ES7),  43  42 bayt

Newton'un yöntemi, f ( x ) = 5 x 4 + 1'in yaklaşık olarak 5x4+5 kullanılması .f'(x)=5x4+1

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

Çevrimiçi deneyin!

Nasıl?

x0=0 ile başlıyoruz ve tekrarlı olarak hesaplıyoruz:

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

kadar xk-xk+1 önemsizdir.


Değişken sayıların denkliğini karşılaştırmak yanlış olduğu için, programın sona ermesinin olası her girdi için garanti edilip edilemeyeceğinden emin değilim (aşağıdaki Python 3 cevabı , formülü kısaltmaya çalışırken daha önce yaşanmış konular).
Joel,

1
@Joel Daha güvenli bir sürüm ekledim.
Arnauld

7

Jöle , 8 bayt

;17B¤ÆrḢ

Çevrimiçi deneyin!

Nasıl çalışır:

  • Listesini , ikili temsili için [a, 1, 0, 0, 0, 1]hazırlayarak aoluşturur 17. Neden bu liste? Çünkü aradığımız katsayılara karşılık geliyor:

    [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
    
  • Daha sonra, katsayıların bir listesi verilen (daha önce inşa ettiklerimiz) verilen Ærpolinom denklemini çözen bir yerleşiktir P(x) = 0.

  • Yalnızca gerçek çözümle ilgileniyoruz, bu nedenle çözüm listesine ilk girişi alıyoruz .


6

APL (Dyalog Unicode) , 11 10 bayt SBCS

-1 dzaima sayesinde

Anonim zımni önek işlevi.

(--*∘5)⍣¯1

Çevrimiçi deneyin!

()⍣¯1 Bir kez aşağıdaki taktik fonksiyonunu negatif uygulayın:

- reddedilen argüman

- eksi

*∘5 argüman 5 gücüne yükseltildi

Aslında, şunu sorar: Sonuç y olacak şekilde hangi xf(x)=-x-x5 beslemem gerekir ?y


Bu çok havalı. Ne yazık ki J bu inversiyonu gerçekleştiremiyor gibi görünüyor
Jonah

@ dzaima Neden bunu görmedim‽ Teşekkürler.
Adam

5

R , 43 bayt

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

Çevrimiçi deneyin!

nlmx|x5+x+bir|nlma


@ TheSimpliFire Matematiksel olarak eşdeğerdir, ancak sayısal olarak öyle değildir: mutlak değer yerine kareyi kullanmak, büyük girdiler için yanlış değere yol açar. ( Çevrimiçi deneyin. )
Robin Ryder


3

J , 14 bayt

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

Çevrimiçi deneyin!

J, polinomları çözmek için yerleşikti. p.

Son 4 test TIO'da zaman aşımına uğradı, ancak teoride hala doğru.

Nasıl

J'nin yerleşikine ilişkin polinom katsayıları, x^0ilk katsayısı olan sayısal bir liste olarak alınır . Bunun anlamı listenin:

a 1 0 0 0 1

1 0 0 0 1İkili sayı ise 17'dir, bu yüzden onu temsil ediyoruz #:@17, sonra girişi ekleyin ,, sonra uygulayın p., sonra sonuçları raze ile açın ;, sonra son elemanı alın.{:



2

Pari / GP , 34 32 26 24 bayt

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

Çevrimiçi deneyin!


Güzel cevap, ama meraktan: neden sadece bununla s(-100010)sonuçlanıyor ? Bu, büyük sınav durumları için dilin bir sınırı mı? Not: Her iki değişen 2 bayt kaydedebilirsiniz için . :)-8.090... - 5.877...*I100.2.2
Kevin Cruijssen

R,-

Bir anonim işlevini kullanabilirsiniz: a->solve(X=-a,a,X^5+X+a).
alephalpha

@ Alephalpha teşekkürler.
TheSimpliFire


2

k4, 33 31 bayt

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

newton-raphson, bir sayı bir araya gelinceye kadar yinelemeli olarak hesaplandı.

düzenleme: -2 ngn sayesinde!


Hata! Bunları yanlış anladım.

K (oK), 10 bayt

{-x+*/5#x}

lol @ngn, dikkatsiz ... güncelleştirilmiş oldu ama şimdi ben ngn / k veya OK :) bunu yapmak için çok tembelim olarak k4 içinde
karalama

güzel! son çift [ ]gereksiz görünüyor
ngn

hmm, haklısın. Aşırı / yakınsamaların fazlalık / atlanmış (biri ya da diğeri unutacağım) parantezleri nedeniyle sonsuz bir döngüde sonuçlanmasından önce garip davranışlarla karşılaştım. bu yüzden onları bıraktım ama kontrol etmeliydim. Teşekkürler!
karalama


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;}

Orijinal işlev adına ve bazı ekstra hassasiyetlere sahip 118 bayt (çift). Bit hackleri ile daha iyi olabilir ama taşınabilir değil.

Sabit yinelemeli 96 bayt.

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;}

Aslında, fonksiyonumuz o kadar iyi ki Newton'un metodunu daha iyi uyarlayabiliriz. Çok daha hızlı ve pratik uygulama (150 bayt) olur

#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;}

Çalıştığını kontrol ettim ama ne kadar hızlı olacağını bulmak için çok tembelim. Newton'dan en az bir sipariş daha hızlı olmalı.


x-=t=...İş gibi bir şey ister misiniz ?
user202729


0

Temiz , 61 60 bayt

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

Çevrimiçi deneyin!

Newton'un metodu, ilk önce user202729'un cevabında uygulandı .

Temiz , 124 bayt

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

Çevrimiçi deneyin!

Arama alanını, her yinelemede% 50 yerine yüksek ve düşük sınırlar arasındaki aralığın% 99,6'sının üst veya altına daraltan "ikili" bir arama.




Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.