Re: Question on replacementFunction

• To: mathgroup at smc.vnet.net
• Subject: [mg109282] Re: Question on replacementFunction
• Date: Tue, 20 Apr 2010 05:51:49 -0400 (EDT)
• References: <hqel40\$m31\$1@smc.vnet.net>

```On Apr 18, 3:58 am, Andrzej Kozlowski <a... at mimuw.edu.pl> wrote:
> I can see a bug in replacementFunction. The following code fixes it:
>
> 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[PolynomialQ[expr, vars],
>      PolynomialReduce[expr, rep, vars][[2]],
>        MemberQ[Attributes[Evaluate[hed]], NumericFunction],
>       Map[replacementFunction[#, rep, vars] &, expr],
>       PolynomialReduce[expr, rep, vars][[2]]]]]]]
>
> replacementFunction[x*y - w*z, x*y - w*z - 2*A, {x, y, z, w}]
>
> 2 A
>
> Andrzej Kozlowski
>
> On 17 Apr 2010, at 19:04, car... at colorado.edu wrote:
>
>
>
> > Could somebody explain why replacementFunction fails for
> > the simpler x*y-w*z but works for (x*y-w*z)^2?   Of course the
> > erratic behavior of ReplaceAll is well known.  Here are the tests
> > (I took replacementFunction from an earlier thread):
>
> > 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[Evaluate[hed]] === Symbol &&
> >      MemberQ[Attributes[Evaluate[hed]], NumericFunction],
> >     Map[replacementFunction[#, rep, vars] &, expr],
> >     PolynomialReduce[expr, rep, vars][[2]]]]]] ;
>
> > expr1 = x*y-w*z; res=x*y-w*z-2*A;
> > Print[replacementFunction[expr1,res,{x,y,w,z}]//Simplify]; (* fails *)
> > Print[ReplaceAll[expr1,x*y-w*z->(2*A)]];    (* OK *)
> > Print[ReplaceAll[expr1,-x*y+w*z->-(2*A)]];  (* fails *)
> > expr2 =(x*y-w*z)^2;
> > Print[replacementFunction[expr2,res,{x,y,w,z}]//Simplify]; (* OK *)
> > Print[ReplaceAll[expr2,x*y-w*z->(2*A)]];    (* OK *)
> > Print[ReplaceAll[expr2,-x*y+w*z->-(2*A)]];  (* fails *)
>
> > Summary: it works for expr =(x*y-w*z)^n if n=2,3,4...
> > also n=-2,-3,... but fails for n=1 or n=-1.  Any fix?  Thanks=

```

• Prev by Date: Re: Button Problem
• Next by Date: Re: ArrayPlot coordinates scaling for overlays
• Previous by thread: Re: Question on replacementFunction
• Next by thread: Nest and Fold don't respect HoldFirst?