如果这更适合MathOverflow,请原谅我,但是我的问题可能太简单了,无法放在这里。

我正在阅读S.K Lando关于生成函数的讲座,其中给出了两个生成函数A和B乘积的定义:

A(s)*B(s) = a0*b0 + (a0*b1 + a1*b0)*s + (a0*b2 + a1*b1 + a2*b0)*s^2 ...

我了解s只是正式的。但是-我知道这对我很钝-我不明白组合系数的项的模式应该如何继续。如果有人可以将定义扩展到一个或两个以上的术语,这可能对我有很大帮助。非常感谢!

对于奖励积分,Haskell中用于将两个序列相乘(表示为系数列表)的算法也将非常受欢迎-但对于我来说,仅了解上述定义就足够了。

最佳答案

注意,系数项的总和在每一项中都是恒定的。例如a0*b0 -> 0+0=0,而a0*b1 -> 0+1=1a1*b0 -> 1+0=1

回想story of young Gauss,他发现通过将一个连续的数字列表与它的反向求和,就得到了一个常数列表。同样的技巧也适用于此。我们将只获取前k个a_ib_i系数,反转b_i系数列表,并获取列表的按分量乘积。

这是一些Haskell代码,用于在给定s^i以及i>=0i的列表的情况下为as=[a0,a1,...]生成bs=[b0,b1,...]的系数:

genCoeff :: [Double] -> [Double] -> Int -> Double
genCoeff as bs i = sum $ zipWith (*) (take (i+1) as) (reverse (take (i+1) bs))


要生成所有系数,我们只需将部分应用的函数genCoeff as bs映射到列表[0,1,...],即

genAllCeoffs :: [Double] -> [Double] -> [Double]
genAllCoeffs as bs = map (genCoeff as bs) [0..]

关于haskell - 如何将两个生成系列相乘?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31684142/

10-12 07:24