Обчисліть Ультрарадикальне


24

Що таке Ультрарадикальне

Ультрарадикальну , або Доведіть радикал, що містять від реального числа a визначаються як тільки дійсний корінь рівняння квінтіков x5+x+a=0 .

Тут ми використовуємо для позначення ультрарадикальної функції. Наприклад, , оскільки .UR()UR(100010)=10105+10100010=0

Виклик

Напишіть повну програму або функцію, яка приймає реальне число як вхідне і повертає або виводить його ультрарадикальне.

Вимоги

Не допускаються стандартні лазівки. Результати для наведених нижче тестових випадків повинні бути точними щонайменше до 6 значущих цифр, але загалом програма повинна обчислити відповідні значення для будь-яких дійсних реальних даних.

Випробування

Для довідки наведено 9 десяткових знаків, округлених до 0. Пояснення додано для деяких тестових випадків.

 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

Критерії виграшу

Виграє найкоротше дійсне подання на кожній мові.

Відповіді:


12

Мова Вольфрама (Mathematica) , 20 байт

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

Спробуйте в Інтернеті!

Ще вбудований, але принаймні це не так UltraRadical.

(символ відображається як |->у Mathematica, подібний до =>JS)


9
Я продовжую шукати відповіді питанням, чому Mathematica використовує і замість і
адам

2
@ Adám, я повинен просто побачити квадрати для перших двох, або мені не вистачає якогось шрифту ...
mbrig

6
@mbrig Просто квадрати. Це моя суть. Mathematica використовує символи в приватному використанні територіях , навіть якщо Unicode робить у більшості з них.
Adám

8

Python 3.8 (передвипуск) , 60 байт

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

Спробуйте в Інтернеті!

Метод ітерації Ньютона. x=xf(x)f(x)=xx5+x+n5x4+1

При використанні 4x5n5x4+1 математично еквівалентний, це робить цикл програми назавжди.


Інший підхід:

Python 3.8 (передвипуск) , 102 байти

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)

Спробуйте в Інтернеті!

Двійковий пошук, враховуючи, що функція x^5+x+aзростає. Встановіть межі -abs(x)і abs(x)досить, але -x*x-1і x*x+1коротше.

Ліміт рекурсії BTW Python трохи занижений, тому необхідно мати 1e-9, а цей :=називається оператором моржів.


Чи лінійний пошук займе менше байтів?
користувач202729

8

JavaScript (ES7), 44 байти

Більш безпечна версія, що використовує ту саму формулу, що наведена нижче, але з фіксованою кількістю ітерацій.

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

Спробуйте в Інтернеті!


JavaScript (ES7),  43  42 байти

Метод Ньютона, використовуючи 5x4+5 як апроксимацію f(x)=5x4+1 .

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

Спробуйте в Інтернеті!

Як?

Починаємо з x0=0 і рекурсивно обчислюємо:

xk+1=xkxk5+xk+n5xk4+5=xkxk+nxk4+15

до xkxk+1 є незначним.


Оскільки порівняння еквівалентності плаваючих чисел є неточним, я не впевнений, чи можна гарантувати припинення програми для кожного можливого введення (відповідь Python 3 нижче вже виникли проблеми при спробі скоротити формулу).
Джоель

1
@Joel Я додав більш безпечну версію.
Арнольд

7

Желе , 8 байт

;17B¤ÆrḢ

Спробуйте в Інтернеті!

