Development of Improved User Interfaces

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

1: X Window interface



A user interface for X Window has been designed.

The X Window user interface provides separate help and plot windows,

allows editing of input expressions, maintains a log of a Maple session,

and supports an assortment of other options. The various methods of

setting defaults, key bindings, etc. are documented in the help file

for X11.

2: 3Dimensional graphics



Maple V supports 3D surface plots under several software platforms,

including X Window. Printed output is provided for a variety of printers,

including Postscript devices.

Surfaces can be described either by a single function of two variables

or parametrically. The coordinate system can be either cartesian, spherical,

or cylindrical. The surface can be rendered as surface patches, a wire frame

plot (with optional hidden line removal), or a collection of points.

There is also a "plots" package which contains a number of specialized

plotting facilities e.g. matrix plots, conformal plots, tube plots etc.

Additional documentation is available online for the plots package.

3: New arrow syntax for specifying operators (functions)



In addition to the "proc ... end" and the angle bracket < ... > notations

for defining functions (procedures), the following "arrow" notation

has been adopted as an alternative syntax

f := x > x^2

g := (x,y) > sin(x+exp(y))

4: Sorting polynomials



Expressions in Maple are usually stored in the order they were created.

Consequently polynomials often appear in a seemingly random order.

The sort command can now be applied to sort any polynomials that appear

in an expression. Univariate polynomials are sorted in descending order.

Multivariate polynomials may be sorted by "total degree" (default) with

ties broken by lexicographical order, or in pure lexicographical order.

An optional argument may be given to specify the variable ordering.

Example:

> a := y^3+y^2*x^2+x^3;

3 2 2 3

a := y + y x + x

> sort(a,[x,y],tdeg);

2 2 3 3

x y + x + y

> sort(a,[x,y],plex);

3 2 2 3

x + x y + y

5: Improved display of output



The output of matrices, vectors, and repeated composition has been improved.

Example: compute a Taylor series expansion for an unknown function F

> s := taylor(f(x),x=0,4);

(2) 2 (3) 3 4

s := f(0) + D(f)(0) x + 1/2 D (f)(0) x + 1/6 D (f)(0) x + O(x )

> linalg[vector]( 4, i > coeff(s,x,i1) );

(2) (3)

[ f(0), D(f)(0), 1/2 D (f)(0), 1/6 D (f)(0) ]

6: User defined formatting routines



Maple's pretty printer understands how to display certain objects such as

polynomials, plots, matrices, vectors, integrals, subscripts, etc.

Users may now specify how their own functions are to be displayed as follows:

To format a function foo(...) the user may assign to the name

`print/foo` a Maple procedure. The Maple procedure will be invoked

during output of a Maple expression once for each different instance

of foo in the output. The procedure can return any expression.

Example:

> `print/complex` := proc(r,i) r+i*I end:

> complex(1,2);

1 + 2 I

7: New help syntax and user defined help routines



Help is now also available using the ? syntax.

For example, to get help for the mod operator, one types simply

> ?mod

The searching component of the help system has been much improved.

The help files themselves now include the actual Maple output.

The user may tell Maple how to generate help for a function "foo"

by assigning the name `help/text/foo` to a TEXT object, e.g.

> `help/text/foo` := TEXT(`this is line 1`, `and this is line 2`):

> ?foo

this is line 1

and this is line 2

New and enhanced mathematical facilities

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

1: New Mathematical functions known to Maple



 Complementary error function erfc(z) = 1erf(z)

(diff/erfc, limit/erfc, evalf/erfc, series/erfc)

 Airy wave functions Ai(x) and Bi(x) (evalf/Ai, evalf/Bi)

 The 3 argument limiting case only of the Meijer G function

(diff/MeijerG, evalf/MeijerG, series/MeijerG)

 The Dirac delta function Dirac(x) and its derivatives Dirac(n,x)

 The generalized Riemann Zeta function Zeta(0,x,s)

