CASA is distributed as a single Maple archive of compiled routines and is loaded via the *with* function after having the language Maple loaded.

`> ` **with(casa):**

|__| | | Welcome to CASA 2.5 for Maple V.5 | /\| |/\ /=\__| [] | / \_ Copyright (C) 1990-2000 by Research Institute | \ for Symbolic Computation (RISC-Linz), the \ CASA 2.5 | University of Linz, A-4040 Linz, Austria. | | _| ||| | For help type '?casa' or '?casa,<topic>'. __/ ||| |_

The code is organized into a number of separate modules. The modules and their major parts are loaded into memory using the *readlib* facility when they get used for the first time. This significantly cuts the amount of memory occupied by the code.

We can define an algebraic set in implicit, parametric or projected representation.

`> ` **A := mkImplAlgSet([x*(x^2+y^2-1),x*z,x^2+y^2+z^2-1], [x,y,z]);**

`> ` **A2 := mkParaAlgSet([t^2-1,1/(t-1),t+1],[t]);**

`> ` **A3 := mkProjAlgSet([[u^2-v^3+v^2],[u+v,u-v,1/v]],[u,v]);**

We may perform conversion between representations, for example:

1. Birational mapping: We may compute a projection of A. The result is a set of algebraic sets, each given as a hypersurface and a birational mapping to 3D-space. The union of these algebraic sets is equal to A, the intersection of the corresponding ideal is equal to the radical of A. In this case we obtain two one-dimensional circles.

`> ` **Aproj := toProj(A);**

2. Parametrization:

`> ` **B := mkImplAlgSet([x^2-y^3,z+y+x],[x,y,z]);**

`> ` **Bpara := toPara(B);**

3. Representation by places (Puiseux expansion)

`> ` **Bplac := toPlac(B):**

`> ` **properties(Bplac);**

The implicit representation of algebraic sets suggests a way of dealing with algebraic sets by working on their corresponding defining ideals. The radical of an ideal generates set-theoretically the same algebraic set (possibly without multiple components).

`> ` **A := mkImplAlgSet([x*(x^2+y^2-1),x*z,x^2+y^2+z^2-1], [x,y,z]);**

`> ` **radA := computeRadical(A);**

During the computation of the radical, the set was split into two components. We can compute the union of these two algebraic sets by computing the intersection (i.e. the least common multiple) of their ideals.

`> ` **G1 := implUnionLCM(radA);**

`> ` **implEqual(A,G1);**

This gives us the ideal we started with, hence we know that the ideal by which A was given is a radical ideal.

The set-theoretic difference of algebraic sets is computed by determining the quotients of ideals.

`> ` **H := mkImplAlgSet([x, y^2+z^2-1],[x, y, z]);**

We can compute the difference of the sets A and H and form the Zariski closure.

`> ` **implDifference(A,H);**

The dimension is an important invariant of algebraic sets. The system CASA allows to compute the dimension of algebraic sets given in implicit representation. Let us define an algebraic set in three dimensions.

`> ` **N := mkImplAlgSet([-y^2*z^2 + 10*y^2*z - y*z^2 - 25*y^2 + 6*y*z + x - 5*y +1, y^3*z^2 - 10*y^3*z + 25*y^3 - y^2*z + 5*y^2 - y*z + y], [x, y, z]);**

N turns out to be a curve.

`> ` **dimension(N);**

There are two ways to compute the irreducible decomposition of N. The first one is based on characteristic sets and works directly on the implicit representation of N.

`> ` **U := decompose(N);**

The second decomposition algorithm works on algebraic sets in projected form by factoring the defining polynomial of the hypersurface.

`> ` **decompose(toProj(N));**

We define an irreducible projective algebraic curve.

`> ` **C1 := mkImplAlgSet([-15*y^2*z^3 - 76*y^3*z^2 - z^5 - 3*y*z^4 - 15*x*y^2*z^2 - 11*x*y^3*z - x*z^4 - 3*x*y*z^3 + y^3*x^2], [x,y,z], ["basespace"="projective"]);**

In the course of studying basic properties of C1 we will look for singular points. The result of the following function call is a list of all singularities of C1 (counted properly). The singular points are collected according to their multiplicities, i.e. first the double points, then the triple points, and so on. Usually, algebraic numbers are introduced in this process.

