Changeset 7ed4b9b in git
- Timestamp:
- Apr 10, 2009, 3:34:00 PM (14 years ago)
- Branches:
- (u'jengelh-datetime', 'ceac47cbc86fe4a15902392bdbb9bd2ae0ea02c6')(u'spielwiese', 'a800fe4b3e9d37a38c5a10cc0ae9dfa0c15a4ee6')
- Children:
- 093892a77af2a4dbecf127c9466ed0de10c63076
- Parents:
- 6af4b1d2770833d1e8d4e66dd4c4613664220413
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/LIB/normal.lib
r6af4b1 r7ed4b9b 1 1 /////////////////////////////////////////////////////////////////////////////// 2 version="$Id: normal.lib,v 1.5 1 2009-04-07 16:18:05 seelischExp $";2 version="$Id: normal.lib,v 1.52 2009-04-10 13:34:00 Singular Exp $"; 3 3 category="Commutative Algebra"; 4 4 info=" … … 10 10 11 11 MAIN PROCEDURES: 12 normal(I[...]); normalization of an affine ring 12 normal(I[...]); normalization of an affine ring 13 13 normalP(I,[...]; normalization of an affine ring in positive characteristic 14 14 normalC(I,[...]; normalization of an affine ring through a chain of rings 15 HomJJ(L); presentation of theEnd_R(J) as affine ring, J an ideal15 HomJJ(L); presentation of End_R(J) as affine ring, J an ideal 16 16 genus(I); computes the geometric genus of a projective curve 17 17 primeClosure(L); integral closure of R/p, p a prime ideal … … 22 22 deltaLoc(f,S); sum of delta invariants at conjugated singular points 23 23 locAtZero(I); checks whether the zero set of I is located at 0 24 norTest( i,nor;) checks whether result of normal or mormal_p was correct24 norTest(I,nor); checks the output of normal, normalP, normalC 25 25 "; 26 26 … … 44 44 Optional parameters in list choose (can be entered in any order):@* 45 45 Decomposition:@* 46 - \"prim\" -> computes first the minimal associated primes, and then47 the normalization of each prime. (default)@*48 46 - \"equidim\" -> computes first an equidimensional decomposition, 49 and then the normalization of each component. @* 50 - \"noDeco\" -> no preliminary decomposition is done. If the ideal is 47 and then the normalization of each component. (default)@* 48 - \"prim\" -> computes first the minimal associated primes, and then 49 the normalization of each prime. @* 50 - \"noDeco\" -> no preliminary decomposition is done. If the ideal is 51 51 not equidimensional radical, output might be wrong.@* 52 - \"isPrim\" -> assumes that the ideal is prime. If assumption does 52 - \"isPrim\" -> assumes that the ideal is prime. If assumption does 53 53 not hold, output might be wrong.@* 54 - \"noFac\" -> factorization is avoided in the computation of the 54 - \"noFac\" -> factorization is avoided in the computation of the 55 55 minimal associated primes; 56 56 Other:@* … … 59 59 ordering only for computing radicals and prime or equidimensional 60 60 decompositions.@* 61 If this option is not set, changes to dp ordering and perform all61 If this option is not set, it changes to dp ordering and perform all 62 62 computation with respect to this ordering.@* 63 63 - \"withDelta\" (or \"wd\") -> returns also the delta invariants. 64 64 If choose is not given or empty, the default options are used.@* 65 65 ASSUME: The ideal must be radical, for non-radical ideals the output may 66 be wrong (id=radical(id); makes id radical). However, when using 67 \"prim\" option the minimal associated primes of id are computed first 68 and hence normal computes the normalization of the radical of id. 66 be wrong (id=radical(id); makes id radical). However, when using 67 \"prim\" option the minimal associated primes of id are computed first 68 and hence normal computes the normalization of the radical of id.@* 69 69 \"isPrim\" should only be used if id is known to be prime. 70 RETURN: a list, say nor, of size 1 (resp. 2 with option \"withDelta\").71 @format 72 The first element nor[1] is a list of r elements, where r is the73 number of associated primes P_i with option \"prim\" (resp. >= no 70 RETURN: a list, say nor, of size 2 (resp. 3 with option \"withDelta\"). 71 @format 72 * nor[1], the first element, is a list of r rings, where r is the 73 number of associated primes P_i with option \"prim\" (resp. >= no 74 74 of equidimenensional components P_i with option \"equidim\").@* 75 Each element of nor[1] is a list with the information on the 76 normalization of the i-th component, i.e. the integral closure 77 in its field of fractions (as affine ring).@* 78 Each list nor[1][i] contains 3 elements (resp. 4 with option 79 \"withDelta\"). @* 80 The first two element of nor[1][i] give the normalization by 81 module generators. The normalization is of the form 82 1/c * U, with U = nor[1][i][1] an ideal of R / P_i and 83 c = nor[1][i][2] a polynomial in R / P_i.@* 84 The third element is a ring Ri=nor[1][i][3], i=1..r, 85 which contains two ideals with given 75 Each ring Ri:=nor[1][i], i=1..r, contains two ideals with given 86 76 names @code{norid} and @code{normap} such that @* 87 - Ri/norid is the normalization of the i-th component. 88 - the direct sum of the rings Ri/norid is the normalization 77 - Ri/norid is the normalization of the i-th component, i.e. the 78 integral closure in its field of fractions (as affine ring); 79 - @code{normap} gives the normalization map from basering/id to 80 Ri/norid for each i.@* 81 - the direct sum of the rings Ri/norid, i=1,..r, is the normalization 89 82 of basering/id; @* 90 - @code{normap} gives the normalization map from basering/id to91 Ri/norid for each j.@*92 When option \"withDelta\" is set, the forth element nor[1][i][4] is93 the delta invariant of the i-th component. (-1 means infinite, and 094 that basering/P_i is normal)@*95 @*96 Also, When option \"withDelta\" is set the second element of the list97 nor, nor[2], is an integer, the total delta invariant of basering/id98 (-1 means infinite, and 0 that basering/idis normal).83 * nor[2] is a list of size r with information on the normalization of 84 the i-th component as module over the basering:@* 85 nor[2][i] is an ideal, say U, in the basering such that the integral 86 closure of basering/P_i is generated as module over the basering by 87 1/c * U, with c the last element U[size(U)] of U.@* 88 * nor[3] (if option \"withDelta\" is set) is a list of an intvec 89 of size r, the delta invariants of the r components, and an integer, 90 the total delta invariant of basering/id (-1 means infinite, and 0 91 that basering/P_i resp. basering/input is normal). 99 92 @end format 100 THEORY: We use a general algorithm described in [G.-M. Greuel, S. Laplagne, 101 F. Seelisch: Normalization of Rings (2009)]. 102 The delta invariant of a reduced ring K[x1,...,xn]/id is 93 THEORY: We use a general algorithm described in [G.-M. Greuel, S. Laplagne, 94 F. Seelisch: Normalization of Rings (2009)].@* 95 The delta invariant of a reduced ring K[x1,...,xn]/id is 103 96 dim_K(normalization(K[x1,...,xn]/id) / K[x1,...,xn]/id) 104 97 We call this number also the delta invariant of id. 105 NOTE: To use the i-th ring type: @code{def R=nor[1][i] [3]; setring R;}.106 @* Increasing/decreasing printlevel displays more/less comments 98 NOTE: To use the i-th ring type: @code{def R=nor[1][i]; setring R;}. 99 @* Increasing/decreasing printlevel displays more/less comments 107 100 (default: printlevel=0). 108 @* Implementation works also for local rings. 101 @* Implementation works also for local rings. 109 102 @* Not implemented for quotient rings. 110 103 @* If the input ideal id is weighted homogeneous a weighted ordering may … … 113 106 EXAMPLE: example normal; shows an example 114 107 " 115 { 108 { 116 109 intvec opt = option(get); // Save current options 117 110 118 119 int decomp;// Preliminar decomposition:111 int i,j; 112 int decomp; // Preliminar decomposition: 120 113 // 0 -> no decomposition (id is assumed to be prime) 121 // 1 -> no decomposition 122 // (id is assumed to be equidimensional radical) 114 // 1 -> no decomposition 115 // (id is assumed to be equidimensional radical) 123 116 // 2 -> equidimensional decomposition 124 117 // 3 -> minimal associated primes 125 126 127 128 129 130 131 132 133 134 135 // Default methods: 136 noFac = 0; // Use facSTD when computing minimal associated primes137 decomp = 3; // Minimal associated primes138 useRing = 0; // Change first to dp ordering, and perform all139 // computations there.140 withDelta = 0; // Do not compute the delta invariant.141 142 143 //--------------------------- define the method --------------------------- 118 int noFac, useRing, withDelta; 119 int dbg = printlevel - voice + 2; 120 int nvar = nvars(basering); 121 int chara = char(basering); 122 list result; 123 list keepresult; 124 list ringStruc; 125 ideal U; 126 poly c; 127 int sp; // Number of components. 128 129 // Default methods: 130 noFac = 0; // Use facSTD when computing minimal associated primes 131 decomp = 2; // Equidimensional decomposition 132 useRing = 0; // Change first to dp ordering, and perform all 133 // computations there. 134 withDelta = 0; // Do not compute the delta invariant. 135 136 //--------------------------- define the method --------------------------- 144 137 string method; //make all options one string in order to use 145 138 //all combinations of options simultaneously 146 139 for ( i=1; i <= size(#); i++ ) 147 { 148 if ( typeof(#[i]) == "string" ) 140 { 141 if ( typeof(#[i]) == "string" ) 149 142 { 150 143 method = method + #[i]; … … 152 145 } 153 146 154 147 //--------------------------- choosen methods ----------------------- 155 148 if ( find(method,"isprim") or find(method,"isPrim") ) 156 149 {decomp = 0;} 157 150 158 151 if ( find(method,"nodeco") or find(method,"noDeco") ) 159 152 {decomp = 1;} 160 153 154 if ( find(method,"prim") ) 155 {decomp = 3;} 156 161 157 if ( find(method,"equidim") ) 162 158 {decomp = 2;} 163 164 if ( find(method,"prim") ) 165 {decomp = 3;} 166 159 167 160 if ( find(method,"nofac") or find(method,"noFac") ) 168 161 {noFac=1;} 169 162 170 163 if ( (find(method,"useRing") or find(method,"usering")) and (ordstr(basering) != "dp("+string(nvars(basering))+"),C")) 171 164 {useRing = 1;} 172 165 173 166 if ( find(method,"withDelta") or find(method,"wd") or find(method,"withdelta")) 174 167 { … … 186 179 list #; 187 180 188 189 // If the ordering is not global, we change to dp ordering for computing the 190 191 // If the ordering is global, but not dp, and useRing = 0, we also change to 192 193 181 //------------------------ change ring if required ------------------------ 182 // If the ordering is not global, we change to dp ordering for computing the 183 // min ass primes. 184 // If the ordering is global, but not dp, and useRing = 0, we also change to 185 // dp ordering. 186 194 187 int isGlobal = ord_test(basering); // Checks if the original ring has 195 188 // global ordering. 196 189 197 190 def origR = basering; // origR is the original ring 198 191 // R is the ring where computations will be done 199 192 200 193 if((useRing == 1) and (isGlobal == 1)){ 201 194 def globR = basering; … … 208 201 def globR = ring(rl); 209 202 setring globR; 210 ideal id = fetch(origR, id); 211 } 212 213 //------------------------ preliminary decomposition----------------------- 203 ideal id = fetch(origR, id); 204 } 205 206 //------------------------ trivial checkings ------------------------ 207 id = groebner(id); 208 if((size(id) == 0) or (id[1] == 1)){ 209 // The original ring R/I was normal. Nothing to do. 210 // We define anyway a new ring, equal to R, to be able to return it. 211 setring origR; 212 list lR = ringlist(origR); 213 def ROut = ring(lR); 214 setring ROut; 215 ideal norid = 0; 216 ideal normap = maxideal(1); 217 export norid; 218 export normap; 219 setring origR; 220 if(withDelta){ 221 result = list(list(ideal(1), poly(1), ROut), 0); 222 } else { 223 result = list(list(ideal(1), poly(1), ROut)); 224 } 225 return(result); 226 } 227 228 //------------------------ preliminary decomposition----------------------- 214 229 list prim; 215 230 if(decomp == 2){ … … 227 242 { prim = minAssGTZ(id); } 228 243 } 229 230 // if ring was not global and useRing is on, we go back to the original ring 244 sp = size(prim); 245 if(dbg>=1) 246 { 247 prim; ""; 248 "// number of components is", sp; 249 ""; 250 } 251 252 253 //----------------- back to the original ring if required ------------------ 254 // if ring was not global and useRing is on, we go back to the original ring 231 255 if((useRing == 1) and (isGlobal != 1)){ 232 256 setring origR; … … 240 264 } 241 265 } 242 243 if(dbg>=1) 244 { 245 prim; ""; 246 "// number of components is", size(prim); 247 ""; 248 } 249 250 // ---------------- normalization of the components------------------------- 251 // calls normalM to compute the normalization of each component. 266 267 // ---------------- normalization of the components------------------------- 268 // calls normalM to compute the normalization of each component. 252 269 253 270 list norComp; // The normalization of each component. … … 262 279 def newR; 263 280 list newRList; 264 281 265 282 for(i=1; i<=size(prim); i++) 266 283 { … … 276 293 printlevel = printlevel + 1; 277 294 norComp = normalM(prim[i], decomp, withDelta); 278 printlevel = printlevel - 1; 295 printlevel = printlevel - 1; 279 296 for(j = 1; j <= size(norComp); j++){ 280 297 newR = norComp[j][3]; … … 290 307 } 291 308 } 309 // -- incorporate result for this component to the list of results --- 292 310 if(useRing == 0){ 293 // We go back to the original ring.294 setring origR;295 U = fetch(R, U);296 c = fetch(R, c);297 newRListO = imap(R, newRList);298 // We change the ordering in the new ring.299 if(nvars(newR) > nvars(origR)){300 newRListO[3]=insert(origOrd, newRListO[3][1]);301 } else {302 newRListO[3] = origOrd;303 }304 newROrigOrd = ring(newRListO);305 setring newROrigOrd;306 ideal norid = imap(newR, norid);307 ideal normap = imap(newR, normap);308 export norid;309 export normap;310 setring origR;311 totalComps++;312 result[totalComps] = list(U, c, newROrigOrd);313 if(withDelta){314 result[totalComps] = insert(result[totalComps], delt, 3);315 }316 setring R;311 // We go back to the original ring. 312 setring origR; 313 U = fetch(R, U); 314 c = fetch(R, c); 315 newRListO = imap(R, newRList); 316 // We change the ordering in the new ring. 317 if(nvars(newR) > nvars(origR)){ 318 newRListO[3]=insert(origOrd, newRListO[3][1]); 319 } else { 320 newRListO[3] = origOrd; 321 } 322 newROrigOrd = ring(newRListO); 323 setring newROrigOrd; 324 ideal norid = imap(newR, norid); 325 ideal normap = imap(newR, normap); 326 export norid; 327 export normap; 328 setring origR; 329 totalComps++; 330 result[totalComps] = list(U, c, newROrigOrd); 331 if(withDelta){ 332 result[totalComps] = insert(result[totalComps], delt, 3); 333 } 334 setring R; 317 335 } else { 318 336 setring R; … … 323 341 } 324 342 } 325 326 // -------------------------- delta computation ---------------------------- 343 344 // -------------------------- delta computation ---------------------------- 327 345 if(withDelta == 1){ 328 346 // Intersection multiplicities of list prim, sp=size(prim). … … 330 348 { 331 349 "// Sum of delta for all components: ", deltI; 332 } 350 } 333 351 if(size(prim) > 1){ 334 352 dbprint(dbg, "// Computing the sum of the intersection multiplicities of the components..."); … … 338 356 deltI = -1; 339 357 } else { 340 deltI = deltI + mul; 358 deltI = deltI + mul; 341 359 } 342 360 if ( dbg >= 1 ) 343 361 { 344 362 "// Intersection multiplicity is : ", mul; 345 } 363 } 346 364 } 347 365 } 348 349 // -------------------------- prepare output ------------------------------ 366 367 // -------------------------- prepare output ------------------------------ 350 368 setring origR; 369 370 list RL; // List of rings 371 list MG; // Module generators 372 intvec DV; // Vector of delta's of each component 373 for(i = 1; i <= size(result); i++){ 374 RL[i] = result[i][3]; 375 MG[i] = lineUpLast(result[i][1], result[i][2]); 376 if(withDelta){ 377 DV[i] = result[i][4]; 378 } 379 } 380 list resultNew; 381 351 382 if(withDelta){ 352 result = result, deltI;383 resultNew = list(RL, MG, list(DV, deltI)); 353 384 } else { 354 result = list(result);355 } 356 385 resultNew = list(RL, MG); 386 } 387 357 388 option(set, opt); 358 return(result); 389 390 if ( dbg >= 0 ) 391 { 392 ""; 393 if(!withDelta){ 394 "// 'normal' created a list, say nor, of two elements."; 395 } else { 396 "// 'normal' created a list, say nor, of three elements."; 397 } 398 "// * nor[1] is a list of", sp, "ring(s). To access the i-th ring nor[1][i], "; 399 "// give it a name, say Ri, and type e.g. "; 400 " def R1 = nor[1][1]; setring R1; norid; normap;"; 401 "// For the other rings type first "; 402 " setring r;"; 403 "// (if r is the name of your original basering) and then continue as"; 404 "// for the first ring."; 405 "// Ri/norid is the affine algebra of the normalization of the i-th "; 406 "// component r/P_i (where P_i is the i-th component of a decomposition of"; 407 "// the input ideal) and normap the normalization map from r to Ri/norid."; 408 "// * nor[2] is a list of", sp, "ideal(s) such that the integral"; 409 "// closure of basering/P_i is generated as module over the basering by"; 410 "// 1/ci * Ui, with Ui the i-th ideal of nor[2] and ci the last element"; 411 "// Ui[size(Ui)] of Ui."; 412 if(withDelta){ 413 "// * nor[3] is a list of an intvec of size r, the delta invariants "; 414 "// of the r components, and an integer, the total delta invariant "; 415 "// of basering/id (-1 means infinite, and 0 that basering/P_i resp. "; 416 "// basering/input is normal)."; 417 } 418 } 419 return(resultNew); 359 420 } 360 361 421 362 422 example … … 366 426 ring s = 0,(x,y),dp; 367 427 ideal i = (x2-y3)*(x2+y2)*x; 368 list nor = normal(i, "withDelta" );369 nor; 428 list nor = normal(i, "withDelta", "prim"); 429 nor; 370 430 371 431 // 2 branches have delta = 1, and 1 branch has delta = 0 372 432 // the total delta invariant is 13 373 433 374 def R2 = nor[1][2] [3]; setring R2;434 def R2 = nor[1][2]; setring R2; 375 435 norid; normap; 376 436 377 437 echo = 0; 378 438 printlevel = printlevel-1; … … 381 441 ring r = 2,(x,y,z),dp; 382 442 ideal i = z3-xy4; 383 list nor = normal(i, "withDelta" ); nor;384 // the delta invariant is infinite 443 list nor = normal(i, "withDelta", "prim"); nor; 444 // the delta invariant is infinite 385 445 // xy2z/z2 and xy3/z2 generate the integral closure of r/i as r/i-module 386 446 // in its quotient field Quot(r/i) 387 447 388 // the normalization as affine algebra over the ground field: 389 def R = nor[1][1] [3]; setring R;448 // the normalization as affine algebra over the ground field: 449 def R = nor[1][1]; setring R; 390 450 norid; normap; 391 451 } … … 423 483 ideal SBid, id, J = Li[1], Li[2], Li[3]; 424 484 poly p = Li[4]; 485 int noRed = 0; 486 if(size(Li) > 4){ 487 if(Li[5] == 1){ 488 noRed = 1; 489 } 490 } 491 425 492 attrib(SBid,"isSB",1); 426 493 int homo = homog(Li[2]); //is 1 if id is homogeneous, 0 if not … … 483 550 484 551 if ( y>=1 ) 485 { 552 { 486 553 "// the non-zerodivisor p:"; p; 487 554 "// the module p*Hom(J,J) = p*J:J :"; f; … … 492 559 //---------- Test: Hom(J,J) == R ?, if yes, go home --------------------------- 493 560 494 //rf = interred(reduce(f,f2)); 561 //rf = interred(reduce(f,f2)); 495 562 //### interred hier weggelassen, unten zugefgt 496 563 rf = reduce(f,f2); //represents p*Hom(J,J)/p*R = Hom(J,J)/R … … 558 625 // f2=p (i.e. ideal generated by p) 559 626 560 //f = mstd(f)[2]; //### gendert GMG 04.10.08 561 //ideal ann = quotient(f2,f); //### f durch rf ersetzt 627 //f = mstd(f)[2]; //### gendert GMG 04.10.08 628 //ideal ann = quotient(f2,f); //### f durch rf ersetzt 562 629 rf = mstd(rf)[2]; //rf = NF(f,p), hence <p,rf> = <p,f> 563 ideal ann = quotient(f2,rf); //p:f = p:rf 564 565 //------------- compute the contribution to delta ---------- 630 ideal ann = quotient(f2,rf); //p:f = p:rf 631 632 //------------- compute the contribution to delta ---------- 566 633 //delt=dim_K(Hom(JJ)/R (or -1 if infinite) 567 568 int delt=vdim(std(modulo(f,ideal(p)))); 634 635 int delt=vdim(std(modulo(f,ideal(p)))); 569 636 570 637 f = p,rf; // generates pJ:J mod(p), i.e. p*Hom(J,J)/p*R as R-module … … 588 655 589 656 //map psi1 = P,maxideal(1); //### psi1 durch fetch ersetzt 590 //ideal SBid = psi1(SBid); 657 //ideal SBid = psi1(SBid); 591 658 ideal SBid = fetch(P,SBid); 592 659 attrib(SBid,"isSB",1); … … 611 678 // It is a fact, that the kernel is generated by the linear and the quadratic 612 679 // relations 613 // f=p,rf, rf=reduce(f,p), generates pJ:J mod(p), 680 // f=p,rf, rf=reduce(f,p), generates pJ:J mod(p), 614 681 // i.e. p*Hom(J,J)/p*R as R-module 615 682 … … 629 696 for ( jj=2; jj<=ii; jj++ ) 630 697 { 631 ff = NF(f[ii]*f[jj],std(0)); //this makes lift much faster 698 ff = NF(f[ii]*f[jj],std(0)); //this makes lift much faster 632 699 A = lift(pf,ff); //ff lin. comb. of elts of pf mod I 633 700 Quad = Quad, ideal(T(jj)*T(ii) - T*A); //quadratic relations … … 648 715 //mstd dient nur zum verkleinern, die SB-Eigenschaft geht spaeter verloren 649 716 //da in neuen Ring abgebildet und mit id vereinigt 650 717 651 718 //---------- reduce number of variables by substitution, if possible ---------- 652 719 if (homo==1) … … 659 726 } 660 727 661 ideal endid = imap(newR,id),imap(newR,Q); 728 ideal endid = imap(newR,id),imap(newR,Q); 662 729 //hier wird Q weiterverwendet, die SB-Eigenschaft wird nicht verwendet. 663 730 endid = simplify(endid,2); 664 731 ideal endphi = ideal(X(1..nvars(R))); 665 732 666 L = substpart(endid,endphi,homo,rw); 667 668 def lastRing=L[1]; 669 setring lastRing; 733 734 if(noRed == 0){ 735 L = substpart(endid,endphi,homo,rw); 736 def lastRing=L[1]; 737 setring lastRing; 738 //return(lastRing); 739 } else { 740 list RL = ringlist(newRing); 741 def lastRing = ring(RL); 742 setring lastRing; 743 ideal endid = fetch(newRing, endid); 744 ideal endphi = fetch(newRing, endphi); 745 export(endid); 746 export(endphi); 747 //def lastRing = newRing; 748 //setring R; 749 //return(newR); 750 } 751 752 753 754 // L = substpart(endid,endphi,homo,rw); 755 756 // def lastRing=L[1]; 757 // setring lastRing; 670 758 671 759 attrib(endid,"onlySingularAtZero",0); … … 730 818 731 819 /////////////////////////////////////////////////////////////////////////////// 732 //compute intersection multiplicities as needed for delta(I) in 820 //compute intersection multiplicities as needed for delta(I) in 733 821 //normalizationPrimes and normalP: 734 822 … … 736 824 "USAGE: iMult(L); L a list of ideals 737 825 RETURN: int, the intersection multiplicity of the ideals of L; 738 if iMult(L) is infinite, -1 is returned. 826 if iMult(L) is infinite, -1 is returned. 739 827 THEORY: If r=size(L)=2 then iMult(L) = vdim(std(L[1]+L[2])) and in general 740 828 iMult(L) = sum{ iMult(L[j],Lj) | j=1..r-1 } with Lj the intersection 741 829 of L[j+1],...,L[r]. If I is the intersection of all ideals in L then 742 830 we have delta(I) = delta(L[1])+...+delta(L[r]) + iMult(L) where 743 delta(I) = vdim (normalisation(R/I)/(R/I)), R the basering. 831 delta(I) = vdim (normalisation(R/I)/(R/I)), R the basering. 744 832 EXAMPLE: example iMult; shows an example 745 833 " … … 762 850 ideal I(i) = intersect(I(i+1),prim[i+1]); 763 851 mu = vdim(std(I(i)+prim[i])); 764 if ( mu < 0 ) 765 { 766 break; 852 if ( mu < 0 ) 853 { 854 break; 767 855 } 768 856 mul = mul + mu; … … 783 871 L = (x-y),(x3+y2),(x3-y4); 784 872 iMult(L); 785 } 873 } 786 874 /////////////////////////////////////////////////////////////////////////////// 787 875 //check if I has a singularity only at zero, as needed in normalizationPrimes … … 794 882 EXAMPLE: example locAtZero; shows an example 795 883 " 796 { 884 { 797 885 int ii,jj, caz; //caz: conzentrated at zero 798 886 int dbp = printlevel-voice+2; 799 887 int nva = nvars(basering); 800 int vdi = vdim(I); 888 int vdi = vdim(I); 801 889 if ( vdi < 0 ) 802 890 { 803 if (dbp >=1) 804 { "// non-isolated singularitiy";""; } 891 if (dbp >=1) 892 { "// non-isolated singularitiy";""; } 805 893 return(caz); 806 894 } … … 812 900 { 813 901 caz=1; 814 if (dbp >=1) 815 { "// isolated singularity and homogeneous";""; } 902 if (dbp >=1) 903 { "// isolated singularity and homogeneous";""; } 816 904 return(caz); 817 905 } … … 838 926 if ( caz == 1 || pot >= vdi ) 839 927 { 840 if (dbp >=1) 928 if (dbp >=1) 841 929 { 842 930 "// mindeg, exponent, vdim used in 'locAtZero':", mi1,pot,vdi; ""; 843 } 931 } 844 932 return(caz); 845 933 } 846 934 else 847 { 935 { 848 936 if ( pot^2 < vdi ) 849 937 { pot = pot^2; } … … 862 950 i= std(i*ideal(x-1,y,z)); 863 951 locAtZero(i); 864 } 952 } 865 953 866 954 /////////////////////////////////////////////////////////////////////////////// 867 955 868 //The next procedure normalizationPrimes computes the normalization of an 869 //irreducible or an equidimensional ideal i. 870 //- If i is irreducuble, then the returned list, say nor, has size 2 956 //The next procedure normalizationPrimes computes the normalization of an 957 //irreducible or an equidimensional ideal i. 958 //- If i is irreducuble, then the returned list, say nor, has size 2 871 959 //with nor[1] the normalization ring and nor[2] the delta invariant. 872 //- If i is equidimensional, than the "splitting tools" can create a 873 //decomposition of i and nor can have more than 1 ring. 960 //- If i is equidimensional, than the "splitting tools" can create a 961 //decomposition of i and nor can have more than 1 ring. 874 962 875 963 static proc normalizationPrimes(ideal i,ideal ihp,int delt,intvec delti,list #) 876 "USAGE: normalizationPrimes(i,ihp,delt[,si]); i = equidimensional ideal, 964 "USAGE: normalizationPrimes(i,ihp,delt[,si]); i = equidimensional ideal, 877 965 ihp = map (partial normalization), delt = partial delta-invariant, 878 966 si = ideal s.t. V(si) contains singular locus (optional) … … 885 973 - normap gives the normalization map from basering/id 886 974 to nor[j]/norid (for each j) 887 nor[size(nor)] = dim_K(normalisation(P/i) / (P/i)) is the 975 nor[size(nor)] = dim_K(normalisation(P/i) / (P/i)) is the 888 976 delta-invariant, where P is the basering. 889 977 EXAMPLE: example normalizationPrimes; shows an example … … 911 999 int depth,lauf,prdim,osaz; 912 1000 int ti=timer; 913 1001 914 1002 gnirlist = ringlist(BAS); 915 1003 … … 935 1023 } 936 1024 937 //--------------- General NOTATION, compute SB of input ----------------- 1025 //--------------- General NOTATION, compute SB of input ----------------- 938 1026 // SM is a list, the result of mstd(i) 939 // SM[1] = SB of input ideal i, 1027 // SM[1] = SB of input ideal i, 940 1028 // SM[2] = (minimal) generators for i. 941 1029 // We work with SM and will copy the attributes from i to SM[2] … … 958 1046 //----------------- the general case, set attributes ---------------- 959 1047 //Note: onlySingularAtZero is NOT preserved under the ring extension 960 //basering --> Hom(J,J) (in contrast to isIsolatedSingularity), 1048 //basering --> Hom(J,J) (in contrast to isIsolatedSingularity), 961 1049 //therefore we reset it: 962 1050 963 1051 attrib(i,"onlySingularAtZero",0); 964 1052 … … 1035 1123 } 1036 1124 1037 //-------------------- Trivial cases, in each case RETURN ------------------ 1125 //-------------------- Trivial cases, in each case RETURN ------------------ 1038 1126 // input ideal is the ideal of a partial normalization 1039 1127 … … 1059 1147 return(result); 1060 1148 } 1061 1149 1062 1150 // --- Trivial case: input ideal is zero-dimensional and homog --- 1063 1151 if( (dim(SM[1])==0) && (homog(SM[2])==1) ) … … 1068 1156 } 1069 1157 MB=maxideal(1); 1070 intvec rw; 1071 list LL=substpart(MB,ihp,0,rw); 1158 intvec rw; 1159 list LL=substpart(MB,ihp,0,rw); 1072 1160 def newR5=LL[1]; 1073 1161 setring newR5; … … 1107 1195 } 1108 1196 1109 //---------------------- The non-trivial cases start ------------------- 1197 //---------------------- The non-trivial cases start ------------------- 1110 1198 //the higher dimensional case 1111 1199 //we test first hypersurface, CohenMacaulay and complete intersection … … 1135 1223 // Notation: J ideal of singular locus or (if given) containing it 1136 1224 // JM = mstd(J) or maxideal(1),maxideal(1) 1137 // JM[1] SB of singular locus, JM[2] minbasis, dimJ = dim(JM[1]) 1225 // JM[1] SB of singular locus, JM[2] minbasis, dimJ = dim(JM[1]) 1138 1226 // SM[1] SB of the input ideal i, SM[2] minbasis 1139 1227 // Computation if singular locus is critical, because it determines the … … 1156 1244 { 1157 1245 //--- the case where an ideal #[1] is given: 1158 if( size(#)>0 ) 1246 if( size(#)>0 ) 1159 1247 { 1160 1248 J = #[1],SM[2]; … … 1185 1273 attrib(JM[1],"isSB",1); 1186 1274 if( y>=1 ) 1187 { 1275 { 1188 1276 "// the dimension of the singular locus is"; dimJ ; ""; 1189 1277 } 1190 1278 1191 1279 if(dim(JM[1]) <= dim(SM[1])-2) 1192 1280 { … … 1218 1306 1219 1307 //------- extra check for onlySingularAtZero, relatively cheap ---------- 1220 //it uses the procedure 'locAtZero' from for testing 1308 //it uses the procedure 'locAtZero' from for testing 1221 1309 //if an ideal is concentrated at 0 1222 1310 if(y>=1) … … 1224 1312 "// extra test for onlySingularAtZero:"; 1225 1313 } 1226 if ( locAtZero(JM[1]) ) 1314 if ( locAtZero(JM[1]) ) 1227 1315 { 1228 1316 attrib(SM[2],"onlySingularAtZero",1); … … 1236 1324 } 1237 1325 } 1238 1326 1239 1327 //displaying the attributes: 1240 1328 if(y>=2) 1241 1329 { 1242 "// the attributes of the ideal are:"; 1330 "// the attributes of the ideal are:"; 1243 1331 "// isCohenMacaulay:", attrib(SM[2],"isCohenMacaulay"); 1244 1332 "// isCompleteIntersection:", attrib(SM[2],"isCompleteIntersection"); … … 1253 1341 1254 1342 //------------- case: CohenMacaulay in codim 2, RETURN --------------- 1255 if( (attrib(SM[2],"isRegInCodim2")==1) && 1343 if( (attrib(SM[2],"isRegInCodim2")==1) && 1256 1344 (attrib(SM[2],"isCohenMacaulay")==1) ) 1257 1345 { … … 1278 1366 //---------- case: isolated singularity only at 0, RETURN ------------ 1279 1367 // In this case things are easier, we can use the maximal ideal as radical 1280 // of the singular locus; 1368 // of the singular locus; 1281 1369 // JM mstd of ideal of singular locus, SM mstd of input ideal 1282 1370 … … 1307 1395 // Note: 1308 1396 // HomJJ (ideal SBid, ideal id, ideal J, poly p) with 1309 // SBid = SB of id, J = radical ideal of basering P with: 1397 // SBid = SB of id, J = radical ideal of basering P with: 1310 1398 // nonNormal(R) is in V(J), J contains the nonzero divisor p 1311 1399 // of R = P/id (J = test ideal) … … 1356 1444 1357 1445 printlevel=printlevel+1; 1358 list tluser = 1359 normalizationPrimes(endid,psi(ihp),delt,delti); 1360 //list tluser = 1361 // normalizationPrimes(endid,psi(ihp),delt,delti,J); 1446 list tluser = 1447 normalizationPrimes(endid,psi(ihp),delt,delti); 1448 //list tluser = 1449 // normalizationPrimes(endid,psi(ihp),delt,delti,J); 1362 1450 //#### ??? improvement: give also the old ideal of sing locus??? 1363 1451 1364 1452 printlevel = printlev; //reset printlevel 1365 setring BAS; 1366 return(tluser); 1453 setring BAS; 1454 return(tluser); 1367 1455 } 1368 1456 … … 1447 1535 intvec delti2 = keepresult2[size(keepresult2)][2]; 1448 1536 1449 if( delt>=0 && delt1>=0 && delt2>=0 ) 1537 if( delt>=0 && delt1>=0 && delt2>=0 ) 1450 1538 { ideal idid1=id,id1; 1451 1539 int mul = vdim(std(idid1)); … … 1457 1545 { 1458 1546 delt = -1; 1459 } 1547 } 1460 1548 } 1461 1549 if ( y>=1 ) … … 1511 1599 if(y>=1) 1512 1600 { 1513 "// radical is equal to:";""; JM[2]; 1601 "// radical is equal to:";""; JM[2]; 1514 1602 ""; 1515 1603 } … … 1535 1623 1536 1624 RS=HomJJ(RR,y); //most important subprocedure 1537 1625 1538 1626 // ------------------ the normal case, RETURN ----------------- 1539 1627 // RS[2]==1 means that the test for normality was positive … … 1697 1785 } 1698 1786 printlevel = printlevel+1; 1699 keepresult1 = 1787 keepresult1 = 1700 1788 normalizationPrimes(vid,ihp,0,0); //1st split factor 1701 1789 … … 1719 1807 attrib(vid,"onlySingularAtZero",oSAZ); 1720 1808 1721 keepresult2 = 1809 keepresult2 = 1722 1810 normalizationPrimes(vid,ihp,0,0); 1723 1811 list delta2 = keepresult2[size(keepresult2)]; //2nd split factor 1724 1812 printlevel = printlev; //reset printlevel 1725 1813 1726 1814 setring BAS; 1727 1815 … … 1794 1882 //subst y,x: x+y+z->f(y,z)+g(z)+z eliminates only x 1795 1883 //HENCE: substitute vars depending on most other vars first 1796 //However, if the sytem xi-fi is reduced then xi does not appear in any of the 1884 //However, if the sytem xi-fi is reduced then xi does not appear in any of the 1797 1885 //fj and hence the order does'nt matter when substitutinp xi by fi 1798 1886 … … 1802 1890 map phi = newRing,maxideal(1); //identity map 1803 1891 list Le = elimpart(endid); 1804 //this proc and the next loop try to substitute as many variables as 1892 //this proc and the next loop try to substitute as many variables as 1805 1893 //possible indices of substituted variables 1806 1894 … … 1904 1992 1905 1993 proc genus(ideal I,list #) 1906 "USAGE: genus( I) or genus(I,1); I a 1-dimensional ideal1994 "USAGE: genus(i) or genus(i,1); I a 1-dimensional ideal 1907 1995 RETURN: an integer, the geometric genus p_g = p_a - delta of the projective 1908 1996 curve defined by i, where p_a is the arithmetic genus. … … 1910 1998 i.e. dim(R'/R), R' the normalization of the local ring R of the 1911 1999 singularity. @* 1912 genus( I,1) uses the normalization to compute delta. Usually genus(i,1)2000 genus(i,1) uses the normalization to compute delta. Usually genus(i,1) 1913 2001 is slower than genus(i) but sometimes not. 1914 2002 EXAMPLE: example genus; shows an example … … 2541 2629 "USAGE: primeClosure(L [,c]); L a list of a ring containing a prime ideal 2542 2630 ker, c an optional integer 2543 RETURN: a list L (of size n+1) consisting of rings L[1],...,L[n] such that @*2544 - L[1] is a copy of (not a reference to!) the input ring L[1] @*2631 RETURN: a list L (of size n+1) consisting of rings L[1],...,L[n] such that 2632 - L[1] is a copy of (not a reference to!) the input ring L[1] 2545 2633 - all rings L[i] contain ideals ker, L[2],...,L[n] contain ideals phi 2546 such that L[1]/ker --> ... --> L[n]/ker are injections given by the 2547 corresponding ideals phi, and L[n]/ker is the integral closure of 2548 L[1]/ker in its quotient field.@* 2634 such that 2635 L[1]/ker --> ... --> L[n]/ker 2636 are injections given by the corresponding ideals phi, and L[n]/ker 2637 is the integral closure of L[1]/ker in its quotient field. 2549 2638 - all rings L[i] contain a polynomial nzd such that elements of 2550 2639 L[i]/ker are quotients of elements of L[i-1]/ker with denominator 2551 nzd via the injection phi. @*2640 nzd via the injection phi. 2552 2641 L[n+1] is the delta invariant 2553 NOTE: - L is constructed by recursive calls of primeClosure itself. @*2554 - c determines the choice of nzd: @*2642 NOTE: - L is constructed by recursive calls of primeClosure itself. 2643 - c determines the choice of nzd: 2555 2644 - c not given or equal to 0: first generator of the ideal SL, 2556 the singular locus of Spec(L[i]/ker) @*2645 the singular locus of Spec(L[i]/ker) 2557 2646 - c<>0: the generator of SL with least number of monomials. 2558 2647 EXAMPLE: example primeClosure; shows an example … … 2603 2692 ker=simplify(interred(ker),15); 2604 2693 //execute ("ring R0="+charstr(R)+",("+varstr(R)+"),("+ordstr(R)+");"); 2605 def R0 = ring(Rlist); 2694 // Rlist may be not defined in this new ring, so we define it again. 2695 list Rlist2 = ringlist(R); 2696 def R0 = ring(Rlist2); 2606 2697 setring R0; 2607 2698 ideal ker=fetch(R,ker); … … 2626 2717 // locus of ker, J:=rad(ker): 2627 2718 2628 list SM=mstd(ker); 2719 list SM=mstd(ker); 2629 2720 2630 2721 // In the first iteration, we have to compute the singular locus "from 2631 // scratch". 2722 // scratch". 2632 2723 // In further iterations, we can fetch it from the previous one but 2633 2724 // have to compute its radical … … 2694 2785 2695 2786 // having computed the radical J of/in the ideal of the singular locus, 2696 // we now need to pick an element nzd of J; 2787 // we now need to pick an element nzd of J; 2697 2788 // NOTE: nzd must be a non-zero divisor mod ker, i.e. not contained in ker 2698 2789 … … 2727 2818 2728 2819 export nzd; 2729 list RR = SM[1],SM[2],J,nzd; 2820 // In this case we do not eliminate variables, so that the maps 2821 // are well defined. 2822 list RR = SM[1],SM[2],J,nzd,1; 2730 2823 2731 2824 if ( dblvl >= 1 ) 2732 2825 {""; 2733 2826 "// compute the first ring extension:"; 2827 "RR: "; 2828 RR; 2734 2829 } 2735 2830 … … 2814 2909 { 2815 2910 delt = -1; 2816 } 2911 } 2817 2912 L[size(L)] = delt; 2818 2913 … … 2938 3033 maxi = maxi,maxideal(1); 2939 3034 map backmap = S(k),maxi; 2940 3035 2941 3036 //mapstr=" map backmap = S(k),"; 2942 3037 //for (l=1;l<=nvars(R(k));l++) … … 2997 3092 /////////////////////////////////////////////////////////////////////////////// 2998 3093 // closureGenerators is called inside proc normal (option "withGens" ) 2999 // 3000 3001 // INPUT is the output of proc primeClosure (except for the last element, the 3002 // delta invariant) : hence input is a list L consisting of rings 3094 // 3095 3096 // INPUT is the output of proc primeClosure (except for the last element, the 3097 // delta invariant) : hence input is a list L consisting of rings 3003 3098 // L[1],...,L[n] (denoted R(1)...R(n) below) such that 3004 3099 // - L[1] is a copy of (not a reference to!) the input ring L[1] 3005 // - all rings L[i] contain ideals ker, L[2],...,L[n] contain ideals phi 3100 // - all rings L[i] contain ideals ker, L[2],...,L[n] contain ideals phi 3006 3101 // such that 3007 3102 // L[1]/ker --> ... --> L[n]/ker … … 3018 3113 // preim[size(preim)] is a non-zero divisor of basering/i. 3019 3114 3020 proc closureGenerators(list L); 3115 proc closureGenerators(list L); 3021 3116 { 3022 def Rees=basering; // when called inside normalI (in reesclos.lib) 3117 def Rees=basering; // when called inside normalI (in reesclos.lib) 3023 3118 // the Rees Algebra is the current basering 3024 3119 … … 3027 3122 int length = nvars(L[n]); // the number of variables of the last ring 3028 3123 int j,k,l; 3029 string mapstr; 3030 list preimages; 3031 //Note: the empty list belongs to no ring, hence preimages can be used 3124 string mapstr; 3125 list preimages; 3126 //Note: the empty list belongs to no ring, hence preimages can be used 3032 3127 //later in R(1) 3033 3128 //this is not possible for ideals (belong always to some ring) 3034 3129 3035 for (int i=1; i<=n; i++) 3036 { 3130 for (int i=1; i<=n; i++) 3131 { 3037 3132 def R(i)=L[i]; //give the rings from L a name 3038 3133 } … … 3066 3161 map phimap=R(k-1),phi; //phimap:R(k-1)-->R(n), k=2..n, is the map 3067 3162 //belonging to phi in R(n) 3068 } 3163 } 3069 3164 3070 3165 p = p*phimap(nzd); … … 3121 3216 maxi = maxi,maxideal(1); 3122 3217 map backmap = S(k),maxi; 3123 3218 3124 3219 //mapstr=" map backmap = S(k),"; 3125 3220 //for (l=1;l<=nvars(R(k));l++) … … 3152 3247 3153 3248 proc normalP(ideal id,list #) 3154 "USAGE: normalP(id [,choose]); id a radical ideal, choose a comma separated 3249 "USAGE: normalP(id [,choose]); id a radical ideal, choose a comma separated 3155 3250 list of optional strings: \"withRing\" or \"isPrim\" or \"noFac\".@* 3156 3251 If choose = \"noFac\", factorization is avoided during the computation 3157 of the minimal associated primes; choose = \"isPrim\" disables the 3252 of the minimal associated primes; choose = \"isPrim\" disables the 3158 3253 computation of the minimal associated primes (should only be used 3159 3254 if the ideal is known to be prime).@* … … 3165 3260 tested) otherwise the result may be wrong. 3166 3261 RETURN: a list, say 'nor' of size 2 (default) or, if \"withRing\" is given, 3167 of size 3. @* 3168 nor[1] (resp. nor[2] if \"withRing\" is given) is a list of ideals 3169 Ii, i=1..r, in the basering where r is the number of associated prime 3262 of size 3. @* 3263 nor[1] (resp. nor[2] if \"withRing\" is given) is a list of ideals 3264 Ii, i=1..r, in the basering where r is the number of associated prime 3170 3265 ideals P_i (irreducible components) of id.@* 3171 - Ii is an ideal given by polynomials g_1,...,g_k,g_k+1 such that 3266 - Ii is an ideal given by polynomials g_1,...,g_k,g_k+1 such that 3172 3267 g_1/g_k+1,...,g_k/g_k+1 generate the integral closure of 3173 3268 basering/P_i as module (over the basering) in its quotient field.@* 3174 3175 nor[2] (resp. nor[3] if choose=\"withRing\") is a list of an intvec 3176 of size r, the delta invariants of the r components, and an integer, 3177 the total delta invariant of basering/id (-1 means infinite, and 0 3178 that basering/P_i resp. basering/input is normal). @* 3269 3270 nor[2] (resp. nor[3] if choose=\"withRing\") is a list of an intvec 3271 of size r, the delta invariants of the r components, and an integer, 3272 the total delta invariant of basering/id (-1 means infinite, and 0 3273 that basering/P_i resp. basering/input is normal). @* 3179 3274 3180 3275 If the optional string \"withRing\" is given, the ring structure of … … 3183 3278 @code{norid} and @code{normap} such that @* 3184 3279 - Ri/norid is the normalization of the i-th rime component P_i, i.e. 3185 isomorphic to the integral closure of basering/P_i in its field 3280 isomorphic to the integral closure of basering/P_i in its field 3186 3281 of fractions; @* 3187 - the direct sum of the rings Ri/norid is the normalization 3282 - the direct sum of the rings Ri/norid is the normalization 3188 3283 of basering/id; @* 3189 3284 - @code{normap} gives the normalization map from basering/P_i to 3190 3285 Ri/norid (for each i).@* 3191 THEORY: The delta invariant of a reduced ring K[x1,...,xn]/id is 3286 THEORY: The delta invariant of a reduced ring K[x1,...,xn]/id is 3192 3287 dim_K(normalization(K[x1,...,xn]/id) / K[x1,...,xn]/id) 3193 We call this number also the delta invariant of id. normalP uses 3194 the qth-power algorithm suggested by Leonard-Pellikaan (using the 3195 Frobenius) in part similair to an implementation by Singh-Swanson. 3288 We call this number also the delta invariant of id. normalP uses 3289 the qth-power algorithm suggested by Leonard-Pellikaan (using the 3290 Frobenius) in part similair to an implementation by Singh-Swanson. 3196 3291 NOTE: To use the i-th ring type: @code{def R=nor[1][i]; setring R;}. 3197 @* Increasing/decreasing printlevel displays more/less comments 3292 @* Increasing/decreasing printlevel displays more/less comments 3198 3293 (default: printlevel = 0). 3199 3294 @* Not implemented for local or mixed orderings or quotient rings. … … 3227 3322 } 3228 3323 3229 //--------------------------- define the method --------------------------- 3324 //--------------------------- define the method --------------------------- 3230 3325 string method; //make all options one string in order to use 3231 3326 //all combinations of options simultaneously 3232 3327 for ( i=1; i<= size(#); i++ ) 3233 { 3234 if ( typeof(#[i]) == "string" ) 3328 { 3329 if ( typeof(#[i]) == "string" ) 3235 3330 { 3236 3331 method = method + #[i]; … … 3253 3348 kill #; 3254 3349 list #; 3255 //--------------------------- start computation --------------------------- 3350 //--------------------------- start computation --------------------------- 3256 3351 ideal II,K1,K2; 3257 3352 … … 3278 3373 3279 3374 if(y>=1) 3280 { 3375 { 3281 3376 prim;""; 3282 3377 "// number of irreducible components is", size(prim); … … 3295 3390 } 3296 3391 if(y>=1) 3297 { "// compute SB of ideal"; 3392 { "// compute SB of ideal"; 3298 3393 } 3299 3394 mstdid = mstd(prim[i]); … … 3303 3398 //------- 1-st main subprocedure: compute module generators ---------- 3304 3399 printlevel = printlevel+1; 3305 II = normalityTest(mstdid); 3400 II = normalityTest(mstdid); 3306 3401 3307 3402 //------ compute also the ringstructure if "withRing" is given ------- … … 3325 3420 K1 = std(K1); 3326 3421 K2 = mstdid[1]+II[1]; 3327 K2 = std(K2); 3328 // K1 = std(mstdid[1],II); //### besser 3422 K2 = std(K2); 3423 // K1 = std(mstdid[1],II); //### besser 3329 3424 // K2 = std(mstdid[1],II[1]); //### besser: Hannes, fixen! 3330 3425 co = codim(K1,K2); … … 3359 3454 if ( wring ) 3360 3455 { 3361 "// 'normalP' created a list, say nor, of three lists: 3456 "// 'normalP' created a list, say nor, of three lists: 3362 3457 // nor[1] resp. nor[2] are lists of",sr,"ring(s) resp. ideal(s) 3363 3458 // and nor[3] is a list of an intvec and an integer. … … 3366 3461 // To access the i-th ring nor[1][i] give it a name, say Ri, and type e.g. 3367 3462 def R1 = nor[1][1]; setring R1; norid; normap; 3368 // for the other rings type first setring r; (if r is the name of your 3463 // for the other rings type first setring r; (if r is the name of your 3369 3464 // original basering) and then continue as for the first ring; 3370 // Ri/norid is the affine algebra of the normalization of the i-th 3465 // Ri/norid is the affine algebra of the normalization of the i-th 3371 3466 // component r/P_i (where P_i is an associated prime of the input ideal) 3372 3467 // and normap the normalization map from r to Ri/norid; 3373 3468 // nor[2] is a list of",sr,"ideal(s), each ideal nor[2][i] consists of 3374 // elements g1..gk of r such that the gj/gk generate the integral 3469 // elements g1..gk of r such that the gj/gk generate the integral 3375 3470 // closure of r/P_i as (r/P_i)-module in the quotient field of r/P_i. 3376 3471 // nor[3] shows the delta-invariant of each component and of the input … … 3384 3479 // closure of the i-th component as (basering/P_i)-module in the quotient 3385 3480 // field of basering/P_i (P_i an associated prime of the input ideal); 3386 // nor[2] shows the delta-invariant of each component and of the input ideal 3481 // nor[2] shows the delta-invariant of each component and of the input ideal 3387 3482 // (-1 means infinite, and 0 that r/P_i is normal)."; 3388 3483 } … … 3412 3507 // the input ideal id of normalP. 3413 3508 // Output is an ideal U s.t. U[i]/U[1] are module generators. 3414 3509 3415 3510 static proc normalityTest(list mstdid) 3416 3511 { … … 3436 3531 ideal M = minor(jacob(I),h,J); //use the command minor modulo J (hence J=0) 3437 3532 M = std(M); //this makes M much smaller 3438 //keep only minors which are not 0 mod I (!) this is important since we 3533 //keep only minors which are not 0 mod I (!) this is important since we 3439 3534 //need a nzd mod I 3440 3535 … … 3444 3539 { 3445 3540 if( size(M[ii]) < size(D[1]) ) 3446 { 3447 D = M[ii]; 3541 { 3542 D = M[ii]; 3448 3543 } 3449 3544 } … … 3452 3547 ideal F = var(1)^p; 3453 3548 for(ii=2; ii<=n; ii++) 3454 { 3455 F=F,var(ii)^p; 3549 { 3550 F=F,var(ii)^p; 3456 3551 } 3457 3552 … … 3462 3557 if ( y >= 1) 3463 3558 { "compute module generators of integral closure"; 3464 "denominator D is:"; D; 3559 "denominator D is:"; D; 3465 3560 pause(); 3466 } 3561 } 3467 3562 3468 3563 ii=0; … … 3473 3568 if ( y >= 1) 3474 3569 { "iteration", ii; } 3475 L = U*Dp + I; 3476 //### L=interred(L) oder msdt(L)[2]? 3570 L = U*Dp + I; 3571 //### L=interred(L) oder msdt(L)[2]? 3477 3572 //Wird dadurch kleiner aber string(L) wird groesser 3478 3573 K = preimage(Q,phi,L); //### Improvement by block ordering? … … 3484 3579 //---------------------------- simplify output -------------------------- 3485 3580 if(size(reduce(U,LK[1]))==0) //previous U coincides with new U 3486 { //i.e. we reached the integral closure 3487 U=simplify(reduce(U,groebner(D)),2); 3581 { //i.e. we reached the integral closure 3582 U=simplify(reduce(U,groebner(D)),2); 3488 3583 U = D,U; 3489 3584 poly gg = gcd(U[1],U[size(U)]); … … 3498 3593 U = simplify(U,6); 3499 3594 //if ( y >= 1) 3500 //{ "module generators are U[i]/U[1], with U:"; U; 3595 //{ "module generators are U[i]/U[1], with U:"; U; 3501 3596 // ""; pause(); } 3502 3597 option(set,op); … … 3513 3608 static proc substpartSpecial(ideal endid, ideal endphi) 3514 3609 { 3515 //Note: newRing is of the form (R the original basering): 3610 //Note: newRing is of the form (R the original basering): 3516 3611 //char(R),(T(1..N),X(1..nvars(R))),(dp(N),...); 3517 3612 … … 3520 3615 int n = nvars(basering); 3521 3616 3522 list Le = elimpart(endid); 3617 list Le = elimpart(endid); 3523 3618 int q = size(Le[2]); //q variables have been substituted 3524 3619 //Le;""; 3525 if ( q == 0 ) 3620 if ( q == 0 ) 3526 3621 { 3527 3622 ideal normap = endphi; … … 3546 3641 list g2 = gnirlist[2]; //the varlist 3547 3642 list g3 = gnirlist[3]; //contains blocks of orderings 3548 int n3 = size(g3); 3549 //----------------- first identify module ordering ------------------ 3643 int n3 = size(g3); 3644 //----------------- first identify module ordering ------------------ 3550 3645 if ( g3[n3][1]== "c" or g3[n3][1] == "C" ) 3551 3646 { … … 3560 3655 int m = 1; 3561 3656 } 3562 //---- delete variables which were substituted and weights -------- 3657 //---- delete variables which were substituted and weights -------- 3563 3658 //gnirlist;""; 3564 3659 intvec V; … … 3570 3665 V = V,g3[ii][2]; //copy weights for ordering in each block 3571 3666 if ( ii==1 ) //into one intvector 3572 { 3667 { 3573 3668 V = V[2..size(V)]; 3574 3669 } … … 3598 3693 //"newg3"; newg3; 3599 3694 //newg3 = delete(newg3,1); //delete empty list 3600 3695 3601 3696 /* 3602 3697 //### neue Ordnung, 1 Block fuer alle vars, aber Gewichte erhalten; … … 3604 3699 //ein neuer Block) ein kuerzeres Ergebnis liefert 3605 3700 kill g3; 3606 list g3; 3701 list g3; 3607 3702 V=0; 3608 3703 for ( ii= 1; ii<=n3-1; ii++ ) … … 3613 3708 3614 3709 if ( V==1 ) 3615 { 3710 { 3616 3711 g3[1] = list("dp",V); 3617 3712 } 3618 3713 else 3619 3714 { 3620 g3[1] = lis("wp",V); 3715 g3[1] = lis("wp",V); 3621 3716 } 3622 3717 newg3 = g3; … … 3634 3729 newg3 = insert(newg3,gm); 3635 3730 } 3636 gnirlist[2] = newg2; 3731 gnirlist[2] = newg2; 3637 3732 gnirlist[3] = newg3; 3638 3733 … … 3648 3743 return(L); 3649 3744 3650 //Hier scheint interred gut zu sein, da es Ergebnis relativ schnell 3745 //Hier scheint interred gut zu sein, da es Ergebnis relativ schnell 3651 3746 //verkleinert. Hier wird z.B. bei leonard1 size(norid) verkleinert aber 3652 3747 //size(string(norid)) stark vergroessert, aber es hat keine Auswirkungen 3653 //da keine map mehr folgt. 3748 //da keine map mehr folgt. 3654 3749 //### Bei Leonard2 haengt interred (BUG) 3655 3750 //mstd[2] verkleinert norid nocheinmal um die Haelfte, dauert aber 3.71 sec … … 3662 3757 // Assume: J[i]/J[1] are the module generators in the quotient field 3663 3758 // with J[1] as universal denominator. 3664 // If option "noRed" is not given, a reduction in the number of variables is 3759 // If option "noRed" is not given, a reduction in the number of variables is 3665 3760 // attempted. 3666 3761 static proc computeRing(ideal J, ideal I, list #) 3667 3762 { 3668 3763 int i, ii,jj; 3669 intvec V; // to be used for variable weights 3764 intvec V; // to be used for variable weights 3670 3765 int y = printlevel-voice+2; 3671 3766 def R = basering; … … 3676 3771 string svar; 3677 3772 ideal maxid = maxideal(1); 3678 3773 3679 3774 int noRed = 0; // By default, we try to reduce the number of generators. 3680 3775 if(size(#) > 0){ 3681 if ( typeof(#[1]) == "string" ) 3776 if ( typeof(#[1]) == "string" ) 3682 3777 { 3683 3778 if (#[1] == "noRed"){noRed = 1;} … … 3686 3781 3687 3782 if ( y >= 1){"// computing the ring structure...";} 3688 3783 3689 3784 if(c==1) 3690 3785 { … … 3711 3806 //old variable names are not touched 3712 3807 3713 if ( find(svars,"T(") == 0 ) 3808 if ( find(svars,"T(") == 0 ) 3714 3809 { 3715 3810 svar = "T"; … … 3717 3812 else 3718 3813 { 3719 for (ii=90; ii>=65; ii--) 3814 for (ii=90; ii>=65; ii--) 3720 3815 { 3721 if ( find(svars,ASCII(ii)+"(") == 0 ) 3816 if ( find(svars,ASCII(ii)+"(") == 0 ) 3722 3817 { 3723 3818 svar = ASCII(ii); break; … … 3735 3830 } 3736 3831 else 3737 { 3832 { 3738 3833 for ( ii=q; ii>=1; ii-- ) 3739 3834 { … … 3753 3848 //Reihenfolge gendert:neue Variablen kommen zuerst, Namen ev. nicht T(i) 3754 3849 3755 def newR = ring(gnirlist); 3850 def newR = ring(gnirlist); 3756 3851 setring newR; //new extended ring 3757 3852 ideal I = imap(R,I); … … 3760 3855 if(y>=1) 3761 3856 { 3762 "// compute linear relations:"; 3857 "// compute linear relations:"; 3763 3858 } 3764 3859 qring newQ = std(I); 3765 3860 3766 3861 ideal f = imap(R,J); 3767 3862 module syzf = syz(f); 3768 ideal pf = f[1]*f; 3863 ideal pf = f[1]*f; 3769 3864 //f[1] is the denominator D from normalityTest, a non zero divisor of R/I 3770 3865 … … 3772 3867 newT = 1,newT[1..q]; 3773 3868 //matrix T = matrix(ideal(1,T(1..q)),1,q+1); //alt 3774 matrix T = matrix(newT,1,q+1); 3869 matrix T = matrix(newT,1,q+1); 3775 3870 ideal Lin = ideal(T*syzf); 3776 //Lin=interred(Lin); 3871 //Lin=interred(Lin); 3777 3872 //### interred reduziert ev size aber size(string(LIN)) wird groesser 3778 3873 … … 3789 3884 if(y>=1) 3790 3885 { 3791 "// compute quadratic relations:"; 3886 "// compute quadratic relations:"; 3792 3887 } 3793 3888 matrix A; … … 3806 3901 if(ord_test(basering) != 1){ 3807 3902 A = lift(pf, ff, u); 3808 Quad = Quad,ideal(newT[jj-1]*newT[ii-1] * u[1, 1]- T*A); 3903 Quad = Quad,ideal(newT[jj-1]*newT[ii-1] * u[1, 1]- T*A); 3809 3904 } else { 3810 3905 A = lift(pf,ff); // ff lin. comb. of elts of pf mod I … … 3812 3907 } 3813 3908 //A = lift(pf, f[ii]*f[jj]); 3814 //Quad = Quad, ideal(T(jj-1)*T(ii-1) - T*A); 3909 //Quad = Quad, ideal(T(jj-1)*T(ii-1) - T*A); 3815 3910 } 3816 3911 } … … 3831 3926 //Ebenso interred, z.B. bei Leonard1 (1. Komponente von Leonard): 3832 3927 //"size Q1:", size(Q1), size(string(Q1)); //75 60083 3833 //Q1 = interred(Q1); 3928 //Q1 = interred(Q1); 3834 3929 //"size Q1:", size(Q1), size(string(Q1)); //73 231956 (!) 3835 3930 //### Speicherueberlauf bei substpartSpecial bei 'ideal norid = phi1(endid)' … … 3840 3935 ideal endphi = imap(R,maxid); 3841 3936 3842 if(noRed == 0){ 3937 if(noRed == 0){ 3843 3938 list L=substpartSpecial(endid,endphi); 3844 3939 def lastRing=L[1]; … … 3856 3951 setring R; 3857 3952 return(newR); 3858 } 3953 } 3859 3954 } 3860 3955 … … 3873 3968 // - nor[1] = U, an ideal of R. 3874 3969 // - nor[2] = c, an element of R. 3875 // U and c satisfy that 1/c * U is the normalization of R / I in the 3970 // U and c satisfy that 1/c * U is the normalization of R / I in the 3876 3971 // quotient field Q(R/I). 3877 3972 // - nor[3] = ring say T, containing two ideals norid and normap such that … … 3881 3976 // Details: 3882 3977 // -------- 3883 // Computes the ideal of the minors in the first step and then reuses it in all 3978 // Computes the ideal of the minors in the first step and then reuses it in all 3884 3979 // steps. 3885 // In step s, the denominator is D^s, where D is a nzd of the original quotient 3980 // In step s, the denominator is D^s, where D is a nzd of the original quotient 3886 3981 // ring, contained in the radical of the singular locus. 3887 // This denominator is used except when the degree of D^i is greater than the 3982 // This denominator is used except when the degree of D^i is greater than the 3888 3983 // degree of a conductor. 3889 // The nzd is taken as the smallest degree polynomial in the radical of the 3984 // The nzd is taken as the smallest degree polynomial in the radical of the 3890 3985 // singular locus. 3891 3986 3892 // It assumes that the ideal I is equidimensional radical. This is not checked 3987 // It assumes that the ideal I is equidimensional radical. This is not checked 3893 3988 // in the procedure! 3894 // If decomp = 0 or decomp = 3 it assumes further that I is prime. Therefore 3895 // any non-zero element in the jacobian ideal is assumed to be a 3989 // If decomp = 0 or decomp = 3 it assumes further that I is prime. Therefore 3990 // any non-zero element in the jacobian ideal is assumed to be a 3896 3991 // non-zerodivisor. 3897 3992 3898 3993 // It works over the given basering. 3899 // If it has a non-global ordering, it changes it to dp global only for 3994 // If it has a non-global ordering, it changes it to dp global only for 3900 3995 // computing radical. 3901 3996 3902 // The delta invariant is only computed if withDelta = 1, and decomp = 0 or 3997 // The delta invariant is only computed if withDelta = 1, and decomp = 0 or 3903 3998 // decomp = 3 (meaning that the ideal is prime). 3904 3999 … … 3913 4008 3914 4009 def R = basering; 3915 3916 // ---------------- computation of the singular locus --------------------- 4010 4011 // ---------------- computation of the singular locus --------------------- 3917 4012 // We compute the radical of the ideal of minors modulo the original ideal. 3918 4013 // This is done only in the first step. … … 3929 4024 } 3930 4025 int d = dim(I); 3931 4026 3932 4027 qring Q = I; // We work in the quotient by the groebner base of the ideal I 3933 4028 option("redSB"); … … 3940 4035 ideal J = minor(jacob(IMin), nvars(basering) - d, I); 3941 4036 J = groebner(J); 3942 3943 // -------------------- election of the conductor ------------------------- 3944 poly condu = getSmallest(J); // Choses the polynomial of smallest degree 4037 4038 // -------------------- election of the conductor ------------------------- 4039 poly condu = getSmallest(J); // Choses the polynomial of smallest degree 3945 4040 // of J as universal denominator. 3946 4041 if(dbg >= 1){ … … 3949 4044 } 3950 4045 3951 // --------- splitting the ideal by the conductor (if possible) ----------- 3952 // If the ideal is equidimensional, but not necessarily prime, we check if 4046 // --------- splitting the ideal by the conductor (if possible) ----------- 4047 // If the ideal is equidimensional, but not necessarily prime, we check if 3953 4048 // the conductor is a non-zerodivisor of R/I. 3954 4049 // If not, we split I. 3955 if((decomp == 1) or (decomp == 2)){ 4050 if((decomp == 1) or (decomp == 2)){ 3956 4051 ideal Id1 = quotient(0, condu); 3957 4052 if(size(Id1) > 0){ … … 3968 4063 list nor1 = normalM(Id1, decomp, withDelta)[1]; 3969 4064 list nor2 = normalM(Id2, decomp, withDelta)[1]; 3970 printlevel = printlevel - 1; 4065 printlevel = printlevel - 1; 3971 4066 return(list(nor1, nor2)); 3972 4067 } 3973 4068 } 3974 4069 3975 // --------------- computation of the first test ideal --------------------- 4070 // --------------- computation of the first test ideal --------------------- 3976 4071 // To compute the radical we go back to the original ring. 3977 // If we are using a non-global ordering, we must change to the global 4072 // If we are using a non-global ordering, we must change to the global 3978 4073 // ordering. 3979 4074 if(isGlobal == 1){ … … 3987 4082 ""; 3988 4083 } 3989 J = radical(J); 4084 // We check if the only singular point is the origin. 4085 // If so, the radical is the maximal ideal at the origin. 4086 J = groebner(J); 4087 if(locAtZero(J)){ 4088 J = maxideal(1); 4089 } else { 4090 J = radical(J); 4091 } 3990 4092 } else { 3991 4093 // We change to global dp ordering. … … 4009 4111 ideal J = fetch(globR, J); 4010 4112 } 4011 4113 4012 4114 if(dbg >= 1){ 4013 4115 "The radical of the original singular locus is"; … … 4016 4118 } 4017 4119 4018 // ---------------- election of the non zero divisor --------------------- 4120 // ---------------- election of the non zero divisor --------------------- 4019 4121 setring Q; 4020 4122 J = fetch(R, J); 4021 J = interred(J); 4022 poly D = getSmallest(J); // Chooses the poly of smallest degree as 4123 J = interred(J); 4124 poly D = getSmallest(J); // Chooses the poly of smallest degree as 4023 4125 // non-zerodivisor. 4024 4126 if(dbg >= 1){ … … 4027 4129 } 4028 4130 4029 // ------- splitting the ideal by the non-zerodivisor (if possible) -------- 4131 // ------- splitting the ideal by the non-zerodivisor (if possible) -------- 4030 4132 // If the ideal is equidimensional, but not necessarily prime, we check if D 4031 4133 // is actually a non-zerodivisor of R/I. 4032 4134 // If not, we split I. 4033 if((decomp == 1) or (decomp == 2)){ 4135 if((decomp == 1) or (decomp == 2)){ 4034 4136 // We check if D is actually a non-zerodivisor of R/I. 4035 4137 // If not, we split I. … … 4039 4141 if(dbg >= 1){ 4040 4142 "A zerodivisor was found. We split the ideal. The zerodivisor is ", D; 4041 } 4143 } 4042 4144 setring R; 4043 4145 ideal Id1 = fetch(Q, Id1), I; … … 4048 4150 list nor1 = normalM(Id1, decomp, withDelta)[1]; 4049 4151 list nor2 = normalM(Id2, decomp, withDelta)[1]; 4050 printlevel = printlevel - 1; 4051 return(list(nor1, nor2)); 4152 printlevel = printlevel - 1; 4153 return(list(nor1, nor2)); 4052 4154 } 4053 4155 } 4054 4156 4055 // --------------------- normalization ------------------------------------ 4157 // --------------------- normalization ------------------------------------ 4056 4158 // We call normalMEqui to compute the normalization. 4057 4159 setring R; … … 4066 4168 4067 4169 /////////////////////////////////////////////////////////////////////////////// 4068 4170 4069 4171 static proc normalMEqui(ideal I, ideal origJ, poly condu, poly D, int withDelta) 4070 4172 // Here is where the normalization is actually computed. … … 4083 4185 int isGlobal = ord_test(basering); 4084 4186 int delt; 4085 4187 4086 4188 def R = basering; 4087 4189 poly c = D; … … 4090 4192 list testOut; // Output of proc testIdeal 4091 4193 // (the test ideal and the ring structure) 4092 4194 4093 4195 qring Q = groebner(I); 4094 4196 option("redSB"); 4095 option("returnSB"); 4197 option("returnSB"); 4096 4198 ideal J = imap(R, origJ); 4097 4199 poly c = imap(R, c); … … 4103 4205 dbprint(dbg, "Preliminar step begins."); 4104 4206 4105 // --------------------- computation of A1 ------------------------------- 4207 // --------------------- computation of A1 ------------------------------- 4106 4208 dbprint(dbg, "Computing the quotient (DJ : J)..."); 4107 ideal U = groebner(quotient(D*J, J)); 4209 ideal U = groebner(quotient(D*J, J)); 4108 4210 ideal oldU = 1; 4109 4211 … … 4112 4214 } 4113 4215 4114 // ----------------- Grauer-Remmert criterion check ----------------------- 4216 // ----------------- Grauer-Remmert criterion check ----------------------- 4115 4217 // We check if the equality in Grauert - Remmert criterion is satisfied. 4116 4218 isNormal = checkInclusions(D*oldU, U); … … 4120 4222 "and U = "; U; 4121 4223 } 4122 } else { 4224 } else { 4123 4225 // The original ring R/I was normal. Nothing to do. 4124 4226 // We define anyway a new ring, equal to R, to be able to return it. … … 4140 4242 } 4141 4243 4142 // ----- computation of the chain of ideals A1 c A2 c ... c An ------------ 4244 // ----- computation of the chain of ideals A1 c A2 c ... c An ------------ 4143 4245 while(isNormal == 0){ 4144 4246 step++; … … 4148 4250 } 4149 4251 dbprint(dbg, "Computing the test ideal..."); 4150 4151 // --------------- computation of the test ideal ------------------------ 4152 // Computes a test ideal for the new ring. 4252 4253 // --------------- computation of the test ideal ------------------------ 4254 // Computes a test ideal for the new ring. 4153 4255 // The test ideal will be the radical in the new ring of the original 4154 4256 // test ideal. … … 4158 4260 testOut = testIdeal(I, U, origJ, c, D); 4159 4261 cJ = testOut[1]; 4160 4262 4161 4263 setring Q; 4162 4264 cJ = imap(R, cJ); 4163 4265 cJ = groebner(cJ); 4164 4266 4165 4267 // cJ / c is now the ideal mapped back. 4166 // We have the generators as an ideal in the new ring, 4268 // We have the generators as an ideal in the new ring, 4167 4269 // but we want the generators as an ideal in the original ring. 4168 4270 cJMod = getGenerators(cJ, U, c); … … 4172 4274 cJMod; 4173 4275 } 4174 4276 4175 4277 cJ = cJMod; 4176 4278 4177 // ------------- computation of the quotient (DJ : J)-------------------- 4279 // ------------- computation of the quotient (DJ : J)-------------------- 4178 4280 oldU = U; 4179 4281 dbprint(dbg, "Computing the quotient (c*D*cJ : cJ)..."); … … 4181 4283 if(dbg >= 2){"The quotient is "; U;} 4182 4284 4183 // ------------- Grauert - Remmert criterion check ---------------------- 4285 // ------------- Grauert - Remmert criterion check ---------------------- 4184 4286 // We check if the equality in Grauert - Remmert criterion is satisfied. 4185 4287 isNormal = checkInclusions(D*oldU, U); 4186 4288 4187 if(isNormal == 1){ 4188 // We go one step back. In the last step we didnt get antyhing new, 4289 if(isNormal == 1){ 4290 // We go one step back. In the last step we didnt get antyhing new, 4189 4291 // we just verified that the ring was already normal. 4190 4292 dbprint(dbg, "The ring in the previous step was already normal."); … … 4192 4294 U = oldU; 4193 4295 } else { 4194 // ------------- preparation for next iteration ---------------------- 4296 // ------------- preparation for next iteration ---------------------- 4195 4297 // We have to go on. 4196 4298 // The new denominator is chosen. … … 4209 4311 } 4210 4312 4211 // ------------------------- delta computation ---------------------------- 4212 if(withDelta){ 4313 // ------------------------- delta computation ---------------------------- 4314 if(withDelta){ 4213 4315 ideal UD = groebner(U); 4214 4316 delt = vdim(std(modulo(UD, c))); 4215 4317 } 4216 4217 // -------------------------- prepare output ----------------------------- 4318 4319 // -------------------------- prepare output ----------------------------- 4218 4320 setring R; 4219 4321 U = fetch(Q, U); … … 4228 4330 } 4229 4331 return(output); 4230 4332 4333 } 4334 4335 /////////////////////////////////////////////////////////////////////////////// 4336 4337 static proc lineUpLast(ideal U, poly c) 4338 // Sets c as the last generator of U. 4339 { 4340 int i; 4341 ideal newU; 4342 for (i = 1; i <= ncols(U); i++){ 4343 if(U[i] != c){ 4344 if(size(newU) == 0){ 4345 newU = U[i]; 4346 } else { 4347 newU = newU, U[i]; 4348 } 4349 } 4350 } 4351 if(size(newU) == 0){ 4352 newU = c; 4353 } else { 4354 newU = newU, c; 4355 } 4356 return(newU); 4231 4357 } 4232 4358 … … 4250 4376 static proc getSmallest(ideal J){ 4251 4377 // Computes the polynomial of smallest degree of J. 4252 // If there are more than one, it chooses the one with smallest number 4378 // If there are more than one, it chooses the one with smallest number 4253 4379 // of monomials. 4254 4380 int i; … … 4283 4409 4284 4410 int i, j; // counters; 4285 int dbg = printlevel - voice + 2; // dbg = printlevel (default: dbg = 0) 4411 int dbg = printlevel - voice + 2; // dbg = printlevel (default: dbg = 0) 4286 4412 poly p; // The lifted polynomial 4287 4413 ideal JGr = groebner(J); // Groebner base of J … … 4311 4437 // Internal procedure, used in normalM. 4312 4438 // Computes the test ideal in the new ring. 4313 // It takes the original test ideal and computes the radical of it in the 4439 // It takes the original test ideal and computes the radical of it in the 4314 4440 // new ring. 4315 4441 … … 4318 4444 // The original ring is R / I, where R is the basering. 4319 4445 int i; // counter 4320 int dbg = printlevel - voice + 2; // dbg = printlevel (default: dbg = 0) 4446 int dbg = printlevel - voice + 2; // dbg = printlevel (default: dbg = 0) 4321 4447 def R = basering; // We dont work in the quo 4322 4448 ideal J = origJ; 4323 4449 4324 4450 // ---------- computation of the ring structure of 1/c * U ---------------- 4325 4451 U = lineUp(U, c); 4326 4452 4327 4453 if(dbg > 1){"Computing the new ring structure...";} 4328 4454 list ele = computeRing(U, I, "noRed"); … … 4332 4458 if(dbg > 1){"The relations are"; norid;} 4333 4459 4334 // ---------------- setting the ring to work in -------------------------- 4335 int isGlobal = ord_test(origEre); // Checks if the original ring has 4460 // ---------------- setting the ring to work in -------------------------- 4461 int isGlobal = ord_test(origEre); // Checks if the original ring has 4336 4462 // global ordering. 4337 4463 if(isGlobal != 1){ … … 4340 4466 list newOrd = list("dp", intvec(1:nvars(origEre))), list("C", 0); 4341 4467 rl[3] = newOrd; 4342 def ere = ring(rl); // globR is the original ring but 4468 def ere = ring(rl); // globR is the original ring but 4343 4469 // with a global ordering. 4344 4470 setring ere; … … 4353 4479 4354 4480 4355 // ----- computation of the test ideal using the ring structure of Ai ----- 4481 // ----- computation of the test ideal using the ring structure of Ai ----- 4356 4482 option("redSB"); 4357 4483 option("returnSB"); … … 4360 4486 J = radical(J); 4361 4487 if(dbg > 1){"Computing the interreduction of the radical...";} 4362 J = groebner(J); 4488 J = groebner(J); 4363 4489 //J = interred(J); 4364 4490 if(dbg > 1){ … … 4367 4493 if(dbg>4){pause();} 4368 4494 } 4369 4495 4370 4496 setring ere; 4371 4372 // -------------- map from Ai to the total ring of fractions --------------- 4497 4498 // -------------- map from Ai to the total ring of fractions --------------- 4373 4499 // Now we must map back this ideal J to U_i / c in the total ring of 4374 4500 // fractions. 4375 4501 // The map sends T_j -> u_j / c. 4376 4502 // The map is built by the following steps: 4377 // 1) We compute the degree of the generators of J with respect to the 4503 // 1) We compute the degree of the generators of J with respect to the 4378 4504 // new variables T_j. 4379 4505 // 2) For each generator, we multiply each term by a power of c, as if … … 4381 4507 // a polynomial in the old variables divided by c). 4382 4508 // 3) We replace the new variables T_j by the corresponding numerator u_j. 4383 // 4) We lift the resulting polynomial to change the denominator 4509 // 4) We lift the resulting polynomial to change the denominator 4384 4510 // from c^n to c. 4385 4511 int nNewVars = nvars(ere) - nvars(R); // Number of new variables 4386 4512 poly c = imap(R, c); 4387 intvec @v = 1..nNewVars; // Vector of the new variables. 4513 intvec @v = 1..nNewVars; // Vector of the new variables. 4388 4514 // They must be the first ones. 4389 4515 if(dbg > 1){"The indices of the new variables are", @v;} 4390 4516 4391 // ---------------------- step 1 of the mapping --------------------------- 4517 // ---------------------- step 1 of the mapping --------------------------- 4392 4518 intvec degs; 4393 4519 for(i = 1; i<=ncols(J); i++){ … … 4398 4524 degs; 4399 4525 } 4400 4401 // ---------------------- step 2 of the mapping --------------------------- 4526 4527 // ---------------------- step 2 of the mapping --------------------------- 4402 4528 ideal mapJ = mapBackIdeal(J, c, @v); 4403 4529 4404 4530 setring R; 4405 4531 4406 // ---------------------- step 3 of the mapping --------------------------- 4532 // ---------------------- step 3 of the mapping --------------------------- 4407 4533 ideal z; // The variables of the original ring in order. 4408 4534 for(i = 1; i<=nvars(R); i++){ 4409 4535 z[i] = var(i); 4410 4536 } 4411 4537 4412 4538 map f = ere, U[2..ncols(U)], z[1..ncols(z)]; // The map to the original ring. 4413 4539 if(dbg > 1){ … … 4416 4542 if(dbg>4){pause();} 4417 4543 } 4418 4544 4419 4545 if(dbg > 1){ 4420 4546 "Computing the map..."; 4421 4547 } 4422 4548 4423 4549 J = f(mapJ); 4424 4550 if(dbg > 1){ … … 4428 4554 } 4429 4555 4430 // ---------------------- step 4 of the mapping --------------------------- 4556 // ---------------------- step 4 of the mapping --------------------------- 4431 4557 qring Q = groebner(I); 4432 4558 ideal J = imap(R, J); … … 4448 4574 } 4449 4575 4450 // --------------------------- prepare output ---------------------------- 4576 // --------------------------- prepare output ---------------------------- 4451 4577 J = groebner(J); 4452 4578 4453 4579 setring R; 4454 4580 J = imap(Q, J); 4455 4581 4456 4582 return(list(J, ele[1])); 4457 4583 } … … 4460 4586 4461 4587 static proc changeDenominator(ideal U1, poly c1, poly c2, ideal I){ 4462 // Given a ring in the form 1/c1 * U, it computes a new ideal U2 such that the 4588 // Given a ring in the form 1/c1 * U, it computes a new ideal U2 such that the 4463 4589 // ring is 1/c2 * U2. 4464 4590 // The base ring is R, but the computations are to be done in R / I. … … 4478 4604 4479 4605 static proc changeDenominatorQ(ideal U1, poly c1, poly c2){ 4480 // Given a ring in the form 1/c1 * U, it computes a new U2 st the ring 4606 // Given a ring in the form 1/c1 * U, it computes a new U2 st the ring 4481 4607 // is 1/c2 * U2. 4482 4608 // The base ring is already a quotient ring R / I. … … 4494 4620 4495 4621 static proc checkInclusions(ideal U1, ideal U2){ 4496 // Checks if the identity A = Hom(J, J) of Grauert-Remmert criterion is 4622 // Checks if the identity A = Hom(J, J) of Grauert-Remmert criterion is 4497 4623 // satisfied. 4498 4624 int dbg = printlevel - voice + 2; // dbg = printlevel (default: dbg = 0) 4499 4625 list reduction1; 4500 4626 list reduction2; 4501 4502 // ---------------------- inclusion Hom(J, J) c A ------------------------- 4627 4628 // ---------------------- inclusion Hom(J, J) c A ------------------------- 4503 4629 if(dbg > 1){"Checking the inclusion Hom(J, J) c A:";} 4504 4630 // This interred is used only because a bug in groebner! … … 4507 4633 if(dbg > 1){reduction1[1];} 4508 4634 4509 // ---------------------- inclusion A c Hom(J, J) ------------------------- 4635 // ---------------------- inclusion A c Hom(J, J) ------------------------- 4510 4636 // The following check should always be satisfied. 4511 4637 // This is only used for debugging. … … 4523 4649 } 4524 4650 } 4525 4651 4526 4652 if(size(reduction1[1]) == 0){ 4527 4653 // We are done! The ring computed in the last step was normal. … … 4548 4674 return(d); 4549 4675 } 4550 4676 4551 4677 /////////////////////////////////////////////////////////////////////////////// 4552 4678 4553 4679 static proc mapBackIdeal(ideal I, poly c, intvec @v){ 4554 // Modifies all polynomials in I so that a map x(i) -> y(i)/c can be 4680 // Modifies all polynomials in I so that a map x(i) -> y(i)/c can be 4555 4681 // carried out. 4556 4682 … … 4567 4693 4568 4694 static proc mapBackPoly(poly p, poly c, intvec @v){ 4569 // Multiplies each monomial of p by a power of c so that a map x(i) -> y(i)/c 4695 // Multiplies each monomial of p by a power of c so that a map x(i) -> y(i)/c 4570 4696 // can be carried out. 4571 4697 … … 4594 4720 //NOTE: We use the following attributes: 4595 4721 // 1 attrib(id,"isCohenMacaulay"); //--- Cohen Macaulay 4596 // 2 attrib(id,"isCompleteIntersection"); //--- complete intersection 4597 // 3 attrib(id,"isHypersurface"); //--- hypersurface 4598 // 4 attrib(id,"isEquidimensional"); //--- equidimensional ideal 4599 // 5 attrib(id,"isPrim"); //--- prime ideal 4600 // 6 attrib(id,"isRegInCodim2"); //--- regular in codimension 2 4601 // 7 attrib(id,"isIsolatedSingularity"); //--- isolated singularities 4602 // 8 attrib(id,"onlySingularAtZero"); //--- only singular at 0 4603 // 9 attrib(id,"isRadical"); //--- radical ideal 4722 // 2 attrib(id,"isCompleteIntersection"); //--- complete intersection 4723 // 3 attrib(id,"isHypersurface"); //--- hypersurface 4724 // 4 attrib(id,"isEquidimensional"); //--- equidimensional ideal 4725 // 5 attrib(id,"isPrim"); //--- prime ideal 4726 // 6 attrib(id,"isRegInCodim2"); //--- regular in codimension 2 4727 // 7 attrib(id,"isIsolatedSingularity"); //--- isolated singularities 4728 // 8 attrib(id,"onlySingularAtZero"); //--- only singular at 0 4729 // 9 attrib(id,"isRadical"); //--- radical ideal 4604 4730 //Recall: (attrib(id,"xy"),1) sets attrib xy to TRUE and 4605 4731 // (attrib(id,"xy"),0) to FALSE … … 4607 4733 static proc getAttrib (ideal id) 4608 4734 "USAGE: getAttrib(id); id=ideal 4609 COMPUTE: check attributes for id. If the attributes above are defined, 4610 take its value, otherwise define it and set it to 0 4735 COMPUTE: check attributes for id. If the attributes above are defined, 4736 take its value, otherwise define it and set it to 0 4611 4737 RETURN: intvec of size 9, with entries 0 or 1, values of attributes defined 4612 4738 above (in this order) … … 4616 4742 int isCoM,isCoI,isHy,isEq,isPr,isReg,isIso,oSAZ,isRad; 4617 4743 4618 if( typeof(attrib(id,"isCohenMacaulay"))=="int" ) 4744 if( typeof(attrib(id,"isCohenMacaulay"))=="int" ) 4619 4745 { 4620 if( attrib(id,"isCohenMacaulay")==1 ) 4746 if( attrib(id,"isCohenMacaulay")==1 ) 4621 4747 { isCoM=1; isEq=1; } 4622 4748 } … … 4624 4750 if( typeof(attrib(id,"isCompleteIntersection"))=="int" ) 4625 4751 { 4626 if(attrib(id,"isCompleteIntersection")==1) 4752 if(attrib(id,"isCompleteIntersection")==1) 4627 4753 { isCoI=1; isCoM=1; isEq=1; } 4628 4754 } 4629 4755 4630 4756 if( typeof(attrib(id,"isHypersurface"))=="int" ) 4631 4757 { … … 4633 4759 { isHy=1; isCoI=1; isCoM=1; isEq=1; } 4634 4760 } 4635 4761 4636 4762 if( typeof(attrib(id,"isEquidimensional"))=="int" ) 4637 4763 { 4638 if(attrib(id,"isEquidimensional")==1) 4764 if(attrib(id,"isEquidimensional")==1) 4639 4765 { isEq=1; } 4640 4766 } 4641 4767 4642 4768 if( typeof(attrib(id,"isPrim"))=="int" ) 4643 4769 { 4644 if(attrib(id,"isPrim")==1) 4770 if(attrib(id,"isPrim")==1) 4645 4771 { isPr=1; } 4646 4772 } … … 4648 4774 if( typeof(attrib(id,"isRegInCodim2"))=="int" ) 4649 4775 { 4650 if(attrib(id,"isRegInCodim2")==1) 4776 if(attrib(id,"isRegInCodim2")==1) 4651 4777 { isReg=1; } 4652 4778 } 4653 4779 4654 4780 if( typeof(attrib(id,"isIsolatedSingularity"))=="int" ) 4655 4781 { 4656 if(attrib(id,"isIsolatedSingularity")==1) 4782 if(attrib(id,"isIsolatedSingularity")==1) 4657 4783 { isIso=1; } 4658 4784 } 4659 4785 4660 4786 if( typeof(attrib(id,"onlySingularAtZero"))=="int" ) 4661 4787 { … … 4666 4792 if( typeof(attrib(id,"isRad"))=="int" ) 4667 4793 { 4668 if(attrib(id,"isRad")==1) 4794 if(attrib(id,"isRad")==1) 4669 4795 { isRad=1; } 4670 4796 } … … 4684 4810 { 4685 4811 attrib(id,"isCohenMacaulay",atr[1]); //--- Cohen Macaulay 4686 attrib(id,"isCompleteIntersection",atr[2]); //--- complete intersection 4687 attrib(id,"isHypersurface",atr[3]); //--- hypersurface 4688 attrib(id,"isEquidimensional",atr[4]); //--- equidimensional ideal 4689 attrib(id,"isPrim",atr[5]); //--- prime ideal 4690 attrib(id,"isRegInCodim2",atr[6]); //--- regular in codimension 2 4691 attrib(id,"isIsolatedSingularity",atr[7]); //--- isolated singularities 4692 attrib(id,"onlySingularAtZero",atr[8]); //--- only singular at 0 4693 attrib(id,"isRadical",atr[9]); //--- radical ideal 4812 attrib(id,"isCompleteIntersection",atr[2]); //--- complete intersection 4813 attrib(id,"isHypersurface",atr[3]); //--- hypersurface 4814 attrib(id,"isEquidimensional",atr[4]); //--- equidimensional ideal 4815 attrib(id,"isPrim",atr[5]); //--- prime ideal 4816 attrib(id,"isRegInCodim2",atr[6]); //--- regular in codimension 2 4817 attrib(id,"isIsolatedSingularity",atr[7]); //--- isolated singularities 4818 attrib(id,"onlySingularAtZero",atr[8]); //--- only singular at 0 4819 attrib(id,"isRadical",atr[9]); //--- radical ideal 4694 4820 4695 4821 return(id); … … 4706 4832 " 4707 4833 { 4708 if( typeof(attrib(id1,"isCohenMacaulay"))=="int" ) 4834 if( typeof(attrib(id1,"isCohenMacaulay"))=="int" ) 4709 4835 { 4710 4836 if( attrib(id1,"isCohenMacaulay")==1 ) … … 4716 4842 { 4717 4843 attrib(id,"isCohenMacaulay",0); 4718 } 4844 } 4719 4845 4720 4846 if( typeof(attrib(id1,"isCompleteIntersection"))=="int" ) … … 4730 4856 attrib(id,"isCompleteIntersection",0); 4731 4857 } 4732 4858 4733 4859 if( typeof(attrib(id1,"isHypersurface"))=="int" ) 4734 4860 { … … 4744 4870 attrib(id,"isHypersurface",0); 4745 4871 } 4746 4872 4747 4873 if( (typeof(attrib(id1,"isEquidimensional"))=="int") ) 4748 4874 { … … 4768 4894 attrib(id,"isPrim",0); 4769 4895 } 4770 4896 4771 4897 if( (typeof(attrib(id1,"isRegInCodim2"))=="int") ) 4772 4898 { … … 4780 4906 attrib(id,"isRegInCodim2",0); 4781 4907 } 4782 4908 4783 4909 if( (typeof(attrib(id1,"isIsolatedSingularity"))=="int") ) 4784 4910 { … … 4792 4918 attrib(id,"isIsolatedSingularity",0); 4793 4919 } 4794 4920 4795 4921 if( typeof(attrib(id1,"onlySingularAtZero"))=="int" ) 4796 4922 { … … 4807 4933 if( typeof(attrib(id1,"isRad"))=="int" ) 4808 4934 { 4809 if(attrib(id1,"isRad")==1) 4935 if(attrib(id1,"isRad")==1) 4810 4936 { 4811 4937 attrib(id,"isRad",1); … … 4821 4947 4822 4948 proc normalC(ideal id, list #) 4823 "USAGE: normalC(id [,choose]); id = radical ideal, choose = optional string 4949 "USAGE: normalC(id [,choose]); id = radical ideal, choose = optional string 4824 4950 which may be a combination of \"equidim\", \"prim\", \"withGens\", 4825 4951 \"isPrim\", \"noFac\".@* … … 4827 4953 If choose = \"prim\" resp. \"equidim\" normalC computes a prime resp. 4828 4954 an equidimensional decomposition and then the normalization of each 4829 component; if choose = \"noFac\" factorization is avoided in the 4955 component; if choose = \"noFac\" factorization is avoided in the 4830 4956 computation of the minimal associated primes; @* 4831 if choose = \"withGens\" the minimal associated primes P_i of id are 4832 computed and for each P_i, algebra generators of the integral closure 4957 if choose = \"withGens\" the minimal associated primes P_i of id are 4958 computed and for each P_i, algebra generators of the integral closure 4833 4959 of basering/P_i are computed as elements of its quotient field;@* 4834 4960 \"isPrim\" disables \"equidim\" and \"prim\".@* 4835 4961 ASSUME: The ideal must be radical, for non-radical ideals the output may 4836 be wrong (id=radical(id); makes id radical). However, if choose = 4837 \"prim\" the minimal associated primes of id are computed first 4962 be wrong (id=radical(id); makes id radical). However, if choose = 4963 \"prim\" the minimal associated primes of id are computed first 4838 4964 and hence normalC computes the normalization of the radical of id. 4839 4965 \"isPrim\" should only be used if id is known to be irreducible. 4840 RETURN: a list, say nor, of size 2 (resp. 3 if choose=\"withGens\"). 4841 The first list nor[1] consists of r rings, where r is the number 4842 of irreducible components if choose = \"prim\" (resp. >= no of 4843 equidimenensional components if choose = \"equidim\"). 4844 @format 4966 RETURN: a list, say nor, of size 2 (resp. 3 if choose=\"withGens\"). 4967 The first list nor[1] consists of r rings, where r is the number 4968 of irreducible components if choose = \"prim\" (resp. >= no of 4969 equidimenensional components if choose = \"equidim\"). 4970 @format 4845 4971 Each ring Ri=nor[1][i], i=1..r, contains two ideals with given 4846 4972 names @code{norid} and @code{normap} such that @* 4847 - Ri/norid is the normalization of the i-th component, i.e. the 4973 - Ri/norid is the normalization of the i-th component, i.e. the 4848 4974 integral closure in its field of fractions (as affine ring); 4849 4975 - the direct sum of the rings Ri/norid is the normalization … … 4852 4978 Ri/norid for each j.@* 4853 4979 4854 If choose=\"withGens\", nor[2] is a list of size r of ideals Ii= 4980 If choose=\"withGens\", nor[2] is a list of size r of ideals Ii= 4855 4981 nor[2][i] in the basering, generating the integral closure of 4856 4982 basering/P_i in its quotient field, i=1..r, in two different ways: 4857 - Ii is given by polynomials 4858 g_1,...,g_k,g_k+1 such that the variables T(j) of the ring Ri 4983 - Ii is given by polynomials 4984 g_1,...,g_k,g_k+1 such that the variables T(j) of the ring Ri 4859 4985 satisfy T(1)=g_1/g_k+1,..,T(k)=g_k/g_k+1. Hence the g_j/g_k+1 4860 4986 are algebra generators of the integral closure of basering/P_i 4861 as sub-algebra in the quotient field of basering/P_i. 4862 4863 nor[2] (resp. nor[3] if choose=\"withGens\") is a list of an intvec 4864 of size r, the delta invariants of the r components, and an integer, 4865 the total delta invariant of basering/id (-1 means infinite, and 0 4866 that basering/P_i resp. basering/input is normal). 4987 as sub-algebra in the quotient field of basering/P_i. 4988 4989 nor[2] (resp. nor[3] if choose=\"withGens\") is a list of an intvec 4990 of size r, the delta invariants of the r components, and an integer, 4991 the total delta invariant of basering/id (-1 means infinite, and 0 4992 that basering/P_i resp. basering/input is normal). 4867 4993 Return value -2 means that delta resp. delta of one of the components 4868 4994 is not computed (which may happen if \"equidim\" is given) . 4869 4995 @end format 4870 THEORY: The delta invariant of a reduced ring K[x1,...,xn]/id is 4996 THEORY: The delta invariant of a reduced ring K[x1,...,xn]/id is 4871 4997 dim_K(normalization(K[x1,...,xn]/id) / K[x1,...,xn]/id) 4872 4998 We call this number also the delta invariant of id. 4873 We use the algorithm described in [G.-M. Greuel, G. Pfister: 4874 A SINGULAR Introduction to Commutative Algebra, 2nd Edition. 4999 We use the algorithm described in [G.-M. Greuel, G. Pfister: 5000 A SINGULAR Introduction to Commutative Algebra, 2nd Edition. 4875 5001 Springer Verlag (2007)]. 4876 5002 NOTE: To use the i-th ring type: @code{def R=nor[1][i]; setring R;}. 4877 @* Increasing/decreasing printlevel displays more/less comments 5003 @* Increasing/decreasing printlevel displays more/less comments 4878 5004 (default: printlevel=0). 4879 5005 @* Not implemented for local or mixed orderings and for quotient rings. … … 4883 5009 EXAMPLE: example normalC; shows an example 4884 5010 " 4885 { 5011 { 4886 5012 int i,j, wgens, withEqui, withPrim, isPrim, nfac; 4887 5013 int y = printlevel-voice+2; … … 4898 5024 } 4899 5025 4900 //--------------------------- define the method --------------------------- 5026 //--------------------------- define the method --------------------------- 4901 5027 string method; //make all options one string in order to use 4902 5028 //all combinations of options simultaneously 4903 5029 for ( i=1; i <= size(#); i++ ) 4904 { 4905 if ( typeof(#[i]) == "string" ) 5030 { 5031 if ( typeof(#[i]) == "string" ) 4906 5032 { 4907 5033 method = method + #[i]; … … 4910 5036 4911 5037 //--------------------------- choosen methods ----------------------- 4912 //we have the methods 5038 //we have the methods 4913 5039 // "withGens": computes algebra generators for each irreducible component 4914 5040 // the general case: either "equidim" or not (then applying minAssGTZ) … … 4932 5058 if ( find(method,"noFac") ) 4933 5059 { 4934 nfac=1; 5060 nfac=1; 4935 5061 } 4936 5062 4937 5063 //------------------ default method, may be changed -------------------- 4938 //Use a prime decomposition only for small no of variables otherwise equidim 5064 //Use a prime decomposition only for small no of variables otherwise equidim 4939 5065 //Compute delta whenever possible. 4940 5066 … … 4966 5092 prim[1] = id; 4967 5093 if( y >= 0 ) 4968 { 5094 { 4969 5095 ""; 4970 5096 "// ** WARNING: result is correct if ideal is prime (not checked) **"; … … 4983 5109 4984 5110 if(y>=1) 4985 { 5111 { 4986 5112 prim;""; 4987 5113 "// number of irreducible components is", size(prim); … … 5025 5151 gens = closureGenerators(l); //computes algebra(!) generators 5026 5152 5027 //NOTE: gens[i]/gens[size(gens)] expresses the ith variable of resu[1] 5153 //NOTE: gens[i]/gens[size(gens)] expresses the ith variable of resu[1] 5028 5154 //(the normalization) as fraction of elements of the basering; 5029 5155 //the variables of resu[1] are algebra generators. … … 5042 5168 Gens = list(gens) + Gens; 5043 5169 5044 /* ### Da die gens Algebra-Erzeuger sind, ist reduce nach Bestimmung 5170 /* ### Da die gens Algebra-Erzeuger sind, ist reduce nach Bestimmung 5045 5171 der Algebra-Variablen T(i) nicht zulssig! 5046 for(i=1;i<=size(gens)-1;i++) 5172 for(i=1;i<=size(gens)-1;i++) 5047 5173 { 5048 5174 gens[i]= reduce(gens[i],std(gens[size(gens)])); … … 5065 5191 { del = -1; } 5066 5192 deli = deli[1..size(deli)-1]; 5067 Resu = resu,Gens,list(deli,del); 5193 Resu = resu,Gens,list(deli,del); 5068 5194 int sr = size(resu); 5069 5195 5070 5196 if ( y >= 0 ) 5071 5197 {""; 5072 "// 'normalC' created a list, say nor, of three lists: 5198 "// 'normalC' created a list, say nor, of three lists: 5073 5199 // nor[1] resp. nor[2] are lists of",sr,"ring(s) resp. ideal(s) 5074 5200 // and nor[3] is a list of an intvec and an integer. … … 5077 5203 // To access the i-th ring nor[1][i] give it a name, say Ri, and type e.g. 5078 5204 def R1 = nor[1][1]; setring R1; norid; normap; 5079 // for the other rings type first setring r; (if r is the name of your 5205 // for the other rings type first setring r; (if r is the name of your 5080 5206 // original basering) and then continue as for the first ring; 5081 // Ri/norid is the affine algebra of the normalization of the i-th 5207 // Ri/norid is the affine algebra of the normalization of the i-th 5082 5208 // component r/P_i (where P_i is an associated prime of the input ideal) 5083 5209 // and normap the normalization map from r to Ri/norid; 5084 5210 // nor[2] is a list of",sr,"ideal(s), each ideal nor[2][i] consists of 5085 // elements g1..gk of r such that the gj/gk generate the integral 5211 // elements g1..gk of r such that the gj/gk generate the integral 5086 5212 // closure of r/P_i as sub-algebra in the quotient field of r/P_i, with 5087 5213 // gj/gk being mapped by normap to the j-th variable of Ri; … … 5096 5222 // We use the following attributes: 5097 5223 // attrib(id,"isCohenMacaulay"); //--- Cohen Macaulay 5098 // attrib(id,"isCompleteIntersection"); //--- complete intersection 5099 // attrib(id,"isHypersurface"); //--- hypersurface 5100 // attrib(id,"isEquidimensional",-1); //--- equidimensional ideal 5101 // attrib(id,"isPrim"); //--- prime ideal 5102 // attrib(id,"isRegInCodim2"); //--- regular in codimension 2 5103 // attrib(id,"isIsolatedSingularity"; //--- isolated singularities 5104 // attrib(id,"onlySingularAtZero"); //--- only singular at 0 5224 // attrib(id,"isCompleteIntersection"); //--- complete intersection 5225 // attrib(id,"isHypersurface"); //--- hypersurface 5226 // attrib(id,"isEquidimensional",-1); //--- equidimensional ideal 5227 // attrib(id,"isPrim"); //--- prime ideal 5228 // attrib(id,"isRegInCodim2"); //--- regular in codimension 2 5229 // attrib(id,"isIsolatedSingularity"; //--- isolated singularities 5230 // attrib(id,"onlySingularAtZero"); //--- only singular at 0 5105 5231 5106 5232 //------------------- first set the attributes ---------------------- 5107 if( typeof(attrib(id,"isCohenMacaulay"))=="int" ) 5233 if( typeof(attrib(id,"isCohenMacaulay"))=="int" ) 5108 5234 { 5109 5235 if( attrib(id,"isCohenMacaulay")==1 ) … … 5115 5241 { 5116 5242 attrib(id,"isCohenMacaulay",0); 5117 } 5243 } 5118 5244 5119 5245 if( typeof(attrib(id,"isCompleteIntersection"))=="int" ) … … 5129 5255 attrib(id,"isCompleteIntersection",0); 5130 5256 } 5131 5257 5132 5258 if( typeof(attrib(id,"isHypersurface"))=="int" ) 5133 5259 { … … 5143 5269 attrib(id,"isHypersurface",0); 5144 5270 } 5145 5271 5146 5272 if( ! (typeof(attrib(id,"isEquidimensional"))=="int") ) 5147 5273 { 5148 5274 attrib(id,"isEquidimensional",0); 5149 5275 } 5150 5276 5151 5277 if( typeof(attrib(id,"isPrim"))=="int" ) 5152 5278 { … … 5160 5286 attrib(id,"isPrim",0); 5161 5287 } 5162 5288 5163 5289 if( ! (typeof(attrib(id,"isRegInCodim2"))=="int") ) 5164 5290 { 5165 5291 attrib(id,"isRegInCodim2",0); 5166 5292 } 5167 5293 5168 5294 if( ! (typeof(attrib(id,"isIsolatedSingularity"))=="int") ) 5169 5295 { 5170 5296 attrib(id,"isIsolatedSingularity",0); 5171 5297 } 5172 5298 5173 5299 if( typeof(attrib(id,"onlySingularAtZero"))=="int" ) 5174 5300 { … … 5185 5311 //-------------- compute equidimensional decomposition -------------------- 5186 5312 //If the method "equidim" is given, compute the equidim decomposition 5187 //and goto the next step (no normalization 5313 //and goto the next step (no normalization 5188 5314 //ACHTUNG: equidim berechnet bei nicht reduzierten id die eingebetteten 5189 5315 //Komponenten als niederdim Komponenten, waehrend diese bei primdecGTZ … … 5222 5348 intvec opt = option(get); 5223 5349 option(redSB); 5224 for(j=1; j<=size(prim); j++) 5350 for(j=1; j<=size(prim); j++) 5225 5351 { 5226 5352 keepresult = keepresult+facstd(prim[j]); … … 5231 5357 prim=ideal(0); //Bug in facstd, liefert leere Liste bei 0-Ideal 5232 5358 } 5233 5359 5234 5360 if(y>=1) 5235 5361 { ""; … … 5244 5370 //start with the computation of the minimal associated primes: 5245 5371 5246 else 5372 else 5247 5373 { 5248 5374 if( isPrim ) … … 5300 5426 //----- for each component (equidim or irred) compute normalization ----- 5301 5427 int sr, skr, del; 5302 intvec deli; 5428 intvec deli; 5303 5429 int sp = size(prim); //size of list prim (# irred or equidim comp) 5304 5430 … … 5331 5457 if( attrib(id,"isHypersurface")==1 ) 5332 5458 { 5333 attrib(prim[i],"isHypersurface",1); 5459 attrib(prim[i],"isHypersurface",1); 5334 5460 attrib(prim[i],"isCompleteIntersection",1); 5335 5461 attrib(prim[i],"isCohenMacaulay",1); … … 5356 5482 } 5357 5483 else 5358 { 5484 { 5359 5485 attrib(prim[i],"isRegInCodim2",0); 5360 5486 attrib(prim[i],"isCohenMacaulay",0); … … 5365 5491 //note: for equidimensional components the "splitting tools" can 5366 5492 //create further decomposition 5367 //We now start normalizationPrimes with 5493 //We now start normalizationPrimes with 5368 5494 //ihp = partial normalisation map = identity map = maxideal(1) 5369 //del = partial delta invariant = 0 5495 //del = partial delta invariant = 0 5370 5496 //deli= intvec of partial delta invariants of components 5371 5497 //in normalizationPrimes all the work is done: … … 5379 5505 skr = size(keepresult); 5380 5506 5381 //compute delta: 5507 //compute delta: 5382 5508 if( del >= 0 && keepresult[skr][1] >=0 ) 5383 5509 { … … 5385 5511 } 5386 5512 else 5387 { 5388 del = -1; 5513 { 5514 del = -1; 5389 5515 } 5390 5516 deli = keepresult[skr][2],deli; … … 5393 5519 { 5394 5520 "// delta of component",i; keepresult[skr][1]; 5395 } 5521 } 5396 5522 } 5397 5523 sr = size(result); … … 5406 5532 "// Compute intersection multiplicities of the components"; 5407 5533 } 5408 } 5534 } 5409 5535 5410 5536 if ( sp > 1 ) … … 5417 5543 else 5418 5544 { 5419 del = del + mul; 5545 del = del + mul; 5420 5546 } 5421 5547 } … … 5433 5559 def R1 = nor[1][1]; setring R1; norid; normap; 5434 5560 // and similair for the other rings nor[1][i]; 5435 // Ri/norid is the affine algebra of the normalization of the i-th component 5436 // r/P_i (where P_i is a prime or an equidimensional ideal of the input ideal) 5561 // Ri/norid is the affine algebra of the normalization of the i-th component 5562 // r/P_i (where P_i is a prime or an equidimensional ideal of the input ideal) 5437 5563 // and normap the normalization map from the basering to Ri/norid; 5438 5564 // nor[2] shows the delta-invariant of each component and of the input … … 5451 5577 list nor = normalC(i); 5452 5578 5453 nor; 5579 nor; 5454 5580 // 2 branches have delta = 1, and 1 branch has delta = 0 5455 5581 // the total delta invariant is 13 … … 5457 5583 def R2 = nor[1][2]; setring R2; 5458 5584 norid; normap; 5459 5585 5460 5586 echo = 0; 5461 5587 printlevel = printlevel-1; … … 5464 5590 ring r = 2,(x,y,z),dp; 5465 5591 ideal i = z3-xy4; 5466 nor = normalC(i); nor; 5467 // the delta invariant is infinite 5592 nor = normalC(i); nor; 5593 // the delta invariant is infinite 5468 5594 // xy2z/z2 and xy3/z2 generate the integral closure of r/i as r/i-module 5469 5595 // in its quotient field Quot(r/i) 5470 5596 5471 // the normalization as affine algebra over the ground field: 5597 // the normalization as affine algebra over the ground field: 5472 5598 def R = nor[1][1]; setring R; 5473 5599 norid; normap; 5474 5600 5475 echo = 0; 5601 echo = 0; 5476 5602 pause(" hit return to continue");echo = 2; 5477 5603 … … 5530 5656 // "primCl" -> uses normalC, with option "withGens". 5531 5657 // "111" -> checks the output of normalM using norTest. 5532 // "p" -> compares the output of norM with the output of normalP 5658 // "p" -> compares the output of norM with the output of normalP 5533 5659 // ("normalP" option must also be set). 5534 // "pc" -> compares the output of norM with the output of normalC with 5660 // "pc" -> compares the output of norM with the output of normalC with 5535 5661 // option "withGens" 5536 5662 // ("primCl" option must also be set). 5663 5537 5664 proc timeNormal(ideal I, list #){ 5538 //--------------------------- define the method --------------------------- 5665 //--------------------------- define the method --------------------------- 5539 5666 int isPrim, useRing; 5540 5667 int decomp = -1; … … 5549 5676 //all combinations of options simultaneously 5550 5677 for ( i=1; i <= size(#); i++ ) 5551 { 5552 if ( typeof(#[i]) == "string" ) 5678 { 5679 if ( typeof(#[i]) == "string" ) 5553 5680 { 5554 5681 method = method + #[i]; … … 5556 5683 } 5557 5684 if ( find(method, "normal")) 5558 {norM = 1;} 5685 {norM = 1;} 5559 5686 if ( find(method, "normalP") and (char(basering) > 0)) 5560 {norP = 1;} 5687 {norP = 1;} 5561 5688 if ( find(method, "normalC")) 5562 {norC = 1;} 5689 {norC = 1;} 5563 5690 if ( find(method, "primCl")) 5564 {primCl = 1;} 5691 {primCl = 1;} 5565 5692 if ( find(method, "isprim") or find(method,"isPrim") ) 5566 5693 {decomp = 0;} 5567 5694 if ( find(method, "p") ) 5568 {checkP = 1;} 5695 {checkP = 1;} 5569 5696 if ( find(method, "pc") ) 5570 {checkPC = 1;} 5697 {checkPC = 1;} 5571 5698 if ( find(method, "111") ) 5572 {check111 = 1;} 5573 5699 {check111 = 1;} 5700 5574 5701 int tt; 5575 5702 if(norM){ 5576 tt = timer; 5703 tt = timer; 5577 5704 if(decomp == 0){ 5578 5705 "Running normal(useRing, isPrim)..."; … … 5587 5714 } 5588 5715 if(norP){ 5589 tt = timer; 5716 tt = timer; 5590 5717 if(decomp == 0){ 5591 5718 "Running normalP(isPrim)..."; … … 5599 5726 ""; 5600 5727 } 5601 5728 5602 5729 if(norC){ 5603 tt = timer; 5730 tt = timer; 5604 5731 if(decomp == 0){ 5605 5732 "Running normalC(isPrim)..."; … … 5613 5740 ""; 5614 5741 } 5615 5742 5616 5743 if(primCl){ 5617 tt = timer; 5744 tt = timer; 5618 5745 if(decomp == 0){ 5619 5746 "Running normalC(withGens, isPrim)..."; … … 5621 5748 "Time normalC(withGens, isPrim): ", timer - tt; 5622 5749 } else { 5623 "Running normalC(withGens)..."; 5750 "Running normalC(withGens)..."; 5624 5751 list a4 = normalC(I, "withGens"); 5625 5752 "Time normalC(withGens): ", timer - tt; … … 5627 5754 ""; 5628 5755 } 5629 5756 5630 5757 if(check111 and norM){ 5631 5758 "Checking output with norTest..."; 5632 5759 "WARNING: this checking only works if the original ideal was prime."; 5633 list norL = list(a1[1][1][3]); 5634 norTest(I, list(norL)); 5760 norTest(I, a1); 5635 5761 ""; 5636 5762 } 5637 5763 5638 5764 if(checkP and norP and norM){ 5639 5765 "Comparing with normalP output..."; 5640 "WARNING: this checking only works if the original ideal was prime."; 5641 U1 = a1[1][1][1]; 5642 c1 = a1[1][1][2]; 5643 U2 = a2[1][1]; 5644 c2 = a2[1][1][size(a2[1][1])]; 5645 W = changeDenominator(U1, c1, c2, groebner(I)); 5646 qring q = groebner(I); 5647 ideal U2 = fetch(r, U2); 5648 ideal W = fetch(r, W); 5649 ch = 0; 5650 if(size(reduce(U2, groebner(W))) == 0){ 5651 "U2 c U1"; 5652 ch = 1; 5653 } 5654 if(size(reduce(W, groebner(U2))) == 0){ 5655 "U1 c U2"; 5656 ch = ch + 1; 5657 } 5658 if(ch == 2){ 5659 "Output of normalP is equal."; 5766 if(size(a2) > 0){ 5767 "WARNING: this checking only works if the original ideal was prime."; 5768 U1 = a1[2][1]; 5769 c1 = U1[size(U1)]; 5770 U2 = a2[1][1]; 5771 c2 = a2[1][1][size(a2[1][1])]; 5772 W = changeDenominator(U1, c1, c2, groebner(I)); 5773 qring q = groebner(I); 5774 ideal U2 = fetch(r, U2); 5775 ideal W = fetch(r, W); 5776 ch = 0; 5777 if(size(reduce(U2, groebner(W))) == 0){ 5778 "U2 c U1"; 5779 ch = 1; 5780 } 5781 if(size(reduce(W, groebner(U2))) == 0){ 5782 "U1 c U2"; 5783 ch = ch + 1; 5784 } 5785 if(ch == 2){ 5786 "Output of normalP is equal."; 5787 } else { 5788 "ERROR: Output of normalP is different."; 5789 } 5790 setring r; 5791 kill q; 5660 5792 } else { 5661 " ERROR: Output of normalP is different.";5793 "normalP returned no output. Comparison is not possible."; 5662 5794 } 5663 5795 ""; 5664 setring r; 5665 kill q; 5666 } 5667 5668 if(checkPC and norM and primCl){ 5796 } 5797 5798 if(checkPC and norM and primCl){ 5669 5799 "Comparing with primeClosure output..."; 5670 "WARNING: this checking only works if the original ideal was prime."; 5671 // primeClosure check 5672 U1 = a1[1][1][1]; 5673 c1 = a1[1][1][2]; 5674 U2 = a4[2][1]; 5675 c2 = a4[2][1][size(a4[2][1])]; 5676 W = changeDenominator(U1, c1, c2, groebner(I)); 5677 qring q = groebner(I); 5678 ideal U2 = fetch(r, U2); 5679 ideal W = fetch(r, W); 5680 ch = 0; 5681 if(size(reduce(U2, groebner(W))) == 0){ 5682 "U2 c U1"; 5683 ch = 1; 5684 } 5685 if(size(reduce(W, groebner(U2))) == 0){ 5686 "U1 c U2"; 5687 ch = ch + 1; 5688 } 5689 if(ch == 2){ 5690 "Output of normalC(withGens) is equal."; 5800 if(size(a4) > 0){ 5801 "WARNING: this checking only works if the original ideal was prime."; 5802 // primeClosure check 5803 U1 = a1[2][1]; 5804 c1 = U1[size(U1)]; 5805 U2 = a4[2][1]; 5806 c2 = a4[2][1][size(a4[2][1])]; 5807 W = changeDenominator(U1, c1, c2, groebner(I)); 5808 qring q = groebner(I); 5809 ideal U2 = fetch(r, U2); 5810 ideal W = fetch(r, W); 5811 ch = 0; 5812 if(size(reduce(U2, groebner(W))) == 0){ 5813 "U2 c U1"; 5814 ch = 1; 5815 } 5816 if(size(reduce(W, groebner(U2))) == 0){ 5817 "U1 c U2"; 5818 ch = ch + 1; 5819 } 5820 if(ch == 2){ 5821 "Output of normalC(withGens) is equal."; 5822 } else { 5823 "ERROR: Output of normalC(withGens) is different."; 5824 } 5825 setring r; 5826 kill q; 5691 5827 } else { 5692 " ERROR: Output of normalC(withGens) is different.";5828 "normalC(withGens) returned no output. Comparison is not possible."; 5693 5829 } 5694 5830 ""; 5695 setring r;5696 kill q;5697 5831 } 5698 5832 } … … 5701 5835 proc norTest (ideal i, list nor, list #) 5702 5836 "USAGE: norTest(i,nor,[n]); i=prime ideal, nor=list, n=optional integer 5703 ASSUME: nor is the resulting list of normal(i) (any options) or the result 5704 of normalP(i,"withRing"). In particular, the ring nor[1][1] contains 5705 the ideal norid and the map normap: basering/i --> nor[1][1]/norid. 5837 ASSUME: nor is the output of normal(i) (any options) or 5838 normalP(i,"withRing") or normalC(i) (any options). 5839 In particular, the ring nor[1][1] contains the ideal norid 5840 and the map normap: basering/i --> nor[1][1]/norid. 5706 5841 RETURN: an intvec v such that: 5707 5842 @format 5708 5843 v[1] = 1 if the normap is injective and 0 otherwise 5709 5844 v[2] = 1 if the normap is finite and 0 otherwise 5710 v[3] = 1 if nor[1][1]/norid is normal and 0 otherwise 5845 v[3] = 1 if nor[1][1]/norid is normal and 0 otherwise 5711 5846 @end format 5712 5847 If n=1 (resp n=2) only v[1] (resp. v[2]) is computed and returned 5713 THEORY: The procedure can be used to test whether the computation of the 5714 normalization was correct: basering/i --> nor[1][1]/norid is the 5715 normalization of basering/i iff v=1,1,0. 5848 THEORY: The procedure can be used to test whether the computation of the 5849 normalization was correct: basering/i --> nor[1][1]/norid is the 5850 normalization of basering/i iff v=1,1,0. 5716 5851 NOTE: For big examples it can be hard to fully test correctness; the 5717 5852 partial test norTest(i,nor,2) is usually fast … … 5731 5866 5732 5867 //### make a copy of nor to have a cpoy of nor[1][1] (not a reference to) 5733 // in order not to overwrite norid and normap. 5868 // in order not to overwrite norid and normap. 5734 5869 // delete nor[2] (if it contains the module generators, which are not used) 5735 5870 // s.t. newnor does not belong to a ring. 5736 5871 5737 list newnor = nor; 5872 list newnor = nor; 5738 5873 if ( size(newnor) == 3 ) 5739 5874 { 5740 5875 newnor = delete(newnor,2); 5741 5876 } 5877 def R = newnor[1][1]; 5742 5878 qring QAS = std(i); 5743 5744 def R = newnor[1][1]; 5879 5880 5745 5881 setring R; 5746 5882 int nva = nvars(R); … … 5758 5894 5759 5895 //--------- check first whether variables Z(i),...,A(i) exist ----------- 5760 for (ii=90; ii>=65; ii--) 5896 for (ii=90; ii>=65; ii--) 5761 5897 { 5762 if ( find(svars,ASCII(ii)+"(") == 0 ) 5898 if ( find(svars,ASCII(ii)+"(") == 0 ) 5763 5899 { 5764 5900 svar = ASCII(ii); break; … … 5774 5910 } 5775 5911 else 5776 { 5912 { 5777 5913 for ( ii = 1; ii <= nva; ii++ ) 5778 5914 { … … 5781 5917 } 5782 5918 } 5783 5919 5784 5920 if ( g3[n3][1]== "c" or g3[n3][1] == "C" ) 5785 5921 { … … 5815 5951 //ideal qnormap = imap(R,normap); 5816 5952 map Qnormap = QAS,qnormap; //r/id --> R/norid 5817 5953 5818 5954 //------------------------ check injectivity --------------------------- 5819 5955 //"injective:"; … … 5831 5967 5832 5968 //------------------------ check normality --------------------------- 5833 list testnor = normal(lnorid[2],"isPrim","noFac" );5834 //### Problem: bei mehrfachem Aufruf von norTest gibt es 5969 list testnor = normal(lnorid[2],"isPrim","noFac", "withDelta"); 5970 //### Problem: bei mehrfachem Aufruf von norTest gibt es 5835 5971 // ** redefining norid & ** redefining normap 5836 5972 //Dies produziert Fehler, da alte norid und normap ueberschrieben werden … … 5839 5975 5840 5976 printlevel=prl; 5841 d = testnor[size(testnor)][2]; //d = delta 5977 5978 d = testnor[3][2]; //d = delta 5842 5979 kill testnor; //### sollte ueberfluessig sein 5843 5980 int d1 = (d==0); //d1=1 if delta=0 … … 5854 5991 norTest(i,nor); //1,1,1 means that normal was correct 5855 5992 5993 nor = normalC(i); 5994 norTest(i,nor); //1,1,1 means that normal was correct 5995 5856 5996 ring s = 2,(x,y),dp; 5857 5997 ideal i = (x-y^2)^2 - y*x^3; 5858 5998 nor = normalP(i,"withRing"); 5859 5999 norTest(i,nor); //1,1,1 means that normalP was correct 5860 printlevel = prl; 6000 printlevel = prl; 5861 6001 } 5862 6002 … … 5870 6010 // options for normal: "equidim", "prim" 5871 6011 // "noDeco", "isPrim", "noFac" 5872 // (prim by default) 6012 // (prim by default) 5873 6013 // options for normalP: "withRing", "isPrim" or "noFac" 5874 // options for normalC: "equidim", "prim", "withGens", 6014 // options for normalC: "equidim", "prim", "withGens", 5875 6015 // "noDeco", "isPrim", "noFac" 5876 6016 5877 //Commands for testing 'normal' 5878 list nor = normal(i); nor; 5879 list nor = normal(i,"isPrim");nor; 6017 //Commands for testing 'normal' 6018 list nor = normal(i); nor; 6019 list nor = normal(i,"isPrim");nor; 5880 6020 list nor = normal(i,"equidim");nor; 5881 6021 list nor = normal(i,"prim");nor; … … 5888 6028 list nor = normalP(i,"isPrim"); nor; //if i is known to be prime 5889 6029 5890 //Commands for testing 'normalC' 5891 list nor = normal(i); nor; 6030 //Commands for testing 'normalC' 6031 list nor = normal(i); nor; 5892 6032 list nor = normal(i,"withGens");nor; 5893 list nor = normal(i,"isPrim");nor; 6033 list nor = normal(i,"isPrim");nor; 5894 6034 list nor = normal(i,"equidim");nor; 5895 6035 list nor = normal(i,"prim");nor; … … 5903 6043 norTest(i,nor,2); //partial test for big examples (1,1 => ok) 5904 6044 factorize(i[1]); //checks for irreducibility 6045 6046 ///////////////////////////////////////////////////////////////////////////// 6047 6048 //----------------------Examples for normal (new algorithm)------------------ 6049 // Timings with Computeserver Dual AMD Opteron 242 1.60GHz. 6050 // Examples from "Normalization of Rings" paper. 6051 6052 // Example 1 6053 // char 0 : normal = 0 secs (7 steps) - normalC = 75 secs 6054 // char 2 : normal = 0 secs (7 steps) - normalP = 0 secs - normalC = 0 secs 6055 // char 5 : normal = 1 secs (7 steps) - normalP = 71 - normalC = 1 secs 6056 // char 11 : normal = 2 secs (7 steps) - normalP = 12 secs - normalC doesn't finish 6057 // char 32003 : normal = 1 secs (7 steps) - normalP doesn't finish - normalC = 1 sec 6058 LIB"normal.lib"; 6059 ring r = 2, (x, y), dp; 6060 ideal i = (x-y)*x*(y+x^2)^3-y^3*(x^3+x*y-y^2); 6061 timeNormal(i, "normal", "normalC", "normalP", "isPrim", "p"); 6062 6063 // Example 2 6064 // char 0 : normal = 1 sec (7 steps) - normalC doesn't finish 6065 // char 3 : normal = 1 secs (8 steps) - normalP = 0 secs - normalC = 4 secs 6066 // char 13 : normal = 1 sec (7 steps) - normalP doesn't finish - normalC = 13 secs 6067 // char 32003 : normal = 1 secs (7 steps) - normalP doesn't finish - normalC = 10 sec 6068 LIB"normal.lib"; 6069 ring r = 13, (x, y), dp; 6070 ideal i = 55*x^8+66*y^2*x^9+837*x^2*y^6-75*y^4*x^2-70*y^6-97*y^7*x^2; 6071 timeNormal(i, "normal", "normalC", "normalP", "p", "isPrim"); 6072 6073 // Example 3 6074 // char 0 : normal = 3 secs (6 steps) - normalC doesn't finish 6075 // char 2 : normal = 1 secs (13 steps) - normalP = 0 secs - normalC doesn't finish 6076 // char 5 : normal = 0 secs (6 steps) - normalP = 8 secs - normalC doesn't finish 6077 LIB"normal.lib"; 6078 ring r=5,(x, y),dp; 6079 ideal i=y9+y8x+y8+y5+y4x+y3x2+y2x3+yx8+x9; 6080 timeNormal(i, "normal", "normalC", "normalP", "isPrim"); 6081 6082 // Example 4 6083 // char 0 : normal = 0 secs (1 step) - normalC = 0 secs 6084 // char 5 : normal = 0 secs (1 step) - normalP = 3 secs - normalC = 0 secs 6085 // char 11 : normal = 0 secs (1 step) - normalP doesn't finish - normalC = 0 secs 6086 // char 32003 : normal = 0 secs (1 step) - normalP doesn't finish - normalC = 0 secs 6087 LIB"normal.lib"; 6088 ring r=11,(x,y),dp; // genus 0 4 nodes and 6 cusps im P2 6089 ideal i=(x2+y^2-1)^3 +27x2y2; 6090 timeNormal(i, "normal", "normalC", "normalP", "isPrim"); 6091 6092 // Example 5 6093 // char 0 : normal = 0 secs (1 step) - normalC = 0 secs 6094 // char 5 : normal = 1 secs (3 step) - normalP doesn't finish - normalC doesn't finish 6095 // char 11 : normal = 0 secs (1 step) - normalP 0 secs - normalC = 0 secs 6096 // char 32003 : normal = 0 secs (1 step) - normalP doesn't finish - normalC = 0 secs 6097 LIB"normal.lib"; 6098 ring r=11,(x,y),dp; //24 sing, delta 24 6099 ideal i=-x10+x8y2-x6y4-x2y8+2y10-x8+2x6y2+x4y4-x2y6-y8+2x6-x4y2+x2y4+2x4+2x2y2-y4-x2+y2-1; 6100 timeNormal(i, "normal", "normalC", "normalP", "isPrim", "p"); 6101 6102 // Example 6 6103 // char 2 : normal = 5 secs (2 steps) - normalP = 25 secs - normalC = 166 secs 6104 LIB"normal.lib"; 6105 ring r=2,(v,u,z,y,x),dp; 6106 ideal i = z3+zyx+y3x2+y2x3, uyx+z2,uz+z+y2x+yx2, u2+u+zy+zx, v3+vux+vz2+vzyx+vzx+uz3+uz2y+z3+z2yx2; 6107 timeNormal(i, "normal", "normalC", "normalP", "isPrim", "p"); 6108 6109 // Example 7 6110 // char 0 : normal = 11 secs (6 steps) - normalC = 11 secs 6111 // char 2 : normal = 11 secs (6 steps) - normalP = 0 secs - normalC = 11 secs 6112 // char 5 : normal = 11 secs (6 steps) - normalP = 3 secs - normalC = 11 secs 6113 // char 11 : normal = 11 secs (6 steps) - normalP = 43 secs - normalC = 11 secs 6114 // char 32003 : normal = 11 secs (6 steps) - normalP doesn't finish - normalC = 11 secs 6115 LIB"normal.lib"; 6116 ring r=11,(x,y,z,w,t),dp; //dim 2, dim s_locus 1 6117 ideal i= x2+zw, y3+xwt, xw3+z3t+ywt2, y2w4-xy2z2t-w3t3; 6118 timeNormal(i, "normal", "normalC", "normalP", "isPrim"); 6119 6120 //////////////////////////////////////////////////////////////////////////////// 6121 6122 // Other examples with new algorithm 6123 6124 // Example 1 6125 // char 0 : normal = 1 secs (13 steps) - normalC doesn't finish 6126 // char 2 : normal = 1 secs (13 steps) - normalP = 0 secs - normalC doesn't finish 6127 // char 5 : normal = 1 secs (13 steps) - normalP = 29 secs - normalC doesn't finish 6128 ring r=2,(x,y),dp; //genus 35 6129 ideal i=y30+y13x+x4y5+x3*(x+1)^2; 6130 timeNormal(i, "normal", "normalC", "normalP"); 6131 6132 // Example 2 6133 // char 0 : normal = 1 secs (13 steps) - normalC doesn't finish 6134 // char 3 : normal = 2 secs (13 steps) - normalP = 0 secs - normalC doesn't finish 6135 ring r=3,(x,y),dp; //genus 19, delta 21 6136 ideal i=y20+y13x+x4y5+x3*(x+1)^2; 6137 timeNormal(i, "normal", "normalC", "normalP"); 6138 6139 // Example 3 6140 // Very fast with all algorithms 6141 ring r = 3, (x, y), dp; 6142 ideal I = (x-y^2)^2-x*y^3; 6143 timeNormal(I, "normal", "normalC", "normalP", "primCl", "111", "p", "pc"); 6144 6145 5905 6146 5906 6147 //----------------------Test Example for charp ------------------- … … 5913 6154 //### preimage verbessern (Ist imm Kern map oder imap verwendet?) 5914 6155 //### Gleich in Ordnung dp wechseln, ringlist verwenden 5915 //### interred ev nur zum Schluss 6156 //### interred ev nur zum Schluss 5916 6157 // (z.B. wenn nacher std; wenn nacher minor: testen ) 5917 6158 … … 5922 6163 //1. Series Fp[x,y,u,v]/(x2v-y2u) 5923 6164 //------------------------------- 5924 //characteristic p 2 3 5 7 11 13 17 37 97 6165 //characteristic p 2 3 5 7 11 13 17 37 97 5925 6166 //icFracP 0.04 0.03 0.04 0.04 0.04 0.05 0.05 0.13 0.59 Mac 5926 6167 //normalP 0 0 0 0 0 0 0 0 1 Sing … … 5930 6171 2. Series Fp[u, v, w, x, y, z]/u2x4+uvy4+v2z4 5931 6172 //-------------------------------------------- 5932 //characteristic p 2 3 5 7 11 5933 //icFracP 0.07 0.22 9.67 143 12543 6173 //characteristic p 2 3 5 7 11 6174 //icFracP 0.07 0.22 9.67 143 12543 5934 6175 //normalP 0 0 5 42 1566 5935 6176 //icFractions 1.16 * * * * *: > 6h 5936 6177 //normal 0 0 0 0 0 5937 6178 5938 //3. Series Fp[u, v, w, x, y, z]/(u2xp+uvyp+v2zp) 6179 //3. Series Fp[u, v, w, x, y, z]/(u2xp+uvyp+v2zp) 5939 6180 //----------------------------------------------- 5940 //characteristic p 2 3 5 7 11 13 17 19 23 5941 //icFracP 0.06 0.07 0.09 0.27 1.81 4.89 26 56 225 6181 //characteristic p 2 3 5 7 11 13 17 19 23 6182 //icFracP 0.06 0.07 0.09 0.27 1.81 4.89 26 56 225 5942 6183 //normalP 0 0 0 0 1 2 6 10 27 5943 //icFractions 0.16 1.49 75.00 4009 * * * * * 6184 //icFractions 0.16 1.49 75.00 4009 * * * * * 5944 6185 //normal 0 0 2 836 5945 6186 //### p=7 normal braucht 807 sec in: … … 5954 6195 5955 6196 //IRREDUCIBLE EXAMPLES: 5956 //--------------------- 6197 //--------------------- 5957 6198 //timing for MacBookPro 2.2GHz Intel Core 2 Duo, 4GB Ram 5958 6199 //Sing. ix86Mac-darwin version 3-1-0 (3100-2008101314) Oct 13 2008 14:46:59 … … 5961 6202 //Apply: 5962 6203 list nor = normal(i,"isPrim"); nor; 5963 list nor = normalP(i,"withRing","isPrim"); nor; 6204 list nor = normalP(i,"withRing","isPrim"); nor; 5964 6205 def R=nor[1][1]; setring R; norid; normap; 5965 6206 setring r; 5966 6207 norTest(i,nor); 5967 6208 5968 int tt = timer; 5969 list nor = normalP(i,"withRing","isPrim"); nor; 6209 int tt = timer; 6210 list nor = normalP(i,"withRing","isPrim"); nor; 5970 6211 timer-tt; 5971 int tt = timer; 6212 int tt = timer; 5972 6213 list nor = normal(i,"isPrim"); 5973 6214 timer-tt; 5974 6215 5975 6216 ring r=19,(x,y,u,v),dp; //delta -1 5976 ideal i=x2v-y2u; 6217 ideal i=x2v-y2u; 5977 6218 //norTest 2 sec 5978 6219 … … 5994 6235 5995 6236 ring r=5,(u,v,x,y,z),dp; //delta -1 5996 ideal i=u2x6+uvy6+v2z6; 6237 ideal i=u2x6+uvy6+v2z6; 5997 6238 //normalP 5sec, normalC 1sec 5998 6239 //V5: norTest(i,nor); 45 sec bei normalP, V6 12 sec … … 6001 6242 ring r=5,(u,v,x,y,z),dp; //delta -1 6002 6243 ideal i=u2x5+uvy5+v2z5; 6003 //normalP 1sec, normalC 1 sec, 6004 //norTest lange: minor(jacob(I),h,J) 193 (308)sec, haengt dann bei M = std(M); 6244 //normalP 1sec, normalC 1 sec, 6245 //norTest lange: minor(jacob(I),h,J) 193 (308)sec, haengt dann bei M = std(M); 6005 6246 //norTest(i,nor,2); verwenden! 6006 6247 //Sing 3.0-4 orig >9h! hngt bei Q = mstd(Q)[2]; 6007 6248 6008 6249 ring r=2,(y,x),wp(12,5); //delta 3 6009 ideal i=y5+y2x4+y2x+yx2+x12; 6250 ideal i=y5+y2x4+y2x+yx2+x12; 6010 6251 //normalP 0 sec (Test 0 sec), normalC 2 sec (Test 2 sec) 6011 6252 //normalC withGens (ohne interred) 0sec … … 6016 6257 //normalC haengt bei minor, ideal im loop wird zu gross ### 6017 6258 //interred bei normalC vergroeesert string um Faktor 4000! 6018 //withGens haengt bei interred in loop 4 (> 10 h) oder 6019 //(nach Ausschalten von interred) bei 6259 //withGens haengt bei interred in loop 4 (> 10 h) oder 6260 //(nach Ausschalten von interred) bei 6020 6261 //int delt=vdim(std(modulo(f,ideal(p)))); (>?h) 6021 6262 6022 //Leonard1: (1. Komponente von Leonard), delta -1 6263 //Leonard1: (1. Komponente von Leonard), delta -1 6023 6264 ring r=2,(v,u,z,y,x),dp; 6024 6265 ideal i = z3+zyx+y3x2+y2x3, uyx+z2,uz+z+y2x+yx2, u2+u+zy+zx, … … 6046 6287 +y*(x^23+x^22+x^20+x^17+x^15+x^14+x^12+x^9) 6047 6288 +(x^25+x^23+x^19+x^17+x^15+x^13+x^11+x^5); 6048 //normalP: dp 2sec withRing 8sec, 6289 //normalP: dp 2sec withRing 8sec, 6049 6290 //wp 4sec, withRing:51sec Zeit in lin = subst(lin, var(ii), vip); in elimpart ), 6050 6291 //norTest(i,nor,2): haengt bei mstd(norid); … … 6052 6293 //GEFIXTES INTERRED ABWARTEN. Dann interred aktivieren 6053 6294 //interred(norid) haengt u. mst(norid) zu lange 6054 //(o.interred): haengt bei haengt bei list SM = mstd(i); 6055 //ideal in der Mitte zu gross 6295 //(o.interred): haengt bei haengt bei list SM = mstd(i); 6296 //ideal in der Mitte zu gross 6056 6297 //i = Ideal (size 118, 13 var) fuer die neue Normalisierung 6057 6298 … … 6059 6300 ------------------ 6060 6301 //Apply: 6061 int tt = timer; 6302 int tt = timer; 6062 6303 list nor=normalP(i,"isPrim","withRing"); 6063 6304 timer-tt; … … 6067 6308 list nor = normalC(i, "withGens"); nor; 6068 6309 list nor = normalP(i,"withRing"); nor; 6069 list nor = normalP(i); nor; 6310 list nor = normalP(i); nor; 6070 6311 def R=nor[1][1]; setring R; norid; normap; 6071 6312 … … 6080 6321 6081 6322 //----------------------Test Example for special cases ------------------- 6082 int tt = timer; 6323 int tt = timer; 6083 6324 list nor=normalP(i,"withRing");nor; 6084 6325 //list nor=normalP(i,"withRing", "isPrim");nor; … … 6087 6328 setring r; 6088 6329 6089 int tt = timer; 6330 int tt = timer; 6090 6331 list nor=normal(i,"isPrim");nor; 6091 6332 timer-tt; … … 6098 6339 ideal j = x,y; 6099 6340 ideal i = j*xy; 6100 equidim(i); 6341 equidim(i); 6101 6342 //hat eingebettete Komponente, equidim rechnet wie in Beschreibung (ok) 6102 6343 6103 6344 ring r = 19,(x,y),dp; 6104 6345 ideal i = x3-y4; //delta = 3 6105 6346 ideal i = y*x*(x3-y4); //delta = 11; 0,0,3 6106 6347 ideal i = (x2-y3)*(x3-y4); //delta = 13; 1,3 6107 ideal i = (x-y)*(x3+y2)*(x3-y4); //delta = 23; 0,1,3 6348 ideal i = (x-y)*(x3+y2)*(x3-y4); //delta = 23; 0,1,3 6108 6349 ideal i = (x-1)*(x3+y2)*(x2-y3); //delta = 16; 0,1,1 6109 6350 ideal i = (x-y^2)^2 - y*x^3; //delta = 3 6110 6351 //singularities at not only at 0, hier rechnet equidim falsch 6111 6352 6112 // -------------------------- General Examples ---------------------------//Huneke, irred., delta=2 (Version 3-0-4: < 1sec) 6353 // -------------------------- General Examples ---------------------------//Huneke, irred., delta=2 (Version 3-0-4: < 1sec) 6113 6354 //Version 3-0-6 default: 1sec, mit gens 2sec, mit delta 5 sec 6114 6355 //(prim,noFac):ca 7 Min, prim:ca 10 min(wg facstd) … … 6128 6369 //normalC: char 2, 31991: 0 sec (isPrim); char 2, equidim: 7 sec 6129 6370 //norTest(i,nor,2); 1sec 6130 //normalP char 2: 1sec (isPrim) 6371 //normalP char 2: 1sec (isPrim) 6131 6372 //size(norid); size(string(norid));21 1219 interred(norid): 21 1245 (0 sec) 6132 6373 6133 int tt = timer; 6374 int tt = timer; 6134 6375 list nor=normalC(i);nor; 6135 6376 timer-tt; … … 6138 6379 6139 6380 //Vasconcelos irred., delta -1 (dauert laenger) 6140 //auf macbook pro = 20 sec mit alter Version, 6381 //auf macbook pro = 20 sec mit alter Version, 6141 6382 //Sing 3-0-6: 6142 6383 // Char 32003: "equidim" 30 sec, "noFac": 30sec … … 6160 6401 //normalP (isPrim) char 2,19: 0sec, char 29: 1sec 6161 6402 6162 //Theo1a, CohenMacaulay regular in codim 2, dim slocus=1, delta=0 6403 //Theo1a, CohenMacaulay regular in codim 2, dim slocus=1, delta=0 6163 6404 //normalC: 0 sec, normalP: haegt in K=preimage(R,phi,L); 6164 6405 ring r=32003,(x,y,z,u),dp; … … 6184 6425 T(1)^6*T(2)*T(3)+T(1)^2*T(2)^4*T(3)+T(1)^3*T(2)^2*T(4)-T(1)^2*T(2)*T(3)^2+T(4)^2; 6185 6426 //normalC: char 2,32003: 0 sec (isPrim) 6186 //normalP (isPrim) char 2: 0sec, char 11 2se, char 19: 13sec 6427 //normalP (isPrim) char 2: 0sec, char 11 2se, char 19: 13sec 6187 6428 //norTest 48sec in char11 6188 6429 //### interred verkuerzt … … 6197 6438 //Theo4 reducible, delta (0,0,0) -1 6198 6439 ring r=29,(x,y,z),dp; 6199 ideal i=(x-y)*(x-z)*(y-z); 6200 //normalC: char 2,32003: 0 sec 6440 ideal i=(x-y)*(x-z)*(y-z); 6441 //normalC: char 2,32003: 0 sec 6201 6442 //normalP char withRing 2, 29: 0sec, 6sec 6202 6443 … … 6204 6445 ring r=32003,(x,y,z),dp; 6205 6446 ideal i=x2y2+x2z2+y2z2; 6206 //normalC: char 2,32003: 0 sec 6447 //normalC: char 2,32003: 0 sec 6207 6448 //normalP char withRing 2, 29: 0sec, 4sec 6208 6449 … … 6226 6467 //alles 0 sec in char 2 6227 6468 //--------------------------------------------------------- 6228 int tt = timer; 6469 int tt = timer; 6229 6470 list nor=normalP(i,"normalC","withRing");nor; 6230 6471 timer-tt; 6231 6472 6232 //St_S/Y, 3 Komponenten, 2 glatt, 1 normal 6473 //St_S/Y, 3 Komponenten, 2 glatt, 1 normal 6233 6474 //charp haengt (in char 20) in K=preimage(R,phi,L); 6234 6475 //ring r=32003,(b,s,t,u,v,w,x,y,z),dp; 6235 6476 ring r=11,(b,s,t,u,v,w,x,y,z),dp; 6236 6477 ideal i=wy-vz,vx-uy,tv-sw,su-bv,tuy-bvz; 6237 //normalC: char 2,32003: 0 sec 6478 //normalC: char 2,32003: 0 sec 6238 6479 //normalP char withRing 2: 1sec, char 11: 40sec 6239 6480 … … 6267 6508 sux2y2-bvx2y2+sux2z2-bvx2z2+suy2z2-bvy2z2, 6268 6509 tux2y3-bvx2y2z+tux2yz2+tuy3z2-bvx2z3-bvy2z3; 6269 //normalC: char 2,32003: 1 sec 6510 //normalC: char 2,32003: 1 sec 6270 6511 //normalP char withRing 2: 1sec, char 11: 40sec 6271 6512 6272 6513 //--------------------------------------------------------- 6273 6514 //genus: 6274 int tt = timer; 6515 int tt = timer; 6275 6516 list nor=normal(i, "noFac");nor; 6276 6517 timer-tt; 6277 6518 6278 //Yoshihiko Sakai, irred, 0sec, delta = 8 6519 //Yoshihiko Sakai, irred, 0sec, delta = 8 6279 6520 ring r=0,(x,y),dp; //genus 0 4 nodes and 6 cusps im P2 6280 6521 //ring r=7,(x,y),dp; //charp haengt in K = preimage(Q,phi,L) … … 6306 6547 //Rob Koelman 6307 6548 //ring r=0,(x,y,z),dp; //dim sing = 1 (nach ca 15 min abgebrochen) 6308 ring r=32003,(x,y,z),dp; 6549 ring r=32003,(x,y,z),dp; 6309 6550 ideal i= 6310 6551 761328152*x^6*z^4-5431439286*x^2*y^8+2494*x^2*z^8+228715574724*x^6*y^4+ … … 6314 6555 506101284*x^2*z^2*y^6+47970216*x^2*z^4*y^4+660492*x^2*z^6*y^2- 6315 6556 z^10-474*z^8*y^2-84366*z^6*y^4; 6316 //normalC char 32003: 10 sec, char 0 : 6557 //normalC char 32003: 10 sec, char 0 : 6317 6558 6318 6559 //ring r=0,(x,y),dp;//genus 10 with 26 cusps (nach ca 4 min abgebrochen) … … 6353 6594 //Probleme mit normalC in char 2 und char 0 6354 6595 6355 int tt = timer; 6596 int tt = timer; 6356 6597 list nor=normalC(i,"withRing");nor; 6357 6598 timer-tt; … … 6365 6606 ring r=2,(x,y),dp; //genus 35 6366 6607 ideal i=y30+y13x+x4y5+x3*(x+1)^2; 6367 //char 0 abgebrochen bei list SM = mstd(i); ### 6608 //char 0 abgebrochen bei list SM = mstd(i); ### 6368 6609 //char 2 nach ca 30 min 6369 //normalC: char 2: abgebr. bei list SM = mstd(i); //Now the work starts' 6610 //normalC: char 2: abgebr. bei list SM = mstd(i); //Now the work starts' 6370 6611 //normalC, withGens, char 2: abgebrochen bei Q=mstd(Q)[2]; 6371 //normalP char 2 withRing: 0sec 6612 //normalP char 2 withRing: 0sec 6372 6613 6373 6614 ring r=0,(x,y),dp; //irred, genus 55, delta 21 … … 6396 6637 6397 6638 //ring r=0,(x,y),dp; 6398 ring r=32003,(x,y),dp; 6399 ideal i= 6400 x30y21+21x29y20+210x28y19+10x27y19+1330x27y18+190x26y18+5985x26y17 6401 +1710x25y17+20349x25y16+45x24y17+9690x24y16+54264x24y15+765x23y16 6402 +38760x23y15+116280x23y14+6120x22y15+116280x22y14+120x21y15 6403 +203490x22y13+30600x21y14+271320x21y13+1799x20y14+293930x21y12+107100x20y13 6404 +503880x20y12+12586x19y13+352716x20y11+278460x19y12+210x18y13+755820x19y11 6405 +54509x18y12+352716x19y10+556920x18y11+2723x17y12+923780x18y10+163436x17y11 6406 +293930x18y9+875160x17y10+16296x16y11+923780x17y9+359359x16y10+252x15y11 6407 +203490x17y8+1093950x16y9+59598x15y10+755820x16y8+598598x15y9+2751x14y10 6408 +116280x16y7+1093950x15y8+148610x14y9+503880x15y7+769197x14y8+13650x13y9 6409 +54264x15y6+875160x14y7+266805x13y8+210x12y9+271320x14y6+768768x13y7 6410 +40635x12y8+20349x14y5+556920x13y6+354816x12y7+1855x11y8+116280x13y5 6639 ring r=32003,(x,y),dp; 6640 ideal i= 6641 x30y21+21x29y20+210x28y19+10x27y19+1330x27y18+190x26y18+5985x26y17 6642 +1710x25y17+20349x25y16+45x24y17+9690x24y16+54264x24y15+765x23y16 6643 +38760x23y15+116280x23y14+6120x22y15+116280x22y14+120x21y15 6644 +203490x22y13+30600x21y14+271320x21y13+1799x20y14+293930x21y12+107100x20y13 6645 +503880x20y12+12586x19y13+352716x20y11+278460x19y12+210x18y13+755820x19y11 6646 +54509x18y12+352716x19y10+556920x18y11+2723x17y12+923780x18y10+163436x17y11 6647 +293930x18y9+875160x17y10+16296x16y11+923780x17y9+359359x16y10+252x15y11 6648 +203490x17y8+1093950x16y9+59598x15y10+755820x16y8+598598x15y9+2751x14y10 6649 +116280x16y7+1093950x15y8+148610x14y9+503880x15y7+769197x14y8+13650x13y9 6650 +54264x15y6+875160x14y7+266805x13y8+210x12y9+271320x14y6+768768x13y7 6651 +40635x12y8+20349x14y5+556920x13y6+354816x12y7+1855x11y8+116280x13y5 6411 6652 +597597x12y6+80640x11y7+5985x13y4+278460x12y5+353892x11y6+7280x10y7+38760x12y4 6412 +358358x11y5+112014x10y6+120x9y7+1330x12y3+107100x11y4+264726x10y5+16660x9y6 6413 +9690x11y3+162799x10y4+111132x9y5+805x8y6+210x11y2+30600x10y3+146685x9y4 6414 +24500x8y5+1710x10y2+54236x9y3+78750x8y4+2310x7y5+21x10y+6120x9y2+58520x8y3 6415 +24010x7y4+45x6y5+190x9y+12509x8y2+39060x7y3+3675x6y4+x9+765x8y+15918x7y2 6416 +15680x6y3+204x5y4+10x8+1786x7y+12915x6y2+3500x5y3+45x7+2646x6y+6580x5y2 6417 +366x4y3+119x6+2562x5y+1995x4y2+10x3y3+203x5+1610x4y+324x3y2+231x4+630x3y 6418 +23x2y2+175x3+141x2y+85x2+16xy+24x+y+4; 6419 list nor = normal(i); 6653 +358358x11y5+112014x10y6+120x9y7+1330x12y3+107100x11y4+264726x10y5+16660x9y6 6654 +9690x11y3+162799x10y4+111132x9y5+805x8y6+210x11y2+30600x10y3+146685x9y4 6655 +24500x8y5+1710x10y2+54236x9y3+78750x8y4+2310x7y5+21x10y+6120x9y2+58520x8y3 6656 +24010x7y4+45x6y5+190x9y+12509x8y2+39060x7y3+3675x6y4+x9+765x8y+15918x7y2 6657 +15680x6y3+204x5y4+10x8+1786x7y+12915x6y2+3500x5y3+45x7+2646x6y+6580x5y2 6658 +366x4y3+119x6+2562x5y+1995x4y2+10x3y3+203x5+1610x4y+324x3y2+231x4+630x3y 6659 +23x2y2+175x3+141x2y+85x2+16xy+24x+y+4; 6660 list nor = normal(i); 6420 6661 //normalC: char 0: ### hngt in SB of singular locus JM = mstd(J); 6421 6662 //normalC: char 32003,"noFac","equidim": 0sec, "noFac": 1sec … … 6424 6665 //### ist das noetig? 6425 6666 6426 //Singular rechnet genus richtig, auch im Fall, dass Kurve irreduzibel, 6667 //Singular rechnet genus richtig, auch im Fall, dass Kurve irreduzibel, 6427 6668 //aber nicht absolut irreduzibel ist: 6428 6669 ring r = 0,(x,y),dp;
Note: See TracChangeset
for help on using the changeset viewer.