Changeset 0b1671 in git


Ignore:
Timestamp:
Nov 8, 2023, 2:38:58 PM (6 months ago)
Author:
Hans Schoenemann <hannes@…>
Branches:
(u'spielwiese', 'b4f17ed1d25f93d46dbe29e4b499baecc2fd51bb')
Children:
f21133bf9dde91dd3c42804f81af23a8aa6e30ba
Parents:
1dc25627122bccd9eebfcd84f1fb60000b4f25a3
Message:
format
Location:
Singular/LIB
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • Singular/LIB/integralbasis.lib

    r1dc2562 r0b1671  
    22///////////////////////////////////////////////////////////////////////////////
    33///////////////////////////////////////////////////////////////////////////////
    4 version="version integralbasis.lib 4.3.1.0 Jul_2022 "; // $Id$
     4version="version integralbasis.lib 4.3.2.10 Nov_2023 "; // $Id$
    55category="Commutative Algebra";
    66info="
     
    5454        (Default option for normal algorithm.)@*
    5555        Options for hensel algorithm:@*
    56         - \"opti\" -> The integral basis for the branches are merged 
     56        - \"opti\" -> The integral basis for the branches are merged
    5757        using a combinatorial approach. (Default option.)@*
    5858        - \"noOpti\" -> the integral basis for the different branches
     
    619619    dbprint(dbg, "----Component: ");
    620620    if(dbg>=1){compo;}
    621  
     621
    622622    norOut = intBasisComp(f, compType, compo, algorithm, locBasis, useRotation, optimize, #);
    623623    norT = norOut[1];
     
    11451145      fT = f;
    11461146    }
    1147    
     1147
    11481148    ideal ibN = ibAt0(fT, locBasis, optimize);
    11491149
     
    11941194  intvec vy = (0,1);
    11951195  int dbg = printlevel - voice;
    1196  
     1196
    11971197  // 1) Compute Puiseux sets (we use segments for easier implementation)
    11981198  list pSegmentFull = getSegments(f, classes, slopes, degExpand);
    11991199  list pSegment = pSegmentFull[1]; // The segments corresponding to expansions at the origin
    12001200  poly unitPoly = pSegmentFull[2]; // The unit outside the origin
    1201   dbprint(dbg, "Step 1 finished"); 
    1202  
     1201  dbprint(dbg, "Step 1 finished");
     1202
    12031203  // 2) Compute IB in each set
    12041204  list ibSeg;
     
    12101210  }
    12111211  dbprint(dbg, "Step 2 finished");
    1212      
     1212
    12131213  // 3) Merge all the integral basis for the segments using the combinatorial approach
    12141214  list ib = optiBase(ibSeg, pSegment);
    12151215  dbprint(dbg, "Step 3 finished");
    1216    
     1216
    12171217  // 4) We add the unit outside the origin and convert to ib shape.
    12181218  ideal IOut;
    12191219  int intExp = int(ib[size(ib)-1][1]);
    12201220  poly condu = var(1)^intExp;  // The denominator of the integral basis.
    1221  
     1221
    12221222  for(k = 0; k < deg(unitPoly, vy); k++)
    12231223  {
     
    12311231  return(IOut);
    12321232}
    1233  
     1233
    12341234
    12351235///////////////////////////////////////////////////////////////////////
     
    12561256
    12571257  number slopeSegment;
    1258    
     1258
    12591259  list out;
    12601260
     
    12771277    list fGlob = henselGlobal(y^fl[2], fl[1], f, maxOrder);
    12781278    poly fLoc = fGlob[1];
    1279    
     1279
    12801280    if(fLoc == 1)
    12811281    {
     
    12871287    fSegment = henselSegments(fLoc, maxOrder);
    12881288    dbprint(dbg, "Number of segments: ", size(fSegment));
    1289    
     1289
    12901290    list pExpRecomputed;
    12911291    list nPoly;
    1292    
     1292
    12931293    //"Check output of henselSegments";
    12941294    //fSegment;
     
    13071307        {
    13081308          // If slopes coincide we add the class to the list
    1309           classesNew[size(classesNew) + 1] = classes[j]; 
     1309          classesNew[size(classesNew) + 1] = classes[j];
    13101310        }
    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,
    13141314      // we need to recompute expansions up to degree maxOrder so that
    13151315      // the factors can be computed correctly.
    1316       if(size(classesNew) > 1) 
     1316      if(size(classesNew) > 1)
    13171317      {
    13181318        // puiseux(poly f, int maxDeg, int atOrigin)
     
    13211321        classesNew = getClasses(pExpRecomputed);
    13221322      }
    1323      
     1323
    13241324      // We put everything together
    13251325      out[i] = list(fSegment[i], slopeSegment, classesNew);
    13261326    }
    13271327  }
    1328  
     1328
    13291329  // We reorder according to the slope
    13301330  out = sortSegments(out);
    1331  
     1331
    13321332  // We also return the unit outside the origin
    13331333  list outFull = list(out, fGlob[2]);
     
    13671367  intvec degPolySet;
    13681368  intvec vy = (0,1);
    1369  
     1369
    13701370  // We get all the possible polynomials, including the full polys
    13711371  //"Building factors from classes...";
    13721372  list bF = buildFactors(classes);
    1373  
     1373
    13741374  int degF = deg(f, vy);
    1375  
     1375
    13761376  // We consider the union of all polynomials
    13771377  poly pGround;
     
    13861386      }
    13871387    }
    1388    
     1388
    13891389    // We compute the full polynomial up to the integrality exponent.
    13901390    // When there is only one class we use the polynomial obtained from Hensel lifting.
     
    14031403    }
    14041404  }
    1405  
     1405
    14061406  // Degrees of the polynomials
    14071407  for(i = 1; i <= size(polySet); i++)
     
    14091409    degPolySet[i] = deg(polySet[i], vy);
    14101410  }
    1411  
     1411
    14121412  // We compute the order of each expansion at each of the polynomials
    14131413  list ordExpAtPoly;
     
    14251425  return(ib);
    14261426}
    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
    14291429// possible product of factors by checking exhaustively all possible
    14301430// combinations such that the product has the correct degree.
     
    14411441  intvec cBest;
    14421442  poly pBest;
    1443  
     1443
    14441444  // The first element is polynomial 1
    14451445  intvec zero = 0 * (1..s);
    14461446  ib[1] = list(0, zero, 1);
    1447  
     1447
    14481448  for (d = 1; d <= degF; d++)
    14491449  {
    14501450    // The best element of degree d;
    14511451    oMax  = 0;
    1452    
     1452
    14531453    // We generate the list of all possible combinations
    14541454    c = summandsFac(degPolySet, d);
    1455    
     1455
    14561456    // We compute the valuation of each combination,
    14571457    // and we keep the largest one.
     
    14851485  //"c, ordExpAtPoly";
    14861486  //c, ordExpAtPoly;
    1487  
     1487
    14881488  number o;
    14891489  number oBest;
     
    15021502          if(ordExpAtPoly[i][j] >= 0)
    15031503          {
    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
    15051505                                                 // ordExpAtPoly[i][j] at the jth Puiseux expansion
    15061506          } else {
     
    15501550}
    15511551
    1552  
     1552
    15531553//We implement the optimization approach from scratch
    15541554proc optiBase(list ibSeg, list segmentSlope)
     
    15561556  int i, k;
    15571557  int s = size(ibSeg);
    1558  
     1558
    15591559  if(s == 1) {return(ibSeg[1]);}
    1560  
     1560
    15611561  // We initialize the recursion step
    15621562  list ibSegRec = ibSeg[s];
    15631563  list segmentSlopeRec = segmentSlope[s]; // Should be fixed to contain only slopes
    1564  
     1564
    15651565  for(k = s-1; k >= 1; k--)
    15661566  {
     
    15751575{
    15761576  //"optiTwoSets begin...";
    1577  
     1577
    15781578  int s1 = size(ib1)-1;  // max degree
    15791579  int s2 = size(ib2)-1;  // max degree
     
    15811581  intvec cBest;
    15821582  int d;
    1583  
     1583
    15841584  //"s1 + s2 = ", s1 + s2;
    1585  
     1585
    15861586  number o, o1, o2;
    15871587  number oBest;
    15881588  poly polyBest;
    1589  
     1589
    15901590  list out;
    15911591  out[1] = list(0, intvec(0,0), 1);
    15921592  // Best element of degree d
    1593  
     1593
    15941594  int m1, m2;
    15951595  for(d = 1; d <= s1 + s2; d++)
     
    16151615        {
    16161616          o = o2;
    1617         } else 
     1617        } else
    16181618        {
    1619           if(c2 == s2) 
     1619          if(c2 == s2)
    16201620          {
    16211621            o = o1;
    1622           } else 
     1622          } else
    16231623          {
    16241624            if(o1 < o2) {o = o1;}
     
    16271627        }
    16281628        //"c1 = ", c1, "c2 = ", c2, "s1 = ", s1, "s2 = ", s2, "o = ", o;
    1629        
     1629
    16301630        if(o > oBest)
    16311631        {
     
    16391639  }
    16401640  //"optiTwoSets finished...";
    1641  
     1641
    16421642  return(out);
    16431643}
    1644    
    1645  
     1644
     1645
    16461646
    16471647////////////////////////////////////////////////////////////////////////
     
    16871687  // puiseux(poly f, int maxDeg, int atOrigin)
    16881688  list pExp = puiseux(f, -1, 1);
    1689  
     1689
    16901690  debug_log_intbas(3, "------Time puiseux expansions: ", timer - tt);
    16911691  tt = timer;
     
    17081708  dbprint(dbg, "--Computing vanishing orders...");
    17091709  matrix MClass = valIKClass(classes);
    1710  
     1710
    17111711  list vS = valIKSelf(bF, md);
    17121712  list MSelf = vS[1];
    17131713  list bestElem = vS[2];
    1714  
     1714
    17151715
    17161716  // The highest exponent of the denominator
     
    17331733    }
    17341734  }
    1735  
     1735
    17361736  dbprint(dbg, "The maximum integrality exponent is ", maxExp);
    1737  
     1737
    17381738  debug_log_intbas(3, "------Time for factors info: ", timer - tt);
    17391739  tt = timer;
     
    17411741  int degExpand = int(maxExp) + 1;
    17421742  dbprint(dbg, "---- Degree of expansions: ", degExpand);
    1743  
     1743
    17441744  if((pardeg(minpoly) > 0) and (optimize == 1))
    17451745  {
     
    17631763  int i, j, k;
    17641764  intvec vy = (0,1);
    1765    
     1765
    17661766  // Computing hensel blocks...
    17671767  dbprint(dbg, "--Building HenselBlocks...");
     
    18301830    blocks[1] = 1;
    18311831    matrix M = valIK(classes);
    1832  
     1832
    18331833  }
    18341834
     
    18601860
    18611861  debug_log_intbas(3, "------Time for ordFull: ", timer - tt);
    1862  
     1862
    18631863  tt = timer;
    18641864
     
    18851885  int mdm = 0;
    18861886  int mdmTemp;
    1887  
     1887
    18881888  // maxDegMerge computes the maximum degree required when adding the
    18891889  // factors from the Chinese remainder approach
     
    19061906  // The classes are reordered in the same order as the irreducible factors
    19071907  classes = ifOut[5];
    1908  
     1908
    19091909  if((ifOut[4] == 1))  // Wrong number of factors, recompute orders
    19101910  {
     
    20152015    //debug_log_intbas(3, "------Time for recomputation: ", timer - tt);
    20162016  }
    2017  
     2017
    20182018  ideal tmp_var_mdm=std(var(1)^mdm);
    20192019  for(i = 1; i <= size(I2LiftedFull); i++)
     
    21422142  //ideal IOut = ibOrigin(fT, locBasis);
    21432143  ideal IOut = ibAt0(fT, locBasis, optimize);
    2144  
     2144
    21452145  list ib = intBasIdealToList(IOut);
    21462146
     
    24622462  int dbg = printlevel - voice + 4;
    24632463  dbprint(dbg, "--buildFactors begins");
    2464  
     2464
    24652465  int i, j;
    24662466  int d = -1;
     
    24902490
    24912491  list polyGround;
    2492  
     2492
    24932493  int isGround = 1;
    2494    
     2494
    24952495  int algExt;
    24962496  for(i = 1; i <= size(classes); i++)
     
    25042504    first = 1;
    25052505    stop1 = 0;
    2506    
     2506
    25072507    // If the denominator is 1 there is nothing to do
    2508    
     2508
    25092509    algExt = 0;
    25102510    if(typeof(classes[i][1]) == "ring")
     
    25162516      if(classes[i][1][2] > 1) {algExt = 1;}
    25172517    }
    2518    
     2518
    25192519    if(algExt == 1)
    25202520    {
     
    25452545        den = classes[i][1][2];
    25462546      }
    2547       exps = expsT;     
     2547      exps = expsT;
    25482548      //"exponents for class ", i, " = ", expsT;
    2549      
     2549
    25502550      for(k = 1; k <= size(exps); k++)
    25512551      {
     
    25672567          S = classes[i][1];
    25682568          setring S;
    2569          
     2569
    25702570          // d = -1 for computing polynomial of full degree
    25712571          if(d >= 0){
     
    25832583            ideal rel = extendBack(fFB, erg[1], dMP);
    25842584            matrix CC = coef(fFB, var(1)*var(2));
    2585            
     2585
    25862586            setring R;
    25872587            ideal rel = imap(S, rel);
     
    26332633          ind++;
    26342634          isGround = 0;
    2635         } else 
     2635        } else
    26362636        {
    26372637          debug_log_intbas(4, "------Time for this factor: ", timer - t);
     
    26632663        {
    26642664          ords[i][ind] = number(d) / number(den);
    2665         } else 
     2665        } else
    26662666        {
    26672667          ords[i][ind] = number(deg(facs[i][ind],vx)) / number(den);
     
    26792679    }
    26802680  }
    2681  
     2681
    26822682  return(list(facs, ords, degs, gfChecks, isGround));
    26832683}
     
    27002700
    27012701  poly mp = minpoly;
    2702  
     2702
    27032703  mp = subst(minpoly, @a, var(1));
    27042704  int d = pardeg(minpoly);
     
    27682768
    27692769  poly mp = minpoly;
    2770  
     2770
    27712771  mp = subst(minpoly, @a, var(1));
    27722772  int d = pardeg(minpoly);
     
    29182918  intvec dx = (1,0);
    29192919  int degX = deg(f, dx);
    2920  
     2920
    29212921  if(d == -1) {d = degX + 1;}
    2922  
     2922
    29232923  //"Check buildPG";
    29242924  //f;
     
    29312931    def S = ring(l);
    29322932    setring S;
    2933    
     2933
    29342934    // We divide the exponents by the GCD of the exponents and the degree of the extension
    29352935    poly ff;
     
    29402940    list ffList = buildPolyGround(list(ff), g2);
    29412941    poly ffRed = ffList[1];
    2942    
     2942
    29432943    list pols;
    29442944    pols[1] = ffRed;
     
    29482948      pols[i+1] = ff;
    29492949    }
    2950    
     2950
    29512951    if(den > 1)
    29522952    {
    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
    29542954      // 0 = 1 + T(1) + ... + T(1)^(den-1)
    29552955      poly pExt = 1; // A root of unity
     
    29602960      ideal I = pExt;
    29612961      I = groebner(I);
    2962          
     2962
    29632963      poly fNewTemp = 1;
    29642964      for(i = 1; i<=den; i++)
     
    29772977      poly fNew = reduce((var(2) - ffRed), groebner(var(1)^(d*den+1)));
    29782978    }
    2979    
     2979
    29802980    // We replace x^den by x
    29812981    ring P = (0, @a), (@x, @y, @X), dp;
     
    29882988    }
    29892989    f2 = subst(f2, @X, @x);
    2990        
     2990
    29912991    setring R;
    29922992    poly fNew = fetch(P, f2);
     
    29962996      // We look for a polynomial over Q.
    29972997      // 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
    29992999      // from the extension in the Puiseux expansion, as in buildPolyFracNew.
    30003000      fNew = multiplicateConjugates(fNew);
     
    30133013  matrix M = coef(f,var(indVar));
    30143014  int g;
    3015   for(int i = 1; i <= ncols(M); i++) 
     3015  for(int i = 1; i <= ncols(M); i++)
    30163016  {
    30173017    if(i == 1){g = leadexp(M[1,1])[indVar];}
     
    30333033//         The common denominator is now cancelled with the numerators.
    30343034static proc buildPolyGround(list fFrac, int sD)
    3035 { 
     3035{
    30363036  int i;
    30373037  int gfCheck = 1;  // The polynomial computed is over the ground field.
     
    32013201//         proc getClasses
    32023202// 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),
    32043204//         expansions of the i-th and j-th conjugacy class respectively.
    32053205static proc valIKClass(list classes)
     
    32083208  def R = basering;
    32093209  matrix MC[size(classes)][size(classes)];
    3210  
     3210
    32113211  // Order for each class of expansions
    32123212  for(i = 1; i <= size(classes); i++)
     
    32433243  poly differ;
    32443244  number ordDiff;
    3245  
    3246   list l; 
    3247  
     3245
     3246  list l;
     3247
    32483248  for(i = 1; i <= size(classes); i++)
    32493249  {
     
    33693369    for(j = 1; j <= s; j++)
    33703370    {
    3371       if(i == j) 
     3371      if(i == j)
    33723372      {
    33733373        //"md = ", md;
    33743374        //"i = ", i;
    3375         if(md[i] > 1) 
     3375        if(md[i] > 1)
    33763376        {
    33773377          minOrd = minOrd + number(MSelf[i][md[i]-1]);
    33783378        }
    33793379        //"it worked";
    3380       } else 
     3380      } else
    33813381      {
    33823382        minOrd = minOrd + number(M[i,j]);
     
    34663466    }
    34673467  }
    3468  
     3468
    34693469  intvec elem = sums[maxExpi];
    34703470  return(list(maxExp, elem));
     
    37733773      setring S;
    37743774      // 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.
    37763776      // This degree should be checked if it is always correct computation, or if we should compute this number
    37773777      // while computing the Puiseux expansions.
     
    39323932  int dbg = printlevel - voice - 2;
    39333933  dbprint(dbg, "START - irreducibleFactors");
    3934  
     3934
    39353935  list I2Lifted = henselBlocks(f, degExpand, 1);
    3936  
     3936
    39373937  list updatedClasses = classes;
    39383938  int nClasses;
     
    39953995
    39963996        newL = puiseux(I2Red, degExpand, 1);
    3997        
     3997
    39983998        classes2 = getClasses(newL);
    39993999        dbprint(dbg, "getClasses finished");
     
    40144014            def S = classes2[j][1];
    40154015            setring S;
    4016            
     4016
    40174017            list bP = buildPolyGroundXRoot(PE[1][1], PE[1][2], degExpand);
    4018            
     4018
    40194019            //"bP ring", bP;
    40204020
     
    40334033            fuProd = bP[1];
    40344034            gfCheck = bP[2];
    4035            
     4035
    40364036            //"bP poly", bP;
    4037            
     4037
    40384038          }
    40394039
     
    41224122    // The first term containing the locloc unit
    41234123    expBaseFactor = expUnit;
    4124        
     4124
    41254125    // If the order of hi is not integer, we add a factor.
    41264126    // This is used in the Chinese remainder strategy
     
    50535053    dbprint(dbg, "----Computing Puiseux Segments...");
    50545054    fSegment = henselSegments(fLoc, maxOrder);
    5055    
     5055
    50565056    //"Check output of henselSegments";
    50575057    //fSegment;
    5058    
     5058
    50595059    for(i = 1; i <= size(fSegment); i++)
    50605060    {
     
    51765176  poly ratPart;
    51775177  list compsT;
    5178  
     5178
    51795179  dbprint(dbg, "sFac = ", sFac);
    51805180  for(i = 1; i <= sFac; i++)
     
    51835183    hFactor[i] = hFactor[i] * (var(1)^(degFac * slN));
    51845184    hFactor[i] = mapFrom(hFactor[i], slN, slD);
    5185  
     5185
    51865186    dbprint(dbg, "henselInSegment - splitFact - i = ", i);
    51875187    compsT = splitFact(hFactor[i], fJe[1][i+1], fJe[2][i+1], globOrder);
    51885188    dbprint(dbg, "henselInSegment - splitFact - finished");
    5189    
     5189
    51905190    for(j = 1; j <= size(compsT); j++)
    51915191    {
  • Singular/LIB/normal.lib

    r1dc2562 r0b1671  
    11//////////////////////////////////////////////////////////////////////////////
    22//////////////////////////////////////////////////////////////////////////////
    3 version="version normal.lib 4.3.1.1 Jan_2023 "; // $Id$
     3version="version normal.lib 4.3.2.10 Nov_2023 "; // $Id$
    44category="Commutative Algebra";
    55info="
     
    7777         If this option is not set, normal changes to dp ordering and performs
    7878         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.
    8080         Not valid for options \"locNormal\" and \"modNormal\".@*
    8181         If the optional parameter choose is not given or empty, only
     
    9797         - \"var2\" -> uses a polynomial in the second variable as universal
    9898         denominator.@*
    99          - \"GBRadical\" -> it computes a Groebner basis of the radical 
     99         - \"GBRadical\" -> it computes a Groebner basis of the radical
    100100         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
    102102         the radical ideal computed for the test ideal.@*
    103          - \"locNormal\" -> uses locNormal procedure to compute the 
     103         - \"locNormal\" -> uses locNormal procedure to compute the
    104104         normalization, which implements a local-to-global algorithm
    105105         (for this option it is required that the ideal I is prime).@*
     
    107107         use modNormal algorithm for the local computations.@*
    108108         - \"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
    110110         option it is required that the ideal I is prime).@*
    111111         - 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
    113113         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
    116116         result will not be verified.@*
    117117         If the optional parameter choose is not given or empty, only
     
    119119         - \"withRing\" -> the ring structure of the normalization is
    120120         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
    122122         modNormal or locNormal options.@*
    123123ASSUME:  The ideal must be radical, for non-radical ideals the output may
     
    126126         and hence normal computes the normalization of the radical of id.@*
    127127NOTE:    \"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 
     128RETURN:  If \"withRing\" option is set, a list, say nor, of size 2
    129129         (resp. 3 with option \"withDelta\").
    130130         Let R denote the basering and id the input ideal.
     
    149149         the total delta invariant of basering/id (-1 means infinite, and 0
    150150         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
    152152         a polynomial d such that U/d is the normalization
    153153THEORY:  We use here a general algorithm described in [G.-M.Greuel, S.Laplagne,
     
    198198      opt = remove_from_list(opt, "locNormal");
    199199      list out = locNormal(id, opt);
    200     } 
     200    }
    201201    if(in_array(#, "withRing")) {
    202202      // We compute the ring structure
    203       def outRing = computeRing(out[1], id); 
    204      
     203      def outRing = computeRing(out[1], id);
     204
    205205      // We put the conductor as the last element of the ideal.
    206206      ideal OO = reduce(out[1], groebner(out[2]));
    207207      OO = interred(OO);
    208208      OO[ncols(OO)+1]=out[2];
    209      
     209
    210210      list outWR = list(list(outRing), list(OO));
    211211      return(outWR);
     
    214214    }
    215215  }
    216  
    217  
     216
     217
    218218  ASSUME(0, not isQuotientRing(basering) );
    219219
     
    48464846  printlevel = printlevel + 1;
    48474847
    4848   if(normalCheck == 1) 
     4848  if(normalCheck == 1)
    48494849  {
    48504850    int out = normalMEqui(I, J, condu, D, withDelta, normalCheck, options);
     
    52565256
    52575257// Checks if string s is an element of list l
    5258 proc in_array(list l, string s)
     5258static proc in_array(list l, string s)
    52595259{
    52605260  int i;
     
    52985298  return(0);
    52995299}
    5300  
     5300
    53015301
    53025302static proc testIdeal(ideal I, ideal U, ideal origJ, poly c, poly D, list options)
     
    53045304
    53055305  ASSUME(1, not isQuotientRing(basering) );
    5306  
    5307  
     5306
     5307
    53085308
    53095309// Internal procedure, used in normalM.
     
    53725372    //"DEBUG - we do not compute the GB of radical output";
    53735373  }
    5374  
     5374
    53755375  if(dbg > 1)
    53765376  {
     
    54505450  ideal J = imap(R, J);
    54515451  poly c = imap(R, c);
    5452  
     5452
    54535453  t = timer;
    54545454  for(i = 1; i<=ncols(J); i++)
     
    54755475  // --------------------------- prepare output ----------------------------
    54765476  // Groebner basis in the ring with only the original variables
    5477  
     5477
    54785478  t = timer;
    54795479  J = groebner(J);
     
    71807180//           S. Steidel      steidel@mathematik.uni-kl.de
    71817181// @*
    7182 // 
     7182//
    71837183// OVERVIEW:
    71847184// Suppose A is an affine domain over a perfect field.@*
     
    71887188// reconstruction as described in [3]. This approach is inherently parallel.@*
    71897189// The strategy is available both as a randomized and as a verified algorithm.
    7190 // 
     7190//
    71917191// REFERENCES:
    7192 // 
     7192//
    71937193// [1] Janko Boehm, Wolfram Decker, Santiago Laplagne, Gerhard Pfister, Stefan Steidel,
    71947194// Andreas Steenpass: Parallel algorithms for normalization, preprint, 2011.
    7195 // 
     7195//
    71967196// [2] Gert-Martin Greuel, Santiago Laplagne, Frank Seelisch: Normalization of Rings,
    71977197// Journal of Symbolic Computation 9 (2010), p. 887-901
    7198 // 
     7198//
    71997199// [3] Janko Boehm, Wolfram Decker, Claus Fieker, Gerhard Pfister:
    72007200// The use of Bad Primes in Rational Reconstruction, preprint, 2012.
    7201 // 
     7201//
    72027202// KEYWORDS:
    72037203// normalization; modular methods
     
    76847684//           S. Steidel      steidel@mathematik.uni-kl.de
    76857685//           A. Steenpass    steenpass@mathematik.uni-kl.de
    7686 // 
     7686//
    76877687// OVERVIEW:
    7688 // 
     7688//
    76897689// Suppose A is an affine domain over a perfect field.@*
    76907690// This library implements a local-to-global strategy for finding the normalization
     
    76947694// Furthermore we allow for the optional modular computation of the local results
    76957695// as provided by modnormal.lib. See again [1] for details.
    7696 // 
     7696//
    76977697// REFERENCES:
    7698 // 
     7698//
    76997699// [1] Janko Boehm, Wolfram Decker, Santiago Laplagne, Gerhard Pfister, Stefan Steidel,
    77007700// Andreas Steenpass: Parallel algorithms for normalization, http://arxiv.org/abs/1110.4299, 2011.
    7701 // 
     7701//
    77027702// [2] Gert-Martin Greuel, Santiago Laplagne, Frank Seelisch: Normalization of Rings,
    77037703// Journal of Symbolic Computation 9 (2010), p. 887-901
    7704 // 
     7704//
    77057705// KEYWORDS:
    77067706// normalization; modular methods
Note: See TracChangeset for help on using the changeset viewer.