Re:Use of AlgebraicRules
- To: mathgroup at yoda.physics.unc.edu
- Subject: Re:Use of AlgebraicRules
- From: HAY at leicester.ac.uk
- Date: Wed, 6 JAN 93 23:52:28 GMT
Ken Sale (Lawrence Livermore National Lab, sale1 at llnl.gov) Posted a query about using AlgebraicRules. Here is a package with an extension of AlgebraicRules that seems to be both more powerful and also simpler to use - it gives the expected result on Ken's example ( see the second of the examples given below). It is sometimes necessary to use Together to get appropriate symbols together so that AlgebraicRulesExtended or AlgebraicRules can act as required (see example 3). Criticism, bug reports, comments and improvements will be welcome. Allan Hayes hay at leicester.ac.uk ******************************************************************** The Package This is set up for adding to the Algebra folder ********************************************************************* (* :Title: Algebraic Rules Extended *) (* :Author: Allan Hayes, hay at leicester.ac.uk *) (* :Summary: An extension of the system function AlgebraicRules. It gives a rule AREx and can be used exactly like AlgebraicRules (though the latter gives a list of rules). But: (1) it does not require the user to list all the symbols occurring in the expression to which AREx is applied. (2)It uses Map so as get at places that Replace alone cannot reach. *) (* :Context: Algebra`AlgebraicRulesExtended` *) (* :Package Version: 1.1 *) (* :Copyright: Copyright 1993 Allan Hayes *) (* :History:Version 1.1 by Allan Hayes, January 1993 *) (* :Keywords: Algebra, Simplification, Manipulation *) (* :Mathematica Version: 2.1 *) BeginPackage["Algebra`AlgebraicRulesExtended`"]; AlgebraicRulesExtended::usage = " AlgebraicRulesExtended[eqns (,{x1,x2,...})]\n generates a rule, AREx, for replacing earlier members of x1,x2,.. with later ones or other variables from eqns. As a first step in evaluation the given list is extended by appending the other symbols in eqns in default order.\n AlgebraicRulesExtended[eqns] is equivalent to AlgebraicRulesExtended[eqns ,{}].\n \n Options: AppendVariables -> True.\n AppendVariables-> False turns off the extension of the list {x1,x2, ...}\n \n expr/.AREx applies these rules to all parts of expr that contain at least one of the symbols from {x1, x2, ...} extended to include all symbols in eqns unless AppendVariables is set to False."; AppendVariables::usage = " AppendVariables is an option for AlgebraicRulesExtended. The default is True; and at this setting the given list of variables is extended by appending any other variables in eqns, in default order. With setting True no extension is made. This option may be used to restrict the search for replacements and so speed up the computation"; Begin["`Private`"]; Options[AlgebraicRulesExtended] = {AppendVariables -> True}; AlgebraicRulesExtended[eqns_, opts___Rule] := AlgebraicRulesExtended[eqns, {},opts]; AlgebraicRulesExtended[eqns_, var_Symbol, opts___Rule] := AlgebraicRulesExtended[eqns, {var}, opts]; AlgebraicRulesExtended[eqns_, vars_List, opts___Rule] := Block[ {x,ans, app}, appendQ = AppendVariables/. {opts}/. Options[AlgebraicRulesExtended]; With[ {prvars = If[appendQ === False, vars, Join[ vars, Complement[ Cases[eqns,s_Symbol, Infinity], vars ] ] ] }, With[ {AM = Function[ rules, (#/. rules)& ][AlgebraicRules[eqns, prvars]] }, x_ :> (*Map[ , Infinity, Heads->True] is much slower*) With[ {posn = Position[ x, p_/; !FreeQ[ p, Alternatives@@prvars ] ] }, Off[AlgebraicRules::newv,General::ivar]; ans= MapAt[AM,x,posn]; On[AlgebraicRules::newv,General::ivar]; ans ] ] ] ] End[]; Protect[AlgebraicRulesExtended, AppendVariables]; EndPackage[]; (* ******************************************************************* Examples and Comparisons with AlgebraicRules ******************************************************************* (1) In[] eqns = { c1^2 + s1^2 == 1, c2^2 + s2^2 == 1, c3^2 + s3^2 == 1 }; AREx1 = AlgebraicRulesExtended[eqns]; Tan[s1^2 + a^c + c1^2]/(b(s2^4 +k + c2^4))/.AREx1 Out[] Tan[1 + a^c]/(b + b*k - 2*b*s2^2 + 2*b*s2^4) In[] AR1 = AlgebraicRules[eqns]; Tan[s1^2 + a^c + c1^2]/(b(s2^4 +k + c2^4))/.AR1 Out[] AlgebraicRules::newv: 4 4 b (c2 + k + s2 ) involves variables not among {c1, s1, c2, s2, c3, s3}. AlgebraicRules::newv: c 2 2 Tan[a + c1 + s1 ] involves variables not among {c1, s1, c2, s2, c3, s3}. c General::ivar: a is not a valid variable. Tan[a^c + c1^2 + s1^2]/(b + b*k - 2*b*s2^2 + 2*b*s2^4) (2) In[] a + b/d /. AlgebraicRulesExtended[d == g, {a,b,d,g}] Out[] a + b/g In[] a + b/d /. AlgebraicRules[d == g, {a,b,d,g}] Out[] b AlgebraicRules::newv: a + - involves variables not among {a, b, d, g}. d 1 General::ivar: - is not a valid variable. d a + b/d (3) In[] AR2 = AlgebraicRules[{a+b == s, a b == p},{a,b,s,p}]; 1/a + 1/b/.AR2 Out[] 1 1 AlgebraicRules::newv: - + - involves variables not among {a, b, s, p}. a b 1 General::ivar: - is not a valid variable. b 1/a + 1/b BUT In[] AR2 = AlgebraicRules[{a+b == s, a b == p},{a,b,s,p}] Together[1/a + 1/b]/.AR2 Out[] s/p For more complicated expressions try Map[Together, expr, Infinity, Heads->True] *)