calc: Algebraic Manipulation

 
 11.2 Algebraic Manipulation
 ===========================
 
 The commands in this section perform general-purpose algebraic
 manipulations.  They work on the whole formula at the top of the stack
 (unless, of course, you have made a selection in that formula).
 
    Many algebra commands prompt for a variable name or formula.  If you
 answer the prompt with a blank line, the variable or formula is taken
 from top-of-stack, and the normal argument for the command is taken from
 the second-to-top stack level.
 
    The ‘a v’ (‘calc-alg-evaluate’) command performs the normal default
 simplifications on a formula; for example, ‘a - -b’ is changed to ‘a +
 b’.  These simplifications are normally done automatically on all Calc
 results, so this command is useful only if you have turned default
 simplifications off with an ‘m O’ command.  SeeSimplification
 Modes.
 
    It is often more convenient to type ‘=’, which is like ‘a v’ but
 which also substitutes stored values for variables in the formula.  Use
 ‘a v’ if you want the variables to ignore their stored values.
 
    If you give a numeric prefix argument of 2 to ‘a v’, it simplifies
 using Calc’s algebraic simplifications; SeeSimplifying Formulas.
 If you give a numeric prefix of 3 or more, it uses Extended
 Simplification mode (‘a e’).
 
    If you give a negative prefix argument -1, -2, or -3, it simplifies
 in the corresponding mode but only works on the top-level function call
 of the formula.  For example, ‘(2 + 3) * (2 + 3)’ will simplify to ‘(2 +
 3)^2’, without simplifying the sub-formulas ‘2 + 3’.  As another
 example, typing ‘V R +’ to sum the vector ‘[1, 2, 3, 4]’ produces the
 formula ‘reduce(add, [1, 2, 3, 4])’ in No-Simplify mode.  Using ‘a v’
 will evaluate this all the way to 10; using ‘C-u - a v’ will evaluate it
 only to ‘1 + 2 + 3 + 4’.  (SeeReducing and Mapping.)
 
    The ‘=’ command corresponds to the ‘evalv’ function, and the related
 ‘N’ command, which is like ‘=’ but temporarily disables Symbolic mode
 (‘m s’) during the evaluation, corresponds to the ‘evalvn’ function.
 (These commands interpret their prefix arguments differently than ‘a v’;
 ‘=’ treats the prefix as the number of stack elements to evaluate at
 once, and ‘N’ treats it as a temporary different working precision.)
 
    The ‘evalvn’ function can take an alternate working precision as an
 optional second argument.  This argument can be either an integer, to
 set the precision absolutely, or a vector containing a single integer,
 to adjust the precision relative to the current precision.  Note that
 ‘evalvn’ with a larger than current precision will do the calculation at
 this higher precision, but the result will as usual be rounded back down
 to the current precision afterward.  For example, ‘evalvn(pi - 3.1415)’
 at a precision of 12 will return ‘9.265359e-5’; ‘evalvn(pi - 3.1415,
 30)’ will return ‘9.26535897932e-5’ (computing a 25-digit result which
 is then rounded down to 12); and ‘evalvn(pi - 3.1415, [-2])’ will return
 ‘9.2654e-5’.
 
    The ‘a "’ (‘calc-expand-formula’) command expands functions into
 their defining formulas wherever possible.  For example, ‘deg(x^2)’ is
 changed to ‘180 x^2 / pi’.  Most functions, like ‘sin’ and ‘gcd’, are
 not defined by simple formulas and so are unaffected by this command.
 One important class of functions which _can_ be expanded is the
 user-defined functions created by the ‘Z F’ command.  SeeAlgebraic
 Definitions.  Other functions which ‘a "’ can expand include the
 probability distribution functions, most of the financial functions, and
 the hyperbolic and inverse hyperbolic functions.  A numeric prefix
 argument affects ‘a "’ in the same way as it does ‘a v’: A positive
 argument expands all functions in the formula and then simplifies in
 various ways; a negative argument expands and simplifies only the
 top-level function call.
 
    The ‘a M’ (‘calc-map-equation’) [‘mapeq’] command applies a given
 function or operator to one or more equations.  It is analogous to ‘V
 M’, which operates on vectors instead of equations.  SeeReducing and
 Mapping.  For example, ‘a M S’ changes ‘x = y+1’ to ‘sin(x) =
 sin(y+1)’, and ‘a M +’ with ‘x = y+1’ and ‘6’ on the stack produces ‘x+6
 = y+7’.  With two equations on the stack, ‘a M +’ would add the lefthand
 sides together and the righthand sides together to get the two
 respective sides of a new equation.
 
    Mapping also works on inequalities.  Mapping two similar inequalities
 produces another inequality of the same type.  Mapping an inequality
 with an equation produces an inequality of the same type.  Mapping a
 ‘<=’ with a ‘<’ or ‘!=’ (not-equal) produces a ‘<’.  If inequalities
 with opposite direction (e.g., ‘<’ and ‘>’) are mapped, the direction of
 the second inequality is reversed to match the first: Using ‘a M +’ on
 ‘a < b’ and ‘a > 2’ reverses the latter to get ‘2 < a’, which then
 allows the combination ‘a + 2 < b + a’, which the algebraic
 simplifications can reduce to ‘2 < b’.
 
    Using ‘a M *’, ‘a M /’, ‘a M n’, or ‘a M &’ to negate or invert an
 inequality will reverse the direction of the inequality.  Other
 adjustments to inequalities are _not_ done automatically; ‘a M S’ will
 change ‘x < y’ to ‘sin(x) < sin(y)’ even though this is not true for all
 values of the variables.
 
    With the Hyperbolic flag, ‘H a M’ [‘mapeqp’] does a plain mapping
 operation without reversing the direction of any inequalities.  Thus, ‘H
 a M &’ would change ‘x > 2’ to ‘1/x > 0.5’.  (This change is
 mathematically incorrect, but perhaps you were fixing an inequality
 which was already incorrect.)
 
    With the Inverse flag, ‘I a M’ [‘mapeqr’] always reverses the
 direction of the inequality.  You might use ‘I a M C’ to change ‘x < y’
 to ‘cos(x) > cos(y)’ if you know you are working with small positive
 angles.
 
    The ‘a b’ (‘calc-substitute’) [‘subst’] command substitutes all
 occurrences of some variable or sub-expression of an expression with a
 new sub-expression.  For example, substituting ‘sin(x)’ with ‘cos(y)’ in
 ‘2 sin(x)^2 + x sin(x) + sin(2 x)’ produces ‘2 cos(y)^2 + x cos(y) +
 sin(2 x)’.  Note that this is a purely structural substitution; the lone
 ‘x’ and the ‘sin(2 x)’ stayed the same because they did not look like
 ‘sin(x)’.  SeeRewrite Rules, for a more general method for doing
 substitutions.
 
    The ‘a b’ command normally prompts for two formulas, the old one and
 the new one.  If you enter a blank line for the first prompt, all three
 arguments are taken from the stack (new, then old, then target
 expression).  If you type an old formula but then enter a blank line for
 the new one, the new formula is taken from top-of-stack and the target
 from second-to-top.  If you answer both prompts, the target is taken
 from top-of-stack as usual.
 
    Note that ‘a b’ has no understanding of commutativity or
 associativity.  The pattern ‘x+y’ will not match the formula ‘y+x’.
 Also, ‘y+z’ will not match inside the formula ‘x+y+z’ because the ‘+’
 operator is left-associative, so the “deep structure” of that formula is
 ‘(x+y) + z’.  Use ‘d U’ (‘calc-unformatted-language’) mode to see the
 true structure of a formula.  The rewrite rule mechanism, discussed
 later, does not have these limitations.
 
    As an algebraic function, ‘subst’ takes three arguments: Target
 expression, old, new.  Note that ‘subst’ is always evaluated
 immediately, even if its arguments are variables, so if you wish to put
 a call to ‘subst’ onto the stack you must turn the default
 simplifications off first (with ‘m O’).