`> ` **singularities(C1);**

Let us take a point on C1, (2:alpha:1), say; alpha being a root of the irreducible polynomial 94*y^3 + 45*y^2 + 9*y + 3.

`> ` **alias(alpha=RootOf(94*y^3 + 45*y^2 + 9*y + 3));**

The tangent space (i.e. the set of points on all lines which have the intersection multiplicity greater than 1) at this point is the following algebraic set (a line):

`> ` **tangSpace(C1,[2,alpha,1]);**

Remove the alias again.

`> ` **alias(alpha=alpha):**

Since the projective point (0:1:0) is a singular point on C1, the tangent space is the whole projective space.

`> ` **Ts := tangSpace(C1,[0,1,0]);**

The tangent cone is a linear subspace generating the tangent space. It is given by the following set.

`> ` **Tc := tangSpace(C1,[0,1,0],"cone");**

The set Tc splits over the algebraic closure of the rational numbers into two lines.

`> ` **decompose(Tc,"absolute");**

It is an interesting question whether coordinates of points on an algebraic set can be expressed as rational functions of some number of parameters. For curves this amounts to representing coordinates of each point in terms of a single parameter. A necessary and sufficient condition is the vanishing of the genus.

`> ` **genus(C1);**

Now we are able to compute a birational mapping of C1 to the line. We get a parametric description.

`> ` **toPara(C1);**

Often it is desirable to determine (systems of) curves passing through specified points with prescribed multiplicity. The system CASA offers some functions to perform this task, e.g., passGenCurve.

Besides the classical Groebner bases algorithm, CASA contains an implementation of Groebner bases for multivariate polynomial modules and is able to solve systems of linear equations with polynomial coefficients. CASA also contains an implementation of the Groebner Walk algorithm for Groebner bases conversion.

`> ` **msolveGB([[x^3 - y, - x + y], [x*y - 1, x^3 - 1], [- x + y^2, y - 1]], [x*y^2 - y^2, - x^5 + x^2 - x + y^2], [x, y], term, tdeg);**

`> ` **GWalk([t^2 + y^2 + z^2 - 1, t^2 + z^2 - y, t - z], [t, y, z]);**

A powerful feature of CASA is its capability to visualize algebraic sets. For the majority of tasks, only singular or other distinguished points of algebraic sets yield some interesting information. These objects have to be treated with care, requiring special analysis. CASA makes a thorough effort to obtain correct information about the local topology in the neighborhood of singularities and other critical points while still keeping the algorithm efficient by using hybrid symbolic-numerical methods. Although Maple provides a function which is claimed to plot sets in implicit representation, its output for more complicated varieties is by far not satisfactory.

`> ` **pacPlot(93392896/15625*x^6 + (94359552/625*y^2 + 91521024/625*y - 249088/125)*x^4 + (1032192/25*y^4 - 36864*y^3 - 7732224/25*y^2 - 207360*y + 770048/25)*x^2 + 65536*y^6 + 49152*y^5 - 135168*y^4 - 72704*y^3 + 101376*y^2 + 27648*y - 27648);**

`> ` **pacPlot(2*x^4 - 3*x^2*y +y^2 - 2*y^3 + y^4);**

`> ` **pacPlot(y^4 - 384*y^2 + 400*x^2 - x^4);**

`> ` **pacPlot(8*(y^2 - x^2) - 8*(y^3 + x^3) + 2*y^4 + x^5);**

The following pictures show the graphs produced by CASA for some surface-to-surface intersections taken from literature.

`> ` **ssiPlot(x - 1, y - 1, [x, y, z]);**

`> ` **ssiPlot(x^2 + y^2 + z^2 - 5, x*y*z - 1, [x, y, z]);**

`> ` **ssiPlot(z - 2*x^4 - y^4, z - 3*x^2*y + y^2 - x^3, [x, y, z]);**

`> ` **ssiPlot(z - 2*x^4 - y^4, z^2 - 3*x^2*y - y^3, [x, y, z]);**

`> ` **ssiPlot(z^2 + 3*x^4 - y^4, z + x^3 - 3*x^2*y + y^2 - 2*y^3, [x, y, z]);**

`> ` **ssiPlot(y^4 - 384*y^2 + 400*x^2 - x^4+z^3, x^2 + y^2 + z^2 -30, [x, y, z]);**