1)问题表述:
给定一个长度为n的向量:a=[a1,a2,..,an]
,我需要计算向量b=[b1,b2,..bn]
,使得:
b1=a1+a2+...+an
b2=a1a2+a1a3+...+a1an+a2a3+...+a2an+...+a{n-1}an
b3=a1a2a3+a1a2a4+...+a1a2an+a1a3a4+...
...
bn=a1a2a3...an
b
的每个连续条目包含a
的条目总和,成对乘积和三乘积之和。
有人知道有效的算法吗,或者可能是实现该算法的现有库?
我在想类似
b1=sum(a)
b2=a1*sum(a[1,:])+a2*sum(a[2,:])+...
对于所有其他条目也是如此。
2)为什么我需要这个:
我想使用Lagrange插值多项式展开执行一维函数积分。我的问题是Newton-Cotes公式的扩展。此公式用于计算定积分。与牛顿-科特斯不同,我想在选定的搭配点上计算给定函数f的完全反导数,因此我必须对每个拉格朗日插值多项式进行积分。
我不需要工作代码。我对算法以及此算法是否已实现感兴趣。
谢谢, 米哈伊尔
编辑:示例:
让a=[1,2,3,4]
。
然后
b=[1+2+3+4,1*2+1*3+1*4+2*3+2*4+3*4,1*2*3+1*2*4+1*3*4+2*3*4,1*2*3*4]=[10,35,50,24]
答案 0 :(得分:6)
from functools import reduce
from itertools import combinations
from operator import mul
a = [1, 2, 3, 4]
print([sum(reduce(mul, c) for c in combinations(a, i + 1)) for i in range(len(a))])
这将输出:
[10, 35, 50, 24]
答案 1 :(得分:0)
出于完整性考虑,我想提出我自己的使用递归的替代解决方案。容易注意到,如果对于某个a=[a1,a2,...,an]
我们知道b=[b1,b2,...bn]
,而不是向量a'=[a1,a2,...,an,a{n+1}]
(这样,前n
个项与向量{{1} })解决方案将是:
a
因此,基于递归的解决方案很简单:
b'=[b1+a{n+1},b2+b1*a{n+1},b3+b2*a{n+1},...,b{n}+b{n-1}*a{n+1},b{n}*a{n+1}]
结果与上面的解决方案相同,但是基准测试表明@blhsing建议的解决方案更有效。