```> f:=51344*y^5+53384*y^4-47264*y^3-415912*x^2*y^3-49304*y^2+29070*x^2*y^2+247631*
> x^2*y+90164*x^4*y+73931*x^2+40396*x^4;
```
```            5          4          3           2  3          2          2  2
f := 51344 y  + 53384 y  - 47264 y  - 415912 x  y  - 49304 y  + 29070 x  y

2            4            2          4
+ 247631 x  y + 90164 x  y + 73931 x  + 40396 x

```

This plot was done by the command

plotAlgSet(mkImplAlgSet([f],[x,y]),x=-2..2,y=-2..2,numpoints=300);

in the package CASA, see below for the WWW address of CASA.
```> with(algcurves);
```
```[Weierstrassform, genus, homogeneous, integral_basis, j_invariant,

parametrization, plot_knot, puiseux, singularities]
```

## 1 Puiseux expansion

In the picture we see 2 singularities and one regular point on the line x=0. We can obtain information (like the tangent lines, the delta invariant and other invariants) on singularities by computing the Puiseux expansions. One can view these Puiseux expansions as a sort of Taylor expansions (note that Puiseux expansions can also have fractional powers of x, whereas a Taylor expansion does not) of the algebraic function RootOf(f,y). Since this algebraic function is multivalued, we will get several expansions, corresponding to the different branches of f at x=0.The following command gives these expansions of f at x=0:

```> puiseux(f,x=0,y,0);
```
```     6163                            2                         2
{----, x RootOf(-73931 + 49304 _Z ), -1 + x RootOf(50324 _Z  - 135641)}
6418

```
The fourth argument 0 tells puiseux to compute a minimal number of terms. The number of terms that will be computed this way is precisely the number of terms that are needed to be able to distinguish the different Puiseux expansions from one another.
Note that it appears as if there were only 3 different puiseux expansions given, whereas in the picture we can see 5 different branches. The other 2 expansions are implicitly given by taking the conjugates of these expansions over the field Q((x)).

```> puiseux(f,x=0,y,3);
```
```      4746694785  2                    2            6163   983148695281170   2
{-1 - ---------- x  + x RootOf(50324 _Z  - 135641), ---- + ---------------- x ,
2532504976                                    6418   6011940312110209

1089365505  2                             2
---------- x  + x RootOf(-73931 + 49304 _Z )}
607721104

```
This command means: give the Puiseux expansions up to accuracy 3, which means modulo x^3. So the coefficients of x^2 are given, but not the coefficients of x^3. To view the x^3 terms of the Puiseux expansions, we need to compute the Puiseux expansions up to accuracy > 3.

```> puiseux(f,x=0,y,4);
```
```
149882029318321335  3                2             4746694785  2
{-1 - ------------------ x  RootOf(50324 _Z  - 135641) - ---------- x
285733439684206208                                 2532504976

2
+ x RootOf(50324 _Z  - 135641),

6708313807195725                         2   3   1089365505  2
---------------- RootOf(-73931 + 49304 _Z ) x  + ---------- x
9153721340698688                                 607721104

2   6163   983148695281170   2
+ x RootOf(-73931 + 49304 _Z ), ---- + ---------------- x }
6418   6011940312110209
```
As one can see from the Puiseux expansions (and also from the picture), the point x=0, y=-1 is singular, because there are two Puiseux expansions going through this point. Namely

y=-1 + x*RootOf(50324_Z^2-135641) + higher order terms

and its conjugate. Similarly x=0, y=0 is a singular point.

## 2 Singularities

```> singularities(f,x,y);
```
```
{[[1/2, 1, 1], 2, 1], [[-1, -1/2, 1], 2, 1], [[-1/2, 1, 1], 2, 1],

[[1, -1/2, 1], 2, 1], [[0, 0, 1], 2, 1], [[0, -1, 1], 2, 1]}

```
The output consists of lists containing [the location of the singularity, the multiplicity, the delta invariant]. The location is given as a list of 3 homogeneous coordinates (x,y,z). The points (x,y,1) are points in the affine plane C^2, where C is the field of constants. The points (x,y,0) are on the line at infinity (in this example there are no singularities at infinity).

A point is singular if and only if the multiplicity of that point is > 1, and also if and only if the delta invariant is > 0. In this example all the singularities are double points. A double point has multiplicity 2 and delta invariant 1.

## 3 Genus

