L_POLYMULT
=L_POLYMULT(a, b)
Argument | Description | Example |
---|---|---|
a | Polynomial 1 defined as a row vector of coefficients | {1, 2, 3} |
b | Polynomial 2 defined as a row vector of coefficients | {4, 5, 6} |
In the template file, navigate to the Polynomials worksheet to see the L_POLYMULT function in action.
Description
L_POLYMULT returns a polynomial c as a row vector resulting from the multiplication of two polynomials a and b. The multiplication of two polynomials can be accomplished by multiplying all combinations of terms and adding all the resulting like-power terms.
a = 1*x^2 + 2*x + 3 b = 4*x^2 + 5*x + 6 c = a*b = 4*x^4 + 13*x^3 + 28*x^2 + 27*x + 18
For this function, a polynomial is defined as p(x) = βn*xn + βn-1*xn-1 + … + β2*x2 + β1*x1 + β0. The β coefficients for polynomials a and b should be given as row vectors in decreasing order of power: {βn,βn-1,...,β1,β0}.
Use of row vectors is consistent with LINEST and the other polynomial functions POLYFIT, POLYVAL, POLYDER, etc.
L_POLYMULT uses the discrete convolution algorithm.
Complex Numbers
L_POLYMULT is used within L_POLYFROMROOTS to create a polynomial of real coefficients. However, intermediate calculations from complex roots may involve the results of L_POLYMULT being a vector of real and/or complex numbers. The complex number arithmetic functions IMSUM and IMPRODUCT are only used within L_POLYMULT if a coefficient of a or b is stored as text (assuming text is a valid complex number). Therefore, no additional loss of precision should occur from the complex number functions if a and b have real coefficients.
Lambda Formula
This code for using L_POLYMULT in Excel is provided under the License as part of the LAMBDA Library, but to use just this function, you may copy the following code directly into your spreadsheet.
Code for AFE Workbook Module (Excel Labs Add-in)
/** * Multiply two polynomials a and b, represented as row vectors of coefficients */ L_POLYMULT = LAMBDA(a,b, LET(doc,"https://www.vertex42.com/lambda/polymult.html", a,IF(AND(ROWS(a)>1,COLUMNS(a)=1),TRANSPOSE(a),a), b,IF(AND(ROWS(b)>1,COLUMNS(b)=1),TRANSPOSE(b),b), len_a,COLUMNS(a),len_b,COLUMNS(b),len_c,len_a+len_b-1, coeffs,MAKEARRAY(1,len_c,LAMBDA(i,k, REDUCE(0,SEQUENCE(MIN(k,len_a)-MAX(1,k+1-len_b)+1,1,MAX(1,k+1-len_b)), LAMBDA(acc,j, IF(OR(ISTEXT(acc),ISTEXT(INDEX(a,j)),ISTEXT(INDEX(b,k-j+1))), IMSUM(acc,IMPRODUCT(INDEX(a,j),INDEX(b,k-j+1))), acc + INDEX(a,j)*INDEX(b,k-j+1) ) ) ) )), MAP(coeffs,LAMBDA(val,IF(IMAGINARY(val)=0,IMREAL(val),val))) ));
Named Function for Google Sheets
Name: L_POLYMULT Description: Multiply two polynomials Arguments: a, b Function: =LET(doc,"https://www.vertex42.com/lambda/polymult.html", a,IF(AND(ROWS(a)>1,COLUMNS(a)=1),TRANSPOSE(a),a), b,IF(AND(ROWS(b)>1,COLUMNS(b)=1),TRANSPOSE(b),b), len_a,COLUMNS(a),len_b,COLUMNS(b),len_c,len_a+len_b-1, coeffs,MAKEARRAY(1,len_c,LAMBDA(i,k, REDUCE(0,SEQUENCE(MIN(k,len_a)-MAX(1,k+1-len_b)+1,1,MAX(1,k+1-len_b)), LAMBDA(acc,j, IF(OR(ISTEXT(acc),ISTEXT(INDEX(a,j)),ISTEXT(INDEX(b,k-j+1))), IMSUM(acc,IMPRODUCT(INDEX(a,j),INDEX(b,k-j+1))), acc + INDEX(a,j)*INDEX(b,k-j+1) )) ) )), MAP(coeffs,LAMBDA(val,IF(IMAGINARY(val)=0,IMREAL(val),val))) )
L_POLYMULT Examples
Test: Copy and Paste this LET function into a cell =LET( a, {1,2,3}, b, {4,5,6}, L_POLYMULT(a,b) ) Result: {4, 13, 28, 27, 18}
The resulting polynomial c=4x4+13x3+28x2+27x+18
Test: Copy and Paste this LET function into a cell =LET( a, {1,1}, b, {1,-4}, c, {1,2}, L_POLYMULT(L_POLYMULT(a,b),c) ) Result: {1, -1, -10, -8}
Change History
3/05/2024 - v1.0.6 - Updated to work with complex numbers.
See Also
POLYVAL, POLYDIV, POLYDER, POLYFROMROOTS