Changeset 003f71 in git


Ignore:
Timestamp:
Nov 26, 2022, 7:17:34 PM (17 months ago)
Author:
Hans Schoenemann <hannes@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
4bd8b041a99fff0e3b0ea2ae4a7114855c08b720
Parents:
f7e6710d93be192399d06dba64ca56a8b283c6e7
Message:
more fixes for rintegers3
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libpolys/coeffs/rintegers3.cc

    rf7e671 r003f71  
    77#ifdef HAVE_RINGS
    88#if SI_INTEGER_VARIANT == 3
     9#define POW_2_28 (1L<<60)
    910
    1011//make sure that a small number is an immediate integer
     
    9495  {
    9596  //from longrat.cc
    96     if (SR_TO_INT(a)==0)
    97       return a;
    98     if (SR_TO_INT(b)==0)
    99       return b;
     97    if (a==INT_TO_SR(0)) return INT_TO_SR(0);
     98    if (b==INT_TO_SR(0)) return INT_TO_SR(0);
    10099    long r=(long)((unsigned long)(SR_HDL(a)-1L))*((unsigned long)(SR_HDL(b)>>1));
    101100    if ((r/(SR_HDL(b)>>1))==(SR_HDL(a)-1L))
    102101    {
    103102      number u=((number) ((r>>1)+SR_INT));
    104     //  if (((((long)SR_HDL(u))<<1)>>1)==SR_HDL(u)) return (u);
     103      if (((((long)SR_HDL(u))<<1)>>1)==SR_HDL(u)) return (u);
    105104      return nrzInit(SR_HDL(u)>>2, R);
    106105    }
    107106    mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin);
    108     mpz_init(erg);
    109     mpz_set_si(erg, SR_TO_INT(a));
     107    mpz_init_set_si(erg, SR_TO_INT(a));
    110108    mpz_mul_si(erg, erg, SR_TO_INT(b));
    111109    nrzTest((number)erg);
    112     return (number) erg;
     110    return nrz_short((number) erg);
    113111  }
    114112  else if (n_Z_IS_SMALL(a))
    115113  {
    116     if (SR_TO_INT(a)==0)
    117       return a;
     114    if (a==INT_TO_SR(0)) return INT_TO_SR(0);
    118115    mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin);
    119116    mpz_init_set(erg, (mpz_ptr) b);
    120117    mpz_mul_si(erg, erg, SR_TO_INT(a));
    121     nrzTest((number)erg);
    122     return (number) erg;
     118    return nrz_short((number) erg);
    123119  }
    124120  else if (n_Z_IS_SMALL(b))
    125121  {
    126     if (SR_TO_INT(b)==0)
    127       return b;
     122    if (b==INT_TO_SR(0)) return INT_TO_SR(0);
    128123    mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin);
    129124    mpz_init_set(erg, (mpz_ptr) a);
    130125    mpz_mul_si(erg, erg, SR_TO_INT(b));
    131     nrzTest((number)erg);
    132     return (number) erg;
     126    return nrz_short((number) erg);
    133127  }
    134128  else
     
    138132    mpz_mul(erg, (mpz_ptr) a, (mpz_ptr) b);
    139133    nrzTest((number)erg);
    140     return (number) erg;
     134    return nrz_short((number) erg);
    141135  }
    142136}
     
    449443#endif
    450444{
    451   assume(SR_TO_INT(b));
    452   if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
    453   {
    454     if (r)
    455       *r = INT_TO_SR(SR_TO_INT(a) % SR_TO_INT(b));
    456     return INT_TO_SR(SR_TO_INT(a)/SR_TO_INT(b));
    457   }
    458   else if (n_Z_IS_SMALL(a))
    459   {
    460     //a is small, b is not, so q=0, r=a
    461     if (r)
    462       *r = a;
    463     return INT_TO_SR(0);
    464   }
    465   else if (n_Z_IS_SMALL(b))
    466   {
    467     unsigned long rr;
    468     mpz_ptr qq = (mpz_ptr) omAllocBin(gmp_nrz_bin);
    469     mpz_init(qq);
    470     mpz_t rrr;
    471     mpz_init(rrr);
    472     rr = mpz_divmod_ui(qq, rrr, (mpz_ptr) a, (unsigned long)ABS(SR_TO_INT(b)));
    473     mpz_clear(rrr);
    474 
    475     if (r)
    476       *r = INT_TO_SR(rr);
    477     if (SR_TO_INT(b)<0)
    478     {
    479       mpz_mul_si(qq, qq, -1);
    480     }
    481     return nrz_short((number)qq);
    482   }
    483   mpz_ptr qq = (mpz_ptr) omAllocBin(gmp_nrz_bin),
    484              rr = (mpz_ptr) omAllocBin(gmp_nrz_bin);
     445  mpz_ptr qq = (mpz_ptr) omAllocBin(gmp_nrz_bin);
    485446  mpz_init(qq);
     447  mpz_ptr rr = (mpz_ptr) omAllocBin(gmp_nrz_bin);
    486448  mpz_init(rr);
    487   mpz_divmod(qq, rr, (mpz_ptr)a, (mpz_ptr)b);
    488   if (r)
    489     *r = (number) rr;
    490   else
     449  mpz_t bb;
     450  mpz_t aa;
     451  int gsign;
     452  if (SR_HDL(b) & SR_INT)
     453  {
     454    if (SR_HDL(b)<0) gsign=-1;
     455    else             gsign=1;
     456    mpz_init_set_si(bb,SR_TO_INT(b));
     457  }
     458  else
     459  {
     460    gsign = mpz_sgn((mpz_ptr) b);
     461    mpz_init_set(bb,(mpz_ptr) b);
     462  }
     463  if (SR_HDL(a) & SR_INT)
     464  {
     465    mpz_init_set_si(aa,SR_TO_INT(a));
     466  }
     467  else
     468  {
     469    mpz_init_set(aa,(mpz_ptr) a);
     470  }
     471  mpz_t gg, ghalf;
     472  mpz_init(gg);
     473  mpz_init(ghalf);
     474  mpz_abs(gg, bb);
     475  mpz_fdiv_qr(qq, rr, aa, gg);
     476  mpz_tdiv_q_2exp(ghalf, gg, 1);
     477  if (mpz_cmp(rr, ghalf) > 0)  // r > ghalf
     478    {
     479      mpz_sub(rr, rr, gg);
     480      mpz_add_ui(qq, qq, 1);
     481    }
     482  if (gsign < 0) mpz_neg(qq, qq);
     483
     484  mpz_clear(ghalf);
     485  mpz_clear(gg);
     486  mpz_clear(aa);
     487  mpz_clear(bb);
     488  if (r==NULL)
    491489  {
    492490    mpz_clear(rr);
    493   }
    494   number res=nrz_short((number)qq);
    495   nrzTest(res);
    496   return res;
     491    omFreeBin(rr,gmp_nrz_bin);
     492  }
     493  else
     494  {
     495    *r=nrz_short((number)rr);
     496  }
     497  return nrz_short((number)qq);
    497498}
    498499
     
    571572  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
    572573  {
    573     long c = SR_TO_INT(a) + SR_TO_INT(b);
     574    long c = SR_HDL(a)+SR_HDL(b)-1L;
    574575    if (INT_IS_SMALL(c))
    575       return INT_TO_SR(c);
    576     mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin);
    577     mpz_init_set_si(erg, c);
    578 
    579     nrzTest((number)erg);
    580     return (number) erg;
     576      return (number)c;
     577    mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin);
     578    mpz_init_set_si(erg,SR_TO_INT(a));
     579    if (SR_HDL(b)>0)
     580      mpz_add_ui(erg, erg, (unsigned long)SR_TO_INT(b));
     581    else
     582      mpz_sub_ui(erg, erg, (unsigned long)-(SR_TO_INT(b)));
     583    return nrz_short((number)erg);
    581584  }
    582585  else if (n_Z_IS_SMALL(a))
     
    584587    mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin);
    585588    mpz_init(erg);
    586     if (SR_TO_INT(a)>0)
     589    if (SR_HDL(a)>0)
    587590      mpz_add_ui(erg, (mpz_ptr) b, (unsigned long)SR_TO_INT(a));
    588591    else
     
    594597    mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin);
    595598    mpz_init(erg);
    596     if (SR_TO_INT(b)>0)
     599    if (SR_HDL(b)>0)
    597600      mpz_add_ui(erg, (mpz_ptr) a, (unsigned long)SR_TO_INT(b));
    598601    else
     
    613616  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
    614617  {
    615     long c = SR_TO_INT(a) - SR_TO_INT(b);
     618    long c = SR_HDL(a)-SR_HDL(b)+1;
    616619    if (INT_IS_SMALL(c))
    617       return INT_TO_SR(c);
    618     mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin);
    619     mpz_init_set_si(erg, c);
    620     nrzTest((number)erg);
    621     return (number) erg;
     620      return number(c);
     621    mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin);
     622    mpz_init_set_si(erg,SR_TO_INT(a));
     623    if (SR_HDL(b)>0)
     624      mpz_sub_ui(erg, erg, (unsigned long)SR_TO_INT(b));
     625    else
     626      mpz_add_ui(erg, erg, (unsigned long)-(SR_TO_INT(b)));
     627    return nrz_short((number)erg);
    622628  }
    623629  else if (n_Z_IS_SMALL(a))
    624630  {
    625631    mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin);
     632    mpz_init_set_si(erg,SR_TO_INT(a));
     633    mpz_sub(erg, erg, (mpz_ptr) b);
     634    return nrz_short((number) erg);
     635  }
     636  else if (n_Z_IS_SMALL(b))
     637  {
     638    mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin);
    626639    mpz_init(erg);
    627 
    628     if (SR_TO_INT(a)>0)
    629       mpz_ui_sub(erg, (unsigned long)SR_TO_INT(a), (mpz_ptr) b);
    630     else
    631     {
    632       mpz_add_ui(erg, (mpz_ptr) b, (unsigned long)-SR_TO_INT(a));
    633       mpz_neg(erg, erg);
    634     }
    635     return nrz_short((number) erg);
    636   }
    637   else if (n_Z_IS_SMALL(b))
    638   {
    639     mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin);
    640     mpz_init(erg);
    641     if (SR_TO_INT(b)>0)
     640    if (SR_HDL(b)>0)
    642641      mpz_sub_ui(erg, (mpz_ptr) a, (unsigned long)SR_TO_INT(b));
    643642    else
     
    747746static number nrzDiv (number a,number b, const coeffs cf)
    748747{
    749   assume(SR_TO_INT(b));
    750748  if (nrzIsZero(b,cf))
    751749  {
     
    755753  else if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
    756754  {
     755    long i=SR_TO_INT(a);
     756    long j=SR_TO_INT(b);
     757    if (j==1L) return a;
     758    if ((i==-POW_2_28) && (j== -1L))
     759    {
     760      return nrzInit(POW_2_28,cf);
     761    }
    757762    //if (SR_TO_INT(a) % SR_TO_INT(b))
    758763    //{
     
    760765    //  WerrorS("Result is without remainder.");
    761766    //}
    762     return INT_TO_SR(SR_TO_INT(a)/SR_TO_INT(b));
     767    return INT_TO_SR(i/j);
    763768  }
    764769  else if (n_Z_IS_SMALL(a))
     
    782787    }
    783788    mpz_clear(r);
    784     if (SR_TO_INT(b)<0)
     789    if (SR_HDL(b)<0)
    785790      mpz_neg(erg, erg);
    786791    return nrz_short((number) erg);
Note: See TracChangeset for help on using the changeset viewer.