Changeset 71673b in git
 Timestamp:
 Sep 22, 2010, 6:51:00 PM (14 years ago)
 Branches:
 (u'fiekerDuVal', '117eb8c30fc9e991c4decca4832b1d19036c4c65')(u'spielwiese', '648d28f488f6ff08f5607ff229b9ad9e4a5b93c2')
 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 FruehbisKrueger, anne@math.unihannover.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 HirzebruchJung type 19 such that all singularities are of HirzebruchJung 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 < n1; i++){ 58 kill l; 59 for(i=1; i < n1; i++){ 60 60 //elimination of all variables exept var(i),var(n1),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_n1 > x_n forall j != i,n1,n 80 def R = ring(ringl); //now x_j > x_i > x_n1 > x_n forall j != i,n1,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_n2,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 quasiordinary 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 ith 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 HizebuchJung 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 HirzebruchJung 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=ndim(K); 743 M=minor(jacob(K),d)+K; 744 if(deg(std(M+V)[1])>0) 742 d=ndim(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==ndim(Estd)) 756 if(d==ndim(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.