Changeset 0b1671 in git
- Timestamp:
- Nov 8, 2023, 2:38:58 PM (6 months ago)
- Branches:
- (u'spielwiese', 'b4f17ed1d25f93d46dbe29e4b499baecc2fd51bb')
- Children:
- f21133bf9dde91dd3c42804f81af23a8aa6e30ba
- Parents:
- 1dc25627122bccd9eebfcd84f1fb60000b4f25a3
- Location:
- Singular/LIB
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/LIB/integralbasis.lib
r1dc2562 r0b1671 2 2 /////////////////////////////////////////////////////////////////////////////// 3 3 /////////////////////////////////////////////////////////////////////////////// 4 version="version integralbasis.lib 4.3. 1.0 Jul_2022"; // $Id$4 version="version integralbasis.lib 4.3.2.10 Nov_2023 "; // $Id$ 5 5 category="Commutative Algebra"; 6 6 info=" … … 54 54 (Default option for normal algorithm.)@* 55 55 Options for hensel algorithm:@* 56 - \"opti\" -> The integral basis for the branches are merged 56 - \"opti\" -> The integral basis for the branches are merged 57 57 using a combinatorial approach. (Default option.)@* 58 58 - \"noOpti\" -> the integral basis for the different branches … … 619 619 dbprint(dbg, "----Component: "); 620 620 if(dbg>=1){compo;} 621 621 622 622 norOut = intBasisComp(f, compType, compo, algorithm, locBasis, useRotation, optimize, #); 623 623 norT = norOut[1]; … … 1145 1145 fT = f; 1146 1146 } 1147 1147 1148 1148 ideal ibN = ibAt0(fT, locBasis, optimize); 1149 1149 … … 1194 1194 intvec vy = (0,1); 1195 1195 int dbg = printlevel - voice; 1196 1196 1197 1197 // 1) Compute Puiseux sets (we use segments for easier implementation) 1198 1198 list pSegmentFull = getSegments(f, classes, slopes, degExpand); 1199 1199 list pSegment = pSegmentFull[1]; // The segments corresponding to expansions at the origin 1200 1200 poly unitPoly = pSegmentFull[2]; // The unit outside the origin 1201 dbprint(dbg, "Step 1 finished"); 1202 1201 dbprint(dbg, "Step 1 finished"); 1202 1203 1203 // 2) Compute IB in each set 1204 1204 list ibSeg; … … 1210 1210 } 1211 1211 dbprint(dbg, "Step 2 finished"); 1212 1212 1213 1213 // 3) Merge all the integral basis for the segments using the combinatorial approach 1214 1214 list ib = optiBase(ibSeg, pSegment); 1215 1215 dbprint(dbg, "Step 3 finished"); 1216 1216 1217 1217 // 4) We add the unit outside the origin and convert to ib shape. 1218 1218 ideal IOut; 1219 1219 int intExp = int(ib[size(ib)-1][1]); 1220 1220 poly condu = var(1)^intExp; // The denominator of the integral basis. 1221 1221 1222 1222 for(k = 0; k < deg(unitPoly, vy); k++) 1223 1223 { … … 1231 1231 return(IOut); 1232 1232 } 1233 1233 1234 1234 1235 1235 /////////////////////////////////////////////////////////////////////// … … 1256 1256 1257 1257 number slopeSegment; 1258 1258 1259 1259 list out; 1260 1260 … … 1277 1277 list fGlob = henselGlobal(y^fl[2], fl[1], f, maxOrder); 1278 1278 poly fLoc = fGlob[1]; 1279 1279 1280 1280 if(fLoc == 1) 1281 1281 { … … 1287 1287 fSegment = henselSegments(fLoc, maxOrder); 1288 1288 dbprint(dbg, "Number of segments: ", size(fSegment)); 1289 1289 1290 1290 list pExpRecomputed; 1291 1291 list nPoly; 1292 1292 1293 1293 //"Check output of henselSegments"; 1294 1294 //fSegment; … … 1307 1307 { 1308 1308 // If slopes coincide we add the class to the list 1309 classesNew[size(classesNew) + 1] = classes[j]; 1309 classesNew[size(classesNew) + 1] = classes[j]; 1310 1310 } 1311 } 1312 1313 // If the number of classes in the segments is larger than one, 1311 } 1312 1313 // If the number of classes in the segments is larger than one, 1314 1314 // we need to recompute expansions up to degree maxOrder so that 1315 1315 // the factors can be computed correctly. 1316 if(size(classesNew) > 1) 1316 if(size(classesNew) > 1) 1317 1317 { 1318 1318 // puiseux(poly f, int maxDeg, int atOrigin) … … 1321 1321 classesNew = getClasses(pExpRecomputed); 1322 1322 } 1323 1323 1324 1324 // We put everything together 1325 1325 out[i] = list(fSegment[i], slopeSegment, classesNew); 1326 1326 } 1327 1327 } 1328 1328 1329 1329 // We reorder according to the slope 1330 1330 out = sortSegments(out); 1331 1331 1332 1332 // We also return the unit outside the origin 1333 1333 list outFull = list(out, fGlob[2]); … … 1367 1367 intvec degPolySet; 1368 1368 intvec vy = (0,1); 1369 1369 1370 1370 // We get all the possible polynomials, including the full polys 1371 1371 //"Building factors from classes..."; 1372 1372 list bF = buildFactors(classes); 1373 1373 1374 1374 int degF = deg(f, vy); 1375 1375 1376 1376 // We consider the union of all polynomials 1377 1377 poly pGround; … … 1386 1386 } 1387 1387 } 1388 1388 1389 1389 // We compute the full polynomial up to the integrality exponent. 1390 1390 // When there is only one class we use the polynomial obtained from Hensel lifting. … … 1403 1403 } 1404 1404 } 1405 1405 1406 1406 // Degrees of the polynomials 1407 1407 for(i = 1; i <= size(polySet); i++) … … 1409 1409 degPolySet[i] = deg(polySet[i], vy); 1410 1410 } 1411 1411 1412 1412 // We compute the order of each expansion at each of the polynomials 1413 1413 list ordExpAtPoly; … … 1425 1425 return(ib); 1426 1426 } 1427 1428 // For each degree up to the degree of f, we compute the best 1427 1428 // For each degree up to the degree of f, we compute the best 1429 1429 // possible product of factors by checking exhaustively all possible 1430 1430 // combinations such that the product has the correct degree. … … 1441 1441 intvec cBest; 1442 1442 poly pBest; 1443 1443 1444 1444 // The first element is polynomial 1 1445 1445 intvec zero = 0 * (1..s); 1446 1446 ib[1] = list(0, zero, 1); 1447 1447 1448 1448 for (d = 1; d <= degF; d++) 1449 1449 { 1450 1450 // The best element of degree d; 1451 1451 oMax = 0; 1452 1452 1453 1453 // We generate the list of all possible combinations 1454 1454 c = summandsFac(degPolySet, d); 1455 1455 1456 1456 // We compute the valuation of each combination, 1457 1457 // and we keep the largest one. … … 1485 1485 //"c, ordExpAtPoly"; 1486 1486 //c, ordExpAtPoly; 1487 1487 1488 1488 number o; 1489 1489 number oBest; … … 1502 1502 if(ordExpAtPoly[i][j] >= 0) 1503 1503 { 1504 o = o + c[i] * ordExpAtPoly[i][j]; // We consider c[i] equal factors, each one with valuation 1504 o = o + c[i] * ordExpAtPoly[i][j]; // We consider c[i] equal factors, each one with valuation 1505 1505 // ordExpAtPoly[i][j] at the jth Puiseux expansion 1506 1506 } else { … … 1550 1550 } 1551 1551 1552 1552 1553 1553 //We implement the optimization approach from scratch 1554 1554 proc optiBase(list ibSeg, list segmentSlope) … … 1556 1556 int i, k; 1557 1557 int s = size(ibSeg); 1558 1558 1559 1559 if(s == 1) {return(ibSeg[1]);} 1560 1560 1561 1561 // We initialize the recursion step 1562 1562 list ibSegRec = ibSeg[s]; 1563 1563 list segmentSlopeRec = segmentSlope[s]; // Should be fixed to contain only slopes 1564 1564 1565 1565 for(k = s-1; k >= 1; k--) 1566 1566 { … … 1575 1575 { 1576 1576 //"optiTwoSets begin..."; 1577 1577 1578 1578 int s1 = size(ib1)-1; // max degree 1579 1579 int s2 = size(ib2)-1; // max degree … … 1581 1581 intvec cBest; 1582 1582 int d; 1583 1583 1584 1584 //"s1 + s2 = ", s1 + s2; 1585 1585 1586 1586 number o, o1, o2; 1587 1587 number oBest; 1588 1588 poly polyBest; 1589 1589 1590 1590 list out; 1591 1591 out[1] = list(0, intvec(0,0), 1); 1592 1592 // Best element of degree d 1593 1593 1594 1594 int m1, m2; 1595 1595 for(d = 1; d <= s1 + s2; d++) … … 1615 1615 { 1616 1616 o = o2; 1617 } else 1617 } else 1618 1618 { 1619 if(c2 == s2) 1619 if(c2 == s2) 1620 1620 { 1621 1621 o = o1; 1622 } else 1622 } else 1623 1623 { 1624 1624 if(o1 < o2) {o = o1;} … … 1627 1627 } 1628 1628 //"c1 = ", c1, "c2 = ", c2, "s1 = ", s1, "s2 = ", s2, "o = ", o; 1629 1629 1630 1630 if(o > oBest) 1631 1631 { … … 1639 1639 } 1640 1640 //"optiTwoSets finished..."; 1641 1641 1642 1642 return(out); 1643 1643 } 1644 1645 1644 1645 1646 1646 1647 1647 //////////////////////////////////////////////////////////////////////// … … 1687 1687 // puiseux(poly f, int maxDeg, int atOrigin) 1688 1688 list pExp = puiseux(f, -1, 1); 1689 1689 1690 1690 debug_log_intbas(3, "------Time puiseux expansions: ", timer - tt); 1691 1691 tt = timer; … … 1708 1708 dbprint(dbg, "--Computing vanishing orders..."); 1709 1709 matrix MClass = valIKClass(classes); 1710 1710 1711 1711 list vS = valIKSelf(bF, md); 1712 1712 list MSelf = vS[1]; 1713 1713 list bestElem = vS[2]; 1714 1714 1715 1715 1716 1716 // The highest exponent of the denominator … … 1733 1733 } 1734 1734 } 1735 1735 1736 1736 dbprint(dbg, "The maximum integrality exponent is ", maxExp); 1737 1737 1738 1738 debug_log_intbas(3, "------Time for factors info: ", timer - tt); 1739 1739 tt = timer; … … 1741 1741 int degExpand = int(maxExp) + 1; 1742 1742 dbprint(dbg, "---- Degree of expansions: ", degExpand); 1743 1743 1744 1744 if((pardeg(minpoly) > 0) and (optimize == 1)) 1745 1745 { … … 1763 1763 int i, j, k; 1764 1764 intvec vy = (0,1); 1765 1765 1766 1766 // Computing hensel blocks... 1767 1767 dbprint(dbg, "--Building HenselBlocks..."); … … 1830 1830 blocks[1] = 1; 1831 1831 matrix M = valIK(classes); 1832 1832 1833 1833 } 1834 1834 … … 1860 1860 1861 1861 debug_log_intbas(3, "------Time for ordFull: ", timer - tt); 1862 1862 1863 1863 tt = timer; 1864 1864 … … 1885 1885 int mdm = 0; 1886 1886 int mdmTemp; 1887 1887 1888 1888 // maxDegMerge computes the maximum degree required when adding the 1889 1889 // factors from the Chinese remainder approach … … 1906 1906 // The classes are reordered in the same order as the irreducible factors 1907 1907 classes = ifOut[5]; 1908 1908 1909 1909 if((ifOut[4] == 1)) // Wrong number of factors, recompute orders 1910 1910 { … … 2015 2015 //debug_log_intbas(3, "------Time for recomputation: ", timer - tt); 2016 2016 } 2017 2017 2018 2018 ideal tmp_var_mdm=std(var(1)^mdm); 2019 2019 for(i = 1; i <= size(I2LiftedFull); i++) … … 2142 2142 //ideal IOut = ibOrigin(fT, locBasis); 2143 2143 ideal IOut = ibAt0(fT, locBasis, optimize); 2144 2144 2145 2145 list ib = intBasIdealToList(IOut); 2146 2146 … … 2462 2462 int dbg = printlevel - voice + 4; 2463 2463 dbprint(dbg, "--buildFactors begins"); 2464 2464 2465 2465 int i, j; 2466 2466 int d = -1; … … 2490 2490 2491 2491 list polyGround; 2492 2492 2493 2493 int isGround = 1; 2494 2494 2495 2495 int algExt; 2496 2496 for(i = 1; i <= size(classes); i++) … … 2504 2504 first = 1; 2505 2505 stop1 = 0; 2506 2506 2507 2507 // If the denominator is 1 there is nothing to do 2508 2508 2509 2509 algExt = 0; 2510 2510 if(typeof(classes[i][1]) == "ring") … … 2516 2516 if(classes[i][1][2] > 1) {algExt = 1;} 2517 2517 } 2518 2518 2519 2519 if(algExt == 1) 2520 2520 { … … 2545 2545 den = classes[i][1][2]; 2546 2546 } 2547 exps = expsT; 2547 exps = expsT; 2548 2548 //"exponents for class ", i, " = ", expsT; 2549 2549 2550 2550 for(k = 1; k <= size(exps); k++) 2551 2551 { … … 2567 2567 S = classes[i][1]; 2568 2568 setring S; 2569 2569 2570 2570 // d = -1 for computing polynomial of full degree 2571 2571 if(d >= 0){ … … 2583 2583 ideal rel = extendBack(fFB, erg[1], dMP); 2584 2584 matrix CC = coef(fFB, var(1)*var(2)); 2585 2585 2586 2586 setring R; 2587 2587 ideal rel = imap(S, rel); … … 2633 2633 ind++; 2634 2634 isGround = 0; 2635 } else 2635 } else 2636 2636 { 2637 2637 debug_log_intbas(4, "------Time for this factor: ", timer - t); … … 2663 2663 { 2664 2664 ords[i][ind] = number(d) / number(den); 2665 } else 2665 } else 2666 2666 { 2667 2667 ords[i][ind] = number(deg(facs[i][ind],vx)) / number(den); … … 2679 2679 } 2680 2680 } 2681 2681 2682 2682 return(list(facs, ords, degs, gfChecks, isGround)); 2683 2683 } … … 2700 2700 2701 2701 poly mp = minpoly; 2702 2702 2703 2703 mp = subst(minpoly, @a, var(1)); 2704 2704 int d = pardeg(minpoly); … … 2768 2768 2769 2769 poly mp = minpoly; 2770 2770 2771 2771 mp = subst(minpoly, @a, var(1)); 2772 2772 int d = pardeg(minpoly); … … 2918 2918 intvec dx = (1,0); 2919 2919 int degX = deg(f, dx); 2920 2920 2921 2921 if(d == -1) {d = degX + 1;} 2922 2922 2923 2923 //"Check buildPG"; 2924 2924 //f; … … 2931 2931 def S = ring(l); 2932 2932 setring S; 2933 2933 2934 2934 // We divide the exponents by the GCD of the exponents and the degree of the extension 2935 2935 poly ff; … … 2940 2940 list ffList = buildPolyGround(list(ff), g2); 2941 2941 poly ffRed = ffList[1]; 2942 2942 2943 2943 list pols; 2944 2944 pols[1] = ffRed; … … 2948 2948 pols[i+1] = ff; 2949 2949 } 2950 2950 2951 2951 if(den > 1) 2952 2952 { 2953 // T(1) is a den-th root of unity, the only relation is 2953 // T(1) is a den-th root of unity, the only relation is 2954 2954 // 0 = 1 + T(1) + ... + T(1)^(den-1) 2955 2955 poly pExt = 1; // A root of unity … … 2960 2960 ideal I = pExt; 2961 2961 I = groebner(I); 2962 2962 2963 2963 poly fNewTemp = 1; 2964 2964 for(i = 1; i<=den; i++) … … 2977 2977 poly fNew = reduce((var(2) - ffRed), groebner(var(1)^(d*den+1))); 2978 2978 } 2979 2979 2980 2980 // We replace x^den by x 2981 2981 ring P = (0, @a), (@x, @y, @X), dp; … … 2988 2988 } 2989 2989 f2 = subst(f2, @X, @x); 2990 2990 2991 2991 setring R; 2992 2992 poly fNew = fetch(P, f2); … … 2996 2996 // We look for a polynomial over Q. 2997 2997 // This algorithm is not implemented for complex singularities. 2998 // In that case we would need to distinguish the extension in the basering 2998 // In that case we would need to distinguish the extension in the basering 2999 2999 // from the extension in the Puiseux expansion, as in buildPolyFracNew. 3000 3000 fNew = multiplicateConjugates(fNew); … … 3013 3013 matrix M = coef(f,var(indVar)); 3014 3014 int g; 3015 for(int i = 1; i <= ncols(M); i++) 3015 for(int i = 1; i <= ncols(M); i++) 3016 3016 { 3017 3017 if(i == 1){g = leadexp(M[1,1])[indVar];} … … 3033 3033 // The common denominator is now cancelled with the numerators. 3034 3034 static proc buildPolyGround(list fFrac, int sD) 3035 { 3035 { 3036 3036 int i; 3037 3037 int gfCheck = 1; // The polynomial computed is over the ground field. … … 3201 3201 // proc getClasses 3202 3202 // Output: a matrix M of number, where M[i, j] is the valuation 3203 // of gamma_i at the product of the conjugated factors (Y - gamma_j), 3203 // of gamma_i at the product of the conjugated factors (Y - gamma_j), 3204 3204 // expansions of the i-th and j-th conjugacy class respectively. 3205 3205 static proc valIKClass(list classes) … … 3208 3208 def R = basering; 3209 3209 matrix MC[size(classes)][size(classes)]; 3210 3210 3211 3211 // Order for each class of expansions 3212 3212 for(i = 1; i <= size(classes); i++) … … 3243 3243 poly differ; 3244 3244 number ordDiff; 3245 3246 list l; 3247 3245 3246 list l; 3247 3248 3248 for(i = 1; i <= size(classes); i++) 3249 3249 { … … 3369 3369 for(j = 1; j <= s; j++) 3370 3370 { 3371 if(i == j) 3371 if(i == j) 3372 3372 { 3373 3373 //"md = ", md; 3374 3374 //"i = ", i; 3375 if(md[i] > 1) 3375 if(md[i] > 1) 3376 3376 { 3377 3377 minOrd = minOrd + number(MSelf[i][md[i]-1]); 3378 3378 } 3379 3379 //"it worked"; 3380 } else 3380 } else 3381 3381 { 3382 3382 minOrd = minOrd + number(M[i,j]); … … 3466 3466 } 3467 3467 } 3468 3468 3469 3469 intvec elem = sums[maxExpi]; 3470 3470 return(list(maxExp, elem)); … … 3773 3773 setring S; 3774 3774 // The number of conjugated expansions is the common demoninator of the exponents times the degree of the extension, 3775 // except when the algebraic extension comes from taking root of unity. 3775 // except when the algebraic extension comes from taking root of unity. 3776 3776 // This degree should be checked if it is always correct computation, or if we should compute this number 3777 3777 // while computing the Puiseux expansions. … … 3932 3932 int dbg = printlevel - voice - 2; 3933 3933 dbprint(dbg, "START - irreducibleFactors"); 3934 3934 3935 3935 list I2Lifted = henselBlocks(f, degExpand, 1); 3936 3936 3937 3937 list updatedClasses = classes; 3938 3938 int nClasses; … … 3995 3995 3996 3996 newL = puiseux(I2Red, degExpand, 1); 3997 3997 3998 3998 classes2 = getClasses(newL); 3999 3999 dbprint(dbg, "getClasses finished"); … … 4014 4014 def S = classes2[j][1]; 4015 4015 setring S; 4016 4016 4017 4017 list bP = buildPolyGroundXRoot(PE[1][1], PE[1][2], degExpand); 4018 4018 4019 4019 //"bP ring", bP; 4020 4020 … … 4033 4033 fuProd = bP[1]; 4034 4034 gfCheck = bP[2]; 4035 4035 4036 4036 //"bP poly", bP; 4037 4037 4038 4038 } 4039 4039 … … 4122 4122 // The first term containing the locloc unit 4123 4123 expBaseFactor = expUnit; 4124 4124 4125 4125 // If the order of hi is not integer, we add a factor. 4126 4126 // This is used in the Chinese remainder strategy … … 5053 5053 dbprint(dbg, "----Computing Puiseux Segments..."); 5054 5054 fSegment = henselSegments(fLoc, maxOrder); 5055 5055 5056 5056 //"Check output of henselSegments"; 5057 5057 //fSegment; 5058 5058 5059 5059 for(i = 1; i <= size(fSegment); i++) 5060 5060 { … … 5176 5176 poly ratPart; 5177 5177 list compsT; 5178 5178 5179 5179 dbprint(dbg, "sFac = ", sFac); 5180 5180 for(i = 1; i <= sFac; i++) … … 5183 5183 hFactor[i] = hFactor[i] * (var(1)^(degFac * slN)); 5184 5184 hFactor[i] = mapFrom(hFactor[i], slN, slD); 5185 5185 5186 5186 dbprint(dbg, "henselInSegment - splitFact - i = ", i); 5187 5187 compsT = splitFact(hFactor[i], fJe[1][i+1], fJe[2][i+1], globOrder); 5188 5188 dbprint(dbg, "henselInSegment - splitFact - finished"); 5189 5189 5190 5190 for(j = 1; j <= size(compsT); j++) 5191 5191 { -
Singular/LIB/normal.lib
r1dc2562 r0b1671 1 1 ////////////////////////////////////////////////////////////////////////////// 2 2 ////////////////////////////////////////////////////////////////////////////// 3 version="version normal.lib 4.3. 1.1 Jan_2023 "; // $Id$3 version="version normal.lib 4.3.2.10 Nov_2023 "; // $Id$ 4 4 category="Commutative Algebra"; 5 5 info=" … … 77 77 If this option is not set, normal changes to dp ordering and performs 78 78 all computations with respect to this ordering.@* 79 - \"withDelta\" (or \"wd\") -> returns also the delta invariants. 79 - \"withDelta\" (or \"wd\") -> returns also the delta invariants. 80 80 Not valid for options \"locNormal\" and \"modNormal\".@* 81 81 If the optional parameter choose is not given or empty, only … … 97 97 - \"var2\" -> uses a polynomial in the second variable as universal 98 98 denominator.@* 99 - \"GBRadical\" -> it computes a Groebner basis of the radical 99 - \"GBRadical\" -> it computes a Groebner basis of the radical 100 100 ideal computed for the test ideal.@* 101 - \"noGBRadical\" -> it does not compute a Groebner basis of 101 - \"noGBRadical\" -> it does not compute a Groebner basis of 102 102 the radical ideal computed for the test ideal.@* 103 - \"locNormal\" -> uses locNormal procedure to compute the 103 - \"locNormal\" -> uses locNormal procedure to compute the 104 104 normalization, which implements a local-to-global algorithm 105 105 (for this option it is required that the ideal I is prime).@* … … 107 107 use modNormal algorithm for the local computations.@* 108 108 - \"modNormal\" -> uses modNormal procedure to compute the 109 normalization, which implements a modular algorithm (for this 109 normalization, which implements a modular algorithm (for this 110 110 option it is required that the ideal I is prime).@* 111 111 - list(\"nPrimes\", int n) -> parameter for modNormal. We consider 112 n primes at a time until the result lifted to the rationals is 112 n primes at a time until the result lifted to the rationals is 113 113 correct modulo one additional prime. (default: n = 10)@* 114 - \"noVerification\" -> if the modular approach is used (using 115 modNormal option or modular option in locNormal), the 114 - \"noVerification\" -> if the modular approach is used (using 115 modNormal option or modular option in locNormal), the 116 116 result will not be verified.@* 117 117 If the optional parameter choose is not given or empty, only … … 119 119 - \"withRing\" -> the ring structure of the normalization is 120 120 computed. The number of variables in the new ring is reduced as much 121 as possible. This is the default option, except when using 121 as possible. This is the default option, except when using 122 122 modNormal or locNormal options.@* 123 123 ASSUME: The ideal must be radical, for non-radical ideals the output may … … 126 126 and hence normal computes the normalization of the radical of id.@* 127 127 NOTE: \"isPrim\" should only be used if id is known to be prime. 128 RETURN: If \"withRing\" option is set, a list, say nor, of size 2 128 RETURN: If \"withRing\" option is set, a list, say nor, of size 2 129 129 (resp. 3 with option \"withDelta\"). 130 130 Let R denote the basering and id the input ideal. … … 149 149 the total delta invariant of basering/id (-1 means infinite, and 0 150 150 that R/P_i resp. R/id is normal).@* 151 If \"withRing\" option is not set, a list of an ideal U and 151 If \"withRing\" option is not set, a list of an ideal U and 152 152 a polynomial d such that U/d is the normalization 153 153 THEORY: We use here a general algorithm described in [G.-M.Greuel, S.Laplagne, … … 198 198 opt = remove_from_list(opt, "locNormal"); 199 199 list out = locNormal(id, opt); 200 } 200 } 201 201 if(in_array(#, "withRing")) { 202 202 // We compute the ring structure 203 def outRing = computeRing(out[1], id); 204 203 def outRing = computeRing(out[1], id); 204 205 205 // We put the conductor as the last element of the ideal. 206 206 ideal OO = reduce(out[1], groebner(out[2])); 207 207 OO = interred(OO); 208 208 OO[ncols(OO)+1]=out[2]; 209 209 210 210 list outWR = list(list(outRing), list(OO)); 211 211 return(outWR); … … 214 214 } 215 215 } 216 217 216 217 218 218 ASSUME(0, not isQuotientRing(basering) ); 219 219 … … 4846 4846 printlevel = printlevel + 1; 4847 4847 4848 if(normalCheck == 1) 4848 if(normalCheck == 1) 4849 4849 { 4850 4850 int out = normalMEqui(I, J, condu, D, withDelta, normalCheck, options); … … 5256 5256 5257 5257 // Checks if string s is an element of list l 5258 proc in_array(list l, string s)5258 static proc in_array(list l, string s) 5259 5259 { 5260 5260 int i; … … 5298 5298 return(0); 5299 5299 } 5300 5300 5301 5301 5302 5302 static proc testIdeal(ideal I, ideal U, ideal origJ, poly c, poly D, list options) … … 5304 5304 5305 5305 ASSUME(1, not isQuotientRing(basering) ); 5306 5307 5306 5307 5308 5308 5309 5309 // Internal procedure, used in normalM. … … 5372 5372 //"DEBUG - we do not compute the GB of radical output"; 5373 5373 } 5374 5374 5375 5375 if(dbg > 1) 5376 5376 { … … 5450 5450 ideal J = imap(R, J); 5451 5451 poly c = imap(R, c); 5452 5452 5453 5453 t = timer; 5454 5454 for(i = 1; i<=ncols(J); i++) … … 5475 5475 // --------------------------- prepare output ---------------------------- 5476 5476 // Groebner basis in the ring with only the original variables 5477 5477 5478 5478 t = timer; 5479 5479 J = groebner(J); … … 7180 7180 // S. Steidel steidel@mathematik.uni-kl.de 7181 7181 // @* 7182 // 7182 // 7183 7183 // OVERVIEW: 7184 7184 // Suppose A is an affine domain over a perfect field.@* … … 7188 7188 // reconstruction as described in [3]. This approach is inherently parallel.@* 7189 7189 // The strategy is available both as a randomized and as a verified algorithm. 7190 // 7190 // 7191 7191 // REFERENCES: 7192 // 7192 // 7193 7193 // [1] Janko Boehm, Wolfram Decker, Santiago Laplagne, Gerhard Pfister, Stefan Steidel, 7194 7194 // Andreas Steenpass: Parallel algorithms for normalization, preprint, 2011. 7195 // 7195 // 7196 7196 // [2] Gert-Martin Greuel, Santiago Laplagne, Frank Seelisch: Normalization of Rings, 7197 7197 // Journal of Symbolic Computation 9 (2010), p. 887-901 7198 // 7198 // 7199 7199 // [3] Janko Boehm, Wolfram Decker, Claus Fieker, Gerhard Pfister: 7200 7200 // The use of Bad Primes in Rational Reconstruction, preprint, 2012. 7201 // 7201 // 7202 7202 // KEYWORDS: 7203 7203 // normalization; modular methods … … 7684 7684 // S. Steidel steidel@mathematik.uni-kl.de 7685 7685 // A. Steenpass steenpass@mathematik.uni-kl.de 7686 // 7686 // 7687 7687 // OVERVIEW: 7688 // 7688 // 7689 7689 // Suppose A is an affine domain over a perfect field.@* 7690 7690 // This library implements a local-to-global strategy for finding the normalization … … 7694 7694 // Furthermore we allow for the optional modular computation of the local results 7695 7695 // as provided by modnormal.lib. See again [1] for details. 7696 // 7696 // 7697 7697 // REFERENCES: 7698 // 7698 // 7699 7699 // [1] Janko Boehm, Wolfram Decker, Santiago Laplagne, Gerhard Pfister, Stefan Steidel, 7700 7700 // Andreas Steenpass: Parallel algorithms for normalization, http://arxiv.org/abs/1110.4299, 2011. 7701 // 7701 // 7702 7702 // [2] Gert-Martin Greuel, Santiago Laplagne, Frank Seelisch: Normalization of Rings, 7703 7703 // Journal of Symbolic Computation 9 (2010), p. 887-901 7704 // 7704 // 7705 7705 // KEYWORDS: 7706 7706 // normalization; modular methods
Note: See TracChangeset
for help on using the changeset viewer.