Changeset 6e17f8 in git for Singular/LIB


Ignore:
Timestamp:
Oct 7, 2010, 8:46:50 PM (14 years ago)
Author:
Anne Frühbis-Krüger <anne@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
6237df24aaf50dfa474a5ed678260dbeb6672678
Parents:
d0579a05a4cf0bbd2234e1d03abd8a0e56876f0b
Message:
anne: added OVERVIEW and REFERENCES to resjung.lib

git-svn-id: file:///usr/local/Singular/svn/trunk@13413 2c84dea3-7e68-4137-9b89-c4e89433aadc
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Singular/LIB/resjung.lib

    rd0579a0 r6e17f8  
    1 //
    21version="$Id$";
    3 category="Commutative Algebra";
     2category="Algebraic Geometry";
    43info="
    54LIBRARY:  resjung.lib      Resolution of surface singularities (Desingularization)
    6                            by Jung's Algorithm
    7 AUTHORS:  Philipp Renner,   philipp_renner@web.de
    8           Anne Fruehbis-Krueger, anne@math.uni-hannover.de
    9 
    10 PROCEDURES:
    11  jungresolve(J,i)  computes a resolution of the surface given by the
     5                           by Jung's Algorithm
     6AUTHORS:  Philipp Renner,   philipp_renner@web.de 
     7@*        Anne Fruehbis-Krueger, anne@math.uni-hannover.de
     8OVERVIEW: This library implements resolution of singularities by Jung's algorithm,
     9@*        which is only applicable to surfaces and persues the following strategy:
     10@*        1) project surface to the plane
     11@*        2) resolve singularities of the branch locus
     12@*        3) pull-back the original surface by this resolution morphism
     13@*        4) normalize the resulting surface so that the remaining singularities
     14@*           are of Hirzebruch-Jung type
     15@*        5) resolve Hirzebruch-Jung singularities explicitly
     16@*        Currently, the Hirzebruch-Jung singularities are resolved by calling
     17@*        the procedure resolve from the library resolve.lib, because this is not
     18@*        overly expensive and the original last step of Jung's algorithm is not
     19@*        implemented yet.
     20REFERENCES:
     21[1] Jung, H.: Darstellung der Funktionen eines algebraischen Körpers zweier unabhÀngigen
     22@*  VerÀnderlichen x,y in der Umgebung x=a, y= b, Journal fÃŒr Reine und Angewandte
     23@*  Mathematik 133: 289–314 (1908)
     24@*  (the origin of this method)
     25[2] J.Kollar: Lectures on Resolution of Singularities, Princeton University Press (2007)
     26@*  (contains large overview over various known methods for curves and surfaces as well as
     27@*   a detailed description of the approach in the general case)
     28 
     29MAIN PROCEDURES:
     30 jungresolve(J,i)  computes a resolution of the surface given by the
    1231                   ideal J using Jungs Method
     32
     33AUXILLARY PROCEDURES:
    1334 clocus(J)         computes the critical locus of the projection of V(J)
    14                    onto the coordinate plane of the last two coordinates
    15  embR(C)           computes a strong embedded resolution of
     35                   onto the coordinate plane of the last two coordinates 
     36 embR(C)           computes a strong embedded resolution of 
    1637                   the plane curve V(C)
    1738 jungnormal(J,i)   computes intermediate step in Jung's algorithm
    18                    such that all singularities are of Hirzebruch-Jung type
     39                   such that all singularities are of Hirzebruch-Jung type 
    1940";
    2041
     
    2950//Critical locus for the Weierstrass map induced by the noether normalization
    3051//----------------------------------------------------------------------------
    31 proc clocus(ideal id)
     52proc clocus(ideal id)     
    3253"USAGE:  clocus(ideal J);
    3354@*       J = ideal
    34 ASSUME:  J  = two dimensional ideal in noether position with respect
    35          to the last two variables
     55ASSUME:  J  = two dimensional ideal in noether position with respect   
     56         to the last two variables 
    3657RETURN:  A ring containing the ideal Clocus respresenting the critical
    3758         locus of the projection V(J)-->C^2 onto the coordinate plane
     
    5172      lowdim = intersect(lowdim,l[j]);
    5273    }
    53   }
     74  } 
    5475  //lowdim = radical(lowdim);  // affects performance
    55   ideal I = l[size(l)];
     76  ideal I = l[size(l)]; 
    5677  poly product=1;
    57   kill l;
    58   for(i=1; i < n-1; i++){
     78  kill l; 
     79  for(i=1; i < n-1; i++){ 
    5980  //elimination of all variables exept var(i),var(n-1),var(n)
    6081    intvec v;
     
    7798    ringl[3]=ll;
    7899    kill l,ll;
    79     def R = ring(ringl); //now x_j > x_i > x_n-1 > x_n forall j != i,n-1,n
     100    def R = ring(ringl); //now x_j > x_i > x_n-1 > x_n forall j != i,n-1,n 
    80101    setring R;
    81102    ideal J = groebner(fetch(A,I));  //this eliminates the variables
    82103    setring A;
    83     ideal J = fetch(R,J);
     104    ideal J = fetch(R,J);   
    84105    attrib(J,"isPrincipal",0);
    85106    if(size(J)==1){
     
    89110    if(attrib(J,"isPrincipal")==0){
    90111      setring R;
    91       for(j = 1;j<=size(J);j++)
    92       {   //determines the monic polynomial in var(i) with coefficents in C2
     112      for(j = 1;j<=size(J);j++){   //determines the monic polynomial in var(i) with coefficents in C2
    93113        if(defined(w)) {kill w;}
    94114        intvec w = leadexp(J[j]);
     
    108128      setring A;
    109129    }
    110     //Product of the discriminants, which lies in C2:
    111     product = product*resultant(J[index],diff(J[index],var(i)),var(i));
     130    product = product*resultant(J[index],diff(J[index],var(i)),var(i));   //Product of the discriminants, which lies in C2
    112131    kill index,J,v;
    113132  }
     
    116135  ideal Clocus = imap(A,product);      //the critical locus is contained in this
    117136  ideal I = preimage(A,LastTwo,lowdim);
    118   //radical is necessary since the resultant is not reduced in general:
    119   Clocus = radical(intersect(Clocus,I));
     137  Clocus = radical(intersect(Clocus,I));  //radical is necessary since the resultant is not reduced in general
    120138  export(Clocus);
    121139  return(C2);
     
    133151///////////////////////////////////////////////////////////////////////////////
    134152//-----------------------------------------------------------------------------
    135 // Build the fibre product of the embedded resolution and
     153// Build the fibre product of the embedded resolution and 
    136154// the coordinate ring of the variety
    137155//-----------------------------------------------------------------------------
    138 static
     156static 
    139157proc buildFP(list embR,ideal NoetherN, map phi){
    140158  def A = basering;
     
    147165    setring R;
    148166    list temp = ringlist(A);
    149 // create data for the new ring
     167// create data for the new ring 
    150168// e.g. if A=K[x_1,..,x_n] and R=K[y_1,..,y_m], K[x_1,..,x_n-2,y_1,..,y_m]
    151169    for(j = 1; j<= nvars(R);j++){
     
    159177    int m = size(J);
    160178    def R2 = ring(temp);
    161     kill temp;
     179    kill temp; 
    162180    setring R2;
    163181    ideal Temp=0;           //defines map from R to R2 which is the inclusion
     
    173191    FibPMI= FibPMI+ideal(f(J));
    174192    map FibMap = A,FibPMI;
    175     kill f,FibPMI;
     193    kill f,FibPMI; 
    176194    ideal TotalT = groebner(FibMap(NoetherN));
    177195    ideal QIdeal = TotalT;
     
    191209// embedded resolution for curves -- optimized for our situation
    192210//-----------------------------------------------------------------------------
    193 proc embR(ideal C)
     211proc embR(ideal C) 
    194212"USAGE:  embR(ideal C);
    195213@*       C = ideal
    196 ASSUME:  C  = ideal of plane curve
     214ASSUME:  C  = ideal of plane curve 
    197215RETURN:  a list l of rings
    198216         l[i] is a ring containing a basic object BO, the result of the
    199          resolution.
     217         resolution. 
    200218NOTE:    Algorithm does not touch normal crossings of V(C)
    201219EXAMPLE: example embR; shows an example
     
    205223  attrib(J,"iswholeRing",1);
    206224  list primdec = equidim(C);
    207   if(size(primdec)==2){
    208 // zero dimensional components of the discrimiant curve
    209 // are smooth an cross normally so they can be ignored
     225  if(size(primdec)==2){   
     226// zero dimensional components of the discrimiant curve 
     227// are smooth an cross normally so they can be ignored 
    210228// in the resolution process
    211229    ideal Lowdim = radical(primdec[1]);
     
    220238  list result = resolve2(BO);
    221239  if(defined(Lowdim)){
    222     for(int i = 1;i<=size(result);i++){
     240    for(int i = 1;i<=size(result);i++){       
    223241// had zero dimensional components which are now added to the end result
    224242      if(defined(R)) {kill R;}
    225243      def R = result[i];
    226       setring R;
     244      setring R; 
    227245      map f = R2,BO[5];
    228246      BO[2]=BO[2]*f(Lowdim);
     
    243261}
    244262///////////////////////////////////////////////////////////////////////////////
    245 static
     263static 
    246264proc resolve2(list BO){
    247 // computes an embedded resolution for the basic object BO
    248 // and returns a list of rings with BO -- specifically optimized
    249 // to our situation
     265// computes an embedded resolution for the basic object BO 
     266// and returns a list of rings with BO -- specifically optimized 
     267// to our situation 
    250268  def H = basering;
    251269  int i,j,k;
     
    255273  result[1]=H;
    256274  attrib(result[1],"isResolved",0);    // has only simple normal crossings
    257   attrib(result[1],"smoothC",0);       // has smooth components
     275  attrib(result[1],"smoothC",0);       // has smooth components 
    258276  int safety=0;                        // number of runs restricted to 30
    259277  while(1){
     
    265283        def R = result[j];
    266284        setring R;
    267         if(attrib(result[j],"smoothC")==0){
     285        if(attrib(result[j],"smoothC")==0){     
    268286// has possibly singular components so choose a singular point and blow up
    269287          list primdecPC = primdecGTZ(BO[2]);
     
    280298              if(defined(blowup)){kill blowup;}
    281299              list blowup = blowUpBO(BO,primdecSL[index][2],3);
    282 // if it has only a rational singularity, blow it up,
     300// if it has only a rational singularity, blow it up, 
    283301// else choose some arbitary singular point
    284               if(attrib(primdecSL[1],"isRational")==0){
    285 // if we blew up a non rational singularity, the exeptional divisors
     302              if(attrib(primdecSL[1],"isRational")==0){ 
     303// if we blew up a non rational singularity, the exeptional divisors 
    286304// are reduzible, so we need to separate them
    287305                for(k=1;k<=size(blowup);k++){
     
    328346          kill primdecPC;
    329347          j=p;
    330           break;
    331         }
    332         else{
    333 // if it has smooth components, determine all the intersection points
     348          break; 
     349        }
     350        else{                           
     351// if it has smooth components, determine all the intersection points 
    334352// and check whether they are snc or not
    335353          int count = 0;
     
    417435};
    418436///////////////////////////////////////////////////////////////////////////////
    419 static
    420 proc jungfib(ideal id, int noeth)
     437static 
     438proc jungfib(ideal id, int noeth) 
    421439"USAGE:  jungfib(ideal J, int i);
    422440@*       J = ideal
     
    424442ASSUME:  J  = two dimensional ideal
    425443RETURN:  a list l of rings
    426          l[i] is a ring containing two Ideals: QIdeal and BMap.
    427          BMap defines a birational morphism from V(QIdeal)-->V(J), such that
     444         l[i] is a ring containing two Ideals: QIdeal and BMap. 
     445         BMap defines a birational morphism from V(QIdeal)-->V(J), such that 
    428446         V(QIdeal) has only quasi-ordinary singularities.
    429          If i!=0 then it's assumed that J is in noether position with respect
     447         If i!=0 then it's assumed that J is in noether position with respect 
    430448         to the last two variables.
    431          If i=0 the algorithm computes a coordinate change such that J is in
     449         If i=0 the algorithm computes a coordinate change such that J is in 
    432450         noether position.
    433451EXAMPLE: none, as it is a static procedure
     
    441459  ideal I = std(radical(id));
    442460  def A = basering;
    443   int n = nvars(A);
     461  int n = nvars(A);                           
    444462  if(deg(NF(1,groebner(slocus(id)))) == -1){
    445463    list result;
     
    454472  if(dim(I)<> 2){ERROR("dimension is unequal 2");}  //dummy check
    455473
    456 // Noether Normalization
     474// Noether Normalization 
    457475  if(noeth == 0){
    458476    if(n==3){
     
    476494        }
    477495        map phi = A,NoetherPos;
    478         kill i,pos,NoetherPos;
    479       }
    480     }
    481     else{
     496        kill i,pos,NoetherPos; 
     497      }
     498    }
     499    else{ 
    482500      map phi = A,NoetherPosition(I);
    483501    }
    484     ideal NoetherN = ideal(phi(I));
     502    ideal NoetherN = ideal(phi(I));             
    485503//image of id under the NoetherN coordinate change
    486504  }
     
    489507    map phi = A,maxideal(1);
    490508  }
    491   kill I;
    492 //Critical Locus
     509  kill I; 
     510//Critical Locus 
    493511  def C2 = clocus(NoetherN);
    494512  setring C2;
    495 
     513     
    496514//dim of critical locus is 0 then the normalization is an resolution
    497515  if(dim(Clocus) == 0){
     
    512530    return(result);
    513531  }
    514 
    515 // dim of critical locus is 1, so compute embedded resolution of the discriminant curve
     532   
     533// dim of critical locus is 1, so compute embedded resolution of the discriminant curve 
    516534  list embRe = embR(Clocus);
    517 
     535 
    518536// build the fibreproduct
    519537  setring A;
    520   list fibreP = buildFP(embRe,NoetherN,phi);
    521 // a list of lists, where fibreP[i] contains the information
     538  list fibreP = buildFP(embRe,NoetherN,phi); 
     539// a list of lists, where fibreP[i] contains the information 
    522540// concerning  the i-th chart of the fibrepoduct
    523541// fibreP[i] is the ring; QIdeal the quotientideal; BMap is the map from A
     
    532550ASSUME:  J  = two dimensional ideal
    533551RETURN:  a list l of rings
    534          l[k] is a ring containing two Ideals: QIdeal and BMap.
    535          BMap defines a birational morphism from V(QIdeal)-->V(J), such that
     552         l[k] is a ring containing two Ideals: QIdeal and BMap. 
     553         BMap defines a birational morphism from V(QIdeal)-->V(J), such that 
    536554         V(QIdeal) has only singularities of Hizebuch-Jung type.
    537          If i!=0 then it's assumed that J is in noether position with respect
     555         If i!=0 then it's assumed that J is in noether position with respect 
    538556         to the last two variables.
    539          If i=0 the algorithm computes a coordinate change such that J is in
     557         If i=0 the algorithm computes a coordinate change such that J is in 
    540558         noether position.
    541559EXAMPLE: example jungnormal; shows an example
     
    587605ASSUME:  J  = two dimensional ideal
    588606RETURN:  a list l of rings
    589          l[k] is a ring containing two Ideals: QIdeal and BMap.
    590          BMap defines a birational morphism from V(QIdeal)-->V(J), such that
    591          V(QIdeal) is smooth. For this the algorithm computes first
     607         l[k] is a ring containing two Ideals: QIdeal and BMap. 
     608         BMap defines a birational morphism from V(QIdeal)-->V(J), such that 
     609         V(QIdeal) is smooth. For this the algorithm computes first 
    592610         a representation of V(J) with Hirzebruch-Jung singularities
    593          and then it currently uses Villamayor's algorithm to resolve
     611         and then it currently uses Villamayor's algorithm to resolve 
    594612         these singularities.
    595          If i!=0 then it's assumed that J is in noether position with respect
     613         If i!=0 then it's assumed that J is in noether position with respect 
    596614         to the last two variables.
    597          If i=0 the algorithm computes a coordinate change such that J is in
     615         If i=0 the algorithm computes a coordinate change such that J is in 
    598616         noether position.
    599617EXAMPLE: none
     
    637655  }
    638656  return(result);
    639 }
     657}   
    640658example
    641659{"EXAMPLE:";
     
    651669}
    652670///////////////////////////////////////////////////////////////////////////////
    653 static
     671static 
    654672proc NoetherP_test(ideal id){
    655673  def A = basering;
     
    660678    list L;
    661679    intvec v = 1,1,1;
    662     L[1] = "lp";
     680    L[1] = "lp";     
    663681    L[2] = v;
    664682    kill v;
     
    681699      intvec v = leadexp(I[1]);
    682700      attrib(v,"isMonic",1);
    683       for(k = 2;k<=3;k++){
     701      for(k = 2;k<=3;k++){ 
    684702// checks whether f is monic in var(i)
    685         if(v[k] <> 0 || v[1] == 0){
     703        if(v[k] <> 0 || v[1] == 0){ 
    686704          attrib(v,"isMonic",0);
    687705          j++;
     
    699717    }
    700718  }
    701   else{
     719  else{     
    702720// not yet a test for more variables
    703721    return(index);
     
    708726//// not necessary in this setting                                    ///
    709727/////////////////////////////////////////////////////////////////////////
    710 static
    711 proc normalCrossing(ideal J,list E,ideal V)
     728static 
     729proc normalCrossing(ideal J,list E,ideal V)       
    712730"Internal procedure - no help and no example available
    713731"
     
    715733   int i,d,j;
    716734   int n=nvars(basering);
    717    list E1,E2;
     735   list E1,E2;                   
    718736   ideal K,M,Estd;
    719737   intvec v,w;
    720738
    721    for(i=1;i<=size(E);i++)
     739   for(i=1;i<=size(E);i++) 
    722740   {
    723741      Estd=std(E[i]+J);
     
    728746   }
    729747   E=E1;
    730    for(i=1;i<=size(E);i++)
     748   for(i=1;i<=size(E);i++)   
    731749   {
    732750      v=i;
     
    734752   }
    735753   list ll;
    736    int re=1;
    737 
    738    while((size(E1)>0)&&(re==1))
     754   int re=1;         
     755
     756   while((size(E1)>0)&&(re==1))   
    739757   {
    740       K=E1[1][1];
    741       v=E1[1][2];
     758      K=E1[1][1];                 
     759      v=E1[1][2];                 
    742760      attrib(K,"isSB",1);
    743761      E1=delete(E1,1);
    744       d=n-dim(K);
    745       M=minor(jacob(K),d)+K;
    746       if(deg(std(M+V)[1])>0)
     762      d=n-dim(K);               
     763      M=minor(jacob(K),d)+K;     
     764      if(deg(std(M+V)[1])>0)     
    747765      {
    748766         re=0;
     
    751769      for(i=1;i<=size(E);i++)
    752770      {
    753          for(j=1;j<=size(v);j++){if(v[j]==i){break;}}
    754          if(j<=size(v)){if(v[j]==i){i++;continue;}}
    755          Estd=std(K+E[i]);
     771         for(j=1;j<=size(v);j++){if(v[j]==i){break;}} 
     772         if(j<=size(v)){if(v[j]==i){i++;continue;}}   
     773         Estd=std(K+E[i]);                             
    756774         w=v;
    757775         if(deg(Estd[1])==0){i++;continue;}
    758          if(d==n-dim(Estd))
     776         if(d==n-dim(Estd))                           
    759777         {
    760778            if(deg(std(Estd+V)[1])>0)
     
    846864        ideal norid = imap(R3,norid);
    847865        ideal normap = imap(R3,normap);
    848         kill R3;
     866        kill R3; 
    849867        map f = R,normap;
    850868        if(defined(BMap)){kill BMap;}
     
    900918//////////////////////////////////////////////////////////////////////////////
    901919
     920
     921
     922
     923
     924   
     925     
Note: See TracChangeset for help on using the changeset viewer.