Changeset 0be039 in git for Singular/LIB/freegb.lib


Ignore:
Timestamp:
Mar 16, 2018, 6:27:45 PM (6 years ago)
Author:
Karim Abou Zeid <karim23697@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
52ac0882b123798821765bb16d5ba4b371ced4cd
Parents:
95a42a2dacdcadb5c004cb3520b5c252dfe8e784df09c0184ffc4aaf31c02b8691e68734f25fc3b3
Message:
Merge branch 'lpDivision' into stable
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Singular/LIB/freegb.lib

    r95a42a2 r0be039  
    5151LIB "qhmoduli.lib"; // for Max
    5252LIB "bfun.lib"; // for inForm
     53LIB "fpadim.lib"; // for intvec conversion
    5354
    5455proc tstfreegb()
     
    32783279}
    32793280
     3281proc lpDivision(poly p, ideal I)
     3282"ASSUME: I is a Groebner basis G = {g1,...,gN}, the original ring of the Letterplace ring has the name 'r' and no variable is called 'tag_i' for i in 1...N
     3283RETURN: list L
     3284NOTE: - L[1] NF(p,I)
     3285      - L[2] list of expressions [i,l_{ij},r_{ij}] with \sum_{i,j} l_{ij} g_i r_{ij} = p - NF(p,I)
     3286"
     3287{
     3288  if (p == 0 || size(I) == 0) {
     3289    list L = 0;
     3290    list empty;
     3291    L[2] = empty;
     3292    return (L);
     3293  }
     3294  poly pNF = lpNF(p,I);
     3295  p = p - pNF;
     3296
     3297  // make new ring
     3298  def save = basering;
     3299  int norigvars = nvars(r);
     3300  string tagvarstr = "(tag_1";
     3301  for (int i = 2; i <= size(I); i++) {
     3302    tagvarstr = tagvarstr + ",tag_" + string(i);
     3303  } kill i;
     3304  tagvarstr = tagvarstr + ")";
     3305  string field = string(ringlist(r)[1]);
     3306  execute("ring @tags = " + field + "," + tagvarstr + ",dp;");
     3307  ring @tagged = (r + @tags);
     3308  def @R = makeLetterplaceRing(attrib(save,"uptodeg")); setring @R;
     3309
     3310  // restore vars
     3311  poly p = imap(save, p);
     3312  poly pNF = imap(save, pNF);
     3313  ideal I = imap(save, I);
     3314  for (int i = 1; i <= size(I); i++) {
     3315    I[i] = I[i] - var(norigvars + i);
     3316  } kill i;
     3317
     3318  list summands;
     3319  list L = pNF;
     3320  poly pTaggedNF = lpNF(p,I);
     3321  pTaggedNF = pTaggedNF * leadcoef(p); // somehow pTaggedNF gets normalized
     3322  for (int i = 1; i <= size(pTaggedNF); i++) {
     3323    intvec iv = lp2iv(pTaggedNF[i]);
     3324    for (int j = 1; j <= size(iv); j++) {
     3325      if (iv[j] > norigvars) {
     3326        intvec left;
     3327        intvec right;
     3328        if (j > 1) {
     3329          left = iv[1..(j-1)];
     3330        }
     3331        if (j < size(iv)) {
     3332          right = iv[(j+1)..size(iv)];
     3333        }
     3334        list summand = (iv[j] - norigvars), leadcoef(pTaggedNF[i])*iv2lp(left), iv2lp(right);
     3335        summands = insert(summands, summand, size(summands));
     3336
     3337        kill left;
     3338        kill right;
     3339        kill summand;
     3340        break;
     3341      }
     3342    } kill j;
     3343    kill iv;
     3344  } kill i;
     3345
     3346  L[2] = summands;
     3347
     3348  setring save;
     3349  list L = imap(@R,L);
     3350  return (L);
     3351}
     3352
     3353proc lpGBPres2Poly(list L, ideal I)
     3354"ASSUME: L is a valid Groebner presentation as for example the result of lpDivision
     3355RETURN: poly
     3356NOTE: computes p = \sum_{i,j} l_{ij} g_i r_{ij} + NF(p,I) = \sum_{i} L[2][i][2] I[L[2][i][1]] L[2][i][3] + L[1]
     3357"
     3358{
     3359  poly p;
     3360  for (int i = 1; i <= size(L[2]); i++) {
     3361    p = p + lpMult(lpMult(L[2][i][2], I[L[2][i][1]]), L[2][i][3]);
     3362  }
     3363  p = p + L[1];
     3364  return (p);
     3365}
     3366
    32803367//procedures to convert monomials into the DVec representation, all static
    32813368////////////////////////////////////////////////////////
Note: See TracChangeset for help on using the changeset viewer.