Changeset 71673b in git
- Timestamp:
- Sep 22, 2010, 6:51:00 PM (13 years ago)
- Branches:
- (u'spielwiese', '828514cf6e480e4bafc26df99217bf2a1ed1ef45')
- Children:
- f48d7b69ebab215998125e1e8020cc229bf8f040
- Parents:
- 8c87110fe9bfff712ab72ad60f3ed035b70989e2
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/LIB/resjung.lib
r8c8711 r71673b 3 3 info=" 4 4 LIBRARY: resjung.lib Resolution of surface singularities (Desingularization) 5 by Jung's Algorithm 6 AUTHORS: Philipp Renner, philipp_renner@web.de 5 by Jung's Algorithm 6 AUTHORS: Philipp Renner, philipp_renner@web.de 7 7 Anne Fruehbis-Krueger, anne@math.uni-hannover.de 8 8 9 9 MAIN PROCEDURES: 10 jungresolve(J,i) computes a resolution of the surface given by the 10 jungresolve(J,i) computes a resolution of the surface given by the 11 11 ideal J using Jungs Method 12 12 13 13 AUXILLARY PROCEDURES: 14 14 clocus(J) computes the critical locus of the projection of V(J) 15 onto the coordinate plane of the last two coordinates 16 embR(C) computes a strong embedded resolution of 15 onto the coordinate plane of the last two coordinates 16 embR(C) computes a strong embedded resolution of 17 17 the plane curve V(C) 18 18 jungnormal(J,i) computes intermediate step in Jung's algorithm 19 such that all singularities are of Hirzebruch-Jung type 19 such that all singularities are of Hirzebruch-Jung type 20 20 "; 21 21 … … 30 30 //Critical locus for the Weierstrass map induced by the noether normalization 31 31 //---------------------------------------------------------------------------- 32 proc clocus(ideal id) 32 proc clocus(ideal id) 33 33 "USAGE: clocus(ideal J); 34 34 @* J = ideal 35 ASSUME: J = two dimensional ideal in noether position with respect 36 to the last two variables 35 ASSUME: J = two dimensional ideal in noether position with respect 36 to the last two variables 37 37 RETURN: A ring containing the ideal Clocus respresenting the critical 38 38 locus of the projection V(J)-->C^2 onto the coordinate plane … … 52 52 lowdim = intersect(lowdim,l[j]); 53 53 } 54 } 54 } 55 55 //lowdim = radical(lowdim); // affects performance 56 ideal I = l[size(l)]; 56 ideal I = l[size(l)]; 57 57 poly product=1; 58 kill l; 59 for(i=1; i < n-1; i++){ 58 kill l; 59 for(i=1; i < n-1; i++){ 60 60 //elimination of all variables exept var(i),var(n-1),var(n) 61 61 intvec v; … … 78 78 ringl[3]=ll; 79 79 kill l,ll; 80 def R = ring(ringl); //now x_j > x_i > x_n-1 > x_n forall j != i,n-1,n 80 def R = ring(ringl); //now x_j > x_i > x_n-1 > x_n forall j != i,n-1,n 81 81 setring R; 82 82 ideal J = groebner(fetch(A,I)); //this eliminates the variables 83 83 setring A; 84 ideal J = fetch(R,J); 84 ideal J = fetch(R,J); 85 85 attrib(J,"isPrincipal",0); 86 86 if(size(J)==1){ … … 131 131 /////////////////////////////////////////////////////////////////////////////// 132 132 //----------------------------------------------------------------------------- 133 // Build the fibre product of the embedded resolution and 133 // Build the fibre product of the embedded resolution and 134 134 // the coordinate ring of the variety 135 135 //----------------------------------------------------------------------------- 136 static 136 static 137 137 proc buildFP(list embR,ideal NoetherN, map phi){ 138 138 def A = basering; … … 145 145 setring R; 146 146 list temp = ringlist(A); 147 // create data for the new ring 147 // create data for the new ring 148 148 // 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] 149 149 for(j = 1; j<= nvars(R);j++){ … … 157 157 int m = size(J); 158 158 def R2 = ring(temp); 159 kill temp; 159 kill temp; 160 160 setring R2; 161 161 ideal Temp=0; //defines map from R to R2 which is the inclusion … … 171 171 FibPMI= FibPMI+ideal(f(J)); 172 172 map FibMap = A,FibPMI; 173 kill f,FibPMI; 173 kill f,FibPMI; 174 174 ideal TotalT = groebner(FibMap(NoetherN)); 175 175 ideal QIdeal = TotalT; … … 189 189 // embedded resolution for curves -- optimized for our situation 190 190 //----------------------------------------------------------------------------- 191 proc embR(ideal C) 191 proc embR(ideal C) 192 192 "USAGE: embR(ideal C); 193 193 @* C = ideal 194 ASSUME: C = ideal of plane curve 194 ASSUME: C = ideal of plane curve 195 195 RETURN: a list l of rings 196 196 l[i] is a ring containing a basic object BO, the result of the 197 resolution. 197 resolution. 198 198 NOTE: Algorithm does not touch normal crossings of V(C) 199 199 EXAMPLE: example embR; shows an example … … 203 203 attrib(J,"iswholeRing",1); 204 204 list primdec = equidim(C); 205 if(size(primdec)==2){ 206 // zero dimensional components of the discrimiant curve 207 // are smooth an cross normally so they can be ignored 205 if(size(primdec)==2){ 206 // zero dimensional components of the discrimiant curve 207 // are smooth an cross normally so they can be ignored 208 208 // in the resolution process 209 209 ideal Lowdim = radical(primdec[1]); … … 218 218 list result = resolve2(BO); 219 219 if(defined(Lowdim)){ 220 for(int i = 1;i<=size(result);i++){ 220 for(int i = 1;i<=size(result);i++){ 221 221 // had zero dimensional components which are now added to the end result 222 222 if(defined(R)) {kill R;} 223 223 def R = result[i]; 224 setring R; 224 setring R; 225 225 map f = R2,BO[5]; 226 226 BO[2]=BO[2]*f(Lowdim); … … 241 241 } 242 242 /////////////////////////////////////////////////////////////////////////////// 243 static 243 static 244 244 proc resolve2(list BO){ 245 // computes an embedded resolution for the basic object BO 246 // and returns a list of rings with BO -- specifically optimized 247 // to our situation 245 // computes an embedded resolution for the basic object BO 246 // and returns a list of rings with BO -- specifically optimized 247 // to our situation 248 248 def H = basering; 249 249 int i,j,k; … … 253 253 result[1]=H; 254 254 attrib(result[1],"isResolved",0); // has only simple normal crossings 255 attrib(result[1],"smoothC",0); // has smooth components 255 attrib(result[1],"smoothC",0); // has smooth components 256 256 int safety=0; // number of runs restricted to 30 257 257 while(1){ … … 263 263 def R = result[j]; 264 264 setring R; 265 if(attrib(result[j],"smoothC")==0){ 265 if(attrib(result[j],"smoothC")==0){ 266 266 // has possibly singular components so choose a singular point and blow up 267 267 list primdecPC = primdecGTZ(BO[2]); … … 278 278 if(defined(blowup)){kill blowup;} 279 279 list blowup = blowUpBO(BO,primdecSL[index][2],3); 280 // if it has only a rational singularity, blow it up, 280 // if it has only a rational singularity, blow it up, 281 281 // else choose some arbitary singular point 282 if(attrib(primdecSL[1],"isRational")==0){ 283 // if we blew up a non rational singularity, the exeptional divisors 282 if(attrib(primdecSL[1],"isRational")==0){ 283 // if we blew up a non rational singularity, the exeptional divisors 284 284 // are reduzible, so we need to separate them 285 285 for(k=1;k<=size(blowup);k++){ … … 326 326 kill primdecPC; 327 327 j=p; 328 break; 329 } 330 else{ 331 // if it has smooth components, determine all the intersection points 328 break; 329 } 330 else{ 331 // if it has smooth components, determine all the intersection points 332 332 // and check whether they are snc or not 333 333 int count = 0; … … 415 415 }; 416 416 /////////////////////////////////////////////////////////////////////////////// 417 static 418 proc jungfib(ideal id, int noeth) 417 static 418 proc jungfib(ideal id, int noeth) 419 419 "USAGE: jungfib(ideal J, int i); 420 420 @* J = ideal … … 422 422 ASSUME: J = two dimensional ideal 423 423 RETURN: a list l of rings 424 l[i] is a ring containing two Ideals: QIdeal and BMap. 425 BMap defines a birational morphism from V(QIdeal)-->V(J), such that 424 l[i] is a ring containing two Ideals: QIdeal and BMap. 425 BMap defines a birational morphism from V(QIdeal)-->V(J), such that 426 426 V(QIdeal) has only quasi-ordinary singularities. 427 If i!=0 then it's assumed that J is in noether position with respect 427 If i!=0 then it's assumed that J is in noether position with respect 428 428 to the last two variables. 429 If i=0 the algorithm computes a coordinate change such that J is in 429 If i=0 the algorithm computes a coordinate change such that J is in 430 430 noether position. 431 431 EXAMPLE: none, as it is a static procedure … … 439 439 ideal I = std(radical(id)); 440 440 def A = basering; 441 int n = nvars(A); 441 int n = nvars(A); 442 442 if(deg(NF(1,groebner(slocus(id)))) == -1){ 443 443 list result; … … 452 452 if(dim(I)<> 2){ERROR("dimension is unequal 2");} //dummy check 453 453 454 // Noether Normalization 454 // Noether Normalization 455 455 if(noeth == 0){ 456 456 if(n==3){ … … 474 474 } 475 475 map phi = A,NoetherPos; 476 kill i,pos,NoetherPos; 477 } 478 } 479 else{ 476 kill i,pos,NoetherPos; 477 } 478 } 479 else{ 480 480 map phi = A,NoetherPosition(I); 481 481 } 482 ideal NoetherN = ideal(phi(I)); 482 ideal NoetherN = ideal(phi(I)); 483 483 //image of id under the NoetherN coordinate change 484 484 } … … 487 487 map phi = A,maxideal(1); 488 488 } 489 kill I; 490 //Critical Locus 489 kill I; 490 //Critical Locus 491 491 def C2 = clocus(NoetherN); 492 492 setring C2; 493 493 494 494 //dim of critical locus is 0 then the normalization is an resolution 495 495 if(dim(Clocus) == 0){ … … 510 510 return(result); 511 511 } 512 513 // dim of critical locus is 1, so compute embedded resolution of the discriminant curve 512 513 // dim of critical locus is 1, so compute embedded resolution of the discriminant curve 514 514 list embRe = embR(Clocus); 515 515 516 516 // build the fibreproduct 517 517 setring A; 518 list fibreP = buildFP(embRe,NoetherN,phi); 519 // a list of lists, where fibreP[i] contains the information 518 list fibreP = buildFP(embRe,NoetherN,phi); 519 // a list of lists, where fibreP[i] contains the information 520 520 // concerning the i-th chart of the fibrepoduct 521 521 // fibreP[i] is the ring; QIdeal the quotientideal; BMap is the map from A … … 530 530 ASSUME: J = two dimensional ideal 531 531 RETURN: a list l of rings 532 l[k] is a ring containing two Ideals: QIdeal and BMap. 533 BMap defines a birational morphism from V(QIdeal)-->V(J), such that 532 l[k] is a ring containing two Ideals: QIdeal and BMap. 533 BMap defines a birational morphism from V(QIdeal)-->V(J), such that 534 534 V(QIdeal) has only singularities of Hizebuch-Jung type. 535 If i!=0 then it's assumed that J is in noether position with respect 535 If i!=0 then it's assumed that J is in noether position with respect 536 536 to the last two variables. 537 If i=0 the algorithm computes a coordinate change such that J is in 537 If i=0 the algorithm computes a coordinate change such that J is in 538 538 noether position. 539 539 EXAMPLE: example jungnormal; shows an example … … 585 585 ASSUME: J = two dimensional ideal 586 586 RETURN: a list l of rings 587 l[k] is a ring containing two Ideals: QIdeal and BMap. 588 BMap defines a birational morphism from V(QIdeal)-->V(J), such that 589 V(QIdeal) is smooth. For this the algorithm computes first 587 l[k] is a ring containing two Ideals: QIdeal and BMap. 588 BMap defines a birational morphism from V(QIdeal)-->V(J), such that 589 V(QIdeal) is smooth. For this the algorithm computes first 590 590 a representation of V(J) with Hirzebruch-Jung singularities 591 and then it currently uses Villamayor's algorithm to resolve 591 and then it currently uses Villamayor's algorithm to resolve 592 592 these singularities. 593 If i!=0 then it's assumed that J is in noether position with respect 593 If i!=0 then it's assumed that J is in noether position with respect 594 594 to the last two variables. 595 If i=0 the algorithm computes a coordinate change such that J is in 595 If i=0 the algorithm computes a coordinate change such that J is in 596 596 noether position. 597 597 EXAMPLE: none … … 635 635 } 636 636 return(result); 637 } 637 } 638 638 example 639 639 {"EXAMPLE:"; … … 649 649 } 650 650 /////////////////////////////////////////////////////////////////////////////// 651 static 651 static 652 652 proc NoetherP_test(ideal id){ 653 653 def A = basering; … … 658 658 list L; 659 659 intvec v = 1,1,1; 660 L[1] = "lp"; 660 L[1] = "lp"; 661 661 L[2] = v; 662 662 kill v; … … 679 679 intvec v = leadexp(I[1]); 680 680 attrib(v,"isMonic",1); 681 for(k = 2;k<=3;k++){ 681 for(k = 2;k<=3;k++){ 682 682 // checks whether f is monic in var(i) 683 if(v[k] <> 0 || v[1] == 0){ 683 if(v[k] <> 0 || v[1] == 0){ 684 684 attrib(v,"isMonic",0); 685 685 j++; … … 697 697 } 698 698 } 699 else{ 699 else{ 700 700 // not yet a test for more variables 701 701 return(index); … … 706 706 //// not necessary in this setting /// 707 707 ///////////////////////////////////////////////////////////////////////// 708 static 709 proc normalCrossing(ideal J,list E,ideal V) 708 static 709 proc normalCrossing(ideal J,list E,ideal V) 710 710 "Internal procedure - no help and no example available 711 711 " … … 713 713 int i,d,j; 714 714 int n=nvars(basering); 715 list E1,E2; 715 list E1,E2; 716 716 ideal K,M,Estd; 717 717 intvec v,w; 718 718 719 for(i=1;i<=size(E);i++) 719 for(i=1;i<=size(E);i++) 720 720 { 721 721 Estd=std(E[i]+J); … … 726 726 } 727 727 E=E1; 728 for(i=1;i<=size(E);i++) 728 for(i=1;i<=size(E);i++) 729 729 { 730 730 v=i; … … 732 732 } 733 733 list ll; 734 int re=1; 735 736 while((size(E1)>0)&&(re==1)) 734 int re=1; 735 736 while((size(E1)>0)&&(re==1)) 737 737 { 738 K=E1[1][1]; 739 v=E1[1][2]; 738 K=E1[1][1]; 739 v=E1[1][2]; 740 740 attrib(K,"isSB",1); 741 741 E1=delete(E1,1); 742 d=n-dim(K); 743 M=minor(jacob(K),d)+K; 744 if(deg(std(M+V)[1])>0) 742 d=n-dim(K); 743 M=minor(jacob(K),d)+K; 744 if(deg(std(M+V)[1])>0) 745 745 { 746 746 re=0; … … 749 749 for(i=1;i<=size(E);i++) 750 750 { 751 for(j=1;j<=size(v);j++){if(v[j]==i){break;}} 752 if(j<=size(v)){if(v[j]==i){i++;continue;}} 753 Estd=std(K+E[i]); 751 for(j=1;j<=size(v);j++){if(v[j]==i){break;}} 752 if(j<=size(v)){if(v[j]==i){i++;continue;}} 753 Estd=std(K+E[i]); 754 754 w=v; 755 755 if(deg(Estd[1])==0){i++;continue;} 756 if(d==n-dim(Estd)) 756 if(d==n-dim(Estd)) 757 757 { 758 758 if(deg(std(Estd+V)[1])>0) … … 844 844 ideal norid = imap(R3,norid); 845 845 ideal normap = imap(R3,normap); 846 kill R3; 846 kill R3; 847 847 map f = R,normap; 848 848 if(defined(BMap)){kill BMap;} … … 898 898 ////////////////////////////////////////////////////////////////////////////// 899 899 900 901 902 903 904 905
Note: See TracChangeset
for help on using the changeset viewer.