Changeset de27d8 in git


Ignore:
Timestamp:
Feb 18, 2013, 7:27:17 PM (10 years ago)
Author:
Hans Schoenemann <hannes@…>
Branches:
(u'jengelh-datetime', 'ceac47cbc86fe4a15902392bdbb9bd2ae0ea02c6')(u'spielwiese', 'a800fe4b3e9d37a38c5a10cc0ae9dfa0c15a4ee6')
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
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • Singular/iparith.cc

    r77ed181 rde27d8  
    16431643    x[i]=n_Init((*c)[i], coeffs_BIGINT);
    16441644  }
    1645   number n=n_ChineseRemainder(x,q,rl,coeffs_BIGINT);
     1645  number n=n_ChineseRemainderSym(x,q,rl,FALSE,coeffs_BIGINT);
    16461646  for(i=rl-1;i>=0;i--)
    16471647  {
     
    17201720static BOOLEAN jjCHINREM_ID(leftv res, leftv u, leftv v)
    17211721{
    1722   lists c=(lists)u->CopyD(); // list of ideal
     1722  lists c=(lists)u->CopyD(); // list of ideal or bigint/int
    17231723  lists pl=NULL;
    17241724  intvec *p=NULL;
     
    18161816        for(i++;i<rl;i++)
    18171817        {
    1818           n_Delete(&(q[i]),currRing->cf);
     1818          n_Delete(&(q[i]),currRing);
    18191819        }
     1820
    18201821        omFree(x); // delete c
    18211822        omFree(q); // delete pl
     1823        if (xx!=NULL) omFree(xx); // delete c
    18221824        return TRUE;
    18231825      }
     
    18261828  if (return_type==BIGINT_CMD)
    18271829  {
    1828     number n=n_ChineseRemainder(xx,q,rl,coeffs_BIGINT);
     1830    number n=n_ChineseRemainderSym(xx,q,rl,TRUE,coeffs_BIGINT);
    18291831    res->data=(char *)n;
    18301832  }
     
    18431845  for(i=rl-1;i>=0;i--)
    18441846  {
    1845     n_Delete(&(q[i]),currRing->cf);
     1847    n_Delete(&(q[i]),currRing);
    18461848  }
    18471849  omFree(q);
  • kernel/ideals.cc

    r77ed181 rde27d8  
    24002400#endif
    24012401
    2402 #ifdef HAVE_FACTORY
    2403 /*2
    2404 * xx,q: arrays of length 0..rl-1
    2405 * xx[i]: SB mod q[i]
    2406 * assume: char=0
    2407 * assume: q[i]!=0
    2408 * destroys xx
    2409 */
    2410 ideal id_ChineseRemainder(ideal *xx, number *q, int rl, const ring R)
    2411 {
    2412   int cnt=IDELEMS(xx[0])*xx[0]->nrows;
    2413   ideal result=idInit(cnt,xx[0]->rank);
    2414   result->nrows=xx[0]->nrows; // for lifting matrices
    2415   result->ncols=xx[0]->ncols; // for lifting matrices
    2416   int i,j;
    2417   number *x=(number *)omAlloc(rl*sizeof(number));
    2418   poly *p=(poly *)omAlloc(rl*sizeof(poly));
    2419   for(i=cnt-1;i>=0;i--)
    2420   {
    2421     for(j=rl-1;j>=0;j--)
    2422     {
    2423       p[j]=xx[j]->m[i];
    2424     }
    2425     result->m[i]=p_ChineseRemainder(p,x,q,rl,R);
    2426     for(j=rl-1;j>=0;j--)
    2427     {
    2428       xx[j]->m[i]=p[j];
    2429     }
    2430   }
    2431   omFreeSize(p,rl*sizeof(poly));
    2432   omFreeSize(x,rl*sizeof(number));
    2433   for(i=rl-1;i>=0;i--) id_Delete(&(xx[i]),R);
    2434   omFreeSize(xx,rl*sizeof(ideal));
    2435   return result;
    2436 }
    2437 #endif
    2438 
    24392402#if 0
    24402403/*2
  • kernel/ideals.h

    r77ed181 rde27d8  
    204204poly id_GCD(poly f, poly g, const ring r);
    205205
    206 ideal id_ChineseRemainder(ideal *x, number *q, int rl, const ring R);
    207 //ideal idChineseRemainder(ideal *x, intvec *iv); /* currently unused */
    208206ideal id_Farey(ideal x, number N, const ring r);
    209207
  • 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));
  • libpolys/polys/monomials/p_polys.cc

    r77ed181 rde27d8  
    128128        x[j]=n_Init(0, R);
    129129    }
    130     number n=n_ChineseRemainder(x,q,rl,R->cf);
     130    number n=n_ChineseRemainderSym(x,q,rl,TRUE,R->cf);
    131131    for(j=rl-1;j>=0;j--)
    132132    {
  • libpolys/polys/simpleideals.cc

    r77ed181 rde27d8  
    17681768  return(idResult);
    17691769}
     1770
     1771ideal id_ChineseRemainder(ideal *xx, number *q, int rl, const ring r)
     1772{
     1773  int cnt=IDELEMS(xx[0])*xx[0]->nrows;
     1774  ideal result=idInit(cnt,xx[0]->rank);
     1775  result->nrows=xx[0]->nrows; // for lifting matrices
     1776  result->ncols=xx[0]->ncols; // for lifting matrices
     1777  int i,j;
     1778  number *x=(number *)omAlloc(rl*sizeof(number));
     1779  poly *p=(poly *)omAlloc(rl*sizeof(poly));
     1780  for(i=cnt-1;i>=0;i--)
     1781  {
     1782    for(j=rl-1;j>=0;j--)
     1783    {
     1784      p[j]=xx[j]->m[i];
     1785    }
     1786    result->m[i]=p_ChineseRemainder(p,x,q,rl,r);
     1787    for(j=rl-1;j>=0;j--)
     1788    {
     1789      xx[j]->m[i]=p[j];
     1790    }
     1791  }
     1792  omFreeSize(p,rl*sizeof(poly));
     1793  omFreeSize(x,rl*sizeof(number));
     1794  for(i=rl-1;i>=0;i--) id_Delete(&(xx[i]),r);
     1795  omFreeSize(xx,rl*sizeof(ideal));
     1796  return result;
     1797}
  • libpolys/polys/simpleideals.h

    r77ed181 rde27d8  
    147147
    148148
     149ideal id_ChineseRemainder(ideal *xx, number *q, int rl, const ring r);
    149150#endif
Note: See TracChangeset for help on using the changeset viewer.