Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.

Question on replacementFunction

ເບິ່ງ 47 ເທື່ອ
ຂ້າມໄປຫາຂໍ້ຄວາມທີ່ຍັງບໍ່ໄດ້ອ່ານທຳອິດ

car...@colorado.edu

ຍັງບໍ່ໄດ້ອ່ານ,
17 ມ.ສ. 2010, 6:03:5417/4/2010
ຫາ
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.

Bob Hanlon

ຍັງບໍ່ໄດ້ອ່ານ,
18 ມ.ສ. 2010, 5:58:4518/4/2010
ຫາ
x*y - w*z -> (2*A) // FullForm

Rule[Plus[Times[x,y],Times[-1,w,z]],Times[2,A]]

-x*y + w*z -> -2*A // FullForm

Rule[Plus[Times[-1,x,y],Times[w,z]],Times[-2,A]]

The LHS of these rules are different forms and will behave differently than you expect. To get easily understood behaviour, keep the LHS of replacement rules as simple as possible or use multiple rules to address the different forms.

expr = (x*y - w*z)^Range[-2, 2]

{1/(x*y - w*z)^2, 1/(x*y - w*z), 1,
x*y - w*z, (x*y - w*z)^2}

expr /. x -> (2 A + w*z)/y

{1/(4*A^2), 1/(2*A), 1, 2*A, 4*A^2}

expr /. {x*y - w*z -> (2*A), -x*y + w*z -> -2*A}

{1/(4*A^2), 1/(2*A), 1, 2*A, 4*A^2}


Bob Hanlon

---- car...@colorado.edu wrote:

=============

Andrzej Kozlowski

ຍັງບໍ່ໄດ້ອ່ານ,
18 ມ.ສ. 2010, 5:58:2418/4/2010
ຫາ
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]],

If[Head[Evaluate[hed]] === Symbol &&
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

car...@colorado.edu

ຍັງບໍ່ໄດ້ອ່ານ,
20 ມ.ສ. 2010, 5:51:3920/4/2010
ຫາ
> > also n=-2,-3,... but fails for n=1 or n=-1. Any fix? Thanks=
.

Thanks - this fix solved that problem. Now replacementFunction works even for
expr=(x*y-w*z)^n, with symbolic n. Hopefully this will eventually become a
built-in function that implements algebraic substitution instead of
pattern replacement.

I plan to test it in a more ambitious setting: a 12 x 12 matrix, each
entry of which has about 5000 leaves. The idea is to inject geometric
invariants through repeated replacements, finally ending up with shorter
expressions (about 100 leaves) that can be finished up with Simplify.

0 ຂໍ້​ຄວາມ​ໃໝ່