La sequenza di Lehmer-Comtet


12

La sequenza Lehmer-Comtet è una sequenza tale che una (n) è il n ° derivata di f (x) = x x rispetto ad x come valutata al x = 1 .

Compito

Prendere un numero intero non negativo come ingresso e uscita del n esimo termine della sequenza Lehmer-Comtet.

Questo è quindi dovresti ridurre al minimo le dimensioni del file del tuo codice sorgente.

Casi test

OEIS 5727

Ecco i primi due termini in ordine (copiati dall'OEIS)

1, 1, 2, 3, 8, 10, 54, -42, 944, -5112, 47160, -419760, 4297512, -47607144, 575023344, -7500202920, 105180931200, -1578296510400, 25238664189504, -428528786243904, 7700297625889920, -146004847062359040, 2913398154375730560, -61031188196889482880

Risposte:


11

Haskell , 77 75 byte, nessun builtin di differenziazione

x@(a:b)&y@(c:d)=a*c:zipWith(+)(b&y)(x&d)
s=1:s&(1:scanl(*)1[-1,-2..])
(s!!)

Provalo online!

Come funziona

Rappresentiamo una funzione come elenco infinito di coefficienti della serie di Taylor circa x = 1: f ( x ) = ∑ n = 0 f ( n ) ( x - 1) n / n ! è rappresentato da [f (1), f ′ (1), f ″ (1),…].

L' &operatore moltiplica due di queste funzioni utilizzando la regola del prodotto. Questo ci consente di definire ricorsivamente la funzione s ( x ) = x x in termini di se stessa usando l'equazione differenziale s (1) = 1, s ′ ( x ) = s ( x ) ⋅ (1 + ln x ), dove ln x = ∑ n = 1 (−1) n - 1 ( n - 1)! ( X - 1) n / n !


7

Mathematica, 19 byte

D[x^x,{x,#-1}]/.x->1&

-18 byte da @Non un albero


9
A meno che non mi manchi qualcosa, puoi renderlo molto più breve: D[x^x,{x,#}]/.x->1&19 byte.
Non un albero il

in realtà 21 byte .. ma sì! molto più breve!
J42161217

Non credo che ti serva il -1- la sequenza di OEIS inizia a n = 0.
Non un albero

1
va bene allora! 19 byte è
J42161217

5

Ottava con pacchetto simbolico, 36 32 byte

syms x
@(n)subs(diff(x^x,n),x,1)

Il codice definisce una funzione anonima che genera una variabile simbolica con il risultato.

Provalo online!


5

Haskell , 57 byte

f 0=1
f n=f(n-1)-foldl(\a k->f(k-1)/(1-n/k)-a*k)0[1..n-1]

Provalo online!

Nessun built-in per differenziazione o algebra. Le uscite galleggiano.


4

Python con SymPy , 77 75 58 57 byte

1 byte salvato grazie a @notjagan

17 byte salvati grazie a @AndersKaseorg

from sympy import*
lambda n:diff('x^x','x',n).subs('x',1)

1
lambda n:diff('x**x','x',10).subs('x',1)non richiede sympy.abc.
Anders Kaseorg,

1
Ummm ... dove usi n?
Zacharý,

@ZacharyT grazie! per coincidenza ho testato la proposta di Anders proprio con n = 10, quindi ha dato lo stesso risultato :) risolto ora
Uriel

-1 byte sostituendo x**xcon x^x.
Notjagan,


2

Python 3 , 150 byte

lambda n:0**n or sum(L(n-1,r)for r in range(n))
L=lambda n,r:0<=r<=n and(0**n or n*L(n-2,r-1)+L(~-n,r-1)+(r-~-n)*L(~-n,r)if r else n<2or-~-n*L(n-1,0))

Provalo online!

Complessità esponenziale del runtime. Utilizza la formula fornita nella pagina OEIS.


n>=r>=0salva un byte.
Ad Hoc Garf Hunter

Puoi anche salvare un byte inserendo 0**ndopo sum(...).
Ad Hoc Garf Hunter




1

Python3 + mpmath 52 byte

from mpmath import*
lambda n:diff(lambda x:x**x,1,n)

-3 byte, grazie @Zachary T


1
Dovresti cambiare la lingua in python3 + mpmath, poiché mpmath non è una libreria standard.
Ad Hoc Garf Hunter,

2
È possibile modificare la prima riga in from mpmath import*e la seconda in diff(lambda x:x**x,1,n). (basta rimuovere gli spazi non necessari)
Zacharý

0

Python 3 , 288 261 byte

Differenziazione senza differenziazione integrata.

p=lambda a,n:lambda v:v and p(a*n,n-1)or a
l=lambda v:v and p(1,-1)
e=lambda v:v and m(e,a(p(1,0),l))or 1
a=lambda f,g:lambda v:v and a(f(1),g(1))or f(0)+g(0)
m=lambda f,g:lambda v:v and a(m(f(1),g),m(g(1),f))or f(0)*g(0)
L=lambda n,f=e:n and L(n-1,f(1))or f(0)

Provalo online!

Come funziona

Ognuna delle prime cinque righe definisce le funzioni, i loro derivati ​​e i loro risultati quando valutate a 1. I loro derivati ​​sono anche funzioni.

  • p è potere cioè a*x^n
  • l è logaritmo cioè ln(x)
  • e è esponenziale cioè exp(x)
  • a è l'aggiunta cioè f(x)+g(x)
  • m è la moltiplicazione cioè f(x)*g(x)

Utilizzo: ad esempio, exp(ln(x)+3x^2)sarebbe rappresentato come e(l()+p(3,2)). Let x=e(l()+p(3,2)). Per trovare il suo derivato, chiama x(1). Per trovare il risultato quando valutato a 1, chiamare x(0).

Bonus: differenziazione simbolica


È possibile salvare molti byte utilizzando la execcompressione. Provalo online!
Ad Hoc Garf Hunter

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.