Next: Simplifying Formulas, Previous: Selecting Subformulas, Up: Algebra

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. See Simplification 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; see Simplifying 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`’.
(See Reducing 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. See Algebraic 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.
see Reducing 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)`’. See Rewrite 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`).