Changeset f5850b in git


Ignore:
Timestamp:
Jun 1, 2018, 7:50:16 PM (6 years ago)
Author:
Karim Abou Zeid <karim23697@…>
Branches:
(u'fieker-DuVal', '117eb8c30fc9e991c4decca4832b1d19036c4c65')(u'spielwiese', 'b4f17ed1d25f93d46dbe29e4b499baecc2fd51bb')
Children:
dc0f002e8452e73b123103f906e73147f38b811c
Parents:
5f13434321a632b9a349403b82d21f853ed48c26
Message:
Adjusted bba to work with the new letterplace multiplication
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • kernel/GBEngine/kInline.h

    r5f13434 rf5850b  
    594594}
    595595
     596KINLINE void sLObject::Tail_Minus_mm1_Mult_qq_Mult_mm2(poly m1, poly q, poly m2, int lq, poly spNoether)
     597{
     598  if (bucket != NULL)
     599  {
     600    kBucket_Minus_m1_Mult_p_Mult_m2(bucket, m1, q, m2, &lq, NULL); // check if we need noether
     601  }
     602  else
     603  {
     604    if (lq<=0) lq= ::pLength(q);
     605    poly _p = (t_p != NULL ? t_p : p);
     606    assume(_p != NULL);
     607
     608    int lp=pLength-1;
     609    pNext(_p) = p_Minus_mm_Mult_qq( pNext(_p), m1, p_Mult_mm(q, m2, tailRing), lp, lq,
     610        spNoether, tailRing );
     611    pLength=lp+1;
     612    return;
     613  }
     614}
     615
    596616KINLINE void sLObject::LmDeleteAndIter()
    597617{
  • kernel/GBEngine/kspoly.cc

    r5f13434 rf5850b  
    123123  }
    124124
     125  int holeStart = tailRing->isLPring * p_mFirstVblock(p2, tailRing->isLPring, tailRing);
     126  // n1 and n2 is already set to 1
     127  poly n1 = p_GetExp_k_n(lm, holeStart, tailRing->N, tailRing);
     128  poly n2 = p_GetExp_k_n(lm, 1, holeStart, tailRing);
     129
    125130  // take care of coef buisness
    126131  if (! n_IsOne(pGetCoeff(p2), tailRing->cf))
     
    130135    int ct = ksCheckCoeff(&an, &bn, tailRing->cf);    // Calculate special LC
    131136    p_SetCoeff(lm, bn, tailRing);
     137    p_SetCoeff(n1, bn, tailRing);
    132138    if ((ct == 0) || (ct == 2))
    133139      PR->Tail_Mult_nn(an);
     
    137143  else
    138144  {
     145    p_SetCoeff(n1, pGetCoeff(lm), tailRing);
    139146    if (coef != NULL) *coef = n_Init(1, tailRing->cf);
    140147  }
    141148
    142 
    143149  // and finally,
    144   PR->Tail_Minus_mm_Mult_qq(lm, t2, pLength(t2) /*PW->GetpLength() - 1*/, spNoether);
     150  if (tailRing->isLPring) {
     151    PR->Tail_Minus_mm1_Mult_qq_Mult_mm2(n1, t2, n2, pLength(t2), spNoether);
     152  } else {
     153    PR->Tail_Minus_mm_Mult_qq(lm, t2, pLength(t2) /*PW->GetpLength() - 1*/, spNoether);
     154  }
    145155  assume(PW->GetpLength() == pLength(PW->p != NULL ? PW->p : PW->t_p));
    146156  PR->LmDeleteAndIter();
  • kernel/GBEngine/kstd2.cc

    r5f13434 rf5850b  
    39623962    if ( ! strat->homog)
    39633963    {
    3964       strat->P.GetP(strat->lmBin); // because shifts are counted with .p structure
     3964      if (!strat->P.IsNull()) {
     3965        strat->P.GetP(strat->lmBin); // because shifts are counted with .p structure
     3966      }
    39653967      /* in the nonhomog case we have to shrink the polynomial */
    39663968      qq = p_Shrink(strat->P.p, lV, currRing); // direct shrink
  • kernel/GBEngine/kutil.h

    r5f13434 rf5850b  
    212212                         int use_bucket, ring r);
    213213  KINLINE void Tail_Minus_mm_Mult_qq(poly m, poly qq, int lq, poly spNoether);
     214  KINLINE void Tail_Minus_mm1_Mult_qq_Mult_mm2(poly m1, poly qq, poly m2, int lq, poly spNoether);
    214215  KINLINE void Tail_Mult_nn(number n);
    215216  // deletes bucket, makes sure that p and t_p exists
  • kernel/GBEngine/shiftgb.cc

    r5f13434 rf5850b  
    7878
    7979  /* assume sh and uptodeg agree TODO check */
    80   assume(sh>=0);
    8180
    8281  if (sh == 0) return(p); /* the zero shift */
     
    9998  /* p is a monomial from the ring r */
    10099
    101   if (sh == 0) return(p); /* the zero shift */
    102 
    103   assume(sh>=0);
     100  if (sh == 0 || p == NULL) return(p); /* the zero shift */
     101
    104102  int L = p_mLastVblock(p,lV,r);
     103  assume(L+sh>=1);
    105104  assume(L+sh<=uptodeg);
    106105
     
    118117    {
    119118      assume(j + (sh*lV)<=r->N);
     119      assume(j + (sh*lV)>=1);
    120120      s[j + (sh*lV)] = e[j]; /* actually 1 */
    121121    }
     
    175175  /* for a monomial p, returns the number of the last block */
    176176  /* where a nonzero exponent is sitting */
    177   if (p_LmIsConstant(p,r))
     177  if (p == NULL || p_LmIsConstant(p,r))
    178178  {
    179179    return(0);
     
    190190}
    191191
    192 int pFirstVblock(poly p, int lV)
     192int p_FirstVblock(poly p, int lV, const ring r)
    193193{
    194194  /* returns the number of maximal block */
    195195  /* appearing among the monomials of p */
    196196  /* the 0th block is the 1st one */
    197   poly q = p; //p_Copy(p,currRing); /* need it ? */
    198   int ans = 0;
     197  if (p == NULL) {
     198    return 0;
     199  }
     200  poly q = p;
     201  int ans = p_mFirstVblock(q,lV,r);
    199202  int ansnew = 0;
    200203  while (q!=NULL)
    201204  {
    202     ansnew = pmFirstVblock(q,lV);
    203     ans    = si_min(ans,ansnew);
     205    ansnew = p_mFirstVblock(q,lV,r);
     206    if (ansnew > 0) { // don't count constants
     207      ans = si_min(ans,ansnew);
     208    }
    204209    pIter(q);
    205210  }
     
    208213}
    209214
    210 int pmFirstVblock(poly p, int lV)
    211 {
    212   if (pIsConstantPoly(p))
    213   {
    214     return(int(0));
     215int p_mFirstVblock(poly p, int lV, const ring r)
     216{
     217  if (p == NULL || p_LmIsConstant(p,r))
     218  {
     219    return(0);
    215220  }
    216221  /* for a monomial p, returns the number of the first block */
    217222  /* where a nonzero exponent is sitting */
    218   int *e=(int *)omAlloc0((currRing->N+1)*sizeof(int));
    219   p_GetExpV(p,e,currRing);
     223  int *e=(int *)omAlloc0((r->N+1)*sizeof(int));
     224  p_GetExpV(p,e,r);
    220225  int j,b;
    221226  j = 1;
    222   while ( (!e[j]) && (j<=currRing->N-1) ) j++;
    223   if (j==currRing->N + 1)
    224   {
    225 #ifdef PDEBUG
    226     PrintS("pmFirstVblock: unexpected zero exponent vector\n");
    227 #endif
    228     return(j);
    229   }
    230   b = (int)(j/lV)+1; /* the number of the block, 1<= N <= currRing->N  */
     227  while ( (!e[j]) && (j<=r->N-1) ) j++;
     228  freeT(e, r->N);
     229  assume(j <= r->N);
     230  b = (int)(j+lV-1)/lV; /* the number of the block, 1<= b <= r->N  */
    231231  return (b);
    232232}
     
    396396  /* r->N is a multiple of lV */
    397397
     398  if (p==NULL) return p;
    398399  int *e = (int *)omAlloc0((r->N+1)*sizeof(int));
    399400  int  b = (int)((r->N +lV-1)/lV); /* the number of blocks */
  • kernel/GBEngine/shiftgb.h

    r5f13434 rf5850b  
    3232#define pmLastVblock(p,lV) p_mLastVblock(p,lV,currRing)
    3333
    34 int pFirstVblock(poly p, int lV);
    35 int pmFirstVblock(poly p, int lV);
     34int p_FirstVblock(poly p, int lV, const ring r);
     35int p_mFirstVblock(poly p, int lV, const ring r);
     36
     37//int pLastVblock(poly p, int lV);
     38#define pFirstVblock(p,lV) p_FirstVblock(p,lV,currRing)
     39//int pmLastVblock(poly p, int lV);
     40#define pmFirstVblock(p,lV) p_mFirstVblock(p,lV,currRing)
    3641
    3742int isInV(poly p, int lV);
  • libpolys/polys/kbuckets.cc

    r5f13434 rf5850b  
    798798//////////////////////////////////////////////////////////////////////////
    799799///
     800/// Bpoly == Bpoly - m1*p*m2; where m1 and m2 are monoms
     801/// Does not destroy p, m1 and m2
     802/// assume (*l <= 0 || pLength(p) == *l)
     803void kBucket_Minus_m1_Mult_p_Mult_m2(kBucket_pt bucket, poly m1, poly p, poly m2, int *l, poly spNoether)
     804{
     805  assume(*l <= 0 || pLength(p) == *l);
     806  int i, l1;
     807  poly p1 = p;
     808  ring r = bucket->bucket_ring;
     809
     810  if (*l <= 0)
     811  {
     812    l1 = pLength(p1);
     813    *l = l1;
     814  }
     815  else
     816    l1 = *l;
     817
     818  if (m1 == NULL || m2 == NULL || p == NULL) return;
     819
     820#ifndef HAVE_PSEUDO_BUCKETS
     821  kBucketMergeLm(bucket);
     822  kbTest(bucket);
     823  i = pLogLength(l1);
     824
     825#if defined(HAVE_PLURAL)
     826  if ((rField_is_Ring(r) && !(rField_is_Domain(r)))
     827  ||(rIsPluralRing(r)))
     828  {
     829    pSetCoeff0(m1, n_InpNeg(pGetCoeff(m1),r->cf));
     830    p1=pp_Mult_mm(r->p_Procs->pp_mm_Mult(p, m1, r),m2,r);
     831    pSetCoeff0(m1, n_InpNeg(pGetCoeff(m1),r->cf));
     832    l1=pLength(p1);
     833    i = pLogLength(l1);
     834  }
     835  else
     836#endif
     837  {
     838    if ((i <= bucket->buckets_used) && (bucket->buckets[i] != NULL))
     839    {
     840      assume(pLength(bucket->buckets[i])==(unsigned)bucket->buckets_length[i]);
     841//#ifdef USE_COEF_BUCKETS
     842//     if(bucket->coef[i]!=NULL)
     843//     {
     844//       poly mult=p_Mult_mm(bucket->coef[i],m,r);
     845//       bucket->coef[i]=NULL;
     846//       p1 = p_Minus_mm_Mult_qq(bucket->buckets[i], mult, p1,
     847//                               bucket->buckets_length[i], l1,
     848//                             spNoether, r);
     849//     }
     850//     else
     851//#endif
     852      MULTIPLY_BUCKET(bucket,i);
     853      p1 = p_Minus_mm_Mult_qq(bucket->buckets[i], m1, p_Mult_mm(p1, m2, r),
     854                            bucket->buckets_length[i], l1,
     855                            spNoether, r);
     856      l1 = bucket->buckets_length[i];
     857      bucket->buckets[i] = NULL;
     858      bucket->buckets_length[i] = 0;
     859      i = pLogLength(l1);
     860    }
     861    else
     862    {
     863      pSetCoeff0(m1, n_InpNeg(pGetCoeff(m1),r->cf));
     864      if (spNoether != NULL)
     865      {
     866        l1 = -1;
     867        p1 = r->p_Procs->pp_Mult_mm_Noether(r->p_Procs->pp_mm_Mult(p1, m1, r), m2, spNoether, l1, r);
     868        i = pLogLength(l1);
     869      }
     870      else
     871      {
     872        p1 = r->p_Procs->pp_Mult_mm(r->p_Procs->pp_mm_Mult(p1, m1, r), m2, r);
     873      }
     874      pSetCoeff0(m1, n_InpNeg(pGetCoeff(m1),r->cf));
     875    }
     876  }
     877
     878  while (bucket->buckets[i] != NULL)
     879  {
     880    //kbTest(bucket);
     881    MULTIPLY_BUCKET(bucket,i);
     882    p1 = p_Add_q(p1, bucket->buckets[i],
     883                 l1, bucket->buckets_length[i], r);
     884    bucket->buckets[i] = NULL;
     885    bucket->buckets_length[i] = 0;
     886    i = pLogLength(l1);
     887  }
     888
     889  bucket->buckets[i] = p1;
     890  bucket->buckets_length[i]=l1;
     891  if (i >= bucket->buckets_used)
     892    bucket->buckets_used = i;
     893  else
     894    kBucketAdjustBucketsUsed(bucket);
     895#else // HAVE_PSEUDO_BUCKETS
     896  bucket->p = p_Minus_mm_Mult_qq(bucket->p, m1, p_Mult_mm(p, m2, r),
     897                               bucket->l, l1,
     898                               spNoether, r);
     899#endif
     900}
     901
     902//////////////////////////////////////////////////////////////////////////
     903///
    800904/// Bpoly == Bpoly + m*p; where m is a monom
    801905/// Does not destroy p and m
  • libpolys/polys/kbuckets.h

    r5f13434 rf5850b  
    134134//////////////////////////////////////////////////////////////////////////
    135135///
     136/// Bpoly == Bpoly - m1*p*m2; where m1 and m2 are monoms
     137/// Does not destroy p, m1 and m2 (TODO: rename into kBucket_Minus_mm1_Mult_pp_Mult_mm2!?)
     138/// assume (*l <= 0 || pLength(p) == *l)
     139void kBucket_Minus_m1_Mult_p_Mult_m2(kBucket_pt bucket, poly m1, poly p, poly m2, int *l, poly spNother = NULL);
     140
     141//////////////////////////////////////////////////////////////////////////
     142///
    136143/// Bpoly == Bpoly + m*p; where m is a monom
    137144/// Does not destroy p and m
  • libpolys/polys/shiftop.cc

    r5f13434 rf5850b  
    1010{
    1111#ifdef SHIFT_MULT_DEBUG
    12   Print("shift_pp_Mult_mm p=%s m=%s", pString(p), pString(m));
    13   PrintLn();
     12  PrintLn(); PrintS("shift_pp_Mult_mm: "); p_wrp(p, ri, ri); PrintS(" * "); p_wrp(m, ri, ri);
    1413#endif
    1514
     15  int lV = ri->isLPring;
     16  if (p_mFirstVblock(m,lV,ri) < p_mFirstVblock(p,lV,ri)) {
     17    // TODO remove this
     18    PrintS("WARNING: auto switch to shift_pp_mm_Mult");
     19    return shift_pp_mm_Mult(p, m, ri);
     20  }
     21
    1622  // we just shift m and then call the commutative multiplication
    17   int lV = ri->isLPring;
    1823  int uptodeg = ri->N/lV;
    19   int shift = p_LastVblock(p, lV, ri);
    20   p_mLPshift(m, shift, uptodeg, lV, ri);
     24  int pshift = p_LastVblock(p, lV, ri);
     25  int mshift = p_mFirstVblock(m, lV, ri) - 1;
     26#ifdef SHIFT_MULT_DEBUG
     27  if (mshift > 0) {
     28    PrintLn();
     29    PrintS("WARNING: m is already shifted");
     30  }
     31#endif
     32  poly m2 = p_Copy(m,ri);
     33  p_mLPshift(m2, pshift - mshift, uptodeg, lV, ri);
    2134
    2235  // this is the commutative multiplication procedure
    2336  extern poly pp_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral(spolyrec*, spolyrec*, ip_sring*);
    24   p = pp_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral(p, m, ri);
    25   return p_Shrink(p, lV, ri);
     37  p = pp_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral(p, m2, ri);
     38  p = p_Shrink(p, lV, ri);
     39#ifdef SHIFT_MULT_DEBUG
     40  PrintLn(); PrintS("shift_pp_Mult_mm result: "); p_wrp(p, ri, ri); PrintLn();
     41#endif
     42  return p;
    2643}
    2744
     
    2946poly shift_p_Mult_mm(poly p, const poly m, const ring ri)
    3047{
     48  // TODO remove this
     49  return shift_pp_Mult_mm(p,m,ri);
    3150#ifdef SHIFT_MULT_DEBUG
    32   Print("shift_p_Mult_mm p=%s m=%s", pString(p), pString(m));
    33   PrintLn();
     51  PrintLn(); PrintS("shift_p_Mult_mm: "); p_wrp(p, ri, ri); PrintS(" * "); p_wrp(m, ri, ri); PrintLn();
    3452#endif
    3553
     54  int lV = ri->isLPring;
     55  if (p_mFirstVblock(m,lV,ri) < p_mFirstVblock(p,lV,ri)) {
     56    // TODO remove this
     57    Print("WARNING: auto switch to shift_p_mm_Mult");
     58    return shift_p_mm_Mult(p, m, ri);
     59  }
     60
    3661  // we just shift m and then call the commutative multiplication
     62  int uptodeg = ri->N/lV;
     63  int pshift = p_LastVblock(p, lV, ri);
     64  int mshift = p_mFirstVblock(m, lV, ri) - 1;
     65#ifdef SHIFT_MULT_DEBUG
     66  if (mshift > 0) {
     67    PrintLn(); Print("WARNING: m is already shifted"); PrintLn();
     68  }
     69#endif
     70  poly m2 = p_Copy(m,ri);
     71  p_mLPshift(m2, pshift - mshift, uptodeg, lV, ri);
     72
     73  // this is the commutative multiplication procedure
     74  extern poly p_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral(spolyrec*, spolyrec*, ip_sring*);
     75
     76  p = p_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral(p, m2, ri);
     77  poly q = p_Shrink(p, lV, ri);
     78  p_Delete(&p, ri);
     79#ifdef SHIFT_MULT_DEBUG
     80  PrintLn(); PrintS("shift_p_Mult_mm result: "); p_wrp(q, ri, ri); PrintLn();
     81#endif
     82  return q;
     83}
     84
     85poly shift_pp_mm_Mult(poly p, const poly m, const ring ri)
     86{
     87#ifdef SHIFT_MULT_DEBUG
     88  PrintLn(); PrintS("shift_pp_mm_Mult: "); p_wrp(m, ri, ri); PrintS(" * "); p_wrp(p, ri, ri); PrintLn();
     89#endif
     90
    3791  int lV = ri->isLPring;
     92  if (p_mFirstVblock(p,lV,ri) < p_mFirstVblock(m,lV,ri)) {
     93    // TODO remove this
     94    PrintS("WARNING: auto switch to shift_pp_Mult_mm");
     95    return shift_pp_Mult_mm(p, m, ri);
     96  }
     97
     98  // we just shift m and then call the commutative multiplication
    3899  int uptodeg = ri->N/lV;
    39   int shift = p_LastVblock(p, lV, ri);
    40   p_mLPshift(m, shift, uptodeg, lV, ri);
     100  int mshift = p_mLastVblock(m, lV, ri);
     101  int pshift = p_FirstVblock(p, lV, ri) - 1;
     102#ifdef SHIFT_MULT_DEBUG
     103  if (pshift > 0) {
     104    PrintLn(); PrintS("WARNING: p is already shifted"); PrintLn();
     105  }
     106#endif
     107  p = p_Copy(p,ri);
     108  p_LPshift(p, mshift - pshift, uptodeg, lV, ri);
     109
     110  // this is the commutative multiplication procedure
     111  extern poly pp_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral(spolyrec*, spolyrec*, ip_sring*);
     112  p = pp_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral(p, m, ri);
     113
     114  p = p_Shrink(p, lV, ri);
     115#ifdef SHIFT_MULT_DEBUG
     116  PrintLn(); PrintS("shift_pp_mm_Mult result: "); p_wrp(p, ri, ri); PrintLn();
     117#endif
     118  return p;
     119}
     120
     121// destroys p
     122poly shift_p_mm_Mult(poly p, const poly m, const ring ri)
     123{
     124  return shift_pp_mm_Mult(p,m,ri);
     125#ifdef SHIFT_MULT_DEBUG
     126  PrintLn(); PrintS("shift_p_mm_Mult: "); p_wrp(m, ri, ri); PrintS(" * "); p_wrp(p, ri, ri); PrintLn();
     127#endif
     128
     129  int lV = ri->isLPring;
     130  if (p_mFirstVblock(p,lV,ri) < p_mFirstVblock(m,lV,ri)) {
     131    // TODO remove this
     132    Print("WARNING: auto switch to shift_p_Mult_mm");
     133    return shift_p_Mult_mm(p, m, ri);
     134  }
     135
     136  // we just shift m and then call the commutative multiplication
     137  int uptodeg = ri->N/lV;
     138  int mshift = p_mLastVblock(m, lV, ri);
     139  int pshift = p_FirstVblock(p, lV, ri) - 1;
     140#ifdef SHIFT_MULT_DEBUG
     141  if (pshift > 0) {
     142    PrintLn(); PrintS("WARNING: p is already shifted"); PrintLn();
     143  }
     144#endif
     145  p_LPshift(p, mshift - pshift, uptodeg, lV, ri);
    41146
    42147  // this is the commutative multiplication procedure
     
    46151  poly q = p_Shrink(p, lV, ri);
    47152  p_Delete(&p, ri);
    48   return q;
    49 }
    50 
    51 poly shift_pp_mm_Mult(poly p, const poly m, const ring ri)
    52 {
    53153#ifdef SHIFT_MULT_DEBUG
    54   Print("shift_pp_mm_Mult p=%s m=%s", pString(p), pString(m));
    55   PrintLn();
     154  PrintLn(); PrintS("shift_p_mm_Mult resutl: "); p_wrp(q, ri, ri); PrintLn();
    56155#endif
    57 
    58   // we just shift m and then call the commutative multiplication
    59   int lV = ri->isLPring;
    60   int uptodeg = ri->N/lV;
    61   int shift = p_mLastVblock(m, lV, ri);
    62   p_LPshift(p, shift, uptodeg, lV, ri);
    63 
    64   // this is the commutative multiplication procedure
    65   extern poly pp_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral(spolyrec*, spolyrec*, ip_sring*);
    66   p = pp_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral(p, m, ri);
    67   return p_Shrink(p, lV, ri);
    68 }
    69 
    70 // destroys p
    71 poly shift_p_mm_Mult(poly p, const poly m, const ring ri)
    72 {
    73 #ifdef SHIFT_MULT_DEBUG
    74   Print("shift_p_mm_Mult p=%s m=%s", pString(p), pString(m));
    75   PrintLn();
    76 #endif
    77 
    78   // we just shift m and then call the commutative multiplication
    79   int lV = ri->isLPring;
    80   int uptodeg = ri->N/lV;
    81   int shift = p_mLastVblock(m, lV, ri);
    82   p_LPshift(p, shift, uptodeg, lV, ri);
    83 
    84   // this is the commutative multiplication procedure
    85   extern poly p_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral(spolyrec*, spolyrec*, ip_sring*);
    86 
    87   p = p_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral(p, m, ri);
    88   poly q = p_Shrink(p, lV, ri);
    89   p_Delete(&p, ri);
    90156  return q;
    91157}
     
    95161
    96162#ifdef SHIFT_MULT_DEBUG
    97   Print("shift_p_Minus_mm_Mult_qq p=%s m=%s q=%s spNoether=%s", pString(p), pString(m), pString(q));
    98   PrintLn();
     163  PrintLn(); PrintS("shift_p_Minus_mm_Mult_qq: "); p_wrp(p, ri, ri); PrintS(" - "); p_wrp(m, ri, ri); PrintS(" * "); p_wrp(q, ri, ri); PrintLn();
    99164#endif
    100165
    101   // we just shift m and then call the commutative multiplication
    102   int lV = ri->isLPring;
    103   int uptodeg = ri->N/lV;
    104   int shift = p_mLastVblock(m, lV, ri);
    105   p_LPshift(q, shift, uptodeg, lV, ri);
     166  Shorter = pLength(p) + pLength(q);
    106167
    107   // this is the commutative multiplication procedure
    108   extern poly p_Minus_mm_Mult_qq__FieldGeneral_LengthGeneral_OrdGeneral(spolyrec*, spolyrec*, spolyrec*, int&, spolyrec*, ip_sring*);
     168  poly qq = p_Add_q(p, shift_pp_mm_Mult(q, p_Neg(p_Copy(m, ri), ri), ri), ri);
     169  /* qq = p_Shrink(qq, lV, ri); // probably not neccessary */
     170  /* p_Delete(&p, ri); */ // just for testing disabled
    109171
    110   p = p_Minus_mm_Mult_qq__FieldGeneral_LengthGeneral_OrdGeneral(p, m, q, Shorter, spNoether, ri);
    111   poly qq = p_Shrink(p, lV, ri);
    112   p_Delete(&p, ri);
     172#ifdef SHIFT_MULT_DEBUG
     173  PrintLn(); PrintS("shift_p_Minus_mm_Mult_qq result: "); p_wrp(qq, ri, ri); PrintLn();
     174#endif
     175  Shorter -= pLength(qq);
    113176  return qq;
    114177}
Note: See TracChangeset for help on using the changeset viewer.