MathGroup Archive 1996

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

Search the Archive

Re: Constant term in polynomial?

  • To: mathgroup at smc.vnet.net
  • Subject: [mg3386] Re: Constant term in polynomial?
  • From: espen.haslund at fys.uio.no (Espen Haslund)
  • Date: Sun, 3 Mar 1996 02:23:51 -0500
  • Organization: Universitet i Oslo
  • Sender: owner-wri-mathgroup at wolfram.com

In article <4gmhdc$gmv at dragonfly.wolfram.com>, bruck at mtha.usc.edu says...
>
>Arrgh, I feel stupid asking this question, but I can't think how to do it:
>how do I find the constant term in a polynomial in several variables in
>Mathematica?  For example, the "7" in 7 + 3 x y + y^2 ?
>
>I suppose one way would be to use
>
>   Coefficient[Coefficient[7 + 3 x y + y^2,x,0],y,0].
>
>But that's incredibly clunky, especially since I may have fifty or more
>variables in my real-life problem.
>
>I could evaluate the expression under the rule {x->0, y->0}, with the same
>problem:  for fifty variables that's awkward.  I could build the rule using
>Variables[expr], but that's clumsy and seems inefficient.
>
>First[7 + 3 x y + y^2] will work for this one, since the 7 is present and
>appears first in the FullForm representation.  But it won't work in 
>First[3 x y + y^2], which returns 3 x y.
>
>OK, so I can build a command which computes Variables[First[expr]], and
>if that's empty, returns 0; otherwise returns First[expr].  Also clunky
>IMHO, but it seems the most workable--unless there's some trap I'm missing?
>
>Or I can introduce an auxiliary variable "one", refer to the polynomial as 
>"7 one + 3 x y + y^2", and ask for Coefficient[expr, one].  Gag!  If I ever 
>want to EVALUATE it, I have to remember to use the rule one->1.
>
>There MUST be a standard way to do this, but I can't think of what it could 
be!
>
>--Ron Bruck
>
Dear, Ron:

Interesting problem.
I have read some of the answers to your question (including our own), 
and taken some of the ideas.

   If you want to be sure that your function gives the same
as the [[1, 1, ..., 1]] element of what CoefficientList 
returns then you should probably use something like:

constantCoefficient[poly_, vars_] :=
First[Flatten[CoefficientList[poly, vars] ] ]

   This is quite slow for long polynomials. Your idea of 
a set of rules like {x->0, y->0} gives a much faster
function:

coeff0[poly_, vars_] :=
Module[{r},
   r = Map[Rule[#, 0] &, Flatten[{vars}] ];
   poly /. r
]  

   Also you are right that looking only on the first 
part of the expression is even more efficient. If
you know that your constant coefficient is
an integer, rational, or approximate real number then
the following should avoid failing for the special
cases discussed by several people. I think it may
also work if your coefficient is a complex number.

c0[poly_] :=
Module[{d},
   If[Length[poly] < 2,
    Return[Select[d + d^2 + poly, NumberQ] ],
     Return[Select[d + Take[poly, 2], NumberQ] ] ]
]

   The dummy d and d^2 is to avoid some of the special cases.
If you need also irrational coefficients, this modified version
should work, but is significantly slower.
  
c0Irrational[poly_] :=
Module[{d},
   Select[d + d^2 + poly, NumberQ[N[#]] &]
]

   To se some of the problems (inconsistencies) that may
occur you can try all definitions, and also 
CoefficientList[poly, vars] and PolynomialQ[poly, vars], 
with poly = Log[x](and vars = x).

Hope this is of some help 
- Espen



==== [MESSAGE SEPARATOR] ====


  • Prev by Date: Mathematica on Solaris x86?
  • Next by Date: Re: Constant term in polynomial?
  • Previous by thread: Re: Constant term in polynomial?
  • Next by thread: Re: Constant term in polynomial?