Desafío
El desafío es escribir un programa que tome un número positivoa
y un número distinto de cerob
y salga a^b
(a elevado a la potencia b). Solo se puede usar + - * / abs()
como funciones / operadores matemáticos. Estos solo pueden aplicarse a valores escalares, pero no a listas completas o matrices.
Ejemplos:
1.234 ^ 5.678 = 3.29980
4.5 ^ 4.5 = 869.874
4.5 ^-4.5 = 0.00114959
Relevante: http://xkcd.com/217/
Detalles
Puede escribir una función o una construcción similar para usar en la consola. Si no puede usar la entrada de la consola, puede suponer que ambos números se guardan en variables y salen a través de la salida estándar o escribiendo en un archivo. La salida debe ser correcta al menos a 4 dígitos significativos. Puede suponer que ambos a
y b
no son cero. Un tiempo de ejecución de significativamente más de 1 minuto no es aceptable. El menor número de bytes ganará. Por favor explique su programa y su algoritmo.
EDITAR: solo se deben considerar las bases positivas . Puedes asumir a>0
. ¡Tenga en cuenta que ambos números no tienen que ser enteros!
fuente
-0.5 ** 0.5
?Respuestas:
Python, 77
Al igual que con otras respuestas, esto se basa en log y exp. Pero las funciones se calculan resolviendo numéricamente ecuaciones diferenciales ordinarias.
¿Cumple los requisitos? Para los ejemplos en la pregunta, sí. Para grandes a, llevará mucho tiempo. Para grandes aob, se volverá inexacto.
Ejemplos:
Actualización: flawr pidió más detalles sobre las matemáticas, así que aquí tienes. Considere los siguientes problemas de valor inicial:
Si puedo encontrar el valor de t tal que x (t) = a, entonces tendré y (t) = exp (bt) = a ^ b. La forma más simple de resolver numéricamente un problema de valor inicial es el método de Euler . Calcula la derivada que se supone que tiene la función, y luego da un paso, en la dirección de la derivada, y proporcional a ella, pero escalada por una pequeña constante. Entonces eso es lo que hago, dar pequeños pasos hasta que x sea tan grande como a, y luego ver qué es y en ese momento. Bueno, así es como lo pensé. En mi código, t nunca se calcula explícitamente (es 1e-7 * el número de pasos del bucle while), y guardé algunos caracteres haciendo los cálculos para x con a en su lugar.
fuente
JavaScript (E6)
155174191Edición 2 Según lo sugerido por @bebe, uso de la función recursiva (rendimiento peor pero más corto) Se
modificó ligeramente la función R para evitar "demasiada recursividad"
. Se agregó el conjunto de pruebas. La función funciona bien para bases <3000 y exponente en el rango -50..50.
Editar Golfed más y mejor precisión
Cualquier número real puede ser aproximado con un número racional (y los números 'reales' estándar de IEEE almacenan racionales de hecho). Cualquier número racional se puede expresar como una fracción a / b con enteros ayb. x ^ (a / b) es la raíz b de (x ^ a) o (raíz b de x) ^ a. La exponenciación de enteros es bastante fácil al cuadrar. La raíz entera se puede aproximar utilizando métodos numéricos.
Código
Prueba en la consola FireFox o FireBug
fuente
e&1&&(r*=b)
hace esto , excepto 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))
(debo estar cansado)Haskell, 85
90Algoritmo estándar de registro de exp. Ahora con un nombre diferente, eliminando algunos caracteres más:
raise
ahora se llama(%)
, o%
en notación infija, incluso haciendo que su uso consuma menos bytes:4.5%(-4.5)
La versión sin golf también usa solo 172 bytes:
fuente
JS (ES6), 103 bytes
Ejemplos:
Utiliza la serie Taylor.
b^x = 1 + ln(b)*x/1! + (ln(b)*x)^2/2! + (ln(b)*x)^3/3! + (ln(b)*x)^4/4! + ...
con aproximación de logaritmo natural :
ln(b) = (1-1/x) + (1-1/x)^2/2 + (1-1/x)^3/3 + (1-1/x)^4/4 + ...
Utilicé 128 iteraciones para calcular
b^x
(más iteraciones es difícil debido a factorial) y 262144 iteraciones paraln(b)
fuente
e(80,5) ->1555962210.2240903
- debería ser 3276800000golflua 120
Uso el hecho de que
y escribí mis propias
log
yexp
funciones. Los valoresa
yb
deben ingresarse en las nuevas líneas cuando se ejecutan en la terminal:Ejecuciones de muestra:
Una versión sin Lua es,
fuente