The genus of an algebraic curve equals (d-1)(d-2)/2 minus the sum of the delta invariants. Since these have already been determined by the previous command, computing the genus is easy now:
```> genus(f,x,y);
```
```                                       0

```
The genus only depends on the algebraic function field of the curve. This field does not change if we apply birational transformations, so the genus is invariant under such transformations. This means, for example, that subs(y=y-x^2,f) must have genus 0 as well:
```
> expand(subs(y=y-x^2,f));
```
```         2  3           2  2           2             4            5          4
-629448 x  y  + 170862 x  y  + 346239 x  y - 109768 x  y + 51344 y  + 53384 y

3          2          2           4          6           8
- 47264 y  + 73931 x  - 49304 y  - 256539 x  - 13830 x  + 469296 x

10            4  2              6           2  4           4  3
- 51344 x   + 1568040 x  y  - 1461272 y x  - 256720 x  y  + 513440 x  y

2  6             8
- 513440 y  x  + 256720 y x

```
Note that since this is actually a polynomial in x^2 instead of in x, this curve is not too complicated so the following command won't take too much time:
```> genus(",x,y);
```
```                                       0

```

## 4 Parametrization for curves with genus 0

An irreducible algebraic curve allows a parametrization if and only if the genus is 0. A parametrization is a birational map from the projective line (= the field of constants union {infinity}) to the algebraic curve. This map is 1-1, except for a finite number of points. It is a 1-1 map between the places of the projective line and the places of the algebraic curve f.

```> P:=parametrization(f,x,y,t);
```
```
4                      2
t (1099445881881426048 t  - 16040523292174584 t  + 53107291522493)
P := [3/2 ------------------------------------------------------------------, -
4                     2
241338906430052436 t  - 1824106392785178 t  + 469130474761

4                        2
693956497570032603672 t  - 2955191035472683371 t  - 2891251115952043
1/6418 --------------------------------------------------------------------
4                     2
241338906430052436 t  - 1824106392785178 t  + 469130474761

]

```
This parametrization algorithm computes a parametrization over an algebraic extension of the constants of degree <= 2 if degree(f,{x,y}) is even, and a rational (i.e. no field extension) parametrization if the degree of the curve is odd, like in this example.

If we substitute an arbitrary number for t (avoiding roots of the denominators to avoid "division by zero" messages), we get a point on the curve.

```> subs(t=123,P);
```
```             4385274978862261115427699  -3750586234234742809861291
[-------------------------, --------------------------]
5217400145311249701386    8371318533151900145873837

```
Let's verify if this is indeed a point on the curve:

```> subs(x="[1],y="[2],f);
```
```                                       0

```
OK.

## 5 Integral Basis

The function field of an irreducible algebraic curve f can be identified with the field C(x)[y]/(f). This is an algebraic extension of C(x) of degree degree(f,y).In some applications (integration of algebraic functions, and the method that algcurves[parametrization] uses) one needs to be able to recognize the poles of elements in the function field. For this purpose one can compute a basis (as a C[x] module) for the ring of functions in C(x)[y]/(f) that have no pole on the part of the curve in the affine part of the plane. This basis is computed as follows:

```> b:=integral_basis(f,x,y):b:=map(normal,b);
```
```                                                2
2         y (-6163 + 255 y + 6418 y )                       3
b := [1, y, y , 1/6418 ---------------------------, 1/154032 (4091100 y x
x

2  3            2  2            2               4             4
+ 6931440 x  y  + 4472580 x  y  - 8381355 x  y + 20001159 x  y + 616128 y

3            2           2             4             6
+ 24480 y  - 3757065 x  - 591648 y  + 13824317 x  - 15312572 x

5            3            3  2             10               8
- 19307156 x  + 3328820 x  - 5740240 x  y  - 13091520 x   y + 18641392 x

10             4  2               6            4  3
- 10652224 x   - 22233844 x  y  - 18819060 y x  - 8882512 x  y

2  6               8             9             7
+ 26405104 y  x  + 22910160 y x  - 10652224 x  + 26630560 x

9               7               5  2             5
- 13091520 x  y + 32728800 x  y + 33293392 x  y  - 23728380 x  y

3  10            3  9            3  8            3  7
+ 3286016 y  x   + 3286016 y  x  - 5750528 y  x  - 8215040 y  x

3  6            3  5            3  3             2  10
+ 4723648 y  x  + 5955904 y  x  - 1026880 y  x  + 18368768 y  x

2  9             8  2             2  7
+ 18368768 y  x  - 32145344 x  y  - 45921920 y  x )/(x (x - 1) (2 x + 1)

(2 x - 1) (x + 1))]

```
Note that this didn't require computation time because of the fact that it has already been determined for use in the parametrization algorithm. The map(normal, b) command makes the output look somewhat smaller.