and its derivatives Zeta(n,x,s).

2: Enhanced numerical facilities



 Asymptotic series are now used to numerically evaluate the following

functions for large x: Si(x) and Ci(x) (Sine and Cosine integrals), Ai(x)

and Bi(x) (Airy wave functions), erfc(x) (complementary error function),

BesselJ and BesselY (Bessel functions J(v,x) and Y(v,x)).

 Evalf of sum(f(r),r=RootOf(a(x),x)) sums f(r) over the

complex roots of a polynomial a(x).

 Dsolve has been extended to use a Runga Kutta based numerical method for

solving initial value ODEs.

 The library routines shake and evalr provide a model of interval arithmetic

which is used for simplifications of signum of exact real constants.

3: Enhanced integration facilities



Definite integration has been extended to handle more

integrands of the following form:

int( R(t)*exp(u*t^s)*ln(b*t)^m*cos(c*t^r), t=a..infinity )

or sin

where r in {0,s,2*s,s/2} and other restrictions on the constants apply.

In general these integrals can be expressed in terms of the Gamma function,

incomplete Gamma function GAMMA(a,x), and the Polygamma function Psi(x),

the Riemann Zeta function Zeta(x), the error function and Fresnel integrals,

and the Meijer G function.

Examples where R(t) is a power of t (possibly negative and/or fractional):

> int( exp(t^2)*cos(2*t)*t^2, t=0..infinity );

1/2

 1/4 Pi exp(1)

> int( exp(sqrt(2*Pi)*t)*sin(t^2), t=0..infinity );

1/2 1/2 1/2 1/2

1/4 2 Pi  1/2 2 Pi FresnelS(1)

> int( exp(t)/t^(1/3), t=1..infinity );

GAMMA(2/3, 1)

> int( exp(t)*ln(t)/t, t=1..infinity );

MeijerG(3, 0, 1)

> int( exp(t)*ln(t)/t^(1/2), t=1..infinity );

MeijerG(3, 1/2, 1)

Maple can do some cases where the denominator of R(t) is of the

form 1exp(v*t^s), e.g.

> int( exp(t)*t^2/(1exp(2*t)), t=0..infinity );

7/4 Zeta(3)

And also a few cases where R(t) includes an error function, e.g.

> int( t*exp(t^2)*erf(2*t+1), t=0..infinity );

1/2 1/2

1/2 erf(1) + 1/5 exp(1/5) erfc(2/5 5 ) 5

> int( ln(2*t^2)*erf(t/2)/t^(3/2), t=0..infinity );

1/2 1/2 1/2

ln(2) Pi Pi Pi Psi(1/4)

6  + 8  + 2 

GAMMA(3/4) GAMMA(3/4) GAMMA(3/4)

4: The derivative operator D



The D operator has been extended to handle partial derivatives.

The notation D[i](f) means the derivative of f with respect to the

i'th argument. The chain rule is applied and by default and it is

assumed that partial derivatives commute. Examples:

> g := (x,y) > sin(x+cos(y)):

> D[1](g);

(x,y) > cos(x + cos(y))

> D[1,2](g);

(x,y) > sin(x + cos(y)) sin(y)

Consequently the mtaylor function (for multivariate Taylor series)

will now expand an unknown function of more than one argument, e.g.

> mtaylor(f(x,y),[x=0,y=0],3);

2

f(0, 0) + D[1](f)(0, 0) x + D[2](f)(0, 0) y + 1/2 D[1, 1](f)(0, 0) x

2

+ D[1, 2](f)(0, 0) x y + 1/2 D[2, 2](f)(0, 0) y

5: Enhanced limit and series facilities



Asymptotic series have been extended to allow exponential terms

to appear in the resulting series. Example:

> asympt( Psi(2*exp(x))x, x, 4 );

1 1 1

ln(2)     + O()

4 exp(x) 2 4

48 exp(x) exp(x)

> limit( Psi(2*exp(x))x, x=infinity );

