推导其指数生成函数为正切的序列


15

几乎每个函数都可以表示为具有无限项的多项式。

例如, e^x = 1 + x + x^2/2! + x^3/3! + x^4/4! + ...

例如, sin(x) = x - x^3/3! + x^5/5! - x^7/7! + ...

n第-个项的系数形成一个序列,相应的函数称为生成函数该序列。

的系数 n第-项形成一个序列。

通常,n-th项的分母为n!。因此,我们将系数乘以n!得到另一个序列,该序列的指数生成函数将是原始函数。

例如,其指数生成函数为的序列e^x将为1,1,1,1,...

例如,其指数生成函数为的序列sin(x)将为0,1,0,-1,0,1,0,-1,...

任务

您的任务是找到指数生成函数n的序列的第n个项。tan(x)

测试用例

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

(从此处复制。)(警告:0 -th个术语是不同的)

示例实施

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

伊迪恩!

参考文献


4
如果您想了解有关生成函数及其在数学中的使用的更多信息,特别是组合数学和数论,我强烈建议H. Wilf撰写这本“著名的”教科书生成函数论。
瑕疵的

5
(无法抗拒):从字面上看,您的第一句话非常错误!
Flounderer

向后具有“生成函数”和“指数生成函数”的含义。$ \ sin(x)$是序列0,1,0,-1,0,1,0,-1,0,...的指数生成函数-不是序列是指数生成函数$ \ sin(x)$。您要我们执行的操作是对$ \ tan(x)$指数生成的序列进行编码。
Glen O

看起来不错,除了“这也称为该函数的生成函数。第n个项的系数形成一个序列。”,它可能应该说类似“第n个项的系数形成一个序列,并且相应的功能称为序列的生成功能”。
Glen O

@GlenO编辑。
Leaky Nun

Answers:


8

CJam(33 32 27 26 23 20字节)

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

在线演示

解剖

这实质上实现了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

或者使用另一种不同的方法,获取23个字节:

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

在线演示。感谢Dennis提供3个字节。

解剖

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

或者使用非常不同的方法,为29个字节:

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

在线演示

不幸的是,输入需要特殊情况0

解剖

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

您可能在想“ WTF ?!他在回答错误的问题。” 如果是这样,那是可以理解的,但是两种方法的确可以给出正确的结果


如果ot有所帮助,那么每晚在TIO上构建的都会为返回一个空数组[WW]3ew
丹尼斯

@丹尼斯,谢谢。但是,事实证明,0无论如何都需要是一个特例,因为它的值为1
彼得·泰勒

1
如果一个人甚至没有点击我的链接,只会认为您在回答错误的问题。
Leaky Nun

ri_1&a{{1$+}*]W%0+}@*0=节省3个字节。
丹尼斯

2
@LeakyNun,所以那时所有人都会。我看到了链接列表和tl; dr。
彼得·泰勒

7

朱莉娅40 38 32字节

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

输入和输出为BigFloats 形式。在线尝试!

背景

切线函数的Maclaurin系列满足恒等式

每当x处于其收敛半径时,其中B n是伯努利数。

由于B 2(n + 1)(-1)n具有相同的符号,如果n> 0B 1 = 1/2,则B 2n + 1 = 0,我们可以如下重写。

此外,只要n为非负整数,我们就有

其中ζ表示黎曼Zeta函数

由此,按照约定0 0 = 1,得出

这是实现使用的公式。


6

Python,57个字节

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

少打高尔夫球:

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)

我们可以i通过微分切线函数i时间并在处求值来计算指数生成函数的th系数0。每个导数都是的多项式tan(x),其值为0是其常数项。

我们用函数递归表示的tan(x)**ji阶导数的系数。递归表达式来自关系tanf(i,j)tan(x)' = 1 + tan(x)**2

所以,的导数tan(x)**j

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

因此,tan(x)**jith导数中的贡献者是tan(x)**(j-1)tan(x)**(j+1)(i-1)st导数中,各自的系数等于其幂。这给出了递归表达式

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

请注意,我们不必排除负指数,j因为它们的总和为零,也不j=0会有贡献,因为相交的乘数为0

基座壳体的i==0对应于tan(x)自身与j==1和零个系数否则。最终评估在固定期限内进行j=0,该常数作为默认值输入。


这将在CJam中移植到20个字节。您介意我是我的主要回答,还是要移植并发布?
彼得·泰勒

您应该发布它,我不知道CJam。
xnor

4

Mathematica,20个字节

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

直截了当的方法。计算tan(x)n 导数,并在x = 0时

用法

例


3

Haskell,48个字节

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

我们可以i通过微分切线函数i时间并在处求值来计算指数生成函数的th系数0。每个导数是中的多项式tan(x),并且0处的值是其常数项。

我们用函数递归表示的tan(x)^ji阶导数的系数。递归表达式来自该关系。tani%jtan(x)' = 1 + tan(x)^2

所以,的导数tan(x)^j

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

因此,tan(x)^jith导数中的贡献者是tan(x)^(j-1)tan(x)^(j+1)(i-1)st导数中,各自的系数等于其幂。


3

果冻12 11 字节

Ṛ+\;S
ḂÇ⁸¡Ḣ

就像彼得·泰勒的CJam答案,这个计算ñ的短期日欧拉向上/向下顺序如果ñ是奇数和特殊情况下甚至ñ0

在线尝试!验证所有测试用例

怎么运行的

ḂÇ⁸¡Ḣ  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.

3

Sage,26个字节

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

与面向数学的语言中的其他解决方案一样,此函数计算的n三阶导数tan(x)并将其评估为x = 0

在线尝试


2

J,15 13字节

还有内置 t:,其计算所述Ñ 的指数生成函数的系数黄褐色(X)

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

感谢@ Leaky Nun让我想起J中的Taylor系列副词,该副词节省了2个字节。

替代15个字节

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

另一种方法是计算第n tan(x)导数并在x = 0时对其求

注意:在 J中,导数函数使用的内存量d.随着n的增加而快速增长超过10时。

用法

   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

说明

(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

2

朱莉娅39 39字节

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

感谢Dennis,节省了2个字节。

不是最短的Julia解决方案(请参阅Dennis的解决方案),而是纯粹使用矩阵形式的导数逻辑来完成的。

基本上,它使用tan(x)的导数为1 + tan(x)^ 2的事实。因此,由于tan(x)的任意幂的导数(例如tan(x)^ k)为k tan(x)^(k-1)tan(x)'= k tan(x)^(k-1) + k tan(x)^(k + 1),我们可以对具有适当值的矩阵使用简单的矩阵幂来生成展开,第二行或第二列(取决于构造)保存tan(x )本身。

因此,我们只需要在结果表达式中找到常量,这就是相应行或列中的第一个值。


!n=(spdiagm((0:n,1:n+1),(1,-1))^n)[2]应该管用。
丹尼斯

@丹尼斯-很好。没想到spdiagm会允许这种构造样式-尝试了diagm,但当然没有用。
Glen O

2

JavaScript(ES6), 127个 45字节

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

@xnor解决方案的端口。


0

Haskell,95 93字节

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

它基本上是通用公式的实现,并进行了一些小的优化。


0

带符号工具箱的MATLAB,84字节

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

示例运行:

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

0

哈斯克尔(字节太多)

仅使用列表上的操作和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])

不幸的是,n由于使用Int值,该值对于适度的值会溢出。我将尝试使用Integer值来解决问题。在此之前,欢迎提出建议。


0

公理,46字节

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

测试和结果代码

(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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.