The integral basis has a factor k in the denominator if and only if there is a singularity on the line x=RootOf(k). This can only happen if k^2 divides the discriminant discrim(f,y). The integral basis contains information about the singularities, in a form that is useful for computations. The advantage of this form is that it is rational, i.e. one needs no algebraic extensions of the field of constants to denote the integral basis, whereas we do need algebraic numbers to denote the Puiseux expansions.

Suppose that we are only interested in the singularities on the line x=0. Then we can compute a local integral basis for the factor x. A local integral basis for a factor x-alpha is a basis for all elements in the function field that are integral over C[[x-alpha]]. An element of the function field is integral over C[[x-alpha]] if it has no pole at the places on the line x=alpha.

```> b_local:=integral_basis(f,x,y,{x});
```
```                                                      2
2         y (-6163 + 255 y + 6418 y )
b_local := [1, y, y , 1/6418 ---------------------------,
x

2                        2
y  (-6163 + 255 y + 6418 y )
1/6418 ----------------------------]
x
```
An example of the kind of information that the integral basis contains is the sum of the multiplicities of the factor x-alpha in the denominators. This sum equals the sum of the delta invariants of the points on the line x=alpha. So this local integral basis for the set of factors {x} tells us that the sum of the delta invariants on the line x=0 is 2.

## 6 Homogeneous Representation

Until now an algebraic curve was represented by a polynomial in 2 variables x and y. An algebraic curve is normally not viewed as lying in the affine plane C^2 (where C is the field of constants) but in the projective plane P^2(C). The notation as a non-homogeneous polynomial in 2 variables is convenient if we want to study the affine part of the curve (for example in the integral basis computation), but not if we are interested in the part of the curve on the line at infinity. Often (for example for computing the genus) the part of the curve at infinity is needed as well. The non-homogenous notation in two variables can be converted to the homogeneous notation as follows:

```> homogeneous(f,x,y,z);
```
```       2  3          4             2    2          4            2  3
73931 x  z  + 40396 x  z + 247631 x  y z  + 90164 x  y - 49304 y  z

2  2            3  2           2  3          4            5
+ 29070 x  y  z - 47264 y  z  - 415912 x  y  + 53384 y  z + 51344 y

```
This can be converted again to f with:

```> subs(z=1,");
```
```       5          4          3           2  3          2          2  2
51344 y  + 53384 y  - 47264 y  - 415912 x  y  - 49304 y  + 29070 x  y

2            4            2          4
+ 247631 x  y + 90164 x  y + 73931 x  + 40396 x

```
Now the line at infinity is the line z=0 on homogeneous(f,x,y,z).
```> subs({x=z,z=x},homogeneous(f,x,y,z));
```
```       2  3          4             2    2          4            3  2
73931 z  x  + 40396 z  x + 247631 x  y z  + 90164 z  y - 49304 x  y

2  2            2  3           3  2            4          5
+ 29070 z  y  x - 47264 x  y  - 415912 y  z  + 53384 x y  + 51344 y

```
By switching x and z we can move the line x=0 to infinity.
```> switched:=subs(z=1,");
```
```                   3                     2                      3  2
switched := 73931 x  + 40396 x + 247631 x  y + 90164 y - 49304 x  y

2          2  3           3            4          5
+ 29070 x y  - 47264 x  y  - 415912 y  + 53384 x y  + 51344 y

```
```> singularities(switched,x,y);
```
```{[[-2, -2, 1], 2, 1], [[-1/2, 1/2, 0], 2, 1], [[-1, 0, 0], 2, 1],

[[-1, 1/2, 1], 2, 1], [[1, -1/2, 1], 2, 1], [[2, 2, 1], 2, 1]}

```
So we see that now there are two singularities at infinity, namely (1,0,0) and (-1,1,0). Note that this may look different in the output of singularities, because in homogeneous coordinates the points (x,y,z) and (c*x,c*y,c*z) are the same for nonzero c.

