Em matemática, a tetração é o próximo hiperoperador após a exponenciação e é definida como exponenciação iterada.
Adição ( um sucesso n vezes)
Multiplicação ( a adicionada a si mesma, n vezes)
Exponenciação ( um multiplicado por si mesmo, n vezes)
Tetração ( a exponenciada por si mesma, n vezes)
As relações inversas da tetração são chamadas de super-raiz e super-logaritmo. Sua tarefa é escrever um programa que, dado A e B, imprime o B nd -order super-raiz de A.
Por exemplo:
- se A =
65,536
e B =4
imprimir2
- se A =
7,625,597,484,987
e B =3
imprimir3
A e B são números inteiros positivos e o resultado deve ser um número de ponto flutuante com uma precisão de 5 dígitos após o ponto decimal. O resultado pertence ao domínio real.
Cuidado, as super-raízes podem ter muitas soluções.
Respostas:
C - visando clareza, não tentou espremer o código
Considerando a entrada:
Em geral, deve haver apenas uma solução em ℝ, o que simplifica consideravelmente o problema.
O código é:
Compilar:
Para correr:
Por exemplo:
4 2
3 3
3 π
n (2 ½ ) ➙ 2 como n ∞ ∞? (limite conhecido)
Sim!
n (e 1 / e ) ∞ como n ➙ ∞? (limites superiores)
Legal! (e 1 / e ≅ 1,44466786101 ...)
fonte
Python, 87 caracteres
Uma pesquisa linear simples para a resposta.
Fora do tópico, mas o que o * # $ (@! Está acontecendo com o
**
operador python ?fonte
(1e200)**2
com1e(200**2)
?OverflowError
no primeiro caso.Mathematica,
3540Gera uma lista de todas as soluções, com precisão de 5 dígitos.
Mais 5 caracteres para obter apenas a solução real, exigida pelas regras atualizadas.
fonte
Julia
Instrução de ponto flutuante ignorada, pois a pergunta define apenas o comportamento para números inteiros.
fonte
Quando isso se tornou um código de golfe? Eu pensei que era um desafio de código apresentar o melhor algoritmo!
código-golfe
APL, 33 caracteres
Esta é uma pesquisa linear simples, iniciando em C = 1 + 10 -6 e incrementando-a em 10 -6 até o
log C log C log C C A ≤ 1
onde a função log C é aplicada recursivamente B vezes.
Exemplos
Esse código é muito lento, mas para pequenas bases, como 2 ou 3, é concluído em alguns segundos. Veja abaixo uma coisa melhor.
desafio de código
APL, complexidade logarítmica
Na verdade, complexidade linear na ordem das raízes, logarítmica no tamanho e precisão do resultado:
tempo = O (B × log (C) + B × log (D))
onde B é a ordem raiz, C é a base de tetragem solicitada e D é o número de dígitos de precisão solicitados. Essa complexidade é meu entendimento intuitivo, não produzi uma prova formal.
Esse algoritmo não requer números inteiros grandes, ele usa apenas a função log em números regulares de ponto flutuante; portanto, é bastante eficiente em números muito grandes, até o limite da implementação do ponto flutuante (precisão dupla ou números FP grandes e arbitrários no Implementações de APL que as oferecem.)
A precisão do resultado pode ser controlada configurando
⎕CT
(tolerância de comparação) para o erro aceitável desejado (no meu sistema, o padrão é 1e¯14, aproximadamente 14 dígitos decimais)Não tenho certeza se
1≥⍵⍟⍣n
acima pode falhar com um erro de domínio (porque o log de um argumento negativo pode falhar imediatamente ou fornecer um resultado complexo, que não estaria no domínio de≥
), mas não consegui encontrar um caso que falha.Exemplos
'3' sai como um valor exato, porque é um dos valores atingidos diretamente pela pesquisa binária (começando de 2, dobrado para 4, bissetrado para 3). No caso geral de isso não acontecer, o resultado aproximará o valor raiz com um erro de ⎕CT (mais precisamente, o teste logarítmico de cada base candidata é realizado com tolerância ⎕CT).
fonte
Ruby, 79 bytes
É o mesmo que o programa abaixo, mas menos preciso, pois executa apenas 99 loops.
Ruby, 87 bytes
Experimente online
Isto é simplesmente bissecção. Ungolfed:
fonte
k [52 caracteres]
Uma versão modificada do meu post n º raiz
Exemplo:
fonte
Haskell
Pesquisa linear simples, retorna primeiro, menor correspondência encontrada.
Exemplo
fonte
Mathematica, 41 bytes sem otimização
O Mathematica foi basicamente inventado para resolver problemas como esse. Uma solução fácil é construir o problema como uma série de potências aninhada e passá-lo para a
Reduce
função interna, que busca soluções analíticas para equações. Como resultado, o seguinte, além de ser um código incomumente conciso, também não é uma força bruta.Você pode remover a restrição para fornecer apenas soluções de números reais se tiver paciência e desejar salvar seis bytes. Você também pode expressar algumas das funções aninhadas de forma abreviada para salvar mais alguns bytes. Como dado, retorna assim
fonte
05AB1E , 16 bytes
Porto da resposta em Python do @KeithRandall .
Experimente online.
Explicação:
ÐU²FXm}
também pode serD²>и.»m
para a mesma contagem de bytes:fonte