如何计算javascript中多项式展开的系数

时间:2017-03-28 16:14:05

标签: javascript math

假设我有以下因素:

(1+3x)(1+x)(1+2x)

扩展为多项式,看起来像:

1 + 6x + 11x^2 + 6x^3

该多项式的系数为

c0 = 1
c1 = 6
c2 = 11
c3 = 6

我试图弄清楚如何快速计算这些因素(对于任何一系列因素)。理想的输出是系数的数组,如

var coeff = [c0,c1,c2,c3];

我想要做的是找到一种快速从因子到系数数组的方法。有关如何在javascript中快速处理此问题的任何建议?为了清楚起见,我试图弄清楚如何为任何一组n个因素做这个,而不仅仅是这个特定的场景。

3 个答案:

答案 0 :(得分:2)

您可以将因子用作向量,并使用叉积来得到结果。

function multiply(a1, a2) {
    var result = [];
    a1.forEach(function (a, i) {
        a2.forEach(function (b, j) {
            result[i + j] = (result[i + j] || 0) + a * b;
        });
    });
    return result;
}

var data = [[1, 3], [1, 1], [1, 2]], // (1+3x)(1+x)(1+2x)
    result = data.reduce(multiply);
    
console.log(result);                 // [1, 6, 11, 6] = 1x^0 + 6x^1 + 11x^2 + 6x^3

答案 1 :(得分:1)

我找到了一种从头到尾做你想做的事情的方法,即使不需要原始因素的任何治疗。虽然我不得不使用数学库。我发现至少有一个库可以满足您的需求:Nerdamer

从下面的代码中可以看出,系数是根据您给出的因子正确计算的。



var factors = '(1+3x)(1+x)(1+2x)';
console.log('original factors: ' + factors);
var y = nerdamer('expand(' + factors + ')');
var polynomialform = y.toString();
console.log('polynomial form: ' + polynomialform);
var coef = polynomialform.split('+').map(v=>v.trim()).map(v=>v.split('x')[0]).map(v=>v.replace(/^\*+|\*+$/g, ''));
console.log('coeficients: ' + coef);

<script src="http://nerdamer.com/js/nerdamer.core.js"></script>
&#13;
&#13;
&#13;

请注意coefs var是一个数组。

显然,通过我提供系数的方式,操作可能在不同的因素情况下失败。这必须适用于减号字符和边缘情况。您可以创建某种循环并将失败的计算放入数组中以检查边缘情况以调整完整数据集的代码。如果您提供更大的测试数据集,我可以改进答案。

希望它对你有所帮助。

答案 2 :(得分:1)

这是基于以下事实:基于以下事实:当您将(1 + b_1 * x + b_2 * x ^ 2 + ... + b_nx ^ n)乘以(1 + b_1 * x + b_2 * x ^ 2 + ... + b_nx ^ n)时,在得到的多项式中(度n + 1),第一项的系数为1,其最后一项的系数为a * b_n。

我认为它比接受的答案简单一点,但仍然是二次的。为了提高效率,您需要more advanced techniques

&#13;
&#13;
function multOne(a, b) {
  var n = b.length;
  var r = [1];  //The first term is always 1
  r[n] = a * b[n - 1]; //The last term is always a*b_n-1
  for (var i = 1; i < n; i++)
    r[i] = b[i] + a * b[i - 1];
  return r;
}

function solve(c) {
  var result = [1, c[0]];  //use result as an accumulator
  for (var j = 1; j < c.length; j++)
    result = multOne(c[j], result);
  return result;
}

console.log(solve([3, 1, 2]));  //You don't need to pass 1s either. Just pass the varying coefficients
&#13;
&#13;
&#13;