```>
> cusps:=761328152*x^6*z^4-5431439286*x^2*y^8+2494*x^2*z^8+
>  228715574724*x^6*y^4+9127158539954*x^10-15052058268*x^6*y^2*z^2+
>  3212722859346*x^8*y^2-134266087241*x^8*z^2-202172841*y^8*z^2
>  -34263110700*x^4*y^6-6697080*y^6*z^4-2042158*x^4*z^6-201803238*y^10+
>  12024807786*x^4*y^4*z^2-128361096*x^4*y^2*z^4+506101284*x^2*z^2*y^6+
>  47970216*x^2*z^4*y^4+660492*x^2*z^6*y^2-z^10-474*z^8*y^2-84366*z^6*y^4:
>
```
This curve is given in as a homogeneous polynomial; However, the input for the algorithms in this package must be the curve in its non-homogeneous representation:

```> cusps:=subs(z=1,cusps);
```
```                    6               8  2         2                 4  6
cusps := 761328152 x  - 5431439286 y  x  + 2494 x  + 228715574724 y  x

10                2  6                  8  2
+ 9127158539954 x   - 15052058268 y  x  + 3212722859346 x  y

8              8                6  4            6
- 134266087241 x  - 202172841 y  - 34263110700 y  x  - 6697080 y

4              10                4  4              4  2
- 2042158 x  - 201803238 y   + 12024807786 y  x  - 128361096 x  y

6  2             2  4           2  2            2          4
+ 506101284 y  x  + 47970216 x  y  + 660492 x  y  - 1 - 474 y  - 84366 y

```
This polynomial is a curve of degree 10 having a maximal number of cusps according to the Plucker formulas. It was found by Rob Koelman. It has 26 cusps and no other singularities.

```> singularities(cusps,x,y);
```
```                   2
{[[0, RootOf(117 _Z  + 1), 1], 2, 1],

2                     2
[[RootOf(17199 _Z  - 5), RootOf(3969 _Z  + 16), 1], 2, 1],

2
[[RootOf(-1 + 299 _Z ), 0, 1], 2, 1], [[%2, -81 %2, 1], 2, 1],

[[%2, 81 %2, 1], 2, 1], [[%1, - 1/9 %1, 1], 2, 1],

2
[[RootOf(29 _Z  + 3), 1, 0], 2, 1], [[%1, 1/9 %1, 1], 2, 1],

2                      2
[[RootOf(196 _Z  + 1), 3 RootOf(196 _Z  + 1), 1], 2, 1],

2                       2
[[RootOf(196 _Z  + 1), -3 RootOf(196 _Z  + 1), 1], 2, 1],

2                     2
[[RootOf(49 _Z  + 16), RootOf(637 _Z  - 1215), 1], 2, 1]}

2
%1 := RootOf(2240 _Z  - 9)

2
%2 := RootOf(802816 _Z  + 1)

```
Now lets check if these points are indeed cusps. The multiplicities are 2 and the delta invariants are 1, so that part is OK. To decide if these points are cusps or not, we can use Puiseux expansions. Let's take one of these points:

```> Point:=[RootOf(196*_Z^2+1), -3*RootOf(196*_Z^2+1), 1];
```
```                                  2                       2
Point := [RootOf(196 _Z  + 1), -3 RootOf(196 _Z  + 1), 1]

```
Now compute the Puiseux expansions at the line x=< the x coordinate of this point >

```> p0:=puiseux(cusps,x=Point[1],y,0);
```
```p0 := {

6                  4                2
RootOf(309215454912 _Z  + 238923279504 _Z  - 7009082108 _Z  + 211129875),

/                          2     \3/2
92236816 |   1053  x - RootOf(196 _Z  + 1)|
-3 x - -------- |- ------ -----------------------|   ,
1108809  |  134456                2       |
\           RootOf(196 _Z  + 1)  /

/                          2     \3/2
92236816 |   1053  x - RootOf(196 _Z  + 1)|
3 x - -------- |- ------ -----------------------|   }
1108809  |  134456                2       |
\           RootOf(196 _Z  + 1)  /

```
To obtain the y coordinates from the points on the line x=Point[1] from this, we only need to substitute x=Point[1].

