这些都是初等对称多项式。您可以使用维基百科中的求和符号来书写它们。您还可以使用维埃塔的公式一次获取所有它们作为多项式的系数(最多符号)
(x-a_1)(x-a_2)...(x-a_k) =
x^k -
(a_1 + ... + a_k) x^(k-1) +
(a_1 a_2 + a_1 a_3 + ... + a_(k-1) a_k)) x^(k-2) +
... +
(-1)^k a_1 ... a_k
通过展开 (x-a_1)(x-a_2)...(x-a_k),您将获得一个多项式时间算法来计算所有这些数字(您的原始实现以指数时间运行)。
编辑:Python实现:
from itertools import izip, chain
l = [2,3,4]
x = [1]
for i in l:
x = [a + b*i for a,b in izip(chain([0],x), chain(x,[0]))]
print x
得到 [24, 26, 9, 1],如 2*3*4=24, 2*3+2*4+3*4=26, 2+3+4=9。最后一个 1 是空乘积,对应于您的实现中的 k=0。
This should be O(N2). Using polynomial FFT you could do O(N log2 N), but I am too lazy to code that.