Рассчитайте ультрарадикал

24

Что такое ультрарадикал

Ультрарадикальный , или Доведите радикал, содержащие от вещественного числа определяются как только действительный корень уравнения квинтиков .ax5+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

Wolfram Language (Mathematica) , 20 байтов

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

Попробуйте онлайн!

Все еще встроенный, но по крайней мере это не так UltraRadical.

(персонаж отображается как |->в Mathematica, как =>в JS)

user202729
источник
9
Я продолжаю задаваться вопросом, почему Mathematica использует, а не и
Адам
2
@ Adám я должен просто видеть квадраты для первых двух, или мне не хватает какого-то шрифта ...
mbrig
6
@mbrig Просто квадраты. Это моя точка зрения. Mathematica использует символы в частном использовании территориях , даже если Unicode делает у большинства из них.
Адам
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

При использовании 4Икс5-N5Икс4+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короче.

Кстати, лимит рекурсии Python слишком мал, поэтому необходимо иметь 1e-9, и :=это называется оператором моржа.

user202729
источник
Будет ли линейный поиск занимать меньше байтов?
user202729
8

JavaScript (ES7), 44 байта

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

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

Попробуйте онлайн!


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

Метод Ньютона, использующий 5Икс4+5 в качестве аппроксимации е'(Икс)знак равно5Икс4+1 .

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

Попробуйте онлайн!

Как?

Мы начинаем с Икс0знак равно0 и вычисляем рекурсивно:

ИксК+1знак равноИксК-ИксК5+ИксК+N5ИксК4+5знак равноИксК-ИксК+NИксК4+15

пока ИксК-ИксК+1 будет незначительным.

Arnauld
источник
Поскольку сравнение эквивалентности плавающих чисел является неточным, я не уверен, можно ли гарантировать завершение программы для каждого возможного ввода (в ответе 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, учитывая список коэффициентов (что мы построили ранее).

  • Нас интересует только реальное решение, поэтому мы берем первую запись в списке решений с помощью .

Мистер Xcoder
источник
6

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

-1 благодаря дзайме

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

(--*∘5)⍣¯1

Попробуйте онлайн!

()⍣¯1 Примените следующую молчаливую функцию отрицательно:

- отрицательный аргумент

- минус

*∘5 аргумент в пользу 5

Иксе(Икс)знак равно-Икс-Икс5Y

Адам
источник
Это очень круто. К сожалению, J, кажется, не в состоянии выполнить эту инверсию
Иона
@dzaima Почему я этого не видел? Спасибо.
Адам
5

R , 43 байта

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

Попробуйте онлайн!

nlmИкс|Икс5+Икс+a|nlma

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

R , 56 байт

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

Попробуйте онлайн!

polyrootapolyroot

Ник Кеннеди
источник
2
43 байта
Робин Райдер
@RobinRyder это достаточно отличается, я думаю, вы должны опубликовать свой собственный ответ. Спасибо хоть!
Ник Кеннеди
1
Хорошо спасибо. Здесь .
Робин Райдер
«К сожалению», polyrootвозвращает все сложные корни ... В противном случае он выиграл бы.
Роланд
3

J , 14 байт

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

Попробуйте онлайн!

J имеет встроенный для решения полиномов ... p.

Тайм-аут последних 4 тестовых случаев на TIO, но в теории все еще верны.

как

Полиномиальные коэффициенты для J встроены в числовой список, с коэффициентом для x^0первого. Это означает, что список:

a 1 0 0 0 1

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

Ион
источник
2

Par / GP , 34 32 26 24 байта

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

Попробуйте онлайн!

TheSimpliFire
источник
Хороший ответ, но из любопытства: почему s(-100010)результат, -8.090... - 5.877...*Iа не просто 10? Это ограничение языка для больших тестовых случаев? PS: Вы можете сохранить 2 байта меняющегося как 0.2в .2. :)
Кевин Круйссен
р-
Вы можете использовать анонимную функцию: 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 (ок), 10 байт

{-x+*/5#x}
каракули
источник
@ngn лол, это было неосторожно ... обновлено , но теперь в k4 , как я слишком ленив , чтобы сделать это в СПП / к или ок :)
каракулями
прохладный! последняя пара [ ]кажется ненужным
СПП
хм, ты прав. До этого я сталкивался со странным поведением, когда пере / схождение приводит к бесконечному циклу из-за посторонних / пропущенных (я забыл) скобок. Вот почему я оставил их, но я должен был проверить. Благодарность!
каракули
1

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

Я проверил, что это работает, но мне лень выяснить, насколько быстрее это будет. Должен быть как минимум на один порядок быстрее, чем у Ньютона.

sanaris
источник
Будет ли что-то вроде x-=t=...работы?
user202729
1
82 байта
floorcat
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%.

Οurous
источник
0

Maplesoft Maple , 23 байта

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

К сожалению, нет онлайн компилятора / калькулятора Maple там AFAIK. Но код довольно прост.

Полфосол ఠ_ఠ
источник