```> subs(x=Point[1],p0);
```
```                       6                  4                2
{RootOf(309215454912 _Z  + 238923279504 _Z  - 7009082108 _Z  + 211129875),

2                       2
3 RootOf(196 _Z  + 1), -3 RootOf(196 _Z  + 1)}

```
We see that there are 8 different points on this line. The RootOf(..*_Z^6 + ...) stands for 6 conjugated points (namely the roots of the polynomial inside the RootOf). However, the expression 3*RootOf(196*_Z^2+1) is only 1 point, because our field of definition is not Q anymore but Q(RootOf(196*_Z^2+1)). This is because we needed to extend the field Q in order to be able to "look" on the line x=RootOf(196*_Z^2+1).
The Puiseux series in this set p0 (which have only been determined up to minimal accuracy) are series (with fractional powers) in (x-Point[1]). Lets substitute x -> x+Point[1] to get series in x instead of in (x-Point[1]), that makes it somewhat easier to read.

```> subs( x=x+Point[1], p0);
```
```                       6                  4                2
{RootOf(309215454912 _Z  + 238923279504 _Z  - 7009082108 _Z  + 211129875),

2        92236816 /   1053           x         \3/2
3 x + 3 RootOf(196 _Z  + 1) - -------- |- ------ -------------------|   ,
1108809  |  134456              2     |
\         RootOf(196 _Z  + 1)/

2        92236816 /   1053           x         \3/2
-3 x - 3 RootOf(196 _Z  + 1) - -------- |- ------ -------------------|   }
1108809  |  134456              2     |
\         RootOf(196 _Z  + 1)/

```
For determining the type of the singularity, the coefficients here are not relevant. We have an expansion of the form

< a constant >*x + < a constant > + < a constant > *x^(3/2) + higher order terms

The higher order terms (which have not yet been determined) have no influence on the type of the singularity, nor do the precise values of these constants. These expansions show that there are 6 regular points on this line and 2 cusps.

One can easily get more terms of the Puiseux expansions, although that is not necessary for determining the type of the singularities.

```subs( x=x+Point[1], puiseux(cusps,x=Point[1],y,4)  );
```
```                                                  3
5906833109761747935562   7/2   51265          x
{- ---------------------- %2    - ----- --------------------
5610014109268803            82134              2     2
RootOf(196 _Z  + 1)

2
209169532181512   5/2   301         x             92236816   3/2
+ --------------- %2    - --- ------------------- - -------- %2    - 3 x
15178486401           234              2        1108809
RootOf(196 _Z  + 1)

2         5906833109761747935562   7/2
- 3 RootOf(196 _Z  + 1), - ---------------------- %2
5610014109268803

3
51265          x             209169532181512   5/2
+ ----- -------------------- + --------------- %2
82134              2     2     15178486401
RootOf(196 _Z  + 1)

2
301         x             92236816   3/2                        2
+ --- ------------------- - -------- %2    + 3 x + 3 RootOf(196 _Z  + 1),
234              2        1108809
RootOf(196 _Z  + 1)

/  193855921647353839926617699              2
|- --------------------------- RootOf(196 _Z  + 1) %1
\   691811425164409349728500

18983147748332618556986              2        3
+ ----------------------- RootOf(196 _Z  + 1) %1
806453650272554625

288198802512920292455028              2        5\  3
+ ------------------------ RootOf(196 _Z  + 1) %1 | x
12634440520936689125                          /

/  669854261577818819      2481320965305   3   2201963921137071   5\  2
+ |- ------------------ %1 + ------------- %1  + ---------------- %1 | x
\  71084442425396400        9233424574          5424636937225      /

/198721068              2        3   1139399352              2        5
+ |--------- RootOf(196 _Z  + 1) %1  + ---------- RootOf(196 _Z  + 1) %1
\  49555                               211735

8427956323              2        \
- ---------- RootOf(196 _Z  + 1) %1| x + %1}
41923530                        /

6                  4                2
%1 := RootOf(309215454912 _Z  + 238923279504 _Z  - 7009082108 _Z  + 211129875)

1053           x
%2 := - ------ -------------------
134456              2
RootOf(196 _Z  + 1)

```
We see that if we compute more terms the result can get bigger quickly.

## 7 Graphics: Singularity Knot

A different way to show information about a singularity is the plot_knot command. The input of this procedure is a polynomial f in x and y, for which the singularity that we are interested in is located at x=0, y=0. For example the curve f on the top of this worksheet has a singularity at 0, a double point.

```> f:=51344*y^5+53384*y^4-47264*y^3-415912*x^2*y^3-49304*y^2+29070*x^2*y^2+247631
> *x^2*y+90164*x^4*y+73931*x^2+40396*x^4;
```

