Changeset de27d8 in git for libpolys/coeffs


Ignore:
Timestamp:
Feb 18, 2013, 7:27:17 PM (11 years ago)
Author:
Hans Schoenemann <hannes@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
7d1ce3ef53e17b72b36010a52fcfbdbde745a3e7afc974f80049f26666102bf7d90f3aa6c1dfd957
Parents:
77ed18101c07cdbb767d8703e5ea1d0f7c8b05f6
git-author:
Hans Schoenemann <hannes@mathematik.uni-kl.de>2013-02-18 19:27:17+01:00
git-committer:
Hans Schoenemann <hannes@mathematik.uni-kl.de>2013-02-18 19:27:55+01:00
Message:
fix: intdiv/intmod/chinrem copied from master
Location:
libpolys/coeffs
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • libpolys/coeffs/coeffs.h

    r77ed181 rde27d8  
    201201   /// chinese remainder
    202202   /// returns X with X mod q[i]=x[i], i=0..rl-1
    203    number  (*cfChineseRemainder)(number *x, number *q,int rl, const coeffs);
     203   number  (*cfChineseRemainder)(number *x, number *q,int rl, BOOLEAN sym,const coeffs);
    204204
    205205   /// degree for coeffcients: -1 for 0, 0 for "constants", ...
     
    654654}
    655655
    656 static inline number n_ChineseRemainder(number *a, number *b, int rl, const coeffs r)
    657 {
    658   assume(r != NULL); assume(r->cfChineseRemainder != NULL); return r->cfChineseRemainder(a,b,rl,r);
     656static inline number n_ChineseRemainderSym(number *a, number *b, int rl, BOOLEAN sym,const coeffs r)
     657{
     658  assume(r != NULL); assume(r->cfChineseRemainder != NULL); return r->cfChineseRemainder(a,b,rl,sym,r);
    659659}
    660660
  • libpolys/coeffs/longrat.cc

    r77ed181 rde27d8  
    722722    long aa=SR_TO_INT(a);
    723723    long bb=SR_TO_INT(b);
    724     //return INT_TO_SR((aa-(aa%bb))/bb);
    725724    return INT_TO_SR(aa/bb);
    726725  }
     
    760759    bb->debug=654324;
    761760#endif
    762     FREE_RNUMBER(bb); // omFreeBin((void *)bb, rnumber_bin);
     761    FREE_RNUMBER(bb);
    763762  }
    764763  u=nlShort3(u);
    765   nlTest(u, r);
     764  nlTest(u,r);
    766765  return u;
    767766}
     
    782781  if (SR_HDL(a) & SR_HDL(b) & SR_INT)
    783782  {
    784     //return INT_TO_SR(SR_TO_INT(a)%SR_TO_INT(b));
    785     if ((long)a>0L)
    786     {
    787       if ((long)b>0L)
    788         return INT_TO_SR(SR_TO_INT(a)%SR_TO_INT(b));
    789       else
    790         return INT_TO_SR(SR_TO_INT(a)%(-SR_TO_INT(b)));
    791     }
    792     else
    793     {
    794       if ((long)b>0L)
    795       {
    796         long i=(-SR_TO_INT(a))%SR_TO_INT(b);
    797         if ( i != 0L ) i = (SR_TO_INT(b))-i;
    798         return INT_TO_SR(i);
    799       }
    800       else
    801       {
    802         long i=(-SR_TO_INT(a))%(-SR_TO_INT(b));
    803         if ( i != 0L ) i = (-SR_TO_INT(b))-i;
    804         return INT_TO_SR(i);
    805       }
    806     }
     783    LONG bb=SR_TO_INT(b);
     784    LONG c=SR_TO_INT(a)%bb;
     785    return INT_TO_SR(c);
    807786  }
    808787  if (SR_HDL(a) & SR_INT)
    809788  {
    810     /* a is a small and b is a large int: -> a or (a+b) or (a-b) */
    811     if ((long)a<0L)
    812     {
    813       if (mpz_isNeg(b->z))
    814         return nlSub(a,b,r);
    815       /*else*/
    816         return nlAdd(a,b,r);
    817     }
    818     /*else*/
    819       return a;
    820 
    821789    /* a is a small and b is a large int: -> a */
    822     //return a;
     790    return a;
    823791  }
    824792  number bb=NULL;
     
    841809    bb->debug=654324;
    842810#endif
    843     FREE_RNUMBER(bb); // omFreeBin((void *)bb, rnumber_bin);
     811    FREE_RNUMBER(bb);
    844812  }
    845813  if (mpz_isNeg(u->z))
     
    851819  }
    852820  u=nlShort3(u);
    853   nlTest(u, r);
     821  nlTest(u,r);
    854822  return u;
    855823}
     
    26322600}
    26332601
    2634 number   nlChineseRemainder(number *x, number *q,int rl, const coeffs C)
     2602number   nlChineseRemainderSym(number *x, number *q,int rl, BOOLEAN sym, const coeffs CF)
    26352603// elemenst in the array are x[0..(rl-1)], q[0..(rl-1)]
    26362604{
    26372605#ifdef HAVE_FACTORY
    26382606  setCharacteristic( 0 ); // only in char 0
     2607  Off(SW_RATIONAL);
    26392608  CFArray X(rl), Q(rl);
    26402609  int i;
    26412610  for(i=rl-1;i>=0;i--)
    26422611  {
    2643     X[i]=C->convSingNFactoryN(x[i],FALSE,C); // may be larger MAX_INT
    2644     Q[i]=C->convSingNFactoryN(q[i],FALSE,C); // may be larger MAX_INT
     2612    X[i]=CF->convSingNFactoryN(x[i],FALSE,CF); // may be larger MAX_INT
     2613    Q[i]=CF->convSingNFactoryN(q[i],FALSE,CF); // may be larger MAX_INT
    26452614  }
    26462615  CanonicalForm xnew,qnew;
    26472616  chineseRemainder(X,Q,xnew,qnew);
    2648   number n=C->convFactoryNSingN(xnew,C);
    2649   number p=C->convFactoryNSingN(qnew,C);
    2650   number p2=nlIntDiv(p,nlInit(2, C),C);
    2651   if (nlGreater(n,p2,C))
    2652   {
    2653      number n2=nlSub(n,p,C);
    2654      nlDelete(&n,C);
    2655      n=n2;
    2656   }
    2657   nlDelete(&p,C);
    2658   nlDelete(&p2,C);
     2617  number n=CF->convFactoryNSingN(xnew,CF);
     2618  if (sym)
     2619  {
     2620    number p=CF->convFactoryNSingN(qnew,CF);
     2621    number p2=nlIntDiv(p,nlInit(2, CF),CF);
     2622    if (nlGreater(n,p2,CF))
     2623    {
     2624       number n2=nlSub(n,p,CF);
     2625       nlDelete(&n,CF);
     2626       n=n2;
     2627    }
     2628    nlDelete(&p2,CF);
     2629    nlDelete(&p,CF);
     2630  }
    26592631  return n;
    26602632#else
    26612633  WerrorS("not implemented");
    2662   return nlInit(0, C);
    2663 #endif
     2634  return nlInit(0,CF);
     2635#endif
     2636}
     2637number   nlChineseRemainder(number *x, number *q,int rl, const coeffs C)
     2638{
     2639  return nlChineseRemainderSym(x,q,rl,TRUE,C);
    26642640}
    26652641
     
    28752851  r->cfInt  = nlInt;
    28762852
    2877   r->cfChineseRemainder=nlChineseRemainder;
     2853  r->cfChineseRemainder=nlChineseRemainderSym;
    28782854  r->cfFarey=nlFarey;
    28792855  #ifdef HAVE_RINGS
  • libpolys/coeffs/numbers.cc

    r77ed181 rde27d8  
    7777  return NULL;
    7878}
    79 number ndChineseRemainder(number *,number *,int,const coeffs r)
     79number ndChineseRemainder(number *,number *,int,BOOLEAN,const coeffs r)
    8080{
    8181  Werror("ChineseRemainder not implemented for (c=%d)",getCoeffType(r));
Note: See TracChangeset for help on using the changeset viewer.