# Singular

Procedure from library `paraplanecurves.lib` (see paraplanecurves_lib).

Usage:
adjointIdeal(f [, choices]); f polynomial in three variables, choices optional list consisting of one integer or of one string or of one integer followed by one string.
Optional integer can be:
1: compute integral basis via normalization.
2: make local analysis of singularities first and apply normalization separately.
3: normalization via ideal quotient.
4: normalization via local ideal quotient.
The default is 2.
Optional string may contain substrings:
- rattestyes -> causes error message if curve is not rational.
- firstchecksdone -> prevents that check of assumptions will be done more than once.

Assume:
The basering must be a polynomial ring in three variables, say x,y,z, with coefficients in Q.
The polynomial f must be homogeneous and absolutely irreducible.
All these conditions will be checked automatically.

Return:
ideal, the adjoint ideal of the curve defined by f.

Theory:
Considering C in the chart z<>0, the algorithm regards x as transcendental and y as algebraic and computes an integral basis in C(x)[y] of the integral closure of C[x] in C(x,y) using the normalization algorithm from normal_lib: see integralbasis_lib. In a future edition of the library, also van Hoeij's algorithm for computing the integral basis will be available.
From the integral basis, the adjoint ideal is obtained by linear algebra. Alternatively, the algorithm starts with a local analysis of the singular locus of C. Then, for each primary component of the singular locus which does not correspond to ordinary multiple points or cusps, the integral basis algorithm is applied separately. The ordinary multiple points and cusps, in turn, are addressed by a straightforward direct algorithm. The adjoint ideal is obtained by intersecting all ideals obtained locally. The local variant of the algorithm is used by default.

Example:
 ```LIB "paraplanecurves.lib"; ring R = 0,(x,y,z),dp; poly f = y^8-x^3*(z+x)^5; adjointIdeal(f); ==> _[1]=y6 ==> _[2]=xy5+y5z ==> _[3]=x2y4+xy4z ==> _[4]=x3y3+2x2y3z+xy3z2 ==> _[5]=x4y2+3x3y2z+3x2y2z2+xy2z3 ==> _[6]=x5y+3x4yz+3x3yz2+x2yz3 ==> _[7]=x6+4x5z+6x4z2+4x3z3+x2z4 ```