Changeset 6e45c1 in git
- Timestamp:
- Oct 8, 2010, 11:51:44 AM (13 years ago)
- Branches:
- (u'spielwiese', '5b153614cbc72bfa198d75b1e9e33dab2645d9fe')
- Children:
- 0291940c9ec5aa05557656c2e97b801e2246c2fa
- Parents:
- 4c4e0dd3d09608d110183de35eaa8e1c548721ff
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/LIB/resjung.lib
r4c4e0d r6e45c1 1 // 1 2 version="$Id$"; 2 3 category="Algebraic Geometry"; 3 4 info=" 4 5 LIBRARY: resjung.lib Resolution of surface singularities (Desingularization) 5 by Jung's Algorithm 6 AUTHORS: Philipp Renner, philipp_renner@web.de 6 by Jung's Algorithm 7 AUTHORS: Philipp Renner, philipp_renner@web.de 7 8 @* Anne Fruehbis-Krueger, anne@math.uni-hannover.de 8 9 OVERVIEW: This library implements resolution of singularities by Jung's algorithm, … … 18 19 @* overly expensive and the original last step of Jung's algorithm is not 19 20 @* implemented yet. 20 REFERENCES: 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) 21 REFERENCES: 22 [1] Jung, H.: Darstellung der Funktionen eines algebraischen Koerpers zweier unabhaengigen 23 Veraenderlichen x,y in der Umgebung x=a, y= b, Journal fuer Reine und Angewandte Mathematik 133,289-314 (1908) 24 24 @* (the origin of this method) 25 25 [2] J.Kollar: Lectures on Resolution of Singularities, Princeton University Press (2007) 26 26 @* (contains large overview over various known methods for curves and surfaces as well as 27 27 @* a detailed description of the approach in the general case) 28 29 MAINPROCEDURES:30 jungresolve(J,i) computes a resolution of the surface given by the 28 29 PROCEDURES: 30 jungresolve(J,i) computes a resolution of the surface given by the 31 31 ideal J using Jungs Method 32 32 33 AUXILLARY PROCEDURES:34 33 clocus(J) computes the critical locus of the projection of V(J) 35 onto the coordinate plane of the last two coordinates 36 embR(C) computes a strong embedded resolution of 34 onto the coordinate plane of the last two coordinates 35 embR(C) computes a strong embedded resolution of 37 36 the plane curve V(C) 38 37 jungnormal(J,i) computes intermediate step in Jung's algorithm 39 such that all singularities are of Hirzebruch-Jung type 38 such that all singularities are of Hirzebruch-Jung type 40 39 "; 41 40 … … 50 49 //Critical locus for the Weierstrass map induced by the noether normalization 51 50 //---------------------------------------------------------------------------- 52 proc clocus(ideal id) 51 proc clocus(ideal id) 53 52 "USAGE: clocus(ideal J); 54 53 @* J = ideal 55 ASSUME: J = two dimensional ideal in noether position with respect 56 to the last two variables 54 ASSUME: J = two dimensional ideal in noether position with respect 55 to the last two variables 57 56 RETURN: A ring containing the ideal Clocus respresenting the critical 58 57 locus of the projection V(J)-->C^2 onto the coordinate plane … … 72 71 lowdim = intersect(lowdim,l[j]); 73 72 } 74 } 73 } 75 74 //lowdim = radical(lowdim); // affects performance 76 ideal I = l[size(l)]; 75 ideal I = l[size(l)]; 77 76 poly product=1; 78 kill l; 79 for(i=1; i < n-1; i++){ 77 kill l; 78 for(i=1; i < n-1; i++){ 80 79 //elimination of all variables exept var(i),var(n-1),var(n) 81 80 intvec v; … … 98 97 ringl[3]=ll; 99 98 kill l,ll; 100 def R = ring(ringl); //now x_j > x_i > x_n-1 > x_n forall j != i,n-1,n 99 def R = ring(ringl); //now x_j > x_i > x_n-1 > x_n forall j != i,n-1,n 101 100 setring R; 102 101 ideal J = groebner(fetch(A,I)); //this eliminates the variables 103 102 setring A; 104 ideal J = fetch(R,J); 103 ideal J = fetch(R,J); 105 104 attrib(J,"isPrincipal",0); 106 105 if(size(J)==1){ … … 151 150 /////////////////////////////////////////////////////////////////////////////// 152 151 //----------------------------------------------------------------------------- 153 // Build the fibre product of the embedded resolution and 152 // Build the fibre product of the embedded resolution and 154 153 // the coordinate ring of the variety 155 154 //----------------------------------------------------------------------------- 156 static 155 static 157 156 proc buildFP(list embR,ideal NoetherN, map phi){ 158 157 def A = basering; … … 165 164 setring R; 166 165 list temp = ringlist(A); 167 // create data for the new ring 166 // create data for the new ring 168 167 // 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] 169 168 for(j = 1; j<= nvars(R);j++){ … … 177 176 int m = size(J); 178 177 def R2 = ring(temp); 179 kill temp; 178 kill temp; 180 179 setring R2; 181 180 ideal Temp=0; //defines map from R to R2 which is the inclusion … … 191 190 FibPMI= FibPMI+ideal(f(J)); 192 191 map FibMap = A,FibPMI; 193 kill f,FibPMI; 192 kill f,FibPMI; 194 193 ideal TotalT = groebner(FibMap(NoetherN)); 195 194 ideal QIdeal = TotalT; … … 209 208 // embedded resolution for curves -- optimized for our situation 210 209 //----------------------------------------------------------------------------- 211 proc embR(ideal C) 210 proc embR(ideal C) 212 211 "USAGE: embR(ideal C); 213 212 @* C = ideal 214 ASSUME: C = ideal of plane curve 213 ASSUME: C = ideal of plane curve 215 214 RETURN: a list l of rings 216 215 l[i] is a ring containing a basic object BO, the result of the 217 resolution. 216 resolution. 218 217 NOTE: Algorithm does not touch normal crossings of V(C) 219 218 EXAMPLE: example embR; shows an example … … 223 222 attrib(J,"iswholeRing",1); 224 223 list primdec = equidim(C); 225 if(size(primdec)==2){ 226 // zero dimensional components of the discrimiant curve 227 // are smooth an cross normally so they can be ignored 224 if(size(primdec)==2){ 225 // zero dimensional components of the discrimiant curve 226 // are smooth an cross normally so they can be ignored 228 227 // in the resolution process 229 228 ideal Lowdim = radical(primdec[1]); … … 238 237 list result = resolve2(BO); 239 238 if(defined(Lowdim)){ 240 for(int i = 1;i<=size(result);i++){ 239 for(int i = 1;i<=size(result);i++){ 241 240 // had zero dimensional components which are now added to the end result 242 241 if(defined(R)) {kill R;} 243 242 def R = result[i]; 244 setring R; 243 setring R; 245 244 map f = R2,BO[5]; 246 245 BO[2]=BO[2]*f(Lowdim); … … 261 260 } 262 261 /////////////////////////////////////////////////////////////////////////////// 263 static 262 static 264 263 proc resolve2(list BO){ 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 264 // computes an embedded resolution for the basic object BO 265 // and returns a list of rings with BO -- specifically optimized 266 // to our situation 268 267 def H = basering; 269 268 int i,j,k; … … 273 272 result[1]=H; 274 273 attrib(result[1],"isResolved",0); // has only simple normal crossings 275 attrib(result[1],"smoothC",0); // has smooth components 274 attrib(result[1],"smoothC",0); // has smooth components 276 275 int safety=0; // number of runs restricted to 30 277 276 while(1){ … … 283 282 def R = result[j]; 284 283 setring R; 285 if(attrib(result[j],"smoothC")==0){ 284 if(attrib(result[j],"smoothC")==0){ 286 285 // has possibly singular components so choose a singular point and blow up 287 286 list primdecPC = primdecGTZ(BO[2]); … … 298 297 if(defined(blowup)){kill blowup;} 299 298 list blowup = blowUpBO(BO,primdecSL[index][2],3); 300 // if it has only a rational singularity, blow it up, 299 // if it has only a rational singularity, blow it up, 301 300 // else choose some arbitary singular point 302 if(attrib(primdecSL[1],"isRational")==0){ 303 // if we blew up a non rational singularity, the exeptional divisors 301 if(attrib(primdecSL[1],"isRational")==0){ 302 // if we blew up a non rational singularity, the exeptional divisors 304 303 // are reduzible, so we need to separate them 305 304 for(k=1;k<=size(blowup);k++){ … … 346 345 kill primdecPC; 347 346 j=p; 348 break; 349 } 350 else{ 351 // if it has smooth components, determine all the intersection points 347 break; 348 } 349 else{ 350 // if it has smooth components, determine all the intersection points 352 351 // and check whether they are snc or not 353 352 int count = 0; … … 435 434 }; 436 435 /////////////////////////////////////////////////////////////////////////////// 437 static 438 proc jungfib(ideal id, int noeth) 436 static 437 proc jungfib(ideal id, int noeth) 439 438 "USAGE: jungfib(ideal J, int i); 440 439 @* J = ideal … … 442 441 ASSUME: J = two dimensional ideal 443 442 RETURN: a list l of rings 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 443 l[i] is a ring containing two Ideals: QIdeal and BMap. 444 BMap defines a birational morphism from V(QIdeal)-->V(J), such that 446 445 V(QIdeal) has only quasi-ordinary singularities. 447 If i!=0 then it's assumed that J is in noether position with respect 446 If i!=0 then it's assumed that J is in noether position with respect 448 447 to the last two variables. 449 If i=0 the algorithm computes a coordinate change such that J is in 448 If i=0 the algorithm computes a coordinate change such that J is in 450 449 noether position. 451 450 EXAMPLE: none, as it is a static procedure … … 459 458 ideal I = std(radical(id)); 460 459 def A = basering; 461 int n = nvars(A); 460 int n = nvars(A); 462 461 if(deg(NF(1,groebner(slocus(id)))) == -1){ 463 462 list result; … … 472 471 if(dim(I)<> 2){ERROR("dimension is unequal 2");} //dummy check 473 472 474 // Noether Normalization 473 // Noether Normalization 475 474 if(noeth == 0){ 476 475 if(n==3){ … … 494 493 } 495 494 map phi = A,NoetherPos; 496 kill i,pos,NoetherPos; 497 } 498 } 499 else{ 495 kill i,pos,NoetherPos; 496 } 497 } 498 else{ 500 499 map phi = A,NoetherPosition(I); 501 500 } 502 ideal NoetherN = ideal(phi(I)); 501 ideal NoetherN = ideal(phi(I)); 503 502 //image of id under the NoetherN coordinate change 504 503 } … … 507 506 map phi = A,maxideal(1); 508 507 } 509 kill I; 510 //Critical Locus 508 kill I; 509 //Critical Locus 511 510 def C2 = clocus(NoetherN); 512 511 setring C2; 513 512 514 513 //dim of critical locus is 0 then the normalization is an resolution 515 514 if(dim(Clocus) == 0){ … … 530 529 return(result); 531 530 } 532 533 // dim of critical locus is 1, so compute embedded resolution of the discriminant curve 531 532 // dim of critical locus is 1, so compute embedded resolution of the discriminant curve 534 533 list embRe = embR(Clocus); 535 534 536 535 // build the fibreproduct 537 536 setring A; 538 list fibreP = buildFP(embRe,NoetherN,phi); 539 // a list of lists, where fibreP[i] contains the information 537 list fibreP = buildFP(embRe,NoetherN,phi); 538 // a list of lists, where fibreP[i] contains the information 540 539 // concerning the i-th chart of the fibrepoduct 541 540 // fibreP[i] is the ring; QIdeal the quotientideal; BMap is the map from A … … 550 549 ASSUME: J = two dimensional ideal 551 550 RETURN: a list l of rings 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 551 l[k] is a ring containing two Ideals: QIdeal and BMap. 552 BMap defines a birational morphism from V(QIdeal)-->V(J), such that 554 553 V(QIdeal) has only singularities of Hizebuch-Jung type. 555 If i!=0 then it's assumed that J is in noether position with respect 554 If i!=0 then it's assumed that J is in noether position with respect 556 555 to the last two variables. 557 If i=0 the algorithm computes a coordinate change such that J is in 556 If i=0 the algorithm computes a coordinate change such that J is in 558 557 noether position. 559 558 EXAMPLE: example jungnormal; shows an example … … 605 604 ASSUME: J = two dimensional ideal 606 605 RETURN: a list l of rings 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 606 l[k] is a ring containing two Ideals: QIdeal and BMap. 607 BMap defines a birational morphism from V(QIdeal)-->V(J), such that 608 V(QIdeal) is smooth. For this the algorithm computes first 610 609 a representation of V(J) with Hirzebruch-Jung singularities 611 and then it currently uses Villamayor's algorithm to resolve 610 and then it currently uses Villamayor's algorithm to resolve 612 611 these singularities. 613 If i!=0 then it's assumed that J is in noether position with respect 612 If i!=0 then it's assumed that J is in noether position with respect 614 613 to the last two variables. 615 If i=0 the algorithm computes a coordinate change such that J is in 614 If i=0 the algorithm computes a coordinate change such that J is in 616 615 noether position. 617 616 EXAMPLE: none … … 655 654 } 656 655 return(result); 657 } 656 } 658 657 example 659 658 {"EXAMPLE:"; … … 669 668 } 670 669 /////////////////////////////////////////////////////////////////////////////// 671 static 670 static 672 671 proc NoetherP_test(ideal id){ 673 672 def A = basering; … … 678 677 list L; 679 678 intvec v = 1,1,1; 680 L[1] = "lp"; 679 L[1] = "lp"; 681 680 L[2] = v; 682 681 kill v; … … 699 698 intvec v = leadexp(I[1]); 700 699 attrib(v,"isMonic",1); 701 for(k = 2;k<=3;k++){ 700 for(k = 2;k<=3;k++){ 702 701 // checks whether f is monic in var(i) 703 if(v[k] <> 0 || v[1] == 0){ 702 if(v[k] <> 0 || v[1] == 0){ 704 703 attrib(v,"isMonic",0); 705 704 j++; … … 717 716 } 718 717 } 719 else{ 718 else{ 720 719 // not yet a test for more variables 721 720 return(index); … … 726 725 //// not necessary in this setting /// 727 726 ///////////////////////////////////////////////////////////////////////// 728 static 729 proc normalCrossing(ideal J,list E,ideal V) 727 static 728 proc normalCrossing(ideal J,list E,ideal V) 730 729 "Internal procedure - no help and no example available 731 730 " … … 733 732 int i,d,j; 734 733 int n=nvars(basering); 735 list E1,E2; 734 list E1,E2; 736 735 ideal K,M,Estd; 737 736 intvec v,w; 738 737 739 for(i=1;i<=size(E);i++) 738 for(i=1;i<=size(E);i++) 740 739 { 741 740 Estd=std(E[i]+J); … … 746 745 } 747 746 E=E1; 748 for(i=1;i<=size(E);i++) 747 for(i=1;i<=size(E);i++) 749 748 { 750 749 v=i; … … 752 751 } 753 752 list ll; 754 int re=1; 755 756 while((size(E1)>0)&&(re==1)) 753 int re=1; 754 755 while((size(E1)>0)&&(re==1)) 757 756 { 758 K=E1[1][1]; 759 v=E1[1][2]; 757 K=E1[1][1]; 758 v=E1[1][2]; 760 759 attrib(K,"isSB",1); 761 760 E1=delete(E1,1); 762 d=n-dim(K); 763 M=minor(jacob(K),d)+K; 764 if(deg(std(M+V)[1])>0) 761 d=n-dim(K); 762 M=minor(jacob(K),d)+K; 763 if(deg(std(M+V)[1])>0) 765 764 { 766 765 re=0; … … 769 768 for(i=1;i<=size(E);i++) 770 769 { 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]); 770 for(j=1;j<=size(v);j++){if(v[j]==i){break;}} 771 if(j<=size(v)){if(v[j]==i){i++;continue;}} 772 Estd=std(K+E[i]); 774 773 w=v; 775 774 if(deg(Estd[1])==0){i++;continue;} 776 if(d==n-dim(Estd)) 775 if(d==n-dim(Estd)) 777 776 { 778 777 if(deg(std(Estd+V)[1])>0) … … 864 863 ideal norid = imap(R3,norid); 865 864 ideal normap = imap(R3,normap); 866 kill R3; 865 kill R3; 867 866 map f = R,normap; 868 867 if(defined(BMap)){kill BMap;} … … 918 917 ////////////////////////////////////////////////////////////////////////////// 919 918 920 921 922 923 924 925
Note: See TracChangeset
for help on using the changeset viewer.