Subject: [mg52454] Re: Separating constants from nonconstants in an expression

From: David Bailey <dave at Remove_Thisdbailey.co.uk>

Date: Sat, 27 Nov 2004 01:41:42 -0500 (EST)

References: <co73p0$52k$1@smc.vnet.net>

Sender: owner-wri-mathgroup at wolfram.com

Nicolas Girard wrote:
> Hi,
> given any expression like
>
> expr := (4 Pi k1 x k2 y)/(12 k3 t k4 u)
>
> and knowing that k1...k4 are constants, how could I separate these terms
> from the non constant ones, i.e. ending up with
>
> Pi k1 k2 x y
> -------- . ---
> 3 k3 k4 t u
>
> ? I've looked into the manual & browsed this newsgroup, but didn't find a
> clue...
>
> Many thanks in advance !
> Nicolas
>
>
Nicolas,
The first thing to realise is that the output you want is 'unstable' in
the sense that Mathematica will sort the terms in a multimplication and
potentially mix up the variables that you wish to consider constant with
those you wish to be considered variables. For this reason, the code
that follows returns a list with a constant bit and a variable bit.
First we define what you mean for something to be constant. I've allowed
things like k1^4 to be considered constant as well:
constant[x_?NumericQ] := True;
constant[x_^p_.] := MemberQ[{k1, k2, k3, k4}, x] /; NumericQ[p];
constant[_] := False;
Then it is easy to define a function that will recursively remove
constant bits from your expression:
split[{c_, x_. y_?constant}] := split[{c*y, x}] /; (y =!= 1);
split[{c_, x_}] := {c, x};
split[x_] := split[{1, x}];
(4 Pi k1 x k2 y)/(12 k3 t k4 u) // split//InputForm
{(k1*k2*Pi)/(3*k3*k4), (x*y)/(t*u)}
Note that this is still quite specialised - it doesn't treat (k1+5) or
Exp[k2], for example, to be constant.
David Bailey