Golf la secuencia cuya función de generación exponencial es tangente

15

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 ntérminos enésimos forman una secuencia, y la función correspondiente se llama Función generadora de la secuencia.

Los coeficientes de los ntérminos -th forman una secuencia.

A menudo, el nené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^xseria 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 nené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 0ené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)]))

Ideone it!

Referencias

Monja permeable
fuente
44
Si desea obtener más información sobre la generación de funciones y su uso en matemáticas, especialmente la combinatoria y la teoría numérica, le recomiendo este libro de texto "famoso" que genera la función de H. Wilf.
flawr
55
(No puedo resistir): tomada literalmente, ¡tu primera oración es extremadamente falsa!
Flounderer
Tiene su significado de "función generadora" y "función generadora exponencial" al revés. $ \ sin (x) $ es la función generadora exponencial de la secuencia 0,1,0, -1,0,1,0, -1,0, ... - no es la secuencia la función generadora exponencial de $ \ sin (x) $. Lo que nos pide que hagamos es codificar la secuencia generada exponencialmente por $ \ tan (x) $.
Glen O
Se ve bien, excepto "Esto también se llama la función de generación de esa función. Los coeficientes de los enésimos términos forman una secuencia", que probablemente debería decir algo como "Los coeficientes de los términos enésima forman una secuencia, y la función correspondiente se llama la función de generación de la secuencia ".
Glen O
@GlenO Editado.
Leaky Nun

Respuestas:

8

CJam ( 33 32 27 26 23 20 bytes)

2,{ee::*_(@+.+}ri*0=

Demostración en línea

Disección

Esto implementa esencialmente la recurrencia descrita por xnor .

2,        e# [0 1] represents the base case f(0,j) = j==1
{         e# Loop...
  ee::*   e#   Multiply each array element by its index
  _(@+.+  e#   Sum the array shifted left and the array shifted right
}ri*      e# ... n times
0=        e# Evaluate at j=0

O con un enfoque bastante diferente, para 23 bytes:

ri_1&a{{1$+}*]W%0+}@*0=

Demo en línea . Gracias a Dennis por 3 bytes.

Disección

1a         e# Push [1]
{          e# Repeat...
  {1$+}*]  e#   Compute array of partial sums
  W%0+     e#   Reverse and append 0
}qi:A*     e# ... A times, where A is the input value
0=A1&*     e# Result is first element if A odd, and 0 otherwise

O con un enfoque muy diferente, para 29 bytes:

qie!Ma-{W\+W+3ew{_$.=1=},!},,

Demostración en línea

Lamentablemente, se requiere un caso especial para la entrada 0.

Disección

qi            e# Take an integer n from stdin
e!            e#   Compute all permutations of [0 ... n-1]
Ma-           e#   Special-case n=0
{             e#   Filter...
  W\+W+       e#     Prepend and postpend -1
  3ew         e#     Take slices of 3 consecutive elements
  {           e#     Filter...
    _$.=1=    e#       Test whether the middle element is the second largest
  },!         e#     ... and require no matches
},,           e#   ... and count

Puede estar pensando "¡¿WTF ?! Está respondiendo la pregunta equivocada". Si es así, eso es comprensible, pero ambos enfoques dan los resultados correctos .

Peter Taylor
fuente
En caso de que ayude, la compilación nocturna en TIO devuelve una matriz vacía para [WW]3ew.
Dennis
@ Dennis, gracias. Sin embargo, resulta que 0debe ser un caso especial de todos modos, porque se evalúa como 1.
Peter Taylor
1
Uno solo pensaría que está respondiendo la pregunta incorrecta si ni siquiera ha hecho clic en mis enlaces.
Leaky Nun
ri_1&a{{1$+}*]W%0+}@*0=ahorra 3 bytes.
Dennis
2
@LeakyNun, así que serían todos entonces. Vi esa lista de enlaces y tl; dr.
Peter Taylor
7

Julia, 40 38 32 bytes

!n=2(2*4^n-2^n-0^n)abs(zeta(-n))

