# Singular

#### D.6.1.5 proximitymatrix

Procedure from library alexpoly.lib (see alexpoly_lib).

Usage:
proximitymatrix(INPUT); INPUT poly or list or intmat

Assume:
INPUT is either a REDUCED bivariate polynomial defining a plane curve singularity, or the output of hnexpansion(f[,"ess"]), or the list hne in the ring created by hnexpansion(f[,"ess"]), or the output of develop(f) resp. of extdevelop(f,n), or a list containing the contact matrix and a list of integer vectors with the characteristic exponents of the branches of a plane curve singularity, or an integer vector containing the characteristic exponents of an irreducible plane curve singularity, or the resolution graph of a plane curve singularity (i.e. the output of resolutiongraph or the first entry in the output of totalmultiplicities).

Return:
list, of three integer matrices. The first one is the proximity matrix of the plane curve defined by the INPUT, i.e. the entry i,j is 1 if the infinitely near point corresponding to row i is proximate to the infinitely near point corresponding to row j. The second integer matrix is the incidence matrix of the resolution graph of the plane curve. The entry on the diagonal in row i is -s-1 if s is the number of points proximate to the infinitely near point corresponding to the ith row in the matrix. The third integer matrix is the incidence matrix of the Enriques diagram of the plane curve singularity, i.e. each row corresponds to an infinitely near point in the minimal standard resolution, including the strict transforms of the branches, the diagonal element gives the level of the point, and the entry i,j is -1 if row i is proximate to row j.

Note:
In case the Hamburger-Noether expansion of the curve f is needed for other purposes as well it is better to calculate this first with the aid of hnexpansion and use it as input instead of the polynomial itself.
If you are not sure whether the INPUT polynomial is reduced or not, use squarefree(INPUT) as input instead.
If the input is a smooth curve, then the output will consist of three one-by-one zero matrices.
For the definitions of the computed objects see e.g. the book Eduardo Casas-Alvero, Singularities of Plane Curves.

Example:
 LIB "alexpoly.lib"; ring r=0,(x,y),ls; poly f1=(y2-x3)^2-4x5y-x7; poly f2=y2-x3; poly f3=y3-x2; list proximity=proximitymatrix(f1*f2*f3); /// The proximity matrix P /// print(proximity[1]); ==> 1 0 0 0 0 0 0 0 0 0 ==> -1 1 0 0 0 0 0 0 0 0 ==> -1 -1 1 0 0 0 0 0 0 0 ==> 0 0 -1 1 0 0 0 0 0 0 ==> 0 0 -1 -1 1 0 0 0 0 0 ==> 0 0 0 0 -1 1 0 0 0 0 ==> 0 0 0 -1 0 0 1 0 0 0 ==> -1 0 0 0 0 0 0 1 0 0 ==> -1 0 0 0 0 0 0 -1 1 0 ==> 0 0 0 0 0 0 0 0 -1 1 /// The proximity resolution graph N /// print(proximity[2]); ==> -5 0 1 0 0 0 0 0 1 0 ==> 0 -2 1 0 0 0 0 0 0 0 ==> 1 1 -3 0 1 0 0 0 0 0 ==> 0 0 0 -3 1 0 1 0 0 0 ==> 0 0 1 1 -2 1 0 0 0 0 ==> 0 0 0 0 1 -1 0 0 0 0 ==> 0 0 0 1 0 0 -1 0 0 0 ==> 0 0 0 0 0 0 0 -2 1 0 ==> 1 0 0 0 0 0 0 1 -2 1 ==> 0 0 0 0 0 0 0 0 1 -1 /// They satisfy N=-transpose(P)*P /// print(-transpose(proximity[1])*proximity[1]); ==> -5 0 1 0 0 0 0 0 1 0 ==> 0 -2 1 0 0 0 0 0 0 0 ==> 1 1 -3 0 1 0 0 0 0 0 ==> 0 0 0 -3 1 0 1 0 0 0 ==> 0 0 1 1 -2 1 0 0 0 0 ==> 0 0 0 0 1 -1 0 0 0 0 ==> 0 0 0 1 0 0 -1 0 0 0 ==> 0 0 0 0 0 0 0 -2 1 0 ==> 1 0 0 0 0 0 0 1 -2 1 ==> 0 0 0 0 0 0 0 0 1 -1 /// The incidence matrix of the Enriques diagram /// print(proximity[3]); ==> 0 0 0 0 0 0 0 0 0 0 ==> -1 1 0 0 0 0 0 0 0 0 ==> -1 -1 2 0 0 0 0 0 0 0 ==> 0 0 -1 3 0 0 0 0 0 0 ==> 0 0 -1 -1 4 0 0 0 0 0 ==> 0 0 0 0 -1 5 0 0 0 0 ==> 0 0 0 -1 0 0 4 0 0 0 ==> -1 0 0 0 0 0 0 1 0 0 ==> -1 0 0 0 0 0 0 -1 2 0 ==> 0 0 0 0 0 0 0 0 -1 3 /// If M is the matrix of multiplicities and TM the matrix of total /// multiplicities of the singularity, then M=P*TM. /// We therefore calculate the (total) multiplicities. Note that /// they have to be slightly extended. list MULT=extend_multiplicities(totalmultiplicities(f1*f2*f3)); intmat TM=MULT[1]; // Total multiplicites. intmat M=MULT[2]; // Multiplicities. /// Check: M-P*TM=0. M-proximity[1]*TM; ==> 0,0,0, ==> 0,0,0, ==> 0,0,0, ==> 0,0,0, ==> 0,0,0, ==> 0,0,0, ==> 0,0,0, ==> 0,0,0, ==> 0,0,0, ==> 0,0,0 /// Check: inverse(P)*M-TM=0. intmat_inverse(proximity[1])*M-TM; ==> 0,0,0, ==> 0,0,0, ==> 0,0,0, ==> 0,0,0, ==> 0,0,0, ==> 0,0,0, ==> 0,0,0, ==> 0,0,0, ==> 0,0,0, ==> 0,0,0