The curve f is irreducible and so it consists of only 1 component. But locally around the point 0 it has 2 components. To see this in the second picture at the top of this page, imagine that you could only see a very small environment around the point x=0, y=0 and nothing else. Then the curve would look like two intersecting lines. So even though the curve is globally irreducible, locally around the point 0 it is reducible and consists of 2 components.

Information on these components and their intersection multiplicities can be given in the form of Puiseux pairs, obtained by computing the Puiseux expansions. A different way to represent this information is as follows: By identifying C^2 with R^4 the curve can be viewed as a 2 dimensional surface over the real numbers. Now we can draw a small sphere inside R^4 around the point 0. The surface of the sphere has dimension 3 over R. The intersection with the curve (which has dimension 1 over the complex numbers, so dimension 2 over the real numbers) consists of a number of closed curves over the real numbers, inside a space (the sphere surface) of dimension 3. After applying a projection from the sphere surface to R^3 these curves can be plotted. See also: E. Brieskorn, H. Knörrer: Ebene Algebraische Kurven , Birkhäuser 1981.

In this plot, each component will correspond to one of the local components. Furthermore the winding number in the plot equals the intersection multiplicity of the two branches of the curve. In this example this number is 1. In case we want to see more complicated 3D plots, we only need to make the singularity more complicated and the intersection multiplicities of the branches higher. Since we are only interested in the curve locally, it does not matter if the curve is irreducible or not. However, the input of plot_knot must be squarefree.

```> plot_knot(y^3-x^2,x,y);
```

We see that a cusp gives a 2-3 torus-knot. More generally, if igcd(p,g)=1 then plot_knot(x^p-y^q,x,y) gives a p-q torus-knot.

It gets more interesting if we have plots consisting of more components. For this, we only need to have a singularity consisting of more components. In this example we start with a 2-3 torus-knot, using y^3-x^2. To obtain a high intersection multiplicity we add a high power of x and multiply these two components. Then we get:

```> plot_knot((y^3-x^2)*(y^3-x^2-x^10),x,y,colours=[blue,yellow],numpoints=500,
> lightmodel=light4,orientation=[0,0]);
```

It sometimes requires some tweaking with the various options (see the help page of plot_knot), or to change some of the coefficients (for example the coefficient of x^10) to get good pictures. They tend to look best when viewed from straight angles (the numbers theta and phi in the plot window are 0 or 90) and when using the light schemes under the color menu.

Animations of singularity knots:
 animation:Java animation:Java animation:Java animation:Java animation:Java animation:Java animation:Java animation:Java animation:Java

## 8 Weierstrass form, j-invariant

```> f:=y^4-(x^4-x^3-2*x^2);
```
```                                  4    4    3      2
f := y  - x  + x  + 2 x

```
```> genus(f,x,y);
```
```                                       1

```
```
> w:=Weierstrassform(f,x,y,x0,y0);
```
```                                   2                     2
2     3                  y             y      x0  + 288        y0
w := [y0  + x0  + 288 x0, -24 ---------, 144 -----, 2 ---------, 12 ---------]
x (x - 2)      x - 2      2             2
x0  - 576     x0  - 576

```
```
> j_invariant(f,x,y);
```
```                                      1728

```
For curves with genus 0 one can compute a parametrization, a bijection between the curve and a projective line. One can view this projective line as a normal form for curves with genus 0. For curves with genus 1 we can also compute a normal form, the Weierstrass normal form. In this form the curve is written as: y^2 - (polynomial in x of degree 3). To avoid ambiguity we will denote the Weierstrass normal form with the variables x0 and y0 instead of x and y.

```
> f0:=w[1];
```
```                                    2     3
f0 := y0  + x0  + 288 x0

```
Now the curves f and f0 are birationally equivalent. The Weierstrassform algorithm computes such an equivalence in two directions, namely [w[2] , w[3]] is a morphism from f to f0 and [w[4] , w[5]] is the inverse morphism. Let's check this for the point (-2,2,1) on f.

```
> subs(x=-2,y=2,[w[2],w[3]]);
```
```                                   [-12, -72]

```
Now check if this is on f0:

```
> subs(x0="[1],y0="[2],f0);
```
```                                       0

```
OK. Now try the inverse, and see if we get the point (-2,2,1):

```> subs(x0=""[1],y0=""[2],[w[4] , w[5]]);
```
```                                    [-2, 2]

```

OK.