# What is the inverse of CoefficientList?

I have numbers in vector notation. I need to get polynomial notation from them.

My numbers are {0, 1, 23, 5, 15, 0, 0, 0}. I want to get $x + 23x^2 + 5x^3 + 15x^4$ from this list.

How can I get that polynomial?

-
Thanks for your help. –  Serkan Mar 31 '13 at 4:00
Related question: mathematica.stackexchange.com/questions/21340/… –  Michael E2 Mar 31 '13 at 18:37

One straightforward approach is to calculate the answer directly:

Total[{0, 1, 23, 5, 15, 0, 0, 0} x^(Range[8] - 1)]

-

The following (taken from the Mathematica documentation) will do what you ask.

Expand[FromDigits[Reverse[{0, 1, 23, 5, 15, 0, 0, 0}], x]]


x + 23 x^2 + 5 x^3 + 15 x^4

I found the needed code in Properties & Relations section of the documentation page on CoefficientList. In general, it is a good idea to look for information on inverses in the Properties & Relations section of any function of interest.

-

Dot can be very efficient here:

c.(x^Range[0, Length@c - 1])

x + 23 x^2 + 5 x^3 + 15 x^4


Comparative timings:

n = 5000;
c = RandomInteger[30, n];

SetAttributes[timeAvg, HoldFirst]
timeAvg[func_] := Do[If[# > 0.3, Return[#/5^i]] & @@ Timing@Do[func, {5^i}], {i, 0, 15}]

Expand @ FromDigits[Reverse@c, x] // timeAvg
Total[c * x^(Range@n - 1)] // timeAvg
MapIndexed[#1*x^(#2 - 1) &, c] // Total // timeAvg
c.(x^Range[0, n - 1]) // timeAvg


0.03616

0.004992

0.01744

0.003616

I also like this formulation though it is not quite as fast:

c.Array[x^# &, n, 0]

-

The undocumented function InternalFromCoefficientList is as close as one would get to InverseCoefficientList.

Examples:

cl = {0, 1, 23, 5, 15, 0, 0, 0};
InternalFromCoefficientList[cl, x]


x + 23 x^2 + 5 x^3 + 15 x^4

cl2 = CoefficientList[(1 + x + 2 y)^2, {x, y}]


{{1, 4, 4}, {2, 4, 0}, {1, 0, 0}}

FullSimplify[InternalFromCoefficientList[cl2, {x, y}]]


(1 + x + 2 y)^2

Timings using @Mr.Wizard's set-up and timeAvg:

n = 5000;
c = RandomInteger[30, n];

Expand[Fold[(#1 \[FormalX] + #2) &, 0, Reverse[c]]] // timeAvg  (* 3.250000 *)
Expand@FromDigits[Reverse@c,  x] // timeAvg                     (* 0.039375 *)
MapIndexed[#1*x^(#2 - 1) &, c] // Total // timeAvg              (* 0.019375 *)
Total[c*x^(Range@n - 1)] // timeAvg                             (* 0.005375 *)
c.(x^Range[0, n - 1]) // timeAvg                                (* 0.003875 *)
InternalFromCoefficientList[c, x] // timeAvg                   (* 0.003500 *)

-
First mentioned on Stack Exchange here as far as I can tell. +1 for posting it in a place people can find it. –  Mr.Wizard May 10 at 11:46
Thank you @Mr.W for the link and the vote. –  kguler May 10 at 12:00

I vastly prefer using Horner for reconstructing polynomials from their coefficients. To wit:

Fold[(#1 \[FormalX] + #2) &, 0, Reverse[{0, 1, 23, 5, 15, 0, 0, 0}]] // Expand


returns your polynomial. In fact, this is effectively what FromDigits[] does internally for integer digits. Removing the Expand[] yields what would've been the result of applying HornerForm[] to the polynomial.

-
Why do you prefer Fold to FromDigits or Dot? Also you can drop the second argument of Fold; see: (54784) –  Mr.Wizard May 10 at 11:44
Elegant demonstration of a fundamental programming construct. –  djp May 10 at 12:30
@Mr. Wizard, re: Fold[], old habits, I guess (I still don't have a computer, much less version 10). Anyway, as I said, this is what is done internally in FromDigits[]; I thought it'd be a nice showcase for Horner. As is well-known, Horner minimizes the number of multiplications necessary for evaluating a polynomial, in contrast to an explicit monomial expansion. –  Guess who it is. May 10 at 14:00
Fair enough. +1 –  Mr.Wizard May 10 at 14:27
+1 Answering questions without a viable Mma installation is a NKC. (The C being challenge) –  belisarius May 19 at 1:11

MapIndexed[#1*x^(#2 - 1) &, {0, 1, 23, 5, 15, 0, 0, 0}] // Total