Prawie każdą funkcję można wyrazić jako wielomian z nieskończonymi terminami.
Na przykład, e^x = 1 + x + x^2/2! + x^3/3! + x^4/4! + ...
Na przykład, sin(x) = x - x^3/3! + x^5/5! - x^7/7! + ...
Współczynniki n
-tego wyrażenia tworzą sekwencję, a odpowiednia funkcja nazywa się funkcją generującą sekwencję.
Współczynniki n
-tego wyrażenia tworzą sekwencję.
Często n
-ty termin miałby mianownik n!
. Dlatego mnożymy współczynnik przez, n!
aby uzyskać inną sekwencję, której wykładnicza funkcja generująca byłaby funkcją oryginalną.
Na przykład, sekwencja którego funkcja wykładnicza Generowanie to e^x
byłoby 1,1,1,1,...
.
Na przykład, sekwencja którego funkcja wykładnicza Generowanie to sin(x)
byłoby 0,1,0,-1,0,1,0,-1,...
.
Zadanie
Twoim zadaniem jest znalezienie n
-tego terminu w sekwencji, którego funkcją jest funkcja generowania wykładniczegotan(x)
.
Przypadki testowe
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
(Skopiowano stąd .) (Ostrzeżenie: 0
-te określenie jest inne)
Przykładowa implementacja
# 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)]))
Bibliografia
- Generowanie funkcji na Wikipedii
- Funkcja generowania wykładniczego na Wikipedii
- Przykład funkcji generowania wykładniczego na Wikipedii
- Generowanie funkcji w MathWorld
- Funkcja generowania wykładniczego na MathWorld
- Seria Taylora na Wikipedii
- Wyprowadzenie pierwszych 9 warunków wymaganej sekwencji
- Obowiązkowe OEIS A009006 (należy zauważyć, że
0
-ty termin jest inny) - Algorytm
- OEIS A000111: numery góra / dół
Odpowiedzi:
CJam (
33 32 27 26 2320 bajtów)Demo online
Sekcja
To zasadniczo implementuje powtarzalność opisaną przez xnor .
Lub z innym podejściem, dla 23 bajtów:
Demo online . Dzięki Dennis za 3 bajty.
Sekcja
Lub z zupełnie innym podejściem, dla 29 bajtów:
Demo online
Niestety do wprowadzenia danych wymagany jest specjalny przypadek
0
.Sekcja
Być może myślisz „WTF ?! On odpowiada na złe pytanie”. Jeśli tak, jest to zrozumiałe, ale oba podejścia rzeczywiście dają prawidłowe wyniki .
źródło
[WW]3ew
.0
musi to być szczególny przypadek, ponieważ ocenia1
.ri_1&a{{1$+}*]W%0+}@*0=
oszczędza 3 bajty.Julia,
403832 bajtyDane wejściowe i wyjściowe mają postać
BigFloat
s. Wypróbuj online!tło
Seria Maclaurin funkcji stycznej spełnia tożsamość
ilekroć x leży w promieniu zbieżności, gdzie B n jest liczbą Bernoulliego.
Ponieważ B 2 (n + 1) i (-1) n mają ten sam znak, B 2n + 1 = 0, jeśli n> 0 i B 1 = 1/2 , możemy przepisać powyższe w następujący sposób.
Ponadto, ilekroć n jest nieujemną liczbą całkowitą, mamy taką wartość
gdzie ζ oznacza funkcję zeta Riemanna .
Z tego wynika, że zgodnie z konwencją 0 0 = 1
która jest formułą używaną przez implementację.
źródło
Python, 57 bajtów
Mniej golfa:
Możemy obliczyć
i
współczynnik th wykładniczej funkcji generującej, różnicująci
czasy funkcji stycznej i oceniając przy0
. Każda pochodna jest wielomianem wtan(x)
, a jej wartość przy 0 jest stałym elementem .Rekurencyjnie wyrażamy współczynnik
tan(x)**j
wi
pochodnejtan
z funkcjąf(i,j)
. Wyrażenie rekurencyjne pochodzi z relacjitan(x)' = 1 + tan(x)**2
.Tak więc pochodną
tan(x)**j
jestTak więc, współtwórcami
tan(x)**j
wi
tej pochodnej sątan(x)**(j-1)
itan(x)**(j+1)
w pierwszej(i-1)
pochodnej, każdy o współczynniku równym jego mocy. Daje to rekurencyjną ekspresjęZauważ, że nie musimy wykluczać wykładników ujemnych,
j
ponieważ i tak oceniają na zero i nie uczestniczą, ponieważ krzyżowaniej=0
daje mnożnik0
.Przypadek podstawowy
i==0
odpowiadatan(x)
sam sobiej==1
, a w przeciwnym razie zerowe współczynniki. Ostateczna ocena odbywa się na stałym poziomiej=0
, który jest wprowadzany jako wartość domyślna.źródło
Mathematica, 20 bajtów
Proste podejście. Oblicz n- tą pochodną tan (x) i oceń ją przy x = 0 .
Stosowanie
źródło
Haskell, 48 bajtów
Możemy obliczyć
i
współczynnik th wykładniczej funkcji generującej, różnicująci
czasy funkcji stycznej i oceniając przy0
. Każda pochodna jest wielomianem wtan(x)
, a wartość 0 jest jej stałym składnikiem.Rekurencyjnie wyrażamy współczynnik
tan(x)^j
wi
pochodnejtan
z funkcjąi%j
. Wyrażenie rekurencyjne pochodzi z relacjitan(x)' = 1 + tan(x)^2
.Tak więc pochodną
tan(x)^j
jestTak więc, współtwórcami
tan(x)^j
wi
tej pochodnej sątan(x)^(j-1)
itan(x)^(j+1)
w pierwszej(i-1)
pochodnej, każdy o współczynniku równym jego mocy.źródło
Galaretka ,
1211 bajtówPodobnie jak odpowiedź CJama Petera Taylora , to oblicza n- ty ciąg sekwencji góra / dół Eulera, jeśli n jest nieparzyste, a przypadki specjalne nawet n jako 0 .
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
Szałwia, 26 bajtów
Podobnie jak inne rozwiązania w językach zorientowanych na matematykę, ta funkcja oblicza
n
pochodną thtan(x)
i ocenia jąx = 0
.Wypróbuj online
źródło
J,
1513 bajtówIstnieje również wbudowane narzędzie,
t:
które oblicza n- ty współczynnik wykładniczej funkcji generującej tan (x) .Dzięki @ Leaky Nun za przypomnienie mi przysłówków z serii Taylor w J, które pozwoliły zaoszczędzić 2 bajty.
Alternatywa dla 15 bajtów .
Innym podejściem jest obliczenie n- tej pochodnej tan (x) i oszacowanie jej przy x = 0 .
Uwaga: W J ilość pamięci wykorzystywanej przez funkcję pochodną
d.
rośnie szybko, gdy n przechodzi przez 10.Stosowanie
Wyjaśnienie
źródło
Julia,
3937 bajtówZaoszczędzono 2 bajty dzięki Dennisowi.
Nie najkrótsze rozwiązanie Julii (patrz rozwiązanie Dennisa), ale to jest zrobione wyłącznie przy użyciu logiki pochodnej ... w postaci macierzy.
Zasadniczo wykorzystuje fakt, że pochodna tan (x) wynosi 1 + tan (x) ^ 2. Ponieważ zatem pochodna dowolnej mocy tan (x), powiedzmy tan (x) ^ k, jest k tan (x) ^ (k-1) tan (x) '= k tan (x) ^ (k-1) + k tan (x) ^ (k + 1), możemy użyć prostej mocy macierzy na macierzy o odpowiednich wartościach do wygenerowania rozszerzenia, przy czym drugi rząd lub kolumna (w zależności od konstrukcji) zawiera pochodne tan (x ) samo.
Musimy tylko znaleźć stałą w wynikowym wyrażeniu, a to pierwsza wartość w odpowiednim wierszu lub kolumnie.
źródło
!n=(spdiagm((0:n,1:n+1),(1,-1))^n)[2]
powinno działać.spdiagm
że pozwoli na ten styl konstrukcji - wypróbowałem godiagm
, ale oczywiście nie działało.JavaScript (ES6),
12745 bajtówPort rozwiązań @ xnor.
źródło
Haskell,
9593 bajtówJest to w zasadzie implementacja ogólnej formuły z pewnymi drobnymi optymalizacjami.
źródło
MATLAB z Symbolicznym zestawem narzędzi, 84 bajty
Przykładowe przebiegi:
źródło
Haskell (za dużo bajtów)
Używając tylko operacji na listach i wyniku Raymonda Manzoniego :
Niestety przepełnia to skromne wartości
n
, ponieważ używaInt
wartości. Spróbuję rozwiązać problem za pomocąInteger
wartości. Do tego czasu sugestie są mile widziane.źródło
Aksjomat, 46 bajtów
kod testu i wyników
źródło