La entrada y salida está en forma de BigFloats. 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.

Dennis
fuente
6

Python, 57 bytes

f=lambda i,j=0:~-j*f(i-1,j-1)-~j*f(i-1,j+1)if i else j==1

Menos golfizado:

f=lambda i,j=0:j==1 if i==0 else (j-1)*f(i-1,j-1)+(j+1)*f(i-1,j+1)

Podemos calcular el icoeficiente th de la función generadora exponencial diferenciando los itiempos de la función tangente y evaluando en 0. Cada derivada es un polinomio tan(x)y su valor en 0 es su término constante.

Expresamos recursivamente el coeficiente de tan(x)**jen la iderivada th de tancon la función f(i,j). La expresión recursiva proviene de la relación tan(x)' = 1 + tan(x)**2.

Entonces, la derivada de tan(x)**jes

j*tan(x)**(j-1)*(tan(x)**2+1), or equivalently
j*tan(x)**(j+1) + j*tan(x)**(j-1)

Entonces, los contribuyentes a tan(x)**jen la iderivada th son tan(x)**(j-1)y tan(x)**(j+1)en la (i-1)derivada st, cada uno con un coeficiente igual a su potencia. Esto da la expresión recursiva

f(i,j) = (j-1)*f(i-1,j-1) + (j+1)*f(i-1,j+1)

Tenga en cuenta que no necesitamos excluir exponentes negativos jporque de todos modos se evalúan a cero y no contribuyen porque el cruce j=0da un multiplicador de 0.

El caso base de i==0corresponde a tan(x)sí mismo con j==1, y de lo contrario coeficientes cero. La evaluación final ocurre en el término constante j=0, que se coloca como un valor predeterminado.

xnor
fuente
Este puerto a 20 bytes en CJam. ¿Te importa si considero que esa es mi respuesta principal o quieres exportarlo y publicarlo?
Peter Taylor
Deberías publicarlo, no sé CJam.
xnor
4

Mathematica, 20 bytes

