What Has Changed in Maple V Release 5
Maple V Release 5 includes significant enhancements to some existing features. A brief description of the most interesting enhancements follows.
Lexical Scoping
Differential Equations and the DEtools package
PDEtools
Three Dimensional Geometry
Strings
Arrays of Hardware Floats
Algebraic Curves
Groebner Bases and Ore Algebras
Introduction
Maple allows you to create nested procedure definitions. This means that procedures can be defined within other procedures, or return procedures as expected output. Lexical scoping allows a nested procedure to access the variables which are located in surrounding procedures. You can now program in Maple and achieve better encapsulation.
In previous versions of Maple, it was difficult to have a nested procedure access the variables of an enclosing procedure. Procedures could only share variables if the variables were global.
An Example
The simple example in this section uses the concept of lexical scoping of parameters to define a procedure that creates new procedures that depend upon the input to the top-level procedure.
makeincr := proc(n::integer) # outer procedure local incr; incr := proc(i::integer) # inner procedure RETURN( i + n ); # n is the parameter to makeincr end; RETURN( incr ); end;
makeincr:=procn::integerlocalincr;incr:=proci::integerRETURN⁡i+nend proc;RETURN⁡incrend proc
add2 := makeincr( 2 );
add2≔incr
add2( 0 );
2
add2( 5 );
7
addminus1 := makeincr( -1 );
addminus1≔incr
addminus1( 0 );
−1
addminus1( 5 );
4
In the preceding example, a procedure incr is nested in an outer procedure makeincr. The outer procedure returns as its value the nested procedure incr. The parameter n of makeincr is lexically scoped: its value is visible within the inner procedure incr, where it is used to determine by how much to increment its own parameter i. The value of n is passed to makeincr as part of the definition of the inner procedure incr.
Notice that if one sets the kernel options variable warnlevel to 4, a warning is issued about the presence of a lexically scoped parameter. The warning identifies the new feature in Release 5, whereas in previous versions of Maple, the variable n occurring in the definition of the inner procedure incr would be regarded as a global variable.
For more information about lexical scoping, please see the lexical example worksheet.
The DEtools package is not new in Release 5, but it has been significantly expanded, with dramatic improvements both in performance and power. DEtools incorporated packages that were previously share packages: ODEtools (here DEtools,Lie) for computing using Lie symmetry methods and classifying ODEs; diffop , for computing with linear differential operators; and Poincare for plotting 2D/3D projections of Poincare sections of Hamiltonian systems.
The dsolve command has also been rewritten to take direct advantage of the new implementation of symmetry methods now available in DEtools, resulting in a remarkable improvement in its solving performance.
Finally, the odeadvisor command, originally from ODEtools, can be used to classify ODEs in general, and contains more help pages with related information and solving tips.
Many more examples can be found in the example worksheets examples/diffop and examples/linearode.
with( DEtools );
AreSimilar,Closure,DEnormal,DEplot,DEplot3d,DEplot_polygon,DFactor,DFactorLCLM,DFactorsols,Dchangevar,Desingularize,FindODE,FunctionDecomposition,GCRD,Gosper,Heunsols,Homomorphisms,IVPsol,IsHyperexponential,LCLM,MeijerGsols,MultiplicativeDecomposition,ODEInvariants,PDEchangecoords,PolynomialNormalForm,RationalCanonicalForm,ReduceHyperexp,RiemannPsols,Xchange,Xcommutator,Xgauge,Zeilberger,abelsol,adjoint,autonomous,bernoullisol,buildsol,buildsym,canoni,caseplot,casesplit,checkrank,chinisol,clairautsol,constcoeffsols,convertAlg,convertsys,dalembertsol,dcoeffs,de2diffop,dfieldplot,diff_table,diffop2de,dperiodic_sols,dpolyform,dsubs,eigenring,endomorphism_charpoly,equinv,eta_k,eulersols,exactsol,expsols,exterior_power,firint,firtest,formal_sol,gen_exp,generate_ic,genhomosol,gensys,hamilton_eqs,hypergeometricsols,hypergeomsols,hyperode,indicialeq,infgen,initialdata,integrate_sols,intfactor,invariants,kovacicsols,leftdivision,liesol,line_int,linearsol,matrixDE,matrix_riccati,maxdimsystems,moser_reduce,muchange,mult,mutest,newton_polygon,normalG2,ode_int_y,ode_y1,odeadvisor,odepde,parametricsol,particularsol,phaseportrait,poincare,polysols,power_equivalent,rational_equivalent,ratsols,redode,reduceOrder,reduce_order,regular_parts,regularsp,remove_RootOf,riccati_system,riccatisol,rifread,rifsimp,rightdivision,rtaylor,separablesol,singularities,solve_group,super_reduce,symgen,symmetric_power,symmetric_product,symtest,transinv,translate,untranslate,varparam,zoom
As an example, consider the following second order, nonlinear ODE.
ode := x^4 * diff( y( x ), x, x ) + ( x * diff( y( x ), x ) - y( x ) )^3 = 0;
ode≔x4⁢ⅆ2ⅆx2y⁡x+x⁢ⅆⅆxy⁡x−y⁡x3=0
The new odeadvisor command, classifies this differential equation as follows
odeadvisor( ode );
_2nd_order,_with_linear_symmetries
Given the additional, optional argument help, odeadvisor will pop up a related help page.
odeadvisor( ode, 'help' );
The result from odeadvisor indicates that this is a second order ODE with linear symmetries. You can see the symmetries of this ODE using the symgen command (see DEtools,Lie)
symgen( ode );
_ξ=0,_η=x,_ξ=x,_η=y
The dsolve command, based on this information, will solve this ODE as follows (see dsolve,Lie)
dsolve( ode );
y⁡x=−arctan⁡1c__1⁢x2−1+c__2⁢x,y⁡x=arctan⁡1c__1⁢x2−1+c__2⁢x
Most of the steps of the symmetry scheme are available as user-level commands. Consider for instance the symmetry cycle.
1) A pair of infinitesimals:
sym := [_xi = 0, _eta = exp(y)/ln(x)];
sym≔_ξ=0,_η=ⅇyln⁡x
2) The most general first order ODE invariant under the symmetry group represented by the infinitesimals above can be obtained using equinv
ODE := equinv( sym, y(x) );
ODE≔ⅆⅆxy⁡x=1ln⁡x⁢x+ⅇy⁡x⁢f__1⁡x
3) This ODE can then be solved by dsolve which calls symgen to determine the ODE symmetries and uses this information to arrive at
ans := dsolve( ODE );
ans≔y⁡x=−ln⁡−∫ln⁡x⁢f__1⁡xⅆx+c__1ln⁡x
4) The infinitesimals of the symmetry group can in turn be reobtained departing from the solution above using buildsym
buildsym(ans, y(x));
_ξ=0,_η=ⅇyln⁡x
5) The concrete Lie group of transformation equations (changes of variables) which leaves the ODE invariant can be obtained using transinv
TR_1 := transinv( sym, y(x), s(r) );
TR_1≔r=x,s⁡r=ln⁡−ln⁡x_α⁢ⅇy⁡x−ln⁡x+y⁡x
In the above, _alpha; is the continuous parameter of the Lie group (that is, a real constant). The inverse transformation is given by
ITR_1 := solve(TR_1,{x,y(x)});
ITR_1≔x=r,y⁡x=s⁡r−ln⁡ⅇs⁡r⁢_α+ln⁡rln⁡r
and can be used to check that the ODE is actually invariant under these transformation equations, arriving at an ODE with the same form as the original one (using dchange to change variables):
PDEtools[dchange](ITR_1, ODE, [r,s(r)], normal);
ⅆⅆrs⁡r⁢ln⁡r2⁢r+ⅇs⁡r⁢_αln⁡r⁢r⁢ⅇs⁡r⁢_α+ln⁡r=ⅇs⁡r−ln⁡ⅇs⁡r⁢_α+ln⁡rln⁡r⁢f__1⁡r⁢r⁢ln⁡r+1r⁢ln⁡r
expand(simplify(solve((20),{diff(s(r),r)})));
ⅆⅆrs⁡r=ⅇs⁡r⁢f__1⁡r+1ln⁡r⁢r
6) The canonical coordinates of this Lie group (the coordinates which reduce this ODE to a quadrature; see odeadvisor,quadrature) are obtained using canoni
TR_2 := canoni(sym,y(x),s(r));
TR_2≔r=x,s⁡r=−ln⁡xⅇy⁡x
ITR_2 := solve(TR_2,{x,y(x)});
ITR_2≔x=r,y⁡x=ln⁡−ln⁡rs⁡r
These canonical coordinates are presently used by dsolve to reduce ODE to a quadrature by change of variables
PDEtools[dchange](ITR_2,ODE,[r,s(r)],normal);
−ⅆⅆrs⁡r⁢ln⁡r⁢r+s⁡rs⁡r⁢r⁢ln⁡r=−ln⁡r2⁢f__1⁡r⁢r+s⁡rs⁡r⁢r⁢ln⁡r
expand(simplify(solve((24),{diff(s(r),r)})));
ⅆⅆrs⁡r=ln⁡r⁢f__1⁡r
Once the right hand side of the ODE above does not depend on s(r), it is a quadrature and is solved just integrating both sides with respect to r. Changing variables back one arrives at the answer for the original ODE returned by dsolve.
7) Finally, the infinitesimals of an underlying symmetry group can be used to build an integrating factor for this first order ODE (see odeadvisor,exact) by using the intfactor command:
ODE;
ⅆⅆxy⁡x=1ln⁡x⁢x+ⅇy⁡x⁢f__1⁡x
mu := intfactor(ODE);
μ≔ⅇ−y⁡x⁢ln⁡x
odeadvisor( mu * ODE );
_exact,_1st_order,_with_symmetry_[F(x),G(x)]
There are a variety of optional arguments to dsolve (see the dsolve,Lie for details).
The PDEtools package is a new package in Maple. PDEtools is a collection of commands and routines for finding analytical solutions for partial differential equations (PDEs). The package is an implementation of known methods for solving PDEs; however, it also allows you to look for solutions of equations not yet automatically solved by the package, or for "different solutions" when the package returns a solution which is not the most general one. For this purpose, you can make use of the dchange command and of the HINT option of the pdsolve command (especially the functional hint), both explained in more detail in the corresponding help pages. Finally, PDEtools incorporates the PDEplot command, for plotting the solution for linear and nonlinear first order PDEs with given initial conditions.
with(PDEtools);
CanonicalCoordinates,ChangeSymmetry,CharacteristicQ,CharacteristicQInvariants,ConservedCurrentTest,ConservedCurrents,ConsistencyTest,D_Dx,DeterminingPDE,Eta_k,Euler,FirstIntegralSolver,FromJet,FunctionFieldSolutions,InfinitesimalGenerator,Infinitesimals,IntegratingFactorTest,IntegratingFactors,InvariantEquation,InvariantSolutions,InvariantTransformation,Invariants,Laplace,Library,PDEplot,PolynomialSolutions,ReducedForm,SimilaritySolutions,SimilarityTransformation,Solve,SymmetryCommutator,SymmetryGauge,SymmetrySolutions,SymmetryTest,SymmetryTransformation,TWSolutions,ToJet,ToMissingDependentVariable,build,casesplit,charstrip,dchange,dcoeffs,declare,diff_table,difforder,dpolyform,dsubs,mapde,separability,splitstrip,splitsys,undeclare
When the general solution is found, it is returned directly in equation format
PDE := diff(f(x,y,z),y)+diff(f(x,y,z),x)/x/z=diff(f(x,y,z),z);
PDE≔∂∂yf⁡x,y,z+∂∂xf⁡x,y,zx⁢z=∂∂zf⁡x,y,z
ans := pdsolve(PDE);
ans≔f⁡x,y,z=f__1⁡z⁢ⅇx22,z+y
Answers can be tested using pdetest
pdetest(ans, PDE);
0
When the answer obtained is not the most general one, pdsolve returns using the structure of the solution, to allow the user to determine whether the answer is useful or not
PDE := diff(f(x,y,z),y)^2*exp(2*y)+diff(f(x,y,z),x)/cos(x)/z=diff(f(x,y,z),z);
PDE≔∂∂yf⁡x,y,z2⁢ⅇ2⁢y+∂∂xf⁡x,y,zcos⁡x⁢z=∂∂zf⁡x,y,z
ans≔f⁡x,y,z=f__1⁡x+f__2⁡y+f__3⁡zwhereⅆⅆyf__2⁡y2=ⅇ−2⁢y⁢_c2,ⅆⅆxf__1⁡x=_c1⁢cos⁡x,ⅆⅆzf__3⁡z=_c1z+_c2
That is, on the left is the result found for the indeterminate function, and on the right is a list. In this case, the list contains a set of ODEs for the functions _F1, _F2 and _F3, introduced by pdsolve when building the result. In other examples the list may contain, additionally, an indication of any arbitrary functions and/or change of variables introduced during the solving process. To see the resulting expression for the indeterminate function f(x,y,z), it is possible to use the build command:
build(ans);
f⁡x,y,z=_c1⁢sin⁡x+c__1−_c2ⅇy2+c__2+_c1⁢ln⁡z+_c2⁢z+c__3
A suitable change of variables is the most 'powerful' method when the solution cannot be found by other means. These changes or variables can now be performed using dchange. As a blackboard example, consider for instance the reduction of the number of differentiation variables in a given PDE
PDE := 1+F(x,y)^2+y*diff(F(x,y),x)-x*diff(F(x,y),y);
PDE≔1+F⁡x,y2+y⁢∂∂xF⁡x,y−x⁢∂∂yF⁡x,y
The solution to the PDE above is in fact invariant under rotations in the plane, which means that introducing polar coordinates (the natural coordinates for describing rotations) we will obtain the aforementioned reduction
TR := {x=r*cos(phi), y=r*sin(phi)};
TR≔x=r⁢cos⁡φ,y=r⁢sin⁡φ
dchange(TR, PDE, simplify);
F⁡φ,r2+1−∂∂φF⁡φ,r
The resulting PDE is easily solvable
ans := pdsolve((38));
ans≔F⁡φ,r=tan⁡φ+f__1⁡r
and the answer to the original problem can be obtained changing variables back
ITR := {r=sqrt(x^2+y^2), phi=arctan(y/x)};
ITR≔φ=arctan⁡yx,r=x2+y2
dchange(ITR, ans, known=_F1, simplify);
F⁡x,y=tan⁡arctan⁡yx+f__1⁡x2+y2
pdetest((41),PDE);
dchange is a general change of variables command and as such it can be used to change variables in procedures directly or in integrals (actually any valid Maple expression; see the related help page).
An extensive set of facilities for working with three-dimensional geometric objects and algorithms is provided in the new geom3d package.
Using the geom3d package, you can manipulate a wide variety of geometric objects, including points, lines, planes, spheres, polyhedra, and other solids.
Use the geom3d package by entering the with command. You can refer to procedures in the package by their short names.
restart;
with( geom3d ):
It is very easy to create a variety of geometric objects.
tetrahedron( T, point( O, 0, 0, 0 ), 3 );
Warning, a geometry object has been assigned to the protected name O. Use of protected names for geometry objects is not recommended and may break Maple functionality.
T
faces( T );
3,3,3,3,−3,−3,−3,3,−3,3,3,3,−3,−3,3,3,−3,−3,3,3,3,−3,3,−3,−3,−3,3,3,−3,−3,−3,−3,3,−3,3,−3
area( T );
24⁢3
volume( T );
8⁢3
You can visualize geometric objects using the draw command.
draw( T );
See the list of example worksheets for example worksheets available for this package.
True strings are added to Maple V Release 5. Previously, names also acted as strings when necessary.
Strings and names are identified with a different syntax:
s := "This is a string";
s≔This is a string
type( s, 'string' );
true
type( s, 'name' );
false
n := `This is a name`;
n≔This is a name
type( n, 'string' );
type( n, 'name' );
A fundamental distinction between names and strings is that names may be assigned a value, while strings cannot.
`A name` := 5;
A name≔5
"A string" := 5;
Error, invalid left hand side of assignment
Many procedures which formerly took names or strings as parameters, or returned names for use as strings, now will accept strings (and names), and return strings.
save `A name`, "/tmp/junk.m";
printf( "%s: %d\n", "A String of length: ", length( "A String of length: " ) );
A String of length: : 20
The MATLAB® Link allows you to open a connection to the MATLAB® numeric software package, and carry out computations there, returning the results to your current Maple session.
To use this package, you must have a correctly installed, licensed copy of MATLAB® on your computer. The Matlab example worksheet provides further explanation and examples. (Note: you will need MATLAB® to execute this worksheet.)
Example Computation
To establish a connection with MATLAB®, and to make available the Maple commands for interacting with it, use the with command to load the Matlab package.
with( Matlab ):
First, define a four by four Maple matrix. Use the Maple command below.
m := linalg[ 'randmatrix' ]( 4, 4 );
m≔−722−55−9487−560−6297−73−4−83−1062−8280
To define a MATLAB® variable, use the procedure setvar.
setvar( "m", m );
The MATLAB® variable "m" is defined to have the same value as the Maple variable m. Note that the variable "m" now exists in the current MATLAB® session to which Maple is connected.
Compute the Schur decomposition of this matrix m in MATLAB® by issuing the command
evalM( "r = schur( m )" );
Note the distinction between the evalM command and Maple's matrix evaluator, evalm.
This command sends the MATLAB® command enclosed in quotation marks to the running MATLAB® session to be executed. In this case, a MATLAB® variable "r" is assigned the value of the Schur decomposition of the MATLAB® variable "m".
Now retrieve the value of "r" from MATLAB®, using the getvar command.
s := getvar( "r" );
Finally, to convert this to a Maple matrix, use the command
a := evalm( convert( s, 'array' ) );
Arrays of hardware floating point numbers have been added to Maple V Release 5. Using arrays of hardware floating point numbers (called hfarrays in Maple) can dramatically improve the performance of numerical algorithms.
If you write a procedure that will be evaluated within evalhf, be careful not to introduce any symbolic constructs.
A simple, but nontrivial example of hfarrays is an implementation of the ``forward elimination'' algorithm employed by traditional Gaussian Elimination for square numerical matrices. The main departure from the straightforward description of the algorithm is that we take a little care to choose our pivot in a way that helps to proscribe numerical instability.
macro( forelim = `HFGaussElim/forelim` );
forelim
forelim := proc(r::posint, m::{array,hfarray}) local i, j, k, # indices max, # used to choose the pivot row t; # temporary for swapping # for each row for i from 1 to r do max := i; # find the pivot row # (should be modified for sparse implementation) for j from 1 + i to r do if abs( m[ j, i ] ) > abs( m[ max, i ] ) then max := j; fi; od; # interchange for k from i to r do # swap t := m[ i, k ]; m[ i, k ] := m[ max, k ]; m[ max, k ] := t; od; # do the pivot for j from 1 + i to r do for k from r to i by -1 do m[ j, k ] := m[ j, k ] - m[ i, k ] * m[ j, i ] / m[ i, i ]; od; od; od; m; end;
HFGaussElim/forelim:=procr::posint,m::array,hfarraylocali,j,k,max,t;foritordomax:=i;forjfromi+1tordoifabs⁡m[max,i]<abs⁡m[j,i]thenmax:=jend ifend do;forkfromitordot:=m[i,k];m[i,k]:=m[max,k];m[max,k]:=tend do;forjfromi+1tordoforkfromrby−1toidom[j,k]:=m[j,k] − m[i,k]*m[j,i]/m[i,i]end doend doend do;mend proc
Given a square matrix as input, an upper triangular matrix, row- equivalent to the input, is produced.
forelim( 4, matrix( 4, 4, [ 1, 2, 3, 4, 2, 3, 4, 1, 3, 4, 1, 2, 4, 1, 2, 3 ] ) );
41230134−12−14004413−4130004011
Now we can wrap forelim in a procedure HFGaussElim that checks its arguments and evaluates forelim with the evalhf environment.
HFGaussElim := proc(m::matrix) local rows, cols, i, j, lm; rows := linalg[ 'rowdim' ]( m ); cols := linalg[ 'coldim' ]( m ); if rows <> cols then ERROR( "Must be a square matrix" ); fi; lm := matrix( rows, rows ); for i from 1 to rows do for j from 1 to cols do lm[ i, j ] := m[ i, j ]; od; od; evalhf( forelim( rows, var( lm ) ) ); eval( lm ); end;
HFGaussElim:=procm::matrixlocalrows,cols,i,j,lm;rows:=linalg['rowdim']⁡m;cols:=linalg['coldim']⁡m;ifrows<>colsthenERROR⁡Must be a square matrixend if;lm:=matrix⁡rows,rows;foritorowsdoforjtocolsdolm[i,j]:=m[i,j]end doend do;evalhf⁡`HFGaussElim/forelim`⁡rows,var⁡lm;eval⁡lmend proc
Construct a large random matrix to test the performance of the hfarrays compared to the default floating point Gaussian Elimination used in Maple. Run both algorithms using the random matrix as input. To force Maple's gausselim procedure to use its own floating point algorithm, we explicitly set one of the matrix entries to a nonintegral value.
m := linalg[ 'randmatrix' ]( 50, 50 ): # get a big matrix
m[ 1, 1 ] := 0.5; # force floating point algorithm
m1,1≔0.5
st := time():
linalg[ 'gausselim' ]( m ):
time() - st;
0.131
HFGaussElim( m ):
0.031
The Algebraic Curves package, algcurves, allows you to study (the one-dimensional) algebraic varieties (curves) defined by multivariate polynomials.
You can examine singularities, Puiseaux expansions, compute the genus and j-invariant, and determine an integral basis using this package.
Consider the algebraic curve defined by the polynomial:
f := x^2 - y^3;
f≔−y3+x2
If you execute the following plot commands in a worksheet, you can see what the graph of f looks like.
plots['implicitplot']( f, x=-10..10, y=-10..10, numpoints=10000 );
Compute the singularities of f, by using the singularities command in the algcurves package. The entire package can be loaded first using the with command:
with( 'algcurves' );
AbelMap,Siegel,Weierstrassform,algfun_series_sol,differentials,genus,homogeneous,homology,implicitize,integral_basis,intersectcurves,is_hyperelliptic,j_invariant,monodromy,parametrization,periodmatrix,plot_knot,plot_real_curve,puiseux,singularities
singularities( f, x, y );
0,0,1,2,1,1
A Puiseux expansion of f at x=0 can be obtained using the puiseux command in the algcurves package.
puiseux( f, x = 0, y, 3 );
x23
The final 3 passed to puiseux indicates the truncation order desired in the series expansion.
This curve f is irreducible; not only over the rationals, because
factor( f );
−y3+x2
but also over any algebraic number field. We can verify this as follows:
evala( AFactor( f ) );
The last computation uses the evaluator evala to evaluate the inert procedure call AFactor⁡f. This factors f over the field of complex numbers.
Computing the genus of the curve f is quite simple:
genus( f, x, y );
Since f is a genus zero curve, we can compute its parametrization in terms of a parameter t.
parametrization( f, x, y, t );
t3,t2
Search for singularities (which are provided, below, in homogeneous coordinates) using the singularities command in the algcurves package.
Notice the singularity at 0.
Another Example
Consider the following curve of genus 3:
f := x * y^3 - x^2 * y - x + y^5;
f≔y5+x⁢y3−x2⁢y−x
Display the curve by copying the command below to a worksheet and executing the plot.
plots[ 'implicitplot' ]( f, x = -10..10, y = -10..10 );
The algcurves package can be used to find a parametrization of an algebraic curve. The inverse problem, although it can be easily solved using resultants, will provide for an interesting but simple problem to work out using the new Groebner package.
Consider the parametric curve
with( Groebner );
Basis,FGLM,HilbertDimension,HilbertPolynomial,HilbertSeries,Homogenize,InitialForm,InterReduce,IsBasis,IsProper,IsZeroDimensional,LeadingCoefficient,LeadingMonomial,LeadingTerm,MatrixOrder,MaximalIndependentSet,MonomialOrder,MultiplicationMatrix,MultivariateCyclicVector,NormalForm,NormalSet,RationalUnivariateRepresentation,Reduce,RememberBasis,SPolynomial,Solve,SuggestVariableOrder,Support,TestOrder,ToricIdealBasis,TrailingTerm,UnivariatePolynomial,Walk,WeightedDegree
sigma := [ t^2, t^3 ];
σ≔t2,t3
Determine a polynomial in the variables x and y having this parametrization.
vars := [ 'x', 'y' ];
vars≔x,y
nvars := nops( vars );
nvars≔2
Form the set of polynomial equations to solve.
eqns := { seq( vars[ i ] - sigma[ i ], i = 1 .. nvars ) };
eqns≔−t2+x,−t3+y
Next, compute a Groebner basis for elimination of the variables in t. The ordering of the variables in this command is crucial.
GB := gbasis( eqns, lexdeg( [ 't' ], vars ) );
Warning, Groebner[gbasis] is deprecated. Please, use Groebner[Basis].
GB≔x3−y2,t⁢y−x2,t⁢x−y,t2−x
GB := remove( has, GB, t );
GB≔x3−y2
Using this method, the original curve described by the polynomial x3−y2 is recovered.
Download Help Document