Як це працює:

  • [a, 1, 0, 0, 0, 1]Побудовує список , додаючи aдо двійкового подання 17. Чому цей список? Оскільки це відповідає коефіцієнтам, які ми шукаємо:

    [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
    
  • Тоді, Ærце вбудований, який вирішує поліноміальне рівняння P(x) = 0, задавши перелік коефіцієнтів (те, що ми побудували раніше).

  • Нас цікавить лише реальне рішення, тому ми беремо перший запис у списку рішень .


6

APL (Dyalog Unicode) , 11 10 байт SBCS

-1 завдяки dzaima

Функція анонімного негласного префікса.

(--*∘5)⍣¯1

Спробуйте в Інтернеті!

()⍣¯1 Застосувати таку негласну функцію негативно один раз:

- заперечений аргумент

- мінус

*∘5 аргумент, піднятий до сили 5

По суті, це запитує: Який x мені потрібно подати на f(x)=xx5 , щоб результат став y .


Це дуже круто. На жаль, J не здається в змозі здійснити цю інверсію
Йона

@dzaima Чому я цього не бачив‽ Дякую
Адам

5

R , 43 байти

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

Спробуйте в Інтернеті!

nlmx|x5+x+a|nlma


@TheSimpliFire Математично це рівнозначно, але чисельно це не так: використання квадрата замість абсолютного значення призводить до неправильного значення для великого введення. ( Спробуйте в Інтернеті. )
Робін Райдер

4

R , 56 байт

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

Спробуйте в Інтернеті!

polyrootapolyroot



@RobinRyder - це досить різне, що я думаю, ви повинні опублікувати власну відповідь. Дякую, хоча!
Нік Кеннеді

1
Добре, дякую. Ось воно .
Робін Райдер

"На жаль" polyrootповертає всі складні корені ... Інакше воно виграє.
Роланд

3

J , 14 байт

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

Спробуйте в Інтернеті!

J має вбудований для вирішення многочленів ... p.

Час очікування останнього тестового випадку на TIO, але теоретично все ще є правильним.

як

Поліноміальні коефіцієнти для вбудованого J приймаються як числовий список з коефіцієнтом для x^0першого. Це означає, що список такий:

a 1 0 0 0 1

1 0 0 0 1в довічним 17, таким чином , ми представимо його в вигляді #:@17, то додайте вхід ,, а потім застосувати p., а потім розпаковувати результати з разом ;, а потім взяти останній елемент{:



2

Pari / GP , 34 32 26 24 байти

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

Спробуйте в Інтернеті!


Приємна відповідь, але з цікавості: чому це s(-100010)призводить до -8.090... - 5.877...*Iтого, а не просто 10? Це обмеження мови для великих тестових випадків? PS: Ви можете зберегти 2 байти мінливого як 0.2в .2. :)
Кевін Круїссен

R

Ви можете використовувати анонімну функцію: a->solve(X=-a,a,X^5+X+a).
алефальфа

Дякую @alephalpha.
TheSimpliFire


2

k4, 33 31 байт

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

Ньютон-Рафсон обчислюється ітераційно, поки число не конвергується

редагувати: -2 завдяки ngn!


ой, зрозумів це все неправильно ...

K (oK), 10 байт

{-x+*/5#x}

@ngn lol, це було недбало ... оновлено, але тепер у k4, оскільки я лінивий робити це в ngn / k чи oK :)
scrawl

круто! остання пара [ ]здається непотрібною
ngn

хм, ти маєш рацію. Я стикався з дивною поведінкою раніше, коли над / зближення призводить до нескінченного циклу через сторонні / опущені (ті чи інші, я забуваю) дужки. тому я залишив їх, але я повинен був перевірити. Спасибі!
скраб


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 байт з оригінальною назвою функції та з деякою додатковою точністю (подвійний). З бітовими хаками може бути і краще, але нерепортаж.

96 байт із фіксованими ітераціями.

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

Насправді наша функція настільки хороша, що ми можемо використовувати кращі адаптації методу Ньютона. Набагато швидше і практичніше було б реалізація (150 байт)

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

Я перевірив, як це працює, але я лінивий, щоб дізнатися, наскільки швидше це було б. Повинен бути принаймні на один порядок швидше, ніж у Ньютона.


Що-небудь на зразок x-=t=...роботи?
користувач202729


0

Чистота , 61 60 байт

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

Спробуйте в Інтернеті!

Метод Ньютона, вперше реалізований у відповіді user202729 .

Чистота , 124 байти

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

Спробуйте в Інтернеті!

"Двійковий" пошук, звужуючи область пошуку до верхньої або нижньої 99,6% діапазону між високою та низькою межами при кожній ітерації замість 50%.




Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.