Casi todas las funciones se pueden expresar como un polinomio con términos infinitos.
Por ejemplo, e^x = 1 + x + x^2/2! + x^3/3! + x^4/4! + ...
Por ejemplo, sin(x) = x - x^3/3! + x^5/5! - x^7/7! + ...
Los coeficientes de los n
términos enésimos forman una secuencia, y la función correspondiente se llama Función generadora de la secuencia.
Los coeficientes de los n
términos -th forman una secuencia.
A menudo, el n
enésimo término tendría un denominador de n!
. Por lo tanto, multiplicamos el coeficiente por n!
para obtener otra secuencia, cuya función de generación exponencial sería la función original.
Por ejemplo, la secuencia cuya función exponencial Generación es e^x
seria 1,1,1,1,...
.
Por ejemplo, la secuencia cuya función exponencial Generación es sin(x)
seria 0,1,0,-1,0,1,0,-1,...
.
Tarea
Su tarea es encontrar el n
enésimo término de la secuencia cuya función de generación exponencial es tan(x)
.
Casos de prueba
n result
0 0
1 1
2 0
3 2
4 0
5 16
6 0
7 272
8 0
9 7936
10 0
11 353792
12 0
13 22368256
14 0
15 1903757312
16 0
17 209865342976
18 0
19 29088885112832
20 0
21 4951498053124096
22 0
23 1015423886506852352
24 0
25 246921480190207983616
26 0
(Copiado de aquí .) (Advertencia: el 0
enésimo término es diferente)
Implementación de ejemplo
# copied from https://github.com/Mego/Seriously/blob/v2.0/SeriouslyCommands.py#L16
def memoized(f):
memo = {}
def m_fun(*args):
if args in memo:
return memo[args]
else:
res = f(*args)
memo[args] = res
return res
return m_fun
# copied from https://github.com/Mego/Seriously/blob/v2.0/SeriouslyCommands.py#L169
@memoized
def binomial(n,r):
if r > n:
return 0
elif r==n:
return 1
res = 1
i = 1
while i<=r:
res *= (n+1-i)
res /= i
i+=1
return int(res)
# 2*u(n+1) = Sum_{k=0..n} binomial(n, k)*u(k)*u(n-k)
# from A000111
@memoized
def u(n):
if n<0: return 0
if n==0: return 1
if n==1: return 1
return sum([binomial(n-1,k)*u(k)*u(n-1-k) for k in range(n)])//2
def t(n):
if n%2 == 0: return 0
return u(n)
print('\n'.join([str(x) + ' ' + str(t(x)) for x in range(26)]))
Referencias
- Función generadora en Wikipedia
- Función generadora exponencial en Wikipedia
- Ejemplo de función de generación exponencial en Wikipedia
- Generando función en MathWorld
- Función de generación exponencial en MathWorld
- Serie de Taylor en Wikipedia
- Derivación de los primeros 9 términos de secuencia requerida
- Obligatorio OEIS A009006 (Tenga en cuenta que el
0
enésimo término es diferente) - Algoritmo
- OEIS A000111: números arriba / abajo
Respuestas:
CJam (
33 32 27 26 2320 bytes)Demostración en línea
Disección
Esto implementa esencialmente la recurrencia descrita por xnor .
O con un enfoque bastante diferente, para 23 bytes:
Demo en línea . Gracias a Dennis por 3 bytes.
Disección
O con un enfoque muy diferente, para 29 bytes:
Demostración en línea
Lamentablemente, se requiere un caso especial para la entrada
0
.Disección
Puede estar pensando "¡¿WTF ?! Está respondiendo la pregunta equivocada". Si es así, eso es comprensible, pero ambos enfoques dan los resultados correctos .
fuente
[WW]3ew
.0
debe ser un caso especial de todos modos, porque se evalúa como1
.ri_1&a{{1$+}*]W%0+}@*0=
ahorra 3 bytes.Julia,
403832 bytesLa entrada y salida está en forma de
BigFloat
s. Pruébalo en línea!Antecedentes
La serie Maclaurin de la función tangente satisface la identidad.
siempre que x se encuentre en su radio de convergencia, donde B n es un número de Bernoulli.
Como B 2 (n + 1) y (-1) n tienen el mismo signo, B 2n + 1 = 0 si n> 0 y B 1 = 1/2 , podemos reescribir lo anterior de la siguiente manera.
Además, cada vez que n es un número entero no negativo, tenemos
donde ζ denota la función zeta de Riemann .
De esto, con la convención 0 0 = 1 , se deduce que
cuál es la fórmula que usa la implementación.
fuente
Python, 57 bytes
Menos golfizado:
Podemos calcular el
i
coeficiente th de la función generadora exponencial diferenciando losi
tiempos de la función tangente y evaluando en0
. Cada derivada es un polinomiotan(x)
y su valor en 0 es su término constante.Expresamos recursivamente el coeficiente de
tan(x)**j
en lai
derivada th detan
con la funciónf(i,j)
. La expresión recursiva proviene de la relacióntan(x)' = 1 + tan(x)**2
.Entonces, la derivada de
tan(x)**j
esEntonces, los contribuyentes a
tan(x)**j
en lai
derivada th sontan(x)**(j-1)
ytan(x)**(j+1)
en la(i-1)
derivada st, cada uno con un coeficiente igual a su potencia. Esto da la expresión recursivaTenga en cuenta que no necesitamos excluir exponentes negativos
j
porque de todos modos se evalúan a cero y no contribuyen porque el crucej=0
da un multiplicador de0
.El caso base de
i==0
corresponde atan(x)
sí mismo conj==1
, y de lo contrario coeficientes cero. La evaluación final ocurre en el término constantej=0
, que se coloca como un valor predeterminado.fuente
Mathematica, 20 bytes
Enfoque directo. Calcular el n º derivado de tan (x) y evaluarla en x = 0 .
Uso
fuente
Haskell, 48 bytes
Podemos calcular el
i
coeficiente th de la función generadora exponencial diferenciando losi
tiempos de la función tangente y evaluando en0
. Cada derivada es un polinomiotan(x)
y el valor en 0 es su término constante.Expresamos recursivamente el coeficiente de
tan(x)^j
en lai
derivada th detan
con la funcióni%j
. La expresión recursiva proviene de la relacióntan(x)' = 1 + tan(x)^2
.Entonces, la derivada de
tan(x)^j
esEntonces, los contribuyentes a
tan(x)^j
en lai
derivada th sontan(x)^(j-1)
ytan(x)^(j+1)
en la(i-1)
derivada st, cada uno con un coeficiente igual a su potencia.fuente
Jalea ,
1211 bytesComo respuesta Cjam de Peter Taylor , este calcula el n º período de Euler hacia arriba / abajo secuencia de si n es impar y especiales casos incluso n como 0 .
Pruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
Sabio, 26 bytes
Al igual que las otras soluciones en lenguajes orientados a las matemáticas, esta función calcula la
n
derivada th detan(x)
y la evalúa enx = 0
.Pruébalo en línea
fuente
J,
1513 bytesTambién hay la orden interna
t:
que calcula el n º coeficiente de la función de generación exponencial de tan (x) .Gracias a @ Leaky Nun por recordarme los adverbios de la serie Taylor en J que ahorraron 2 bytes.
Alternativa para 15 bytes .
Otro enfoque consiste en calcular el n º derivado de tan (x) y evaluarla en x = 0 .
Nota: En J , la cantidad de memoria utilizada por la función derivada
d.
crece rápidamente a medida que n pasa a 10.Uso
Explicación
fuente
Julia,
3937 bytesGuardado 2 bytes gracias a Dennis.
No es la solución más corta de Julia (ver la solución de Dennis), pero esta se hace puramente usando lógica derivada ... en forma de matrices.
Básicamente, utiliza el hecho de que la derivada de tan (x) es 1 + tan (x) ^ 2. Entonces, dado que la derivada de cualquier potencia de tan (x), digamos tan (x) ^ k, es k tan (x) ^ (k-1) tan (x) '= k tan (x) ^ (k-1) + k tan (x) ^ (k + 1), podemos usar una potencia de matriz simple en una matriz con los valores apropiados para generar la expansión, con la segunda fila o columna (dependiendo de la construcción) sosteniendo las derivadas de tan (x ) sí mismo.
Entonces solo necesitamos encontrar la constante en la expresión resultante, y ese es el primer valor en la fila o columna correspondiente.
fuente
!n=(spdiagm((0:n,1:n+1),(1,-1))^n)[2]
Deberia trabajar.spdiagm
que permitiría ese estilo de construcción: lo probédiagm
, pero por supuesto no funcionó.JavaScript (ES6),
12745 bytesPuerto de soluciones de @ xnor.
fuente
Haskell,
9593 bytesBásicamente es una implementación de la fórmula general con algunas optimizaciones menores.
fuente
MATLAB con caja de herramientas simbólica, 84 bytes
Ejecuciones de ejemplo:
fuente
Haskell (demasiados bytes)
Usando solo operaciones en listas y el resultado de Raymond Manzoni :
Desafortunadamente, esto se desborda para valores modestos de
n
, ya que usaInt
valores. Intentaré solucionar el problema usandoInteger
valores. Hasta entonces, las sugerencias son bienvenidas.fuente
Axioma, 46 bytes
código para prueba y resultados
fuente