如何有效地扩展二项式序列的乘积?

时间:2019-05-31 15:18:35

标签: algorithm

二项式序列的乘积读取

其中{a_i}和{b_i}是二项式的系数。

我需要将其扩展为多项式

,然后使用多项式中的所有系数{c_k}。

如何有效地扩展它?速度优先于内存占用,因为扩展将被多次使用。


我尝试过的事情

目前,我只想出一个更新方案,该方案在吸收一个二项式后立即扩展多项式。 该方案需要两个数组,一个数组的结果最大为i-1,另一个数组的结果最大为i。

这是我的幼稚方案的C ++代码,但是我认为这个问题与使用哪种语言无关。

#include <iostream>
#include <vector>

int main()
{
  using namespace std;

  // just an example, the coefficients are actually real numbers in [0,1]
  unsigned d = 3;
  vector<double> a;
  vector<double> b;
  a.resize(d, 1); b.resize(d, 1);

  // given two arrays, a[] and b[], of length d
  vector< vector<double> > coefficients(2);
  coefficients[0].resize(d + 1);
  coefficients[1].resize(d + 1);

  if (d > 0) {
    auto &coeff = coefficients[0];    // i = 0
    coeff[0] = a[0];
    coeff[1] = b[0];
    for (unsigned i = 1; i < d; ++i) {// i : [1, d-1]
      const auto ai = a[i];
      const auto bi = b[i];
      const auto &oldCoeff = coefficients[(i-1)%2];
      auto          &coeff = coefficients[i%2];
      coeff[0] = oldCoeff[0] * ai;        // j = 0
      for (unsigned j = 1; j <= i; ++j) { // j : [1, i]
        coeff[j] = oldCoeff[j] * ai + oldCoeff[j-1] * bi;
      }
      coeff[i+1] = oldCoeff[i] * bi;      // j = i
    }
  }

  const auto &coeff = coefficients[(d-1)%2];
  for (unsigned i = 0; i < d; ++i) {
    cout << coeff[i] << "\t";
  }
  cout << coeff[d] << '\n';
}

0 个答案:

没有答案