MathGroup Archive 2009

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

Search the Archive

Re: Re: Replace not spotting a replacement

  • To: mathgroup at smc.vnet.net
  • Subject: [mg103643] Re: [mg103614] Re: [mg103399] Replace not spotting a replacement
  • From: Daniel Lichtblau <danl at wolfram.com>
  • Date: Thu, 1 Oct 2009 06:38:25 -0400 (EDT)
  • References: <200909201021.GAA24204@smc.vnet.net> <52579.98.212.148.221.1253480392.squirrel@webmail.wolfram.com> <00bf01ca4079$2e230d30$8a692790$@clara.co.uk> <50884.140.177.99.93.1254191276.squirrel@webmail.wolfram.com> <200909300900.FAA09474@smc.vnet.net>

David Carter-Hitchin wrote:
> Hi Daniel,
> 

[Much of this was discussed and resolved off-line. I wanted to have the 
corrections on the record, since I go to MathGroup archives whenever I 
need to revisit/revamp this algwbraic replacement function. -DL]


> Many thanks, but your post doesn't make sense to me.  If we start with:
> 
>   Sqrt(2 pi) * tau^(3/2)
> = Sqrt(2 pi) * tau^(1/2) * tau
> = Sqrt(2 pi t) * tau
> = mu tau
> 
> This is not the result your function gives.  I also do not understand the
> way the second argument is constructed:
> 
> {Sqrt[2 \[Pi] \[Tau]] - \[Mu], \[Mu]^2 - \[Tau]}
> 
> Does that mean replace Sqrt(2 pi tau) with mu, then replace mu^2 with tau?
> Which case the second replacement is wrong - it should be "2 pi tau".  If I
> do that then its fine:

Yes, mine was incorrect, yours is what I should have had.


> In[4]:= replacementFunction[
>  Sqrt[2 \[Pi]] \[Tau]^(3/2), {Sqrt[2 \[Pi] \[Tau]] - \[Mu], \[Mu]^2 - 
>    2 \[Pi] \[Tau]}, {Sqrt[\[Tau]], \[Mu]}]
> 
> 
> Out[4]= \[Mu] \[Tau]
> 
> However, as you said, this is quite reliant on spotting the kind of
> expression that turns up the first time and adapting it for a second go.
> What would be nice would be to somehow specify "minimal" (i.e. simpler)
> adjustments to the expression before replacement. 

I'll remark below on this business of spotting the subexpression flavors.


> Nevertheless your function is very useful and have saved it for the next
> time I'm working on something like this.
> 
> Many thanks,
> Kind regards,
> David.

Another mistake, pointed out off-line by Bobby Treat, was in dividing 
where I should be powering. Below is the corrected version (this is 
largely a note to myself, to be read when this topic reappears circa 2012).

replacementFunction[expr_, rep_, vars_] :=
   Module[{num = Numerator[expr], den = Denominator[expr],
     hed = Head[expr], base, expon},
    If[PolynomialQ[num, vars] &&
      PolynomialQ[den, vars] && ! NumberQ[den],
     replacementFunction[num, rep, vars]/
      replacementFunction[den, rep, vars],
     If[hed === Power && Length[expr] == 2,
      base = replacementFunction[expr[[1]], rep, vars];
      expon = replacementFunction[expr[[2]], rep, vars];
      PolynomialReduce[base^expon, rep, vars][[2]],
      If[Head[hed] === Symbol &&
        MemberQ[Attributes[hed], NumericFunction],
       Map[replacementFunction[#, rep, vars] &, expr],
       PolynomialReduce[expr, rep, vars][[2]]]]]]

Now to the subject of figuring out how PolynomialReduce will create 
variables, what they are, etc. One can get a good idea of this using the 
special context function DistributedTermsList. It has been around, and 
stable, since version 4, and is used in several parts of Mathematica 
code, so I do not expect it to evaporate. It will give an internal form 
of its polynomialized input, as a list of coefficients and exponent 
vectors for each polynomial. It will then give a list of the "variables" 
  used in these polynomials. One caveat is that it can only handle one 
polynomial list for input, so we must combine the first two arguments 
expr and rep above.

For the example at hand, we would do this as below.

In[9]:= InputForm[GroebnerBasis`DistributedTermsList[
   {Sqrt[2*Pi]*tau^(3/2), Sqrt[2*Pi*tau]-mu, mu^2-2*Pi*tau}]]

Out[9]//InputForm=
{{{{{3, 0, 0}, Sqrt[2*Pi]}}, {{{1, 0, 0}, Sqrt[2*Pi]}, {{0, 0, 1}, -1}},
   {{{2, 0, 0}, -2*Pi}, {{0, 0, 2}, 1}}}, {Sqrt[tau], tau, mu}}

This tells us that Sqrt[tau] is in fact encapsulated as a variable. That 
is the hint needed to see how to specify and order the "variables" 
explicitly. We'll show the result of doing that, ordering Sqrt[tau]>mu 
and mu>tau.

InputForm[GroebnerBasis`DistributedTermsList[
   {Sqrt[2*Pi]*tau^(3/2), Sqrt[2*Pi*tau]-mu, mu^2-2*Pi*tau},
   {Sqrt[tau],mu,tau}]]

Out[13]//InputForm=
{{{{{3, 0, 0}, Sqrt[2*Pi]}}, {{{1, 0, 0}, Sqrt[2*Pi]}, {{0, 1, 0}, -1}},
   {{{0, 2, 0}, 1}, {{0, 0, 1}, -2*Pi}}}, {Sqrt[tau], mu, tau}}

It is this different ordering that allows the substitutions to work as 
desired, where square roots of tau go to mu (with a constant factor), 
but squares of mu go back to tau (with a factor).

Daniel Lichtblau
Wolfram Research



  • Prev by Date: constant, scale, entropy
  • Next by Date: Re: How to Â
  • Previous by thread: constant, scale, entropy
  • Next by thread: Re: How to Â