¿Qué es el Ultraradical?
El ultraradical , o el radical Bring, de un número real se define como la única raíz real de la ecuación quíntica .
Aquí usamos para denotar la función ultraradical. Por ejemplo, , ya que .
Reto
Escriba un programa completo o una función, que tome un número real como entrada y devuelva o salga su ultraradical.
Requisitos
No se permiten lagunas estándar. Los resultados para los casos de prueba a continuación deben ser precisos al menos con 6 dígitos significativos, pero en general el programa debe calcular los valores correspondientes para cualquier entrada de número real válida.
Casos de prueba
Se dan 9 decimales redondeados hacia 0 como referencia. Se agrega explicación para algunos de los casos de prueba.
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
Criterios ganadores
La presentación válida más corta en cada idioma gana.
fuente
y en
lugar de↦
yᵀ
Python 3.8 (prelanzamiento) , 60 bytes
Pruébalo en línea!
Método de iteración de Newton.X′= x - f( x )F′( x )= x - x5 5+ x + n5 x4 4+ 1
Mientras usa4 x5 5- n5 x4 4+ 1 es matemáticamente equivalente, hace que el programa se repita para siempre.
Otro enfoque:
Python 3.8 (versión preliminar) , 102 bytes
Pruébalo en línea!
Búsqueda binaria, dado que la función
x^5+x+a
está aumentando. Establecer los límites a-abs(x)
yabs(x)
es suficiente pero-x*x-1
yx*x+1
es más corto.Por cierto, el límite de recursión de Python es demasiado bajo, por lo que es necesario tener 1e-9, y
:=
se llama operador de morsa.fuente
JavaScript (ES7), 44 bytes
Una versión más segura con la misma fórmula que a continuación pero con un número fijo de iteraciones.
Pruébalo en línea!
JavaScript (ES7),
4342 bytesMétodo de Newton, usando5 x4 4+ 5 como una aproximación de F′( x ) = 5 x4 4+1 .
Pruébalo en línea!
¿Cómo?
Comenzamos conX0 0= 0 y calculamos recursivamente:
hasta queXk- xk + 1 sea insignificante.
fuente
Jalea , 8 bytes
Pruébalo en línea!
Cómo funciona:
Construye la lista
[a, 1, 0, 0, 0, 1]
anteponiendoa
a la representación binaria de17
. ¿Por qué esta lista? Porque corresponde a los coeficientes que estamos buscando:Entonces,
Ær
es una función incorporada que resuelve la ecuación polinómicaP(x) = 0
, dada una lista de coeficientes (lo que construimos anteriormente).Solo estamos interesados en la solución real, por lo que tomamos la primera entrada en la lista de soluciones con
Ḣ
.fuente
APL (Dyalog Unicode) ,
1110 bytes SBCS-1 gracias a dzaima
Función de prefijo tácito anónimo.
Pruébalo en línea!
(
...)⍣¯1
aplique la siguiente función tácita negativa una vez:-
el argumento negado-
menos*∘5
el argumento planteado al poder de 5fuente
R , 43 bytes
Pruébalo en línea!
nlm
nlm
a
fuente
R , 56 bytes
Pruébalo en línea!
polyroot
polyroot
fuente
polyroot
devuelve todas las raíces complejas ... De lo contrario, ganaría.J , 14 bytes
Pruébalo en línea!
J tiene un incorporado para resolver polinomios ...
p.
Los últimos 4 casos de prueba caducaron en TIO, pero en teoría siguen siendo correctos.
cómo
Los coeficientes polinómicos para la construcción de J se toman como una lista numérica, con el coeficiente para el
x^0
primero. Esto significa que la lista es:1 0 0 0 1
es 17 en binario, así que lo representamos como#:@17
, luego agregamos la entrada,
, luego aplicamosp.
, luego desempaquetamos los resultados con raze;
, luego tomamos el último elemento{:
fuente
Ruby ,
5341 bytesPruébalo en línea!
Usando Newton-Raphson con un número fijo de iteraciones, y el mismo truco de aproximación que Arnauld
fuente
Pari / GP ,
34322624 bytesPruébalo en línea!
fuente
s(-100010)
resulta en-8.090... - 5.877...*I
lugar de solo10
? ¿Es esto una limitación del lenguaje para casos de prueba grandes? PD: puede guardar 2 bytes cambiando ambos0.2
a.2
. :)a->solve(X=-a,a,X^5+X+a)
.05AB1E , 12 bytes
Pruébalo en línea!
El método de Newton
fuente
k4,
3331 bytesnewton-raphson calculó iterativamente hasta que un número converge
editar: -2 gracias a ngn!
whoops, entendí todo esto mal ...
K (oK), 10 bytesfuente
[
]
parece innecesarioPari / GP , 24 bytes
Pruébalo en línea!
fuente
solve
tiene un análogoC, 118b / 96b
118 bytes con el nombre de la función original y con cierta precisión adicional (doble). Con bit hacks puede ser mejor, pero no portable.
96 bytes con iteraciones fijas.
En realidad, nuestra función es tan buena que podemos usar mejores adaptaciones del método de Newton. Una implementación mucho más rápida y práctica (150 bytes) sería
Verifiqué que funciona, pero soy demasiado vago para saber cuánto más rápido sería. Debería ser al menos un orden más más rápido que el de Newton.
fuente
x-=t=...
trabajar?Limpio ,
6160 bytesPruébalo en línea!
El método de Newton, implementado por primera vez en la respuesta del usuario 202729 .
Limpio , 124 bytes
Pruébalo en línea!
Una búsqueda "binaria", que reduce el área de búsqueda al 99,6% superior o inferior del rango entre los límites superior e inferior en cada iteración en lugar del 50%.
fuente
Python 3 + sympy, 72 bytes
Pruébalo en línea!
fuente
Octava , 25 bytes
Pruébalo en línea!
fuente
Maplesoft Maple , 23 bytes
Desafortunadamente, no hay un compilador / calculadora de arce en línea por ahí AFAIK. Pero el código es bastante sencillo.
fuente