Quase todas as funções podem ser expressas como um polinômio com termos infinitos.
Por exemplo, e^x = 1 + x + x^2/2! + x^3/3! + x^4/4! + ...
Por exemplo, sin(x) = x - x^3/3! + x^5/5! - x^7/7! + ...
Os coeficientes dos n
-ésimos termos formam uma sequência e a função correspondente é chamada de Função Geradora da sequência.
Os coeficientes da n
-ésimos termos formam uma sequência.
Freqüentemente, o n
-ésimo termo teria um denominador de n!
. Portanto, multiplicamos o coeficiente por n!
para obter outra sequência, cuja Função Geradora Exponencial seria a função original.
Por exemplo, a sequência cuja função de geração exponencial é e^x
seria1,1,1,1,...
.
Por exemplo, a sequência cuja função de geração exponencial é sin(x)
seria0,1,0,-1,0,1,0,-1,...
.
Tarefa
Sua tarefa é encontrar o n
-ésimo termo da sequência cuja Função Geradora Exponencial é tan(x)
.
Casos de teste
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 daqui .) (Aviso: o 0
termo-é diferente)
Implementação de exemplo
# 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)]))
Referências
- Gerando função na Wikipedia
- Função de geração exponencial na Wikipedia
- Exemplo de função de geração exponencial na Wikipedia
- Gerando função no MathWorld
- Função de geração exponencial no MathWorld
- Série de Taylor na Wikipedia
- Derivação dos primeiros 9 termos da sequência requerida
- OEIS obrigatório A009006 (Observe que o
0
termo-é diferente) - Algoritmo
- OEIS A000111: números cima / baixo
Respostas:
CJam (
33 32 27 26 2320 bytes)Demonstração online
Dissecação
Isso basicamente implementa a recorrência descrita pelo xnor .
Ou com uma abordagem bastante diferente, para 23 bytes:
Demonstração online . Agradecimentos a Dennis por 3 bytes.
Dissecação
Ou com uma abordagem muito diferente, para 29 bytes:
Demonstração online
Infelizmente, é necessário um caso especial para entrada
0
.Dissecação
Você pode estar pensando "WTF ?! Ele está respondendo à pergunta errada." Nesse caso, isso é compreensível, mas as duas abordagens realmente fornecem os resultados corretos .
fonte
[WW]3ew
.0
precisa ser um caso especial de qualquer maneira, porque avalia como1
.ri_1&a{{1$+}*]W%0+}@*0=
salva 3 bytes.Julia,
403832 bytesEntrada e saída está na forma de
BigFloat
s. Experimente online!fundo
A série Maclaurin da função tangente satisfaz a identidade
sempre que x estiver no seu raio de convergência, onde B n é um número de Bernoulli.
Como B 2 (n + 1) e (-1) n têm o mesmo sinal, B 2n + 1 = 0 se n> 0 e B 1 = 1/2 , podemos reescrever o que foi descrito a seguir.
Além disso, sempre que n é um número inteiro não negativo, temos
onde ζ denota a função Riemann zeta .
A partir disso, com a convenção 0 0 = 1 , segue-se que
qual é a fórmula que a implementação usa.
fonte
Python, 57 bytes
Menos golfe:
Podemos calcular o
i
th coeficiente da função geradora exponencial diferenciando osi
tempos da função tangente e avaliando em0
. Cada derivada é um polinômio emtan(x)
, e seu valor em 0 é seu termo constante.Nós recursivamente expressar o coeficiente de
tan(x)**j
noi
th derivado detan
com a funçãof(i,j)
. A expressão recursiva vem da relaçãotan(x)' = 1 + tan(x)**2
.Então, a derivada de
tan(x)**j
éPortanto, os contribuintes
tan(x)**j
nai
derivada th sãotan(x)**(j-1)
etan(x)**(j+1)
na(i-1)
derivada st, cada um com coeficiente igual ao seu poder. Isso dá a expressão recursivaObserve que não precisamos excluir expoentes negativos
j
porque eles avaliam a zero de qualquer maneira e não contribuem porque o cruzamentoj=0
fornece um multiplicador de0
.O caso base de
i==0
corresponde atan(x)
si mesmo comj==1
, e coeficientes zero, caso contrário. A avaliação final ocorre no termo constantej=0
, que é inserido como um valor padrão.fonte
Mathematica, 20 bytes
Abordagem direta. Calcule a n- ésima derivada de tan (x) e avalie-a em x = 0 .
Uso
fonte
Haskell, 48 bytes
Podemos calcular o
i
coeficiente th da função geradora exponencial diferenciando a função tangentei
tempos da e avaliando em0
. Cada derivada é um polinômio emtan(x)
, e o valor em 0 é seu termo constante.Expressamos recursivamente o coeficiente de
tan(x)^j
nai
th derivada detan
com a funçãoi%j
. A expressão recursiva vem da relaçãotan(x)' = 1 + tan(x)^2
.Então, a derivada de
tan(x)^j
éPortanto, os contribuintes
tan(x)^j
nai
derivada th sãotan(x)^(j-1)
etan(x)^(j+1)
na(i-1)
derivada st, cada um com coeficiente igual ao seu poder.fonte
Geléia ,
1211 bytesComo resposta CJam de Peter Taylor , este calcula o n º prazo de Euler é para cima / baixo seqüência , se n é ímpar e-casos especiais ainda n como 0 .
Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
Sábio, 26 bytes
Como as outras soluções em linguagens orientadas à matemática, essa função calcula a
n
th-derivada detan(x)
e a avalia emx = 0
.Experimente online
fonte
J,
1513 bytesHá também o embutido
t:
que calcula o n th coeficiente da função geradora exponencial de tan (x) .Agradeço ao @ Leaky Nun por me lembrar dos advérbios da série Taylor em J que salvaram 2 bytes.
Alternativa para 15 bytes .
Outra abordagem é calcular a n- ésima derivada de tan (x) e avaliá-la em x = 0 .
Nota: Em J , a quantidade de memória usada pela função derivada
d.
cresce rapidamente quando n passa 10.Uso
Explicação
fonte
Julia,
3937 bytesEconomizou 2 bytes graças a Dennis.
Não é a solução mais curta de Julia (veja a solução de Dennis), mas essa é feita puramente usando lógica derivada ... na forma de matrizes.
Basicamente, usa o fato de que a derivada de tan (x) é 1 + tan (x) ^ 2. Então, como a derivada de qualquer potência de tan (x), digamos tan (x) ^ k, é k tan (x) ^ (k-1) tan (x) '= k tan (x) ^ (k-1) + k tan (x) ^ (k + 1), podemos usar uma potência de matriz simples em uma matriz com os valores apropriados para gerar a expansão, com a segunda linha ou coluna (dependendo da construção) segurando os derivados de tan (x ) em si.
Então, só precisamos encontrar a constante na expressão resultante, e esse é o primeiro valor na linha ou coluna correspondente.
fonte
!n=(spdiagm((0:n,1:n+1),(1,-1))^n)[2]
Deveria trabalhar.spdiagm
que permitiria esse estilo de construção - tentei com issodiagm
, mas é claro que não funcionou.JavaScript (ES6),
12745 bytesPorto das soluções da @ xnor.
fonte
Haskell,
9593 bytesÉ basicamente uma implementação da fórmula geral com algumas otimizações menores.
fonte
MATLAB com caixa de ferramentas simbólica, 84 bytes
Exemplo é executado:
fonte
Haskell (muitos bytes)
Usando apenas operações em listas e o resultado de Raymond Manzoni :
Infelizmente, isso excede os valores modestos de
n
, pois usaInt
valores. Vou tentar corrigir o problema usandoInteger
valores. Até lá, sugestões são bem-vindas.fonte
Axioma, 46 bytes
código para teste e resultados
fonte