Desafio
Desafio é escrever um programa que leva positivos números a
e um zero número b
e saídas a^b
(a elevado à potência b). Você só pode usar + - * / abs()
como funções / operadores matemáticos. Eles podem ser aplicados apenas a valores escalares, mas não a listas ou matrizes inteiras.
Exemplos:
1.234 ^ 5.678 = 3.29980
4.5 ^ 4.5 = 869.874
4.5 ^-4.5 = 0.00114959
Relevante: http://xkcd.com/217/
Detalhes
Você pode escrever uma função ou uma construção semelhante para usar no console. Se você não pode usar a entrada do console, pode assumir que os dois números são salvos em variáveis e saídos via saída padrão ou gravando em um arquivo. A saída deve estar correta para pelo menos 4 dígitos significativos. Você pode assumir que ambos a
e b
são diferentes de zero. Um tempo de execução significativamente maior que 1 minuto não é aceitável. O menor número de bytes vencerá. Por favor, explique seu programa e seu algoritmo.
EDIT: Apenas bases positivas devem ser consideradas. Você pode assumir a>0
. Esteja ciente de que os dois números não precisam ser inteiros !!!
fonte
-0.5 ** 0.5
?Respostas:
Python, 77
Como em algumas outras respostas, isso é baseado em log e exp. Mas as funções são calculadas resolvendo numericamente equações diferenciais ordinárias.
Satisfaz os requisitos? Para os exemplos na pergunta, sim. Para um grande, vai demorar muito tempo. Para grandes a ou b, ele se tornará impreciso.
Exemplos:
Atualização: flawr pediu mais detalhes sobre a matemática, então aqui está. Eu considerei os seguintes problemas de valor inicial:
Se eu puder encontrar o valor de t tal que x (t) = a, então terei y (t) = exp (bt) = a ^ b. A maneira mais simples de resolver numericamente um problema de valor inicial é o método de Euler . Você calcula a derivada que a função deve ter e, em seguida, dá um passo na direção da derivada e é proporcional a ela, mas dimensionada por uma pequena constante. Então é isso que eu faço, dê pequenos passos até que x seja tão grande quanto ae, em seguida, veja o que y é naquele momento. Bem, foi assim que pensei. No meu código, t nunca é explicitamente calculado (é 1e-7 * o número de etapas do loop while), e salvei alguns caracteres fazendo os cálculos de x com um.
fonte
JavaScript (E6)
155174191Editar 2 Conforme sugerido por @bebe, usando a função recursiva (executa pior, mas menor)
Função R alterada ligeiramente para evitar 'recursão demais' Conjunto de
testes adicionado. A função tem bom desempenho para bases <3000 e expoente no intervalo -50..50.
Editar Golfed mais e melhor precisão
Qualquer número real pode ser aproximado com um número racional (e os números 'reais' padrão do IEEE armazenam os racionais de fato). Qualquer número racional pode ser expresso como uma fração a / b com números inteiros aeb. x ^ (a / b) é a raiz b de (x ^ a) ou (raiz b de x) ^ a. A exponenciação de número inteiro é bastante fácil ao quadrado. Raiz inteira pode ser aproximada usando métodos numéricos.
Código
Teste no console do FireFox ou FireBug
fonte
e&1&&(r*=b)
faz, exceto multiplicarr
porb
?if(e&1 != 0) r *= b
P=(x,e)=>(F=(b,e,r=1)=>e?F(b*b,e>>1,e&1?r*b:r):r,R=(b,e,g=1,y=1e-16,d=(b/F(g,e-1)-g)/e)=>d>y|d<-y?R(b,e,g+d):g,e<0&&(x=1/x,e=-e),f=1<<24,F(R(x,f),e*f))
(i deve estar cansado)Haskell, 85
90Algoritmo exp-log padrão. Agora com um nome diferente, eliminando mais alguns caracteres:
raise
agora é chamado(%)
ou%
em notação infix, mesmo fazendo seu uso consumir menos bytes:4.5%(-4.5)
A versão ungolfed também usa apenas 172 bytes:
fonte
JS (ES6), 103 bytes
Exemplos :
Use a série Taylor.
b^x = 1 + ln(b)*x/1! + (ln(b)*x)^2/2! + (ln(b)*x)^3/3! + (ln(b)*x)^4/4! + ...
com aproximação natural do logaritmo :
ln(b) = (1-1/x) + (1-1/x)^2/2 + (1-1/x)^3/3 + (1-1/x)^4/4 + ...
Usei 128 iterações para calcular
b^x
(mais iterações são difíceis devido ao fatorial) e 262144 iterações paraln(b)
fonte
e(80,5) ->1555962210.2240903
- deve ser 3276800000golflua 120
Eu uso o fato de que
e escreveu os meus próprios
log
eexp
funções. Os valoresa
eb
precisam ser inseridos nas novas linhas quando executados no terminal:Amostras de execuções:
Uma versão não-gasta de Lua é,
fonte