Re: Rebuilding polygon from CoefficientList?
- To: mathgroup at smc.vnet.net
- Subject: [mg20192] Re: [mg20164] Rebuilding polygon from CoefficientList?
- From: Daniel Lichtblau <danl at wolfram.com>
- Date: Tue, 5 Oct 1999 04:04:22 -0400
- References: <199910040107.VAA17273@smc.vnet.net.>
- Sender: owner-wri-mathgroup at wolfram.com
Holger Strauss wrote: > > Hallo, > > I have a mixed polynomial poly in several variables vars. > > cl = CoefficientList[poly, vars] > > gives a multi-dimensional matrix of coefficients. > > Can anyone help with an algorithm/expression that > re-constructs the original poly given cl and vars? > (In practice, I'd like to manipulate the coefficients before > reconstructing the polynomial; otherwise this wouldn't > make sense). > The algorithm must be able to handle any number of vars. > I've found a solutions for a small and fixed number of vars > using some ugly nested For loops. However, I suppose > that there must be a more efficient solution using some cute > matrix operations. > > Many thanks, > Holger > > Holger Strauss > Institute of Communication Acoustics > Ruhr-University Bochum Here is one method. FromCoefficientList[poly_, var_] /; Head[var]=!=List := FromCoefficientList[poly, {var}] FromCoefficientList[poly_, {var_}] := poly . var^(Range[Length[poly]]-1) FromCoefficientList[poly_, {var1_, rest__}] := With[ {partial = Map[FromCoefficientList[#,rest]&,poly]}, FromCoefficientList[partial, var1] ] SImple example: In[9]:= poly = CoefficientList[1+2*x + y^2, {x,y}] Out[9]= {{1, 0, 1}, {2, 0, 0}} In[10]:= FromCoefficientList[poly, {z,w}] 2 Out[10]= 1 + w + 2 z In our development version we have a built in function that will do this, though it is experimental and not in the System context. As you realize, CoefficientList generates the densest possible structure. For many purposes this may not be what you want; in particular, it can be a memory hog if either degree or number of variables exceeds quite modest bounds. So one might prefer to work with sparse representations. To this end, tentative functionality present in version 4 includes In[5]:= poly = Internal`NestedTermsList[1+2*x + y^2, {x,y}] Out[5]= {{1, {{0, 2}}}, {0, {{2, 1}, {0, 1}}}} In[6]:= Internal`FromNestedTermsList[poly, {z,w}] 2 Out[6]= 1 + w + 2 z One can also obtain a sparse, distributed (rather than recursive) representation. In this case the variables are stored as part of the data structure and hence cannot be altered. Of course they might be changed after the fact by replacement. In[9]:= poly2 = Internal`DistributedTermsList[1+2*x + y^2, {x,y}] Out[9]= {{{{1, 0}, 2}, {{0, 2}, 1}, {{0, 0}, 1}}, {x, y}} In[10]:= Internal`FromDistributedTermsList[poly2] 2 Out[10]= 1 + 2 x + y Daniel Lichtblau Wolfram Research
- References:
- Rebuilding polygon from CoefficientList?
- From: "Holger Strauss" <strauss@ika.ruhr-uni-bochum.de>
- Rebuilding polygon from CoefficientList?