O que é o Ultraradical
O ultraradical , ou o radical Bring, de um número real é definido como a única raiz real da equação quintica .
Aqui usamos para denotar a função ultradadical. Por exemplo, , já que .
Desafio
Escreva um programa ou uma função completa, que aceite um número real como entrada e retorne ou produza seu ultradadical.
Exigências
Não são permitidas brechas padrão. Os resultados para os casos de teste abaixo devem ter precisão de pelo menos 6 dígitos significativos, mas, em geral, o programa deve calcular os valores correspondentes para quaisquer entradas válidas de números reais.
Casos de teste
9 casas decimais arredondadas para 0 são fornecidas como referência. A explicação é adicionada para alguns dos casos de teste.
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
Critérios Vencedores
O menor envio válido em todos os idiomas vence.
fonte
↦
ᵀ
Python 3.8 (pré-lançamento) , 60 bytes
Experimente online!
Método de iteração de Newton.x′= x - f( X )f′( X )= x - x5+ x + n5 x4+ 1
Ao usar4 x5- n5 x4+ 1 é matematicamente equivalente, faz o programa repetir para sempre.
Outra abordagem:
Python 3.8 (pré-lançamento) , 102 bytes
Experimente online!
Pesquisa binária, considerando que a função
x^5+x+a
está aumentando. Defina os limites para-abs(x)
eabs(x)
é suficiente, mas-x*x-1
ex*x+1
é mais curto.O limite de recursão do BTW Python é um pouco baixo demais, por isso é necessário ter 1e-9, e isso
:=
é chamado de operador de morsa.fonte
JavaScript (ES7), 44 bytes
Uma versão mais segura usando a mesma fórmula que abaixo, mas com um número fixo de iterações.
Experimente online!
JavaScript (ES7),
4342 bytesMétodo de Newton, usando5 x4+ 5 como uma aproximação de f′( x ) = 5 x4+ 1 .
Experimente online!
Quão?
Começamos comx0 0= 0 e computamos recursivamente:
atéxk- xk + 1 é insignificante.
fonte
Geléia , 8 bytes
Experimente online!
Como funciona:
Constrói a lista
[a, 1, 0, 0, 0, 1]
precedendoa
a representação binária de17
. Por que essa lista? Porque corresponde aos coeficientes que procuramos:Então,
Ær
é um built-in que resolve a equação polinomialP(x) = 0
, dada uma lista de coeficientes (o que construímos anteriormente).Estamos interessados apenas na solução real, portanto, fazemos a primeira entrada na lista de soluções
Ḣ
.fonte
APL (Dyalog Unicode) ,
1110 bytes SBCS-1 graças a dzaima
Função de prefixo tácito anônimo.
Experimente online!
(
…)⍣¯1
Aplique a seguinte função tácita negativa uma vez:-
o argumento negado-
menos*∘5
o argumento levantado ao poder de 5fonte
R , 43 bytes
Experimente online!
nlm
nlm
a
fonte
R , 56 bytes
Experimente online!
polyroot
polyroot
fonte
polyroot
retorna todas as raízes complexas ... Caso contrário, venceria.J , 14 bytes
Experimente online!
J foi incorporado para resolver polinômios ...
p.
Os 4 casos finais de teste atingiram o tempo limite no TIO, mas em teoria ainda estão corretos.
quão
Os coeficientes polinomiais para J embutidos são tomados como uma lista numérica, com o coeficiente para
x^0
primeiro. Isso significa que a lista é:1 0 0 0 1
é 17 em binário, então nós o representamos como#:@17
, em seguida, anexamos a entrada,
, em seguida aplicamosp.
, em seguida, unbox os resultados com raze e;
, em seguida, pegue o último elemento{:
fonte
Ruby ,
5341 bytesExperimente online!
Usando Newton-Raphson com um número fixo de iterações e o mesmo truque de aproximação que Arnauld
fonte
Pari / GP ,
34322624 bytesExperimente online!
fonte
s(-100010)
resulta em-8.090... - 5.877...*I
vez de apenas10
? Isso é uma limitação do idioma para grandes casos de teste? PS: Você pode salvar 2 bytes alterando ambos0.2
para.2
. :)a->solve(X=-a,a,X^5+X+a)
.05AB1E , 12 bytes
Experimente online!
Método de Newton.
fonte
k4,
3331 bytesnewton-raphson computado iterativamente até que um número seja convergido em
edit: -2 graças a ngn!
gritos, entendi tudo errado ...
K (oK), 10 bytesfonte
[
]
parece desnecessárioPari / GP , 24 bytes
Experimente online!
fonte
solve
tinha um analógicoC, 118b / 96b
118 bytes com o nome da função original e com alguma precisão extra (dupla). Com bit hacks pode ser melhor, mas não portável.
96 bytes com iterações fixas.
Na verdade, nossa função é tão boa que podemos usar melhores adaptações do método de Newton. Uma implementação muito mais rápida e prática (150 bytes) seria
Eu verifiquei se funciona, mas tenho preguiça de descobrir quanto mais rápido seria. Deve ser pelo menos mais um pedido mais rápido que o de Newton.
fonte
x-=t=...
trabalho?Limpo ,
6160 bytesExperimente online!
Método de Newton, implementado pela primeira vez na resposta do usuário202729 .
Limpo , 124 bytes
Experimente online!
Uma pesquisa "binária", estreitando a área de pesquisa para 99,6% superior ou inferior do intervalo entre os limites alto e baixo em cada iteração, em vez de 50%.
fonte
Python 3 + sympy, 72 bytes
Experimente online!
fonte
Oitava , 25 bytes
Experimente online!
fonte
Maplesoft Maple , 23 bytes
Infelizmente, não há compilador / calculadora on-line do Maple disponível no AFAIK. Mas o código é bem direto.
fonte