用于计算“多项式系数”的numpy / scipy函数

时间:2014-05-28 09:46:01

标签: python math numpy polynomials

是否有任何python函数(可能来自numpy或scipy)计算x**r扩展中(1+x+x**2+x**3+...+x**(k-1))**n的系数,其中k>=1n>=0和{{ 1}}?

有时称为多项式系数(PC)(例如,参见here)。

如果没有,你能想到一种有效的计算方法吗? (我对天真/贪婪的方式不感兴趣。)

1 个答案:

答案 0 :(得分:1)

您实际上正在进行n - [1,1,1,...,1,1,1]的折叠卷积。
因此,您是否考虑在足够零填充的阵列上使用FFT,将其元素提升到幂n并使用逆FFT来恢复所有系数

(1+x+x**2+x**3+...+x**(k-1))**n

然后只是阅读你感兴趣的那些?

<强>更新

由于FFT是循环的,因此您需要一个不小于

中的项数的数组
(1+x+x**2+x**3+...+x**(k-1))**n

或换句话说,(k-1)*n+1以便结果不会在末尾包裹(或者至少在他们这样做时它们只向受影响的元素添加零)。通常它的长度也应该是2的幂,因为这是FFT算法所要求的(实现不要求它用零填充你的输入直到它)。

在类似C的伪代码中:

unsigned int m = 1;
while(m<(k-1)*n+1) m *= 2;

complex c[m];
for(unsigned int i=0;i!=k;++i) c[i] = complex(1.0, 0.0);
for(unsigned int i=k;i!=m;++i) c[i] = complex(0.0, 0.0);

c = fft(c);
for(unsigned int i=0;i!=m;++i) c[i] = pow(c[i], double(n));
c = inv_fft(c);

在此结束时,复数组r的{​​{1}}'元素的实部等于c的系数和零的虚部。 /> 现在,由于这都是以浮点形式完成的,因此您应该知道这些元素将累积舍入错误。您可以通过将它们四舍五入到最接近的整数来部分纠正这一点,但请注意,对于足够大的x**rk,这些错误将超过0.5,因此这会产生因某些小的相对误差而导致的结果。 / p>

在网上进行的快速搜索显示,numpy分别具有FFT及其反向nnumpy.fft.rfft的实现,您可以在输入数据为真时使用。