Tan@x~D~{x,#}/.x->0&

Enfoque directo. Calcular el n º derivado de tan (x) y evaluarla en x = 0 .

Uso

Ejemplo

millas
fuente
3

Haskell, 48 bytes

0%1=1
0%_=0
i%j=sum[k*(i-1)%k|k<-[j+1,j-1]]
(%0)

Podemos calcular el icoeficiente th de la función generadora exponencial diferenciando los itiempos de la función tangente y evaluando en 0. Cada derivada es un polinomio tan(x)y el valor en 0 es su término constante.

Expresamos recursivamente el coeficiente de tan(x)^jen la iderivada th de tancon la función i%j. La expresión recursiva proviene de la relación tan(x)' = 1 + tan(x)^2.

Entonces, la derivada de tan(x)^jes

j*tan(x)^(j-1)*(tan(x)^2+1), or equivalently
j*tan(x)^(j+1) + j*tan(x)^(j-1)

Entonces, los contribuyentes a tan(x)^jen la iderivada th son tan(x)^(j-1)y tan(x)^(j+1)en la (i-1)derivada st, cada uno con un coeficiente igual a su potencia.

xnor
fuente
3

Jalea , 12 11 bytes

Ṛ+\;S
ḂÇ⁸¡Ḣ

Como 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

ḂÇ⁸¡Ḣ  Main link. Argument: n

Ḃ       Bit; yield n's parity.
 Ç⁸¡    Apply the helper link (Ç) n (⁸) times.
    Ḣ   Head; retrieve the first element of the resulting list.


Ṛ+\;S   Helper link. Argument: A (list or 1/0)

Ṛ       Cast A to list (if necessary) and reverse the result.
 +\     Take the cumulative sum.
   ;S   Append the sum of A.
Dennis
fuente
3

Sabio, 26 bytes

lambda n:tan(x).diff(n)(0)

Al igual que las otras soluciones en lenguajes orientados a las matemáticas, esta función calcula la nderivada th de tan(x)y la evalúa en x = 0.

Pruébalo en línea

Mego
fuente
2

J, 15 13 bytes

También hay la orden interna t:que calcula el n º coeficiente de la función de generación exponencial de tan (x) .

(1&o.%2&o.)t:

Gracias a @ Leaky Nun por recordarme los adverbios de la serie Taylor en J que ahorraron 2 bytes.

Alternativa para 15 bytes .

3 :'(3&o.d.y)0'

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

   f =: (1&o.%2&o.)t:
   f 7
272
   (,.f"0) i. 11  NB. Additional commands are just for formatting the output
 0    0
 1    1
 2    0
 3    2
 4    0
 5   16
 6    0
 7  272
 8    0
 9 7936
10    0

Explicación

(1&o.%2&o.)t:  Input: n
(         )    Define a monad (one argument function), call the input y
 1&o.          Get the trig function sin(x) and call it on y
      2&o.     Get the trig function cos(x) and call it on y
     %         Divide sin(y) by cos(y) to get tan(y)
           t:  Get the nth coefficient of the exponential generating series
               for that function and return

3 :'(3&o.d.y)0'  Input: n
3 :'          '  Define a monad (one argument function) with input y
     3&o.        Get the trig function tan(x)
           y     The input n
         d.      Get the nth derivative of tan(x)
             0   Evaluate the nth derivative at x = 0 and return
millas
fuente
2

Julia, 39 37 bytes

!n=(spdiagm((0:n,1:n+1),(1,-1))^n)[2]

Guardado 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.

Glen O
fuente
!n=(spdiagm((0:n,1:n+1),(1,-1))^n)[2]Deberia trabajar.
Dennis
@ Dennis: buena captura. No me di cuenta de spdiagmque permitiría ese estilo de construcción: lo probé diagm, pero por supuesto no funcionó.
Glen O
2

JavaScript (ES6), 127 45 bytes

f=(n,m=0)=>n?++m*f(--n,m--)+--m*f(n,m):m-1?0:1

Puerto de soluciones de @ xnor.

Neil
fuente
0

Haskell, 95 93 bytes

p=product
f n=sum[(-1)^(n`div`2+j+1)*j^n*p[k-j+1..n+1]`div`p[1..n+1-k+j]|k<-[1..n],j<-[0..k]]

Básicamente es una implementación de la fórmula general con algunas optimizaciones menores.

falla
fuente
0

MATLAB con caja de herramientas simbólica, 84 bytes

n=input('');syms x;c=coeffs(taylor(tan(x),'Order',n+1))*factorial(n);c(end)*mod(n,2)

Ejecuciones de ejemplo:

>> n=input('');syms x;c=coeffs(taylor(tan(x),'Order',n+1))*factorial(n);c(end)*mod(n,2)
7
ans =
272

>> n=input('');syms x;c=coeffs(taylor(tan(x),'Order',n+1))*factorial(n);c(end)*mod(n,2)
8
ans =
0

>> n=input('');syms x;c=coeffs(taylor(tan(x),'Order',n+1))*factorial(n);c(end)*mod(n,2)
9
ans =
7936
Luis Mendo
fuente
0

Haskell (demasiados bytes)

Usando solo operaciones en listas y el resultado de Raymond Manzoni :

c n = last $ map numerator $ zipWith (*) (scanl (*) (1) [2,3..]) (intersperse 0 $ foldr (.) id (replicate n (\xs->(xs ++ [(1%(1+2*length xs)) * (sum (zipWith (*) xs (reverse xs)))]))) [1])

Desafortunadamente, esto se desborda para valores modestos de n, ya que usa Intvalores. Intentaré solucionar el problema usando Integervalores. Hasta entonces, las sugerencias son bienvenidas.

Rodrigo de Azevedo
fuente
0

Axioma, 46 bytes

f(n:NNI):NNI==(n=0=>0;eval(D(tan(x),x,n),x=0))

código para prueba y resultados

(32) -> [[i, f(i)] for i in 0..26]
   (32)
   [[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]]
                                       Type: List List NonNegativeInteger
RosLuP
fuente