ln(2)

Series expansions for erfc(x), GAMMA(a,x) for a > 0, and MeijerG(a,b,x)

for a > 1, a an integer have been added. Also asymptotic expansions

for the GAMMA and binomial functions have been added. Examples:

> asympt( GAMMA(x)*Ei(x)/x^x/sqrt(2*Pi), x );

1 13 601 319721 60973877 1

 +  +  +  +  + O()

3/2 5/2 7/2 9/2 11/2 13/2

x 12 x 288 x 51840 x 2488320 x x

# An indefinite summation using Gosper's algorithm

> s := sum( binomial(2*n,n)/(n+1)/(2^n)^2, n );

binomial(2 n, n)

s :=  1/2 

(n  1) 2

(2 )

> asympt(s,n,3);

2 1 1 1

  +    + O()

1/2 1/2 1/2 3/2 1/2 5/2 7/2

Pi n 4 Pi n 64 Pi n n

# Hence since s = 2 at n = 0, we have

> sum( binomial(2*n,n)/(n+1)/(2^n)^2, n=0..infinity );

2

6: Definite sums and products over roots of polynomials



Let alpha denote the set of roots of the polynomial a(x).

In Maple, the roots of a(x) are expressed as RootOf( a(x), x ).

Let sum(f(k),k=alpha) mean the sum of f over the roots of a(x).

Likewise let product(f(i),k=alpha) be the product of f over the roots of a(x).

Then Maple can evaluate such sums and products when f is a polynomial

or rational function in k, e.g.

> alpha := RootOf(x^5+x+11,x):

> sum( 1/(k^2+1), k=alpha );

35/57

> product( k^2+1, k=alpha );

1/171

7: Polynomial factorization and root finding



The factor command now accepts an additional argument,

an algebraic extension which specifies an algebraic number field

over which the polynomial is to be factored.

The extension can be specified as a single RootOf or radical,

or in the case of multiple extensions, a list or set of such.

Example: factor the polynomial y^4+2 over Q(sqrt(2))

> factor(y^42,sqrt(2));

2 1/2 2 1/2

(y + 2 ) (y  2 )

> alias(alpha = RootOf(x^22));

> factor(y^42,alpha);

2 2

(y + alpha) (y  alpha)

An algebraic extension can also be given to the roots and irreduc functions.

Similarly for finite fields (see below).

8: Arithmetic over finite fields (Galois fields)



A special representation for univariate polynomials over finite fields

defined by a single algebraic extension over Z mod p has been implemented.

The new facility includes support for computing polynomial gcd's,

factorization and root finding. It is accessed via the mod function.

Example: factor the polynomial x^6+x^5+x^4+x^3+1 over GF(2) then GF(4)

> f := x^6+x^5+x^4+x^3+1:

> Factor(f) mod 2;

2 4

(x + x + 1) (x + x + 1)

> alias(alpha=RootOf(x^2+x+1)):

> Factor(f,alpha) mod 2;

2 2

(x + alpha) (x + x + alpha + 1) (x + alpha + 1) (x + x + alpha)

An algebraic extension can also be given to

the Roots and Irreduc functions, e.g.

> Roots(f,alpha) mod 2;

[[alpha, 1], [alpha + 1, 1]]

Future work will see the functionality extended to multivariate polynomials

and/or over finite fields defined by multiple algebraic extensions.

9: Transforms



The Mellin, Z, and discrete fast Fourier transforms have been added to the

library. The Mellin transform of f(t) is

g(s) = int( f(t)*t^(s1), t=0..infinity )

The Z transform for f(n) is

g(z) = sum( f(n)/z^n, n=0..infinity )

The discrete Fourier transform of a complex vector $z$ is the vector

[ sum( exp(2*Pi*j*k*I/n )*z[k], k=0..n1) for j=0..n1 ]

The Laplace transform package has been taught about Bessel functions.

New library functions

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

