Чтобы построить ответ @ Джейсона:
Код np.poly
для основных случаев можно упростить до:
def foo(seq):
a = np.array([1.])
for s in seq:
a = np.convolve(a, [1,-s])
return a
In [39]: foo([0,0,0])
Out[39]: array([1., 0., 0., 0.])
In [40]: np.poly([0,0,0])
Out[40]: array([1., 0., 0., 0.])
In [41]: foo([2,0,-2])
Out[41]: array([ 1., 0., -4., 0.])
In [42]: np.poly([2,0,-2])
Out[42]: array([ 1., 0., -4., 0.])
In [43]: foo([.1,.2,.3])
Out[43]: array([ 1. , -0.6 , 0.11 , -0.006])
In [44]: np.poly([.1,.2,.3])
Out[44]: array([ 1. , -0.6 , 0.11 , -0.006])
Что делает np.convolve
и почему это работает для этой задачи, это еще один уровень вопроса.
Печать a
после каждой итерации:
In [46]: foo([.1,.2,.3])
[ 1. -0.1]
[ 1. -0.3 0.02]
[ 1. -0.6 0.11 -0.006]
Группировка по уравнению Джейсона:
-abc + abx + acx + bcx - ax2 - bx2 - cx2 + x3
-abc + (ab + ac + bc)*x + (- a - b - c)*x2 + x3
-.1*.2*.3, (.1*.2 + .1*.3 + .2*.3), (-.1-.2-.3), 1
-.006, .02+.03+.06, -.6, 1
или здание постепенно
-a + x
-ab + (-a-b)x + x2
-abc + ...