找出有理生成函数的系数


12

如果我们写一个数字序列作为幂级数的系数,则该幂级数称为该序列的(普通)生成函数(或Gf)。也就是说,如果对于某些函数F(x)和整数系列,a(n)我们有:

a(0) + a(1)x + a(2)x^2 + a(3)x^3 + a(4)x^4 + ... = F(x)

然后F(x)是的生成函数a。例如,几何级数告诉我们:

1 + x + x^2 + x^3 + x^4 + ... = 1/(1-x)

因此,的生成函数1, 1, 1, ...1/(1-x)。如果我们对上面方程的两边求和并乘以x得到以下等式:

x + 2x^2 + 3x^3 + 4x^4 + ... = x/(1-x)^2

因此,的生成函数1, 2, 3, ...x/(1-x)^2。生成函数是一个非常强大的工具,您可以使用它们来做很多有用的事情。在这里可以找到简短的介绍,但是要获得真正彻底的解释,请参见惊人的图书生成功能学。


在此挑战中,您将有理函数(两个具有整数系数的多项式的商)作为两个整数系数数组的输入作为输入,首先是分子,然后是分母。例如,功能f(x) = x / (1 - x - x^2)将被编码为[0, 1], [1, -1, -1]输入中的形式。

给定此输入,您的程序必须无穷大地打印等于生成函数的幂级数的系数,每行一个,从的系数开始x,然后是x^2,等等。


例子:

[1], [1, -1] -> 1, 1, 1, 1, 1, 1, 1, ...
[1], [2, -2] -> 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, ...
[0, 1], [1, -2, 1] -> 1, 2, 3, 4, 5, 6, 7, 8, ...
[0, 1], [1, -1, -1] -> 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
[1], [1, -2] -> 1, 2, 4, 8, 16, 32, 64, 128, ...
[0, 1, 1], [1, -3, 3, -1] -> 1, 4, 9, 16, 25, 36, ...

废话,我的语言是为序列构建的,但是我不能真正进行多维数组输入:(
Stephen

2
我实际上只是在数学上没有足够的知识适合这个规范,您是否有机会向我们普通民众发布更多外行的解释?
Skidsdev'17年


1
@trichoplax始终将分子强制为1,这是不相同的。例如,它无法表达我的最后一个例子,即正方形。
orlp

1
短语表达的另一种方法是评估一般的线性递归。这样,它可以概括该问题,并且可以作为将来重复问题的重复目标。
彼得·泰勒

Answers:



3

Mathematica,64岁 83 90 个字节

Do[Echo@Limit[D[#/#2/i!&@@Fold[x#+#2&]/@#,{x,i}],x->0],{i,∞}‌​]&

感谢@ngenisis和@Jenny_mathy!

将输入作为两个列表。

需要Alt+.终止执行才能看到结果。前端可能因快速输出而崩溃。

83字节版本(@Jenny_mathy):

i=1;v=Tr[#*x^Range@Length@#]&;While[1<2,Echo@Limit[D[v@#/v@#2/i!,{x,i}],x->0];i++]&

83个字节:i = 1;v = Tr [#* x ^ Range @ Length @#]&; 而[1 <2,Echo @ Limit [D [v @#/ v @#2 / i !, {x,i}],x-> 0]; i ++]和
J42161217

@Jenny_mathy抱歉打扰。我发现您的第一个评论中有一些垃圾隐形Unicode字符。清理后,代码就可以了。
Keyu Gan

3
64字节:Do[Echo@Limit[D[#/#2/i!&@@Fold[x#+#2&]/@#,{x,i}],x->0],{i,∞}]&。假设输入是两个列表的列表,并且系数按降序排列。我唯一知道的内置v功能是Internal`FromCoefficientList
ngenisis

反复运行此功能是否有效?我认为i在lambda 内可能需要加几个括号。(另一方面,当目标是打印无限列表时,我不确定是否重复运行的功能是否相关……对此是否存在元共识?)
朱利安·沃尔夫

@ngenisis:您使用的是哪个版本?在v10.0上,您的解决方案给了我Iterator {i,∞} does not have appropriate bounds
朱利安·沃尔夫

1

CJam(22字节)

{\{(W$(@\/_pW*f*.+1}g}

在线演示。请注意,与许多现有答案一样,这在输出中包括第0个系数。

解剖

{           e# Define a block which takes numerator N and denominator D as arguments
  \         e# Flip to put D at the bottom, since that won't change
  {         e# Infinite loop:
    (       e#   Pop the first element of (the modified) N
    W$(     e#   Copy D and pop its first element
            e#   Stack: D N[1:] N[0] D[1:] D[0]
    @\/     e#   Bring N[0] to top, flip, divide
            e#   Stack: D N[1:] D[1:] N[0]/D[0]
    _p      e#   Print a copy
    W*f*.+  e#   Multiply by -1, multiply all, pointwise add
            e#   Stack: D N[1:]-(N[0]/D[0])*D[1:]
  1}g
}

0

Mathematica,86 79字节

f=x^Range@Length@#.#&;For[n=1,8>3,Print@SeriesCoefficient[f@#/f@#2,{x,0,n++}]]&

将输入作为两个单独的列表(分子系数,分母系数)。如果输入可以直接作为多项式的一部分而不是系数列表,则可以大大缩短输入时间。

似乎Do可以在v11中使用无限边界。我无法在本地进行测试,但是,如果是这种情况,则此解决方案可以缩短为75个字节

f=x^Range@Length@#.#&;Do[Print@SeriesCoefficient[f@#/f@#2,{x,0,n}],{n,∞}]&

最后的测试情况下不从0开始
J42161217

@Jenny_mathy:射击,谢谢大家的注意。看起来测试用例期望从第一个开始而不是第零个……肯定可以让我节省一些字节。
朱利安·沃尔夫

@Jenny_mathy:我认为测试用例可能很奇怪。n从1 开始而不是0,得到的结果与您的解决方案相同;但是,在倒数第二个测试用例上都失败了,该解决方案n从0 开始通过。–
朱利安·沃尔夫

0

Pyth,23个字节

JE#
KchQhJ=t-M.t,Q*LKJ0

在线尝试!

怎么运行的

                       Q = eval(input())
JE                     J = eval(input())
  #                    infinite loop:
 chQhJ                   Q[0]/J[0]
K                        assign that to K (and print it, because of the preceding newline)
              *LKJ       K times every element of J
            ,Q           [Q, that]
          .t      0      transpose, padding with 0s
        -M               subtract each pair
       t                 remove the first element
      =                  assign that back to Q

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.