ellipsoid: surface area of an ellipsoid

evalr: evaluation over a range(s)

fnormal: floating point normalization

galois: computes the galois group of a (univariate) polynomial (up to degree 7)

history: a history mechanism (an alternative to Maple "'s)

iratrecon: rational reconstruction

mellin: mellin transform

poisson: poisson series expansion

irreduc: irreducibility test of a (multivariate) polynomial

roots: computes the roots of a (univariate) polynomial

shake: real interval arithmetic (to Digits precision)

sturm: use the Sturm sequence to find the number of real roots in an interval

sturmseq: compute the Sturm sequence of a polynomial over Q or R

thiele: continued fraction interpolation

userinfo: generate user information

ztrans, invztrans: the Ztransform and it's inverse

C: Maple to C language translator

FFT: Fast Fourier transform

Hermite: computes the Hermite normal form of a matrix over a finite field

Irreduc: irreducibility test of a (univariate) polynomial mod p

MOLS: generates mutually orthogonal Latin squares

Nullspace: computes the nullspace of a matrix over a finite field

Primitive: tests if a univariate polynomial over a finite field is primitive

Randpoly: random univariate polynomial of degree k mod p

Randprime: random monic irreducible univariate polynomial of degree k mod p

Smith: computes the Smith normal form of a matrix over a finite field

New library packages

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

1: bianchi (3d Lie algebra classification package)

2: cartan (specialpurpose relativity tensor package  Cartan's formalism)

3: debever (specialpurpose relativity tensor package  Debever's formalism)

4: finance (amortization and Black Scholes stock call option pricing)

5: geom3d (3d geometry package)

6: heap (priority queue data structure)

7: liesymm: (Lie symmetries package  obtains the determining equations for

the Lie symmetries of a system of partial differential equations)

8: logic (boolean algebra package)

9: oframe (orthonormal frame package using the EllisMacCallum formalism)

10: petrov (Weyl tensor classification package)

11: plots (2d and 3d special plots package)

12: tensor (relativity tensor package)

New functionality in library packages

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

1: linalg (linear algebra package)



backsub  back substitution in an augmented triangular matrix

companion  constructs the companion matrix for a monic polynomial

concat  concatenate matrices and/or column vectors together

ffgausselim  "fractionfree" Gaussian elimination

gausselim  changed to do "ordinary Gaussian elimination" over a field

GramSchmidt  GramSchmidt orthogonalization

innerprod  the inner product of a sequence of matrices and vectors

JordanBlock  constructs a Jordan block matrix

linsolve  extended to solve A*X = B where B is a matrix

matrix  utility routine for creating a matrix

minor  utility routine for picking off the i,j'th minor of a matrix

randmatrix  utility routine to generate matrices with random entries

pivot  do one row elimination step on a matrix

stack  stack matrices and/or row vectors on top of each other

vector  utility routine for creating a vector

rank, rowspace, colspace  generalized to work for rational functions

eigenvects  has been modified to return a sequence of lists of the form

[e[i],m[i],{v[i,1],...,v[i,n[i]]}] where e[i] is the eigenvalue,

m[i] it's multiplicity, and {v[i,1], ..., v[i,n[i]]} a set of vectors

for the basis for the eigenspace of e[i]. It has also been

generalized to work for a matrix over any algebraic number field.

2: combinat (combinatorial functions package)



character  character table for Sn the symmetric group on n letters

cartprod  iterator for the cartesian product of two lists

fibonacci  extended to compute the fibonacci polynomials F[n](x)

numbcomb  replaces combinations (computes the number of combinations)

numbpart  replaces partitions (computes the number of partitions)

numbperm  replaces permutations (computes the number of permutations)

randcomb  generate a random combination of m objects from s objects

randpart  generate a random partition of and integer

subsets  iterator for a powerset (iterates over the subsets of a set)

vectoint, inttovec  bijection of the monomials represented as exponent

vectors using the total degree reverse lexicographical ordering

with the nonnegative integers

3: numtheory (number theory package)



mipolys(n,p,k)  computes the number of monic irreducible polynomials

of degree n over a finite field with p^k elements

sigma  now accepts a subscript sigma[k](n) and computes

the sum of the kth powers of divisors

order(n,m)  solves n^k == 1 mod m for the first integer k > 0

4: stats (statistics package)



Added random variate generators for the following distributions:

RandUniform(a..b): Uniform distribution on [a,b)

RandNormal(u,s): Normal distribution with mean u, standard deviation s

RandExponential(l): Exponential distribution with mean l

RandGamma(a): Gamma distribution of order a

RandBeta(a,b): Beta distribution of order a and b

RandChiSquare(v): Xsquare distribution with v degrees of freedom

RandFdist(v1,v2): Fdistribution with v1 and v2 degrees of freedom

New and enhanced system facilities

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

1: Type testing in Maple V



In Maple version 4.3, we extended the notion of a "type" to include

"structured" types. A structured type is a Maple expression that describes

the type of a composite object. The type "set" specifies a set,

but not the type of the objects in the set. The type set(`=`) however

specifies a set of equations. And the type set(name=algebraic)) specifies

a set of equations whose left hand sides are (variable) names, and whose

right hand sides are algebraic expressions.

In Maple V, all types are now structured types. The old polynomial type test

type( p, polynom, [x,y], rational )

which tests if p is a polynomial in x and y with rational coefficients becomes

type( p, polynom(rational,[x,y]) )

Because all types are now single objects, one can describe the type of

arbitrarily complex objects very concisely. For example, the type

matrix( polynom(algnum), square )

specifies a square matrix whose entries are polynomials

(in any number of variables) over an algebraic number field, and the type

[ exp(anything}, {name,name=constant..constant} ]

specifies a list of exactly two objects, the first an exponential

(of any type), the second either a variable name, or an equation of the

form indicated  the set brackets denote alternation.

For a more detailed description see type[structure].

2: Debugging facilities



On an ERROR condition, if printlevel is higher than 1 the

statement being executed and the values of the local variables

are all printed.

3: Sequences and for loops



A new "seq" operator (for constructing sequences) has been added to

the language. It has the same evaluation semantics as the Maple for loop

and as such should be easier to use and understand than the $ operator

which it will eventually replace. There are two versions, modelled

on the two kinds of for loops as indicated by the comments below.

> s := seq( bernoulli(i), i=1..10 ); # for i to 10 do bernoulli(i) od;

s := 1/2, 1/6, 0, 1/30, 0, 1/42, 0, 1/30, 0, 5/66

> seq( abs(x), x=s ); # for x in s do abs(x) od;

1/2, 1/6, 0, 1/30, 0, 1/42, 0, 1/30, 0, 5/66

4: Table and array entries



Arrays and tables can now be descended (picked apart) using the "op" function.

Hence the only objects in Maple now which cannot be descended are procedures.

In addition to the indices function (which computes a sequence of a tables

indices (keys)) the entries function computes a sequence of a tables entries.

Example:

> t := table([red = rot, blue = blau, yellow = gelb, grey = grau]):

> indices(t);

[blue], [yellow], [grey], [red]

> entries(t);

[blau], [gelb], [grau], [rot]

> op(op(t));

[blue = blau, yellow = gelb, grey = grau, red = rot]

5: Procedure execution



This version includes a new implementation of nonlocal goto's

(as generated by ERROR, RETURN, interrupts and system errors).

The new implementation results in a lower overhead for procedure invocation.

Simple procedure calls execute 4 times faster in Maple V.

6: Language translation facilities



The library routine C translates Maple expressions and arrays into C code.

There is an optional code optimization facility.

The library routine fortran has been fixed to break up expressions

which exceed the 19 line continuation limit of Fortran.

The library routine latex for typesetting Maple output in TeX now handles

products, composition, vectors, tables and some operators.

The library routine eqn for troff output now handles products and operators.

Algorithmic improvements

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

1: Polynomial gcd's



Univariate polynomial gcd's over the integers are now computed using the

following modular method. For n word size prime moduli p[1], ..., p[n], the

gcd is computed over Z/(p[k]) efficiently using inplace machine arithmetic.

The n modular gcd's are then combined by application of the Chinese remainder

theorem. This new method is an order of magnitude more efficient for large

problems. This improves the performance of arithmetic in Q(x).

2: Polynomial resultants



Bivariate polynomial resultants over the integers are now computed using using

the following modular method. For n word size prime moduli p[1], ..., p[n],

the resultant is computed in Z/(p[k])[x,y], and these images are combined

using the Chinese remainder theorem. Each resultant calculation in

Z/(p)[x,y] is reduced to d resultant calculations in Z/(p)[x] by polynomial

evaluation and interpolation. This method (due to George Collins)

gives better performance for polynomials of large degree.

3: Arbitrary precision floating point arithmetic



A routine for evaluating hypergeometric functions to arbitrary precision

has been added to the kernel.

Since an elementary function can be expressed as a hypergeometric function,

this routine is used to evaluate elementary functions as well.

The time to compute sin(1) and ln(3) to 1000 digits, for example, is reduced

from 70 to 26 and 120 to 8 seconds respectively on a Sun 3/280 computer.

4: Computation of Pi



Maple is now using the Chudnovsky's formula for computing Pi to high precision.

Their formula is

infinity



1 6541681608 ( 13591409 ) (6*k)! (1)^k

 =  ) ( + k)  

Pi 640320^(3/2) / ( 545140134 ) (3*k)!*(k!)^3 640320^(3*k)



k = 0

To implement this formula, the series has been expressed as a 4, 3 argument

hypergeometric function which is computed using the routine mentioned in point

3 above. This method is about 30% faster in Maple than the previous method

(a similar formula due to Ramanujan).

5: Integration of rational functions



Integration of rational functions now returns a sum of logarithms over the

roots of a polynomial a(x) of smallest possible degree in the form

sum( f(alpha)*log(x+g(alpha)), alpha=RootOf(a(x)) )

The resulting sum, if evaluated in floating point, will be expressed

as an explicit sum of logarithms over the complex roots of alpha.

The above can also be manipulated as a function of x, i.e.

differentiated, expanded as a series in x etc.

The new form is much more concise and usable than the old technology

which produced a "mess" of nested radicals.

6: Polynomial root finding over finite rings



The Roots function has been extended to work for a composite modulus n.

The roots are computed mod each prime factor of n then lifted using padic

lifting and combined by application of the Chinese remainder theorem.

The result returned is a list of the roots and their multiplicities.

Example: find the roots of the polynomial x^2 mod 72

> Roots(x^2) mod 72;

[[36, 2], [24, 1], [12, 1], [60, 1], [0, 2], [48, 1]]

Miscellaneous changes

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

 Maple no longer has two representations for the complex unit i .

The unique representation is (1)^(1/2) and the symbol I is initially

an alias for (1)^(1/2).

 Radical powers of rationals are now automatically reduced, e.g.

> (2/3)^(3/2);

1/2 1/2

3/4 3 2

 Different radicals are no longer automatically combined so as to

preserve a canonical form. The combine function can be used to

combine radicals except the imaginary constant I, e.g.

> a := I+2^(1/2)+3^(1/2):

> a := expand(a^2);

1/2 1/2 1/2 1/2

a := 4 + 2 I 2 + 2 I 3 + 2 2 3

> combine(a,power);

1/2 1/2 1/2

4 + 2 I 2 + 2 I 3 + 2 6

 The library routine userinfo can be used to generate user information

messages for a function during the course of a computation.

In future versions of Maple, this facility will be exploited in the

Maple library to generate information about what Maple is doing.

 The library routine log has been extended to allow for different bases.

The syntax is log[b](x) meaning log base b of x.

 The mtaylor function (multivariate taylor series)

now returns a Maple sum of products and accepts integral weights

for the variables.

 Addition of norm and trace operations to GF (Galois Field package)

 Addition of Bessels equation to dsolve.

 The solve command for solving systems of equations now accepts

an additional argument "split" which directs solve to try to split a system

into one or more simpler systems using factorization at every step.

 The coeff function has been extended to understand coeff(p,x^n) for n<>0

to be equivalent to coeff(p,x,n) meaning the coefficient of x^n in p.

 The alias and macro facilities no longer affect parameters and locals.

I.e. one can have an alias I and a local variable I simultaneously.

Also, alias now will return a sequence of all current alias's.

 The POINT option in the 2D plotting has been improved

to print crosses + instead of dots.

 Map map's onto named arrays and tables, e.g. map(simplify,A);

i.e simplify each entry in the array

 All entries of an antisymmetric array can now be assigned.

 Saving procedures in src format inserts backquotes where necessary.

 Since the neutral operator &* is being used for matrix multiplication

it has been given the same precedence as * (multiplication)

 New Iris variable "endcolon" returns true iff the last statement was

terminated with a colon (instead of a semicolon).

 These functions that previously existed are now readlib defined:

allvalues, compoly, discrim, eqn, fortran, latex, norm, plot3d, select.

 The semantics of the read statement inside a Maple procedure has changed

from stacking the input to reading and executing the input immediately.

 The rsolve function now takes an optional directive "ztrans" to solve

recurrences or systems of recurrence equations using Z transforms.

 The rsolve function can now solve a large class of 1st order equations

and more complicated nonhomogeneous linear equations, e.g.

> rsolve( {y(n) = n*y(n1) + (n1)!, y(0) = 1}, y(n) );

GAMMA(n + 1) (Psi(n + 1) + gamma + 1)

 The isolve function (for integer solutions to equations) can now solve

a single equation of Pythagorean type, i.e. a x^2 + b y^2 + c z^2 = 0 .

where a, b, c are integers. In the example below, the % labels stand

for repeated common subexpressions, and _N1, _N2, _N3 stand for

arbitrary integers.

> isolve(2*x^27*y^2+5*z^2);

_N3 %1 _N3 %3 _N3 %2

{z = , x = , y = }

igcd(%1, %2, %3) igcd(%1, %2, %3) igcd(%1, %2, %3)

2 2

%1 :=  5 _N1  4 _N1 _N2 + 2 _N2

2 2

%2 := 5 _N1 + 2 _N2

2 2

%3 := 5 _N1  10 _N1 _N2  2 _N2

 The rules for lastname evaluation have changed.

Recall that the purpose of lastname evaluation is to allow vectors,

matrices and arrays to have one (or more) as yet undefined entries, e.g.

> A := array(1..2,1..2):

> linalg[det](A);

A[1, 1] A[2, 2]  A[1, 2] A[2, 1]

> A;

A

> op(A);

[ ?[1, 1] ?[1, 2] ]

[ ]

[ ?[2, 1] ?[2, 2] ]

In Maple V this has been extended to subscripted names e.g.

replace A by t[1] in the above.

> t[1] := array(1..2,1..2):

> linalg[det](t[1]);

t[1][1, 1] t[1][2, 2]  t[1][1, 2] t[1][2, 1]

However, to access the array object one cannot use op, since op(t[1]);

would then yield 1, the index.

The way to access the array object now is to use the eval function, e.g.

> eval(t[1]);

[ ?[1, 1] ?[1, 2] ]

[ ]

[ ?[2, 1] ?[2, 2] ]

Finally, a reminder not to make the following mistake.

# Interchange matrices A and B

t := A; A := B; B := t;

If A and B are assigned arrays, tables or procedures, one must write

t := eval(A); A := eval(B); B := eval(t);
