MathGroup Archive 1998

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Extracting polynomial coefficients?



Fred Simons notes that in his original posting Thomas Bell Thomas wrote
that he had a "very long" polynomial and give new solution (solution2
below) that is much quicker my earlier solutions (solution1 below) on
the examples tested. However it seems that solution2 is faster for
sparse polynomials (where many coefficients are zero) and solution1 is
faster for full polynomials (where many coefficients are non-zero). So
it all depends on what "very long" means.


The solution 

solution1[ pol_, vars_] := Cases[
  MapIndexed[ List, CoefficientList[pol, vars], {Length[vars]} ],
  {c_?(#=!=0&), ind_}  :> {Times @@ (vars^(ind-1)), c},
  {Length[vars]}
 ]

can be very wasteful in that it finds all coefficients when only a few
may be non zero, and then has to get rid of the unwanted ones. Not only
does this slow it down, it also uses a lot of menory.

Because of this

solution2[ pol_, vars_ ] := Module[ {ff},
  ff /: ff[x_] ff[y_] := ff[x y];
  ff /: ff[x_]^y_ := ff[x^y];
  Cases[
   Collect[ pol /. (#->ff[#]&) /@ vars, ff[_] ],
   x_. ff[y_] :> {y, x} ]
  ]

is considerably faster when many of the coefficients are zero.

With
z := Random[Integer, {0, 10}]
pol =Sum[ (z+1) a^z b^z c^z d^z e^z , {100} ];

we get 

solution1[pol,{a,b,c,d,e}];//Timing

{32.7333 Second, Null}

solution2[pol,{a,b,c,d,e}];//Timing

{2.33333 Second, Null}


However pol has at most 100 non-zero coefficients non-zero out of maybe
11^5. When most coefficients are non-zero then solution1 (which makes
more use of internal algorithms) turns out to be much faster.

For example: 

Using the following to genererate polynomials with all coefficients non
zero

poly[vars_,n_]:=
 
Plus@@Flatten[Outer[Times[Random[Integer,{1,(n+1)^(Length[vars])}],##]&,
			Sequence@@(Evaluate[vars^#]&[Range[0,n]])
			],Length[vars]-1]

(
poly[{a,b},2]
             2                  2      2        2      2  2 7 + 9 a + 2
a  + 9 b + 7 a b + a  b + b  + 3 a b  + 8 a  b )

With

fp = poly[{a,b,c,d},4];

we get

solution2[fp,{a,b,c,d}];//Timing

{61.5667 Second, Null}


solution1[fp,{a,b,c,d}];//Timing

{1.5 Second, Null}

So we have the usual dilemma of sparse structures and full ones
requiring different approaches - perhaps a combination of the two codes
might automatically scan what it has been given before choosing which
code to use.

The following is a slightly faster than solution1

solution1a [pol_, vars_] := 
  DeleteCases[
			Flatten[
      MapIndexed[ {Times@@(vars^(#2-1)),#}&, 
        CoefficientList[pol, vars], {Length[vars]} 
			],
			Length[vars]-1
			],
			{_,0}
	]	

solution1a[fp,{a,b,c,d}];//Timing

{1.43333 Second, Null}

-- 
Allan Hayes
 Training and Consulting
Leicester, UK
hay@haystack.demon.co.uk
http://www.haystack.demon.co.uk
voice: +44 (0)116 271 4198
fax: +44 (0)116 271 8642



  • Prev by Date: Strange Mathematica 3.0.1 Behaviour
  • Next by Date: Re: Data Extraction from List {{x1,y1}..{xn,yn}}where ##<x<##
  • Prev by thread: Re: Extracting polynomial coefficients?
  • Next by thread: Re: Re: Extracting polynomial coefficients?