Sekwencja Lehmera-Comteta

12

Sekwencja Lehmera-Comteta jest sekwencją taką, że a (n) jest n- tą pochodną f (x) = x x w odniesieniu do x, jak oceniono przy x = 1 .

Zadanie

Weź nieujemną liczbę całkowitą jako dane wejściowe i wyjściowe n -tego ciągu sekwencji Lehmera-Comteta.

To jest więc powinieneś zminimalizować rozmiar pliku kodu źródłowego.

Przypadki testowe

OEIS 5727

Oto kilka pierwszych warunków w kolejności (skopiowane z 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
Ad Hoc Garf Hunter
źródło

Odpowiedzi:

11

Haskell , 77 75 bajtów, brak wbudowanego mechanizmu różnicowania

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

Wypróbuj online!

Jak to działa

Reprezentujemy funkcję jako jej nieskończoną listę współczynników szeregów Taylora około x = 1: f ( x ) = ∑ n = 0 f ( n ) ( x - 1) n / n ! jest reprezentowany przez [f (1), f ′ (1), f ″ (1),…].

W &mnoży operator dwa takie funkcje za pomocą zasady produktu. To pozwala nam rekurencyjnie zdefiniować funkcję s ( x ) = x x względem siebie za pomocą równania różniczkowego s (1) = 1, s ′ ( x ) = s ( x ) ⋅ (1 + ln x ), gdzie ln x = ∑ n = 1 (−1) n - 1 ( n - 1)! ( X - 1) n / n !.

Anders Kaseorg
źródło
7

Mathematica, 19 bajtów

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

-18 bajtów od @Nie drzewo

J42161217
źródło
9
Jeśli czegoś mi nie brakuje, możesz to zrobić o wiele krócej: D[x^x,{x,#}]/.x->1&19 bajtów.
Nie drzewo
faktycznie 21 bajtów .. ale tak! o wiele krótszy!
J42161217,
Nie sądzę, żebyś potrzebował -1- sekwencja z OEIS zaczyna się od n = 0.
Nie jest drzewem
1
ok więc! Jest 19 bajtów
J42161217,
5

Oktawa z pakietem symbolicznym, 36 32 bajtów

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

Kod definiuje anonimową funkcję, która wyświetla wynikową zmienną symboliczną.

Wypróbuj online!

Luis Mendo
źródło
5

Haskell , 57 bajtów

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

Wypróbuj online!

Brak wbudowanych funkcji różnicowania lub algebry. Wyjścia są zmiennoprzecinkowe.

xnor
źródło
4

Python z SymPy , 77 75 58 57 bajtów

1 bajt zapisany dzięki @notjagan

17 bajtów zapisanych dzięki @AndersKaseorg

from sympy import*
lambda n:diff('x^x','x',n).subs('x',1)
Uriel
źródło
1
lambda n:diff('x**x','x',10).subs('x',1)nie wymaga sympy.abc.
Anders Kaseorg
1
Ummm ... gdzie używasz n?
Zacharý
@ZacharyT dzięki! przypadkiem przetestowałem propozycję Andersa przy n = 10, więc dało to ten sam wynik :) naprawiono teraz
Uriel
-1 bajt, zastępując x**xw x^x.
notjagan
2

Python 3 , 150 bajtów

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))

Wypróbuj online!

Wykładnicza złożoność środowiska wykonawczego. Korzysta ze wzoru podanego na stronie OEIS.

Leaky Nun
źródło
n>=r>=0zapisuje bajt.
Ad Hoc Garf Hunter
Możesz także zapisać bajt, umieszczając 0**npo sum(...).
Ad Hoc Garf Hunter
1

Python3 + mpmath 52 bajty

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

-3 bajty, dzięki @Zachary T.

Anubhav
źródło
1
Powinieneś zmienić język na python3 + mpmath, ponieważ mpmath nie jest standardową biblioteką.
Ad Hoc Garf Hunter
2
Możesz zmienić pierwszą linię na from mpmath import*, a drugą na diff(lambda x:x**x,1,n). (po prostu
usuwam
0

Python 3 , 288 261 bajtów

Wbudowane różnicowanie bez różnicowania.

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)

Wypróbuj online!

Jak to działa

Każdy z pierwszych pięciu wierszy określa funkcje i ich pochodne oraz ich wyniki, gdy są oceniane w 1. Ich pochodne są również funkcjami.

  • p jest mocą, tj a*x^n
  • l jest logarytmem tj ln(x)
  • e jest wykładniczy, tj exp(x)
  • a jest dodatkiem tj f(x)+g(x)
  • m to mnożenie, tj f(x)*g(x)

Zastosowanie: na przykład exp(ln(x)+3x^2)będzie reprezentowane jako e(l()+p(3,2)). Let x=e(l()+p(3,2)). Aby znaleźć jego pochodną, ​​zadzwoń x(1). Aby znaleźć wynik po ocenie na 1, zadzwoń x(0).

Premia: zróżnicowanie symboliczne

Leaky Nun
źródło
Możesz zaoszczędzić wiele bajtów, używając execkompresji. Wypróbuj online!
Ad Hoc Garf Hunter