LIB "sing.lib"; LIB"primdec.lib"; //====================Codimension & Milnor Number============================ proc coDimiL(ideal f) { module D=jacob(f); module TK=maxideal(1)*D+f*freemodule(nvars(basering)); module STK=std(TK); int c=vdim(STK)-nvars(basering); int mi=vdim(std(f))-1; list L=c,mi; return(L); } //===========================Sigma-Invariant================================== proc siGmaa(ideal f) { int k=1; module D=jacob(f); module TK=maxideal(1)*D+f*freemodule(nvars(basering)); module STK=std(TK); int t = size(reduce(maxideal(k)*freemodule(nvars(basering)),STK)); while(t!=0) { k=k+1; t= size(reduce(maxideal(k)*freemodule(nvars(basering)),STK)); } return(k); } //=========================== Compute p,q,r ================================== proc expValue(ideal f) { list L,C; int a,b,c,n; C=tangentcone(f); n=size(C[1]); L[1]=deg(C[1][n])-2; L[2]=deg(C[1][n-1])-1; L[3]=deg(C[1][n-2])-1; return(L); } //====================IX(2)-IX(3)============================== proc testp(ideal I, int p) { //test how many (p+1)-th power of different elements of //order 1 are in I and gives this number back //in case of xz+y^p,x2+z2+y3,yz it is 2 //in case of xz+xy^(p-1)+y^p,x2+z2+y3,yz it is 1 def R=basering; ring R1=(0,a,b,c),(x,y,z),dp; int j; ideal H; ideal I=imap(R,I); poly f=a*x+b*y+c*z; poly g=jet(reduce(f^(p+1),std(I)),p+1); matrix M=coef(g,xyz); for (j=1;j<=ncols(M);j++) { H[j]=M[2,j]; } ring R2=0,(a,b,c),dp; ideal H=imap(R1,H); H=std(H); int d=dim(H); setring R; return(d+1); } //====================XII(2)-XII(4)============================== proc testSquare(ideal I) { def R=basering; ring R1=(0,a,b,c),(x,y,z),dp; int j; ideal H; ideal I=imap(R,I); poly f=(a*x+b*y+c*z)^2; poly g=jet(reduce(f,std(I)),2); matrix M=coef(g,xyz); for (j=1;j<=ncols(M);j++) { H[j]=M[2,j]; } ring R2=0,(a,b,c),dp; ideal H=imap(R1,H); list L=minAssGTZ(H); for(j=1;j<=size(L);j++) { if(size(reduce(maxideal(1),std(L[j])))!=0) { setring R; return(1); } } setring R; return(0); } //====================XI(2)-XI(3) for p=3 ============================== proc diffType(ideal I) { def R=basering; ring R1=(0,a,b,c,d,e,f,g,h,k,l,m,n,a1,a2,a3,b1,b2,b3,c1,c2,c3),(x,y,z),ds; ideal I=imap(R,I); poly p1,p2,p3,q1,q2,q3; matrix N; p1=I[1]; p2=I[2]; p3=I[3]; q1=xz+xy2+y3; q2=yz; q3=x2+z3; map phi=R1,d*x+e*y+f*z, b*x+c*y+k*z,l*x+m*y+a*z; matrix T[3][3]=a1,a2,a3,b1,b2,b3,c1,c2,c3; matrix T1[3][3]=d,e,f,b,c,k,l,m,a; poly de=det(T1)*det(T); matrix G[3][1]=q1,q2,q3; N=T*G; poly r1=jet(phi(p1)-N[1,1],3); poly r2=jet(phi(p2)-N[2,1],3); poly r3=jet(phi(p3)-N[3,1],3); int j; ideal H1,H2,H3,H; matrix M=coef(r1,xyz); for (j=1;j<=ncols(M);j++) { H1[j]=M[2,j]; } M=coef(r2,xyz); for (j=1;j<=ncols(M);j++) { H2[j]=M[2,j]; } M=coef(r3,xyz); for (j=1;j<=ncols(M);j++) { H3[j]=M[2,j]; } ring S1=32003,(a,b,c,d,e,f,g,h,k,l,m,n,a1,a2,a3,b1,b2,b3,c1,c2,c3),dp; ideal H1=imap(R1,H1); ideal H2=imap(R1,H2); ideal H3=imap(R1,H3); ideal H=H1+H2+H3; poly de=imap(R1,de); H=H,n*de-1; ideal J=std(H); int re; if(J[1]!=1){re=1;} setring R; return(re); } //====================XI(2)-XI(3) for p>3============================== proc diffType1(ideal I) { def R=basering; ring R1=(0,a,b,c,d,e,f,g,h,k,l,m,n,a1,a2,a3,b1,b2,b3,c1,c2,c3),(x,y,z),ds; ideal I=imap(R,I); poly p1,p2,p3,q1,q2,q3; matrix N; p1=I[1]; p2=I[2]; p3=I[3]; q1=xz+xy2+y3; q2=yz; q3=x2; map phi=R1,d*x+e*y+f*z, b*x+c*y+k*z,l*x+m*y+a*z; matrix T[3][3]=a1,a2,a3,b1,b2,b3,c1,c2,c3; matrix T1[3][3]=d,e,f,b,c,k,l,m,a; poly de=det(T1)*det(T); matrix G[3][1]=q1,q2,q3; N=T*G; poly r1=jet(phi(p1)-N[1,1],3); poly r2=jet(phi(p2)-N[2,1],3); poly r3=jet(phi(p3)-N[3,1],3); int j; ideal H1,H2,H3,H; matrix M=coef(r1,xyz); for (j=1;j<=ncols(M);j++) { H1[j]=M[2,j]; } M=coef(r2,xyz); for (j=1;j<=ncols(M);j++) { H2[j]=M[2,j]; } M=coef(r3,xyz); for (j=1;j<=ncols(M);j++) { H3[j]=M[2,j]; } ring S1=32003,(a,b,c,d,e,f,g,h,k,l,m,n,a1,a2,a3,b1,b2,b3,c1,c2,c3),dp; ideal H1=imap(R1,H1); ideal H2=imap(R1,H2); ideal H3=imap(R1,H3); ideal H=H1+H2+H3; poly de=imap(R1,de); H=H,n*de-1; ideal J=std(H); int re; if(J[1]!=1){re=1;} setring R; return(re); } //====================XI(1)-XI(4) for p=3 ============================== proc diffType2(ideal I) { def R=basering; ring R1=(0,a,b,c,d,e,f,g,h,k,l,m,n,a1,a2,a3,b1,b2,b3,c1,c2,c3),(x,y,z),ds; ideal I=imap(R,I); poly p1,p2,p3,q1,q2,q3; matrix N; p1=I[1]; p2=I[2]; p3=I[3]; q1=xz+xy2+y3; q2=yz; q3=x2+y3+z3; map phi=R1,d*x+e*y+f*z, b*x+c*y+k*z,l*x+m*y+a*z; matrix T[3][3]=a1,a2,a3,b1,b2,b3,c1,c2,c3; matrix T1[3][3]=d,e,f,b,c,k,l,m,a; poly de=det(T1)*det(T); matrix G[3][1]=q1,q2,q3; N=T*G; poly r1=jet(phi(p1)-N[1,1],3); poly r2=jet(phi(p2)-N[2,1],3); poly r3=jet(phi(p3)-N[3,1],3); int j; ideal H1,H2,H3,H; matrix M=coef(r1,xyz); for (j=1;j<=ncols(M);j++) { H1[j]=M[2,j]; } M=coef(r2,xyz); for (j=1;j<=ncols(M);j++) { H2[j]=M[2,j]; } M=coef(r3,xyz); for (j=1;j<=ncols(M);j++) { H3[j]=M[2,j]; } ring S1=32003,(a,b,c,d,e,f,g,h,k,l,m,n,a1,a2,a3,b1,b2,b3,c1,c2,c3),dp; ideal H1=imap(R1,H1); ideal H2=imap(R1,H2); ideal H3=imap(R1,H3); ideal H=H1+H2+H3; poly de=imap(R1,de); H=H,n*de-1; ideal J=std(H); int re; if(J[1]!=1){re=1;} setring R; return(re); } //====================XI(1)-XI(4) for p>3 ============================== proc diffType3(ideal I) { def R=basering; ring R1=(0,a,b,c,d,e,f,g,h,k,l,m,n,a1,a2,a3,b1,b2,b3,c1,c2,c3),(x,y,z),ds; ideal I=imap(R,I); poly p1,p2,p3,q1,q2,q3; matrix N; p1=I[1]; p2=I[2]; p3=I[3]; q1=xz+xy2+y3; q2=yz; q3=x2+y3; map phi=R1,d*x+e*y+f*z, b*x+c*y+k*z,l*x+m*y+a*z; matrix T[3][3]=a1,a2,a3,b1,b2,b3,c1,c2,c3; matrix T1[3][3]=d,e,f,b,c,k,l,m,a; poly de=det(T1)*det(T); matrix G[3][1]=q1,q2,q3; N=T*G; poly r1=jet(phi(p1)-N[1,1],3); poly r2=jet(phi(p2)-N[2,1],3); poly r3=jet(phi(p3)-N[3,1],3); int j; ideal H1,H2,H3,H; matrix M=coef(r1,xyz); for (j=1;j<=ncols(M);j++) { H1[j]=M[2,j]; } M=coef(r2,xyz); for (j=1;j<=ncols(M);j++) { H2[j]=M[2,j]; } M=coef(r3,xyz); for (j=1;j<=ncols(M);j++) { H3[j]=M[2,j]; } ring S1=32003,(a,b,c,d,e,f,g,h,k,l,m,n,a1,a2,a3,b1,b2,b3,c1,c2,c3),dp; ideal H1=imap(R1,H1); ideal H2=imap(R1,H2); ideal H3=imap(R1,H3); ideal H=H1+H2+H3; poly de=imap(R1,de); H=H,n*de-1; ideal J=std(H); int re; if(J[1]!=1){re=1;} setring R; return(re); } //====================Main Procedure============================== proc eqdimMapgerms(ideal f) { int c,mu,sig,p,q; number u; list L,M; ideal K,I; L=coDimiL(f); c=L[1]; mu=L[2]; sig=siGmaa(f); I=jet(f,2); K=radical(det(jacob(I))); ideal J=slocus(K); list LI=primdecGTZ(K); list LJ=primdecGTZ(J); //========================= Type-1 ==================================== if(size(LI)==1 && size(LJ)==1 && c==10 && sig==3 ) { return("f is of type (x2+ayz,y2+axz,z2+axy)"); } //========================= Type-2 ==================================== if(size(LI)==1 && size(LJ)==2 && c-sig==7) { return("f is of type (xy+z"+string(sig)+",x2+yz,y2+xz)"); } //========================= Type-4 ==================================== if(size(LI)==2 && size(LJ)==3 && c-mu==2) { return("f is of type (x2+yz, xy+z"+string(sig)+", xz+y"+string(c-sig-5)+")"); } //========================= Type-6,7 and 10 ==================================== if(size(LI)==3 && size(LJ)==3) { list P=primdecGTZ(I); if(size(P)==1 && c==11 && sig==3) { return("f is of type (x2+yz, y2, z2)"); } if(size(P)==1 && c==12 && sig==3) { return("f is of type (x2, y2, z2)"); } if(size(P)==3 && c-mu==2) { M=expValue(f); return("f is of type (xy+z"+string(M[1])+", yz+x"+string(M[2])+", xz+y"+string(M[3])+")"); } } //========================= Type-9==================================== if(size(LI)==3 && size(LJ)==1) { if(c==13 && sig==4 && mu==9) { return("f is of type (xz+y3, x2+z2+ay3, yz)"); } if(c==13 && sig==4 && mu==10) { return("f is of type (xz+xy2, x2+z2+y3, yz)"); } if(c-2*sig==5 && sig>4) { return("f is of type (xz+xy"+string(sig-2)+", x2+z2+y3, yz)"); } if(c-2*sig==6) { int n=testp(f,sig); if(n==2) { return("f is of type (xz+xy"+string(sig-1)+"+y"+string(sig)+", x2+z2+y3, yz)"); } if(n==3) { return("f is of type (xz+y"+string(sig)+", x2+z2+y3, yz)"); } } } //========================= Type-5,8,11,12 ==================================== if(size(LI)==2 && size(LJ)==1) { list P=primdecGTZ(I); int a=dim(std(P[1][2])); int b=dim(std(P[2][2])); //========================= Type-12 ==================================== if(size(P)==2 && size(J)==3 && a==0 || b==0) { if(c==13 && sig==3 && mu==9) { return("f is of type (y2+x3+x2z, z2+x3,xy)"); } if(c==14 && sig==4 && mu==10) { return("f is of type (y2+x4+x2z, z2+x3,xy)"); } if(c==14 && sig==4 && mu==9) { int c=testSquare(f); if(c==0) { return("f is of type (y2+x3,z2+x3,xy)"); } if(c==1) { return("f is of type (y2+x3+x2z,z2,xy)"); } } if(c==15 && sig==5) { return("f is of type (y2+x2z, z2+x3,xy)"); } if(c==15 && sig==4 && mu==9) { return("f is of type (y2+x3, z2,xy)"); } if(c==15 && sig==4 && mu==11) { return("f is of type (y2+x4+x3z, z2+x3,xy)"); } if(c>=16 && c-2*sig==5) { return("f is of type (y2+x"+string(sig-3)+"z, z2+x3,xy)"); } if(c>=16 && c-2*sig==7) { return("f is of type (y2+x"+string(sig)+"+x"+string(sig-1)+"z, z2+x3,xy)"); } if(c>=16 && c-2*sig==6 && mu-2*sig==1) { return("f is of type (y2+x"+string(sig-1)+", z2+x3,xy)"); } if(c>=16 && c-2*sig==6 && mu-2*sig==2) { return("f is of type (y2+x"+string(sig)+"+x"+string(sig-2)+"z, z2+x3,xy)"); } } //========================= Type-5==================================== if(size(P)==2 && size(J)==4 && a==0 || b==0) { if(c-mu==3) { return("f is of type (x2+yz,xy, z2+y"+string(sig)+")"); } } //========================= Type-8 ==================================== if(size(P)==3) { if(c-mu==3) { return("f is of type (x2+y"+string(sig)+"+z"+string(c-sig-6)+",yz+z2, xy)"); } if(c-mu==4) { return("f is of type (x2+y"+string(sig-1)+"+z"+string(sig-1)+",yz+z2, xy)"); } } //========================= Type-11 ==================================== if(size(P)==2 && size(J)==3 && a==1 && b==1) { if(c==13 && sig==3) { int d=testp(f,3); if(d==2) { return("f is of type (xz+xy2+y3,yz,x2+y3+az3)"); } if(d==3) { return("f is of type (xz+y3,yz,x2+y3+z3)"); } } if(c==14 && sig==4 && mu==10) { int s=diffType(f); if(s==1) { return("f is of type (xz+xy2+y3,yz,x2+z3)"); } if(s==0) { return("f is of type (xz+y3,yz,x2+z3)"); } } if(c-mu==4) { int e=diffType1(f); if(e==0) { return("f is of type (xz+y3,yz,x2+z"+string(c-11)+")"); } if(e==1) { return("f is of type (xz+xy2+y3,yz,x2+z"+string(c-11)+")"); } } if(c>=14 && c-mu==3) { poly h=det(jacob(f)); u=milnor(h); if(u==number(2*c-2*sig-3)) { return("f is of type (xz+xy"+string(sig-2)+",yz,x2+y3+z"+string(c-2*sig-3)+")"); } if(u==number(2*(c-sig-2))) { return("f is of type (xz+y"+string(sig)+",yz,x2+y3+z"+string(c-2*sig-4)+")"); } if(u==number(c+sig)) { int v=diffType3(f); if(v==1) { return("f is of type (xz+xy2+y3,yz,x2+y3+az"+string(c-10)+")"); } if(v==0) { return("f is of type (xz+y"+string((c-sig-4) div 2)+",yz,x2+y3+z"+string(sig)+")"); } } } } } else{return(0);} }