Re: Final comments on CoefficientList
- To: mathgroup at smc.vnet.net
- Subject: [mg2541] Re: [mg2516] Final comments on CoefficientList
- From: Allan Hayes <hay%haystack at smc.vnet.net>
- Date: Fri, 17 Nov 1995 00:20:22 -0500
Scott Herod <sherod at boussinesq.Colorado.EDU>
in [mg2516] Final comments on CoefficientList
defines two new coefficient list functions (attached) that always
give cuboidal arrays of the coefficients, unlike the built-in
function, CoefficientList.
Here is another such function that is quicker and simpler.
CoefficientList3[poly_, vars_]:=
Fold[
Outer[Coefficient[#1,#2]&,#1,#2]&,
{Expand[(Times@@vars) poly]},
vars^Range[Exponent[poly,vars]+1]
]//First
The function for getting back to the polynomial now simpler:
CoeffsToPoly[c_,v_] :=
Dot[c,Sequence@@Reverse[v^Range[0,Dimensions[c]-1]]]
Timings:
First construct a test polynomial (this one,pp, is of degree 4 in
each of the variables x,y,z,u,v)
ri := Random[Integer,{1,9}];
vars = {x,y,z,u};
pp =
Plus@@Flatten[Array[Times@@(rivars^{##})&,{4,4,4,4},{0,0,0,0}]];
(cl3 = CoefficientList3[pp, vars]);//Timing
{0.9 Second, Null}
Scott's two functions
(cl1= myCoefList[pp, vars]);//Timing
{31.0167 Second, Null}
(cl2= myCoefList2[pp, vars]);//Timing
{29.7167 Second, Null}
The built-in function
(cl= CoefficientList[pp, vars]);//Timing
{2.2 Second, Null}
Checks
cl1 == cl2 ==cl3
True
(pp - CoeffsToPoly[cl3,vars])//Expand
0
Allan Hayes
hay at haystack.demon.co.uk
*********************8
Scott's Code
( Scott sent me a correction to the last definition in the code for
myCoefList)
myCoefList[eqn_, x_Symbol] := myCoefList[eqn,{x}];
myCoefList[{eqn_}, x__] := myCoefList[eqn, x];
myCoefList[{eqn1_, eqn2__}, x__] :=
{myCoefList[eqn1, x], myCoefList[{eqn2}, x]};
myCoefList[eqn_, {x_}] :=
Table[Coefficient[eqn,x,i], {i,0, Max[Exponent[eqn, x],0]}];
myCoefList[eqn_, {x_, y__}] :=
Table[Coefficient[myCoefList[eqn,{y}],x,i],
{i,0,Max[Exponent[eqn,x],0]}];
myCoefList2[eqn_, var_] := Module[{coef, spam, a, b, c},
myCoefList::polynomial = "The equation is not a polynomial
in the variables";
coef[spam_, {a_, b_}] := Coefficient[spam, a, b];
coef[spam_, {a_, b_}, c__] := Coefficient[coef[spam, c], a, b];
If[PolynomialQ[eqn, var],
Array[
coef[eqn, Inner[List, var, List[##], Sequence]] &,
(Exponent[eqn,#] + 1 &) /@ var, 0]
,
Message[myCoefList::polynomial];
]
]