 New Features in Maple V - Maple Programming Help

 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: 3-Dimensional graphics ------------------------- Maple V supports 3-D 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 on-line 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,i-1) ); (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) = 1-erf(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 1-exp(-v*t^s), e.g. > int( exp(-t)*t^2/(1-exp(-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(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(f)(0, 0) x + D(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^4-2,sqrt(2)); 2    1/2    2    1/2 (y  + 2   ) (y  - 2   ) > alias(alpha = RootOf(x^2-2)); > factor(y^4-2,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^(s-1), 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..n-1) for j=0..n-1 ] 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 Z-transform 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 (3-d Lie algebra classification package) 2: cartan (special-purpose relativity tensor package -- Cartan's formalism) 3: debever (special-purpose relativity tensor package -- Debever's formalism) 4: finance (amortization and Black Scholes stock call option pricing) 5: geom3d (3-d 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 Ellis-MacCallum formalism) 10: petrov (Weyl tensor classification package) 11: plots (2-d and 3-d 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 -- "fraction-free" Gaussian elimination gausselim -- changed to do "ordinary Gaussian elimination" over a field GramSchmidt -- Gram-Schmidt 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 non-negative 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): X-square distribution with v degrees of freedom RandFdist(v1,v2): F-distribution 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 non-local 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, ..., p[n], the gcd is computed over Z/(p[k]) efficiently using in-place 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, ..., 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 2-D 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 back-quotes 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 semi-colon). - 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(n-1) + (n-1)!, 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^2-7*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 last-name evaluation have changed. Recall that the purpose of last-name 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 in the above. > t := array(1..2,1..2): > linalg[det](t); t[1, 1] t[2, 2] - t[1, 2] t[2, 1] However, to access the array object one cannot use op, since op(t); 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, 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);