Changeset 6e17f8 in git for Singular/LIB
- Timestamp:
- Oct 7, 2010, 8:46:50 PM (14 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- 6237df24aaf50dfa474a5ed678260dbeb6672678
- Parents:
- d0579a05a4cf0bbd2234e1d03abd8a0e56876f0b
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/LIB/resjung.lib
rd0579a0 r6e17f8 1 //2 1 version="$Id$"; 3 category=" Commutative Algebra";2 category="Algebraic Geometry"; 4 3 info=" 5 4 LIBRARY: 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 6 AUTHORS: Philipp Renner, philipp_renner@web.de 7 @* Anne Fruehbis-Krueger, anne@math.uni-hannover.de 8 OVERVIEW: 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. 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) 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 29 MAIN PROCEDURES: 30 jungresolve(J,i) computes a resolution of the surface given by the 12 31 ideal J using Jungs Method 32 33 AUXILLARY PROCEDURES: 13 34 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 16 37 the plane curve V(C) 17 38 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 19 40 "; 20 41 … … 29 50 //Critical locus for the Weierstrass map induced by the noether normalization 30 51 //---------------------------------------------------------------------------- 31 proc clocus(ideal id) 52 proc clocus(ideal id) 32 53 "USAGE: clocus(ideal J); 33 54 @* J = ideal 34 ASSUME: J = two dimensional ideal in noether position with respect 35 to the last two variables 55 ASSUME: J = two dimensional ideal in noether position with respect 56 to the last two variables 36 57 RETURN: A ring containing the ideal Clocus respresenting the critical 37 58 locus of the projection V(J)-->C^2 onto the coordinate plane … … 51 72 lowdim = intersect(lowdim,l[j]); 52 73 } 53 } 74 } 54 75 //lowdim = radical(lowdim); // affects performance 55 ideal I = l[size(l)]; 76 ideal I = l[size(l)]; 56 77 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++){ 59 80 //elimination of all variables exept var(i),var(n-1),var(n) 60 81 intvec v; … … 77 98 ringl[3]=ll; 78 99 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 80 101 setring R; 81 102 ideal J = groebner(fetch(A,I)); //this eliminates the variables 82 103 setring A; 83 ideal J = fetch(R,J); 104 ideal J = fetch(R,J); 84 105 attrib(J,"isPrincipal",0); 85 106 if(size(J)==1){ … … 89 110 if(attrib(J,"isPrincipal")==0){ 90 111 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 93 113 if(defined(w)) {kill w;} 94 114 intvec w = leadexp(J[j]); … … 108 128 setring A; 109 129 } 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 112 131 kill index,J,v; 113 132 } … … 116 135 ideal Clocus = imap(A,product); //the critical locus is contained in this 117 136 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 120 138 export(Clocus); 121 139 return(C2); … … 133 151 /////////////////////////////////////////////////////////////////////////////// 134 152 //----------------------------------------------------------------------------- 135 // Build the fibre product of the embedded resolution and 153 // Build the fibre product of the embedded resolution and 136 154 // the coordinate ring of the variety 137 155 //----------------------------------------------------------------------------- 138 static 156 static 139 157 proc buildFP(list embR,ideal NoetherN, map phi){ 140 158 def A = basering; … … 147 165 setring R; 148 166 list temp = ringlist(A); 149 // create data for the new ring 167 // create data for the new ring 150 168 // 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] 151 169 for(j = 1; j<= nvars(R);j++){ … … 159 177 int m = size(J); 160 178 def R2 = ring(temp); 161 kill temp; 179 kill temp; 162 180 setring R2; 163 181 ideal Temp=0; //defines map from R to R2 which is the inclusion … … 173 191 FibPMI= FibPMI+ideal(f(J)); 174 192 map FibMap = A,FibPMI; 175 kill f,FibPMI; 193 kill f,FibPMI; 176 194 ideal TotalT = groebner(FibMap(NoetherN)); 177 195 ideal QIdeal = TotalT; … … 191 209 // embedded resolution for curves -- optimized for our situation 192 210 //----------------------------------------------------------------------------- 193 proc embR(ideal C) 211 proc embR(ideal C) 194 212 "USAGE: embR(ideal C); 195 213 @* C = ideal 196 ASSUME: C = ideal of plane curve 214 ASSUME: C = ideal of plane curve 197 215 RETURN: a list l of rings 198 216 l[i] is a ring containing a basic object BO, the result of the 199 resolution. 217 resolution. 200 218 NOTE: Algorithm does not touch normal crossings of V(C) 201 219 EXAMPLE: example embR; shows an example … … 205 223 attrib(J,"iswholeRing",1); 206 224 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 210 228 // in the resolution process 211 229 ideal Lowdim = radical(primdec[1]); … … 220 238 list result = resolve2(BO); 221 239 if(defined(Lowdim)){ 222 for(int i = 1;i<=size(result);i++){ 240 for(int i = 1;i<=size(result);i++){ 223 241 // had zero dimensional components which are now added to the end result 224 242 if(defined(R)) {kill R;} 225 243 def R = result[i]; 226 setring R; 244 setring R; 227 245 map f = R2,BO[5]; 228 246 BO[2]=BO[2]*f(Lowdim); … … 243 261 } 244 262 /////////////////////////////////////////////////////////////////////////////// 245 static 263 static 246 264 proc 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 250 268 def H = basering; 251 269 int i,j,k; … … 255 273 result[1]=H; 256 274 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 258 276 int safety=0; // number of runs restricted to 30 259 277 while(1){ … … 265 283 def R = result[j]; 266 284 setring R; 267 if(attrib(result[j],"smoothC")==0){ 285 if(attrib(result[j],"smoothC")==0){ 268 286 // has possibly singular components so choose a singular point and blow up 269 287 list primdecPC = primdecGTZ(BO[2]); … … 280 298 if(defined(blowup)){kill blowup;} 281 299 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, 283 301 // 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 286 304 // are reduzible, so we need to separate them 287 305 for(k=1;k<=size(blowup);k++){ … … 328 346 kill primdecPC; 329 347 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 334 352 // and check whether they are snc or not 335 353 int count = 0; … … 417 435 }; 418 436 /////////////////////////////////////////////////////////////////////////////// 419 static 420 proc jungfib(ideal id, int noeth) 437 static 438 proc jungfib(ideal id, int noeth) 421 439 "USAGE: jungfib(ideal J, int i); 422 440 @* J = ideal … … 424 442 ASSUME: J = two dimensional ideal 425 443 RETURN: 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 428 446 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 430 448 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 432 450 noether position. 433 451 EXAMPLE: none, as it is a static procedure … … 441 459 ideal I = std(radical(id)); 442 460 def A = basering; 443 int n = nvars(A); 461 int n = nvars(A); 444 462 if(deg(NF(1,groebner(slocus(id)))) == -1){ 445 463 list result; … … 454 472 if(dim(I)<> 2){ERROR("dimension is unequal 2");} //dummy check 455 473 456 // Noether Normalization 474 // Noether Normalization 457 475 if(noeth == 0){ 458 476 if(n==3){ … … 476 494 } 477 495 map phi = A,NoetherPos; 478 kill i,pos,NoetherPos; 479 } 480 } 481 else{ 496 kill i,pos,NoetherPos; 497 } 498 } 499 else{ 482 500 map phi = A,NoetherPosition(I); 483 501 } 484 ideal NoetherN = ideal(phi(I)); 502 ideal NoetherN = ideal(phi(I)); 485 503 //image of id under the NoetherN coordinate change 486 504 } … … 489 507 map phi = A,maxideal(1); 490 508 } 491 kill I; 492 //Critical Locus 509 kill I; 510 //Critical Locus 493 511 def C2 = clocus(NoetherN); 494 512 setring C2; 495 513 496 514 //dim of critical locus is 0 then the normalization is an resolution 497 515 if(dim(Clocus) == 0){ … … 512 530 return(result); 513 531 } 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 516 534 list embRe = embR(Clocus); 517 535 518 536 // build the fibreproduct 519 537 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 522 540 // concerning the i-th chart of the fibrepoduct 523 541 // fibreP[i] is the ring; QIdeal the quotientideal; BMap is the map from A … … 532 550 ASSUME: J = two dimensional ideal 533 551 RETURN: 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 536 554 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 538 556 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 540 558 noether position. 541 559 EXAMPLE: example jungnormal; shows an example … … 587 605 ASSUME: J = two dimensional ideal 588 606 RETURN: 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 592 610 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 594 612 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 596 614 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 598 616 noether position. 599 617 EXAMPLE: none … … 637 655 } 638 656 return(result); 639 } 657 } 640 658 example 641 659 {"EXAMPLE:"; … … 651 669 } 652 670 /////////////////////////////////////////////////////////////////////////////// 653 static 671 static 654 672 proc NoetherP_test(ideal id){ 655 673 def A = basering; … … 660 678 list L; 661 679 intvec v = 1,1,1; 662 L[1] = "lp"; 680 L[1] = "lp"; 663 681 L[2] = v; 664 682 kill v; … … 681 699 intvec v = leadexp(I[1]); 682 700 attrib(v,"isMonic",1); 683 for(k = 2;k<=3;k++){ 701 for(k = 2;k<=3;k++){ 684 702 // checks whether f is monic in var(i) 685 if(v[k] <> 0 || v[1] == 0){ 703 if(v[k] <> 0 || v[1] == 0){ 686 704 attrib(v,"isMonic",0); 687 705 j++; … … 699 717 } 700 718 } 701 else{ 719 else{ 702 720 // not yet a test for more variables 703 721 return(index); … … 708 726 //// not necessary in this setting /// 709 727 ///////////////////////////////////////////////////////////////////////// 710 static 711 proc normalCrossing(ideal J,list E,ideal V) 728 static 729 proc normalCrossing(ideal J,list E,ideal V) 712 730 "Internal procedure - no help and no example available 713 731 " … … 715 733 int i,d,j; 716 734 int n=nvars(basering); 717 list E1,E2; 735 list E1,E2; 718 736 ideal K,M,Estd; 719 737 intvec v,w; 720 738 721 for(i=1;i<=size(E);i++) 739 for(i=1;i<=size(E);i++) 722 740 { 723 741 Estd=std(E[i]+J); … … 728 746 } 729 747 E=E1; 730 for(i=1;i<=size(E);i++) 748 for(i=1;i<=size(E);i++) 731 749 { 732 750 v=i; … … 734 752 } 735 753 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)) 739 757 { 740 K=E1[1][1]; 741 v=E1[1][2]; 758 K=E1[1][1]; 759 v=E1[1][2]; 742 760 attrib(K,"isSB",1); 743 761 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) 747 765 { 748 766 re=0; … … 751 769 for(i=1;i<=size(E);i++) 752 770 { 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]); 756 774 w=v; 757 775 if(deg(Estd[1])==0){i++;continue;} 758 if(d==n-dim(Estd)) 776 if(d==n-dim(Estd)) 759 777 { 760 778 if(deg(std(Estd+V)[1])>0) … … 846 864 ideal norid = imap(R3,norid); 847 865 ideal normap = imap(R3,normap); 848 kill R3; 866 kill R3; 849 867 map f = R,normap; 850 868 if(defined(BMap)){kill BMap;} … … 900 918 ////////////////////////////////////////////////////////////////////////////// 901 919 920 921 922 923 924 925
Note: See TracChangeset
for help on using the changeset viewer.