Changeset 6a1aa7 in git for libpolys


Ignore:
Timestamp:
Jul 11, 2014, 5:08:34 PM (10 years ago)
Author:
Hans Schoenemann <hannes@…>
Branches:
(u'fieker-DuVal', '117eb8c30fc9e991c4decca4832b1d19036c4c65')(u'spielwiese', '38077648e7239f98078663eb941c3c979511150a')
Children:
1234c77ed4ce613f813076f72fa15a303743e451312a931ca75e1ecf46c185282254d34874f9f4a4
Parents:
653440a090c5b7f2086e19c2cadf27bb08f91644
git-author:
Hans Schoenemann <hannes@mathematik.uni-kl.de>2014-07-11 17:08:34+02:00
git-committer:
Hans Schoenemann <hannes@mathematik.uni-kl.de>2014-07-11 17:09:41+02:00
Message:
preparation for more integer representations

n_Init_bigint: substituted by n_setMap/nMap
introduced cf->rep for different data representation
introduced several (experimental) integer variants
   via #define in libpolys/misc/auxiliary.h.in
Location:
libpolys
Files:
18 edited

Legend:

Unmodified
Added
Removed
  • libpolys/coeffs/OPAE.cc

    r653440 r6a1aa7  
    341341    r->cfName = nAEName;
    342342    r->cfInpMult=nAEInpMult; //????
    343     r->cfInit_bigint= NULL; // nAEMap0;
    344343    r->cfCoeffWrite=nAECoeffWrite; //????
    345344
  • libpolys/coeffs/OPAEQ.cc

    r653440 r6a1aa7  
    334334    r->cfName = nAEQName;
    335335    r->cfInpMult=nAEQInpMult; //????
    336     r->cfInit_bigint= NULL; // nAEQMap0;
    337336    r->cfCoeffWrite=nAEQCoeffWrite; //????
    338337
  • libpolys/coeffs/OPAEp.cc

    r653440 r6a1aa7  
    363363    r->cfName = nAEpName;
    364364    r->cfInpMult=nAEpInpMult; //????
    365     r->cfInit_bigint= NULL; // nAEpMap0;
    366365    r->cfCoeffWrite=nAEpCoeffWrite; //????
    367366
  • libpolys/coeffs/coeffs.h

    r653440 r6a1aa7  
    9191} LongComplexInfo;
    9292
     93
     94enum n_coeffRep
     95{
     96  n_rep_unknown=0,
     97  n_rep_int,      /**< (int), see modulop.h */
     98  n_rep_gap_rat,  /**< (number), see longrat.h */
     99  n_rep_gap_gmp,  /**< (), see rinteger.h, new impl. */
     100  n_rep_poly,     /**< (poly), see algext.h */
     101  n_rep_rat_fct,  /**< (fraction), see transext.h */
     102  n_rep_gmp,      /**< (mpz_ptr), see rmodulon,h */
     103  n_rep_float,    /**< (float), see shortfl.h */
     104  n_rep_gmp_float,  /**< (gmp_float), see  */
     105  n_rep_gmp_complex,/**< (gmp_complex), see gnumpc.h */
     106  n_rep_gf        /**< (int), see ffields.h */
     107};
     108
    93109struct n_Procs_s
    94110{
     
    96112   coeffs next;
    97113   int     ref;
     114   n_coeffRep rep;
    98115   n_coeffType type;
    99116   /// how many variables of factory are already used by this coeff
     
    251268   /// Inplace: a += b
    252269   void    (*cfInpAdd)(number &a, number b, const coeffs r);
    253 
    254    /// maps the bigint i (from dummy == coeffs_BIGINT!!!) into the
    255    /// coeffs dst
    256    /// TODO: to be exchanged with a map!!!
    257    number  (*cfInit_bigint)(number i, const coeffs dummy, const coeffs dst);
    258270
    259271   /// rational reconstruction: "best" rational a/b with a/b = p mod n
     
    768780}
    769781
    770 static inline number  n_Init_bigint(number i, const coeffs dummy,
    771                 const coeffs dst)
    772 {
    773   assume(dummy != NULL && dst != NULL); assume(dst->cfInit_bigint!=NULL);
    774   return dst->cfInit_bigint(i, dummy, dst);
    775 }
    776 
    777782static inline number  n_RePart(number i, const coeffs cf)
    778783{
  • libpolys/coeffs/ffields.cc

    r653440 r6a1aa7  
    798798    }
    799799  }
    800   if (nCoeff_is_Zp(src,dst->m_nfCharP))
     800  if ((src->rep==n_rep_int) && nCoeff_is_Zp(src,dst->m_nfCharP))
    801801  {
    802802    return nfMapP;    /* Z/p -> GF(p,n) */
    803803  }
     804  if (src->rep==n_rep_gap_rat) /*Q, Z */
     805    return nlModP;
    804806  return NULL;     /* default */
    805807}
     
    832834  r->is_field=TRUE;
    833835  r->is_domain=TRUE;
     836  r->rep=n_rep_gf;
    834837  //r->cfInitChar=npInitChar;
    835838  r->cfKillChar=nfKillChar;
     
    860863
    861864  r->cfWriteLong = nfWriteLong;
    862   r->cfInit_bigint = nlModP;
    863865  r->cfRead = nfRead;
    864866  //r->cfNormalize=ndNormalize;
  • libpolys/coeffs/gnumpc.cc

    r653440 r6a1aa7  
    475475  n->is_field=TRUE;
    476476  n->is_domain=TRUE;
     477  n->rep=n_rep_gmp_complex;
    477478
    478479  n->cfKillChar = ngcKillChar;
     
    516517
    517518  n->cfSetChar=ngcSetChar;
    518 
    519   n->cfInit_bigint=ngcMapQ;
    520519
    521520// we need to initialize n->nNULL at least for minpoly printing
     
    624623{
    625624  assume( getCoeffType(r) == ID );
    626   assume( getCoeffType(aRing) == n_Q );
     625  assume( aRing->rep == n_rep_gap_rat);
    627626
    628627  if ( from != NULL )
     
    635634}
    636635
     636number ngcMapZ(number from, const coeffs aRing, const coeffs r)
     637{
     638  assume( getCoeffType(r) == ID );
     639  assume( aRing->rep == n_rep_gap_gmp);
     640
     641  if ( from != NULL )
     642  {
     643    if (SR_HDL(from) & SR_INT)
     644    {
     645      gmp_float f_i= gmp_float(SR_TO_INT(from));
     646      gmp_complex *res=new gmp_complex(f_i);
     647      return (number)res;
     648    }
     649    gmp_float f_i=(mpz_ptr)from;
     650    gmp_complex *res=new gmp_complex(f_i);
     651    return (number)res;
     652  }
     653  else
     654    return NULL;
     655}
     656
    637657static number ngcMapLongR(number from, const coeffs aRing, const coeffs r)
    638658{
     
    692712  assume( getCoeffType(dst) == ID );
    693713
    694   if (nCoeff_is_Q(src))
     714  if (src->rep==n_rep_gap_rat) /* Q, Z*/
    695715  {
    696716    return ngcMapQ;
    697717  }
    698   if (nCoeff_is_long_R(src))
     718  if (src->rep==n_rep_gap_gmp) /* Z */
     719  {
     720    return ngcMapZ;
     721  }
     722  if ((src->rep==n_rep_gmp_float) && nCoeff_is_long_R(src))
    699723  {
    700724    return ngcMapLongR;
    701725  }
    702   if (nCoeff_is_long_C(src))
     726  if ((src->rep==n_rep_gmp_complex) && nCoeff_is_long_C(src))
    703727  {
    704728    return ngcCopyMap;
    705729  }
    706   if (nCoeff_is_R(src))
     730  if ((src->rep==n_rep_float) && nCoeff_is_R(src))
    707731  {
    708732    return ngcMapR;
    709733  }
    710   if (nCoeff_is_Zp(src))
     734  if ((src->rep==n_rep_int) && nCoeff_is_Zp(src))
    711735  {
    712736    return ngcMapP;
  • libpolys/coeffs/gnumpfl.cc

    r653440 r6a1aa7  
    413413  n->is_field=TRUE;
    414414  n->is_domain=TRUE;
     415  n->rep=n_rep_gmp_float;
    415416
    416417  n->cfKillChar = ndKillChar; /* dummy */
     
    443444  n->cfSetMap = ngfSetMap;
    444445  n->cfCoeffWrite = ngfCoeffWrite;
    445   n->cfInit_bigint = ngfMapQ;
    446446#ifdef LDEBUG
    447447  n->cfDBTest  = ndDBTest; // not yet implemented: ngfDBTest
     
    474474{
    475475  assume( getCoeffType(dst) == ID );
    476   assume( getCoeffType(src) == n_Q );
     476  assume( src->rep == n_rep_gap_rat );
    477477 
    478478  gmp_float *res=new gmp_float(numberFieldToFloat(from,QTOF,dst));
    479479  return (number)res;
    480480}
     481number ngfMapZ(number from, const coeffs aRing, const coeffs r)
     482{
     483  assume( getCoeffType(r) == ID );
     484  assume( aRing->rep == n_rep_gap_gmp);
     485
     486  if ( from != NULL )
     487  {
     488    if (SR_HDL(from) & SR_INT)
     489    {
     490      gmp_float f_i= gmp_float(SR_TO_INT(from));
     491      gmp_float *res=new gmp_float(f_i);
     492      return (number)res;
     493    }
     494    gmp_float f_i=(mpz_ptr)from;
     495    gmp_float *res=new gmp_float(f_i);
     496    return (number)res;
     497  }
     498  else
     499    return NULL;
     500}
     501
    481502
    482503static number ngfMapR(number from, const coeffs src, const coeffs dst)
     
    510531  assume( getCoeffType(dst) == ID );
    511532 
    512   if (nCoeff_is_Q(src))
     533  if (src->rep==n_rep_gap_rat) /*Q, Z*/
    513534  {
    514535    return ngfMapQ;
    515536  }
    516   if (nCoeff_is_long_R(src))
     537  if (src->rep==n_rep_gap_gmp) /*Q, Z*/
     538  {
     539    return ngfMapZ;
     540  }
     541  if ((src->rep==n_rep_gmp_float) && nCoeff_is_long_R(src))
    517542  {
    518543    return ndCopyMap; //ngfCopyMap;
    519544  }
    520   if (nCoeff_is_R(src))
     545  if ((src->rep==n_rep_float) && nCoeff_is_R(src))
    521546  {
    522547    return ngfMapR;
    523548  }
    524   if (nCoeff_is_long_C(src))
     549  if ((src->rep==n_rep_gmp_complex) && nCoeff_is_long_C(src))
    525550  {
    526551    return ngfMapC;
    527552  }
    528   if (nCoeff_is_Zp(src))
     553  if ((src->rep==n_rep_int) && nCoeff_is_Zp(src))
    529554  {
    530555    return ngfMapP;
     
    532557  return NULL;
    533558}
    534 
    535559
    536560void    ngfCoeffWrite  (const coeffs r, BOOLEAN /*details*/)
  • libpolys/coeffs/longrat.cc

    r653440 r6a1aa7  
    144144  z=nlShort3(z);
    145145  return z;
     146}
     147
     148number nlMapZ(number from, const coeffs src, const coeffs dst)
     149{
     150  if (SR_HDL(from) & SR_INT)
     151  {
     152    return from;
     153  }
     154  return nlMapGMP(from,src,dst);
    146155}
    147156
     
    12881297}
    12891298
    1290 // Map q \in QQ \to Zp
    1291 // src = Q, dst = Zp (or an extension of Zp?)
     1299// Map q \in QQ or ZZ \to Zp or an extension of it
     1300// src = Q or Z, dst = Zp (or an extension of Zp)
    12921301number nlModP(number q, const coeffs Q, const coeffs Zp)
    12931302{
     
    21682177nMapFunc nlSetMap(const coeffs src, const coeffs dst)
    21692178{
    2170   if (getCoeffType(src)==n_Q /*nCoeff_is_Q(src) or coeffs_BIGINT*/)
     2179  if (src->rep==n_rep_gap_rat)  /*Q, coeffs_BIGINT */
    21712180  {
    21722181    return ndCopyMap;
    21732182  }
    2174   if (nCoeff_is_Zp(src))
     2183  if ((src->rep==n_rep_int) && nCoeff_is_Zp(src))
    21752184  {
    21762185    return nlMapP;
    21772186  }
    2178   if (nCoeff_is_R(src))
     2187  if ((src->rep==n_rep_float) && nCoeff_is_R(src))
    21792188  {
    21802189    return nlMapR;
    21812190  }
    2182   if (nCoeff_is_long_R(src))
     2191  if ((src->rep==n_rep_gmp_float) && nCoeff_is_long_R(src))
    21832192  {
    21842193    return nlMapLongR; /* long R -> Q */
    21852194  }
    21862195#ifdef HAVE_RINGS
    2187   if (nCoeff_is_Ring_Z(src) || nCoeff_is_Ring_PtoM(src) || nCoeff_is_Ring_ModN(src))
     2196  if (src->rep==n_rep_gmp) // nCoeff_is_Ring_Z(src) || nCoeff_is_Ring_PtoM(src) || nCoeff_is_Ring_ModN(src))
    21882197  {
    21892198    return nlMapGMP;
    21902199  }
    2191   if (nCoeff_is_Ring_2toM(src))
     2200  if (src->rep==n_rep_gap_gmp)
     2201  {
     2202    return nlMapZ;
     2203  }
     2204  if ((src->rep==n_rep_int) && nCoeff_is_Ring_2toM(src))
    21922205  {
    21932206    return nlMapMachineInt;
     
    30203033{
    30213034  r->is_domain=TRUE;
     3035  r->rep=n_rep_gap_rat;
    30223036
    30233037  //const int ch = (int)(long)(p);
     
    30833097  r->cfInpMult=nlInpMult;
    30843098  r->cfInpAdd=nlInpAdd;
    3085   r->cfInit_bigint=nlCopyMap;
    30863099  r->cfCoeffWrite=nlCoeffWrite;
    30873100
  • libpolys/coeffs/modulop.cc

    r653440 r6a1aa7  
    457457  r->is_field=TRUE;
    458458  r->is_domain=TRUE;
     459  r->rep=n_rep_int;
    459460
    460461  r->ch = c;
     
    503504  //r->cfName = ndName;
    504505  r->cfInpMult=ndInpMult;
    505   r->cfInit_bigint= nlModP; // npMap0;
    506506#ifdef NV_OPS
    507507  if (c>NV_MAX_PRIME)
     
    690690}
    691691
     692number npMapZ(number from, const coeffs src, const coeffs dst)
     693{
     694  if (SR_HDL(from) & SR_INT)
     695  {
     696    long f_i=SR_TO_INT(from);
     697    return npInit(f_i,dst);
     698  }
     699  return npMapGMP(from,src,dst);
     700}
     701
    692702/*2
    693703* convert from an machine long
     
    710720{
    711721#ifdef HAVE_RINGS
    712   if (nCoeff_is_Ring_2toM(src))
     722  if ((src->rep==n_rep_int) && nCoeff_is_Ring_2toM(src))
    713723  {
    714724    return npMapMachineInt;
    715725  }
    716   if (nCoeff_is_Ring_Z(src) || nCoeff_is_Ring_PtoM(src) || nCoeff_is_Ring_ModN(src))
     726  if (src->rep==n_rep_gmp) //nCoeff_is_Ring_Z(src) || nCoeff_is_Ring_PtoM(src) || nCoeff_is_Ring_ModN(src))
    717727  {
    718728    return npMapGMP;
    719729  }
    720 #endif
    721   if (nCoeff_is_Q(src))
     730  if (src->rep==n_rep_gap_gmp) //nCoeff_is_Ring_Z(src)
     731  {
     732    return npMapZ;
     733  }
     734#endif
     735  if (src->rep==n_rep_gap_rat)  /* Q, Z */
    722736  {
    723737    return nlModP; // npMap0;
    724738  }
    725   if ( nCoeff_is_Zp(src) )
     739  if ((src->rep==n_rep_int) && nCoeff_is_Zp(src) )
    726740  {
    727741    if (n_GetChar(src) == n_GetChar(dst))
     
    734748    }
    735749  }
    736   if (nCoeff_is_long_R(src))
     750  if ((src->rep==n_rep_gmp_float) && nCoeff_is_long_R(src))
    737751  {
    738752    return npMapLongR;
  • libpolys/coeffs/mpr_complex.cc

    r653440 r6a1aa7  
    444444      if (SR_HDL(num) & SR_INT)
    445445      {
    446         int nn = SR_TO_INT(num);
    447         if((long)nn == SR_TO_INT(num))
    448             r = SR_TO_INT(num);
    449         else
    450             r = gmp_float(SR_TO_INT(num));
     446        r = gmp_float(SR_TO_INT(num));
    451447      }
    452448      else
     
    458454        if (SR_HDL(num) & SR_INT)
    459455        {
    460           int nn = SR_TO_INT(num);
    461           if((long)nn == SR_TO_INT(num))
    462             r = SR_TO_INT(num);
    463           else
    464             r = gmp_float(SR_TO_INT(num));
     456          r = gmp_float(SR_TO_INT(num));
    465457        }
    466458        else
  • libpolys/coeffs/numbers.cc

    r653440 r6a1aa7  
    7979number ndFarey(number,number,const coeffs r)
    8080{
    81   Werror("farey not implemented for (c=%d)",getCoeffType(r));
     81  Werror("farey not implemented for %s (c=%d)",r->cfCoeffString(r),getCoeffType(r));
    8282  return NULL;
    8383}
    8484number ndChineseRemainder(number *,number *,int,BOOLEAN,const coeffs r)
    8585{
    86   Werror("ChineseRemainder not implemented for (c=%d)",getCoeffType(r));
     86  Werror("ChineseRemainder not implemented for %s (c=%d)",r->cfCoeffString(r),getCoeffType(r));
    8787  return n_Init(0,r);
    8888}
     
    243243{
    244244  Werror("no conversion from factory");
    245   return NULL;
    246 }
    247 
    248 number  ndInit_bigint(number, const coeffs, const coeffs)
    249 {
    250   Werror("no conversion from bigint to this field");
    251245  return NULL;
    252246}
     
    338332    n->cfGcd  = ndGcd;
    339333    n->cfLcm  = ndGcd; /* tricky, isn't it ?*/
    340     n->cfInit_bigint = ndInit_bigint;
    341334    n->cfInitMPZ = ndInitMPZ;
    342335    n->cfMPZ = ndMPZ;
  • libpolys/coeffs/rintegers.cc

    r653440 r6a1aa7  
    33****************************************/
    44/*
    5 * ABSTRACT: numbers modulo n
     5* ABSTRACT: numbers (integers)
    66*/
    77
     
    2929omBin gmp_nrz_bin = omGetSpecBin(sizeof(mpz_t));
    3030
     31#if SI_INTEGER_VARIANT == 2
    3132/*
    3233 * Multiply two numbers
     
    214215  mpz_init(r);
    215216  mpz_tdiv_qr(erg, r, (int_number) a, (int_number) b);
    216   if (!nrzIsZero((number) r, R))
    217   {
    218     WerrorS("Division by non divisible element.");
    219     WerrorS("Result is without remainder.");
    220   }
     217  //if (!nrzIsZero((number) r, R))
     218  //{
     219  //  WerrorS("Division by non divisible element.");
     220  //  WerrorS("Result is without remainder.");
     221  //}
    221222  mpz_clear(r);
    222223  omFreeBin(r, gmp_nrz_bin);
     
    408409  r->is_field=FALSE;
    409410  r->is_domain=TRUE;
     411  r->rep=n_rep_gmp;
    410412
    411413  r->nCoeffIsEqual = ndCoeffIsEqual;
     
    427429  r->cfExtGcd = nrzExtGcd; // only for ring stuff
    428430  r->cfDivBy = nrzDivBy; // only for ring stuff
    429   r->cfInit_bigint = nrzMapQ;
    430431  //#endif
    431432  r->cfInpNeg   = nrzNeg;
     
    460461}
    461462
    462 #endif
     463#elif SI_INTEGER_VARIANT == 3
     464
     465//make sure that a small number is an immediate integer
     466//bascially coped from longrat.cc nlShort3
     467//TODO: is there any point in checking 0 first???
     468//TODO: it is not clear that this works in 32/64 bit everywhere.
     469//      too many hacks.
     470#ifdef LDEBUG
     471#define nrzTest(A) nrzDBTest(A,__FILE__,__LINE__,NULL)
     472BOOLEAN nrzDBTest (number x, const char *f, const int l, const coeffs);
     473#else
     474#define nrzTest(A)
     475#endif
     476
     477#define CF_DEBUG 0
     478static inline number nrz_short(number x)
     479{
     480#if CF_DEBUG
     481  StringAppendS("short(");
     482  nrzWrite(x, NULL);
     483#endif
     484  if (mpz_cmp_ui((int_number) x,(long)0)==0)
     485  {
     486    mpz_clear((int_number)x);
     487    omFreeBin(x, gmp_nrz_bin);
     488#if CF_DEBUG
     489    StringAppendS(")=0");
     490#endif
     491    return INT_TO_SR(0);
     492  }
     493  if (mpz_size1((int_number)x)<=MP_SMALL)
     494  {
     495    int ui=mpz_get_si((int_number)x);
     496    if ((((ui<<3)>>3)==ui)
     497    && (mpz_cmp_si((int_number)x,(long)ui)==0))
     498    {
     499      mpz_clear((int_number)x);
     500      omFreeBin(x, gmp_nrz_bin);
     501#if CF_DEBUG
     502    StringAppendS(")=imm");
     503#endif
     504      return INT_TO_SR(ui);
     505    }
     506  }
     507#if CF_DEBUG
     508  StringAppendS(")");
     509#endif
     510  return x;
     511}
     512
     513
     514
     515
     516/*
     517 * Multiply two numbers
     518 * check for 0, 1, -1 maybe
     519 */
     520#if CF_DEBUG
     521number _nrzMult(number, number, const coeffs);
     522number nrzMult(number a, number b, const coeffs R)
     523{
     524  StringSetS("Mult: ");
     525  nrzWrite(a, R);
     526  StringAppendS(" by ");
     527  nrzWrite(b, R);
     528  number c = _nrzMult(a, b, R);
     529  StringAppendS(" is ");
     530  nrzWrite(c, R);
     531  char * s = StringEndS();
     532  Print("%s\n", s);
     533  omFree(s);
     534  return c;
     535}
     536number _nrzMult (number a, number b, const coeffs R)
     537#else
     538number nrzMult (number a, number b, const coeffs R)
     539#endif
     540{
     541  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b)) {
     542  //from longrat.cc
     543    if (SR_TO_INT(a)==0)
     544      return a;
     545    if (SR_TO_INT(b)==0)
     546      return b;
     547    long r=(long)((unsigned long)(SR_HDL(a)-1L))*((unsigned long)(SR_HDL(b)>>1));
     548    if ((r/(SR_HDL(b)>>1))==(SR_HDL(a)-1L))
     549    {
     550      number u=((number) ((r>>1)+SR_INT));
     551    //  if (((((long)SR_HDL(u))<<1)>>1)==SR_HDL(u)) return (u);
     552      return nrzInit(SR_HDL(u)>>2, R);
     553    }
     554    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     555    mpz_init(erg);
     556    mpz_set_si(erg, SR_TO_INT(a));
     557    mpz_mul_si(erg, erg, SR_TO_INT(b));
     558    nrzTest((number)erg);
     559    return (number) erg;
     560  }
     561  else if (n_Z_IS_SMALL(a))
     562  {
     563    if (SR_TO_INT(a)==0)
     564      return a;
     565    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     566    mpz_init_set(erg, (int_number) b);
     567    mpz_mul_si(erg, erg, SR_TO_INT(a));
     568    nrzTest((number)erg);
     569    return (number) erg;
     570  }
     571  else if (n_Z_IS_SMALL(b))
     572  {
     573    if (SR_TO_INT(b)==0)
     574      return b;
     575    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     576    mpz_init_set(erg, (int_number) a);
     577    mpz_mul_si(erg, erg, SR_TO_INT(b));
     578    nrzTest((number)erg);
     579    return (number) erg;
     580  }
     581  else
     582  {
     583    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     584    mpz_init(erg);
     585    mpz_mul(erg, (int_number) a, (int_number) b);
     586    nrzTest((number)erg);
     587    return (number) erg;
     588  }
     589}
     590
     591
     592static int int_gcd(int a, int b)
     593{
     594  int r;
     595  a = ABS(a);
     596  b = ABS(b);
     597  if (!a) return b;
     598  if (!b) return a;
     599  do
     600  {
     601    r = a % b;
     602    a = b;
     603    b = r;
     604  } while (b);
     605  return ABS(a); // % in c doeas not imply a signn
     606                 // it would be unlikely to see a negative here
     607                 // but who knows
     608}
     609
     610/*
     611 * Give the smallest non unit k, such that a * x = k = b * y has a solution
     612 */
     613number nrzLcm (number a, number b, const coeffs R)
     614{
     615  PrintS("nrzLcm\n");
     616  int_number erg;
     617  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
     618  {
     619    int g = int_gcd(SR_TO_INT(a), SR_TO_INT(b));
     620    return nrzMult(a, INT_TO_SR(SR_TO_INT(b)/g), R);
     621  }
     622  else if (n_Z_IS_SMALL(a))
     623  {
     624    erg = (int_number) omAllocBin(gmp_nrz_bin);
     625    mpz_init_set(erg, (int_number) b);
     626    unsigned long g = mpz_gcd_ui(NULL, erg, (unsigned long) ABS(SR_TO_INT(a)));
     627    mpz_mul_si(erg, erg, SR_TO_INT(a)/g);
     628  }
     629  else if (n_Z_IS_SMALL(b))
     630  {
     631    erg = (int_number) omAllocBin(gmp_nrz_bin);
     632    mpz_init_set(erg, (int_number) a);
     633    unsigned long g = mpz_gcd_ui(NULL, erg, (unsigned long) ABS(SR_TO_INT(b)));
     634    mpz_mul_si(erg, erg, SR_TO_INT(b)/g);
     635  }
     636  else
     637  {
     638    erg = (int_number) omAllocBin(gmp_nrz_bin);
     639    mpz_init(erg);
     640    mpz_lcm(erg, (int_number) a, (int_number) b);
     641  }
     642  return (number) erg;
     643}
     644
     645/*
     646 * Give the largest non unit k, such that a = x * k, b = y * k has
     647 * a solution.
     648 */
     649number nrzGcd (number a,number b,const coeffs R)
     650{
     651  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
     652  {
     653    int g = int_gcd(SR_TO_INT(a), SR_TO_INT(b));
     654    return INT_TO_SR(g);
     655  }
     656  else if (n_Z_IS_SMALL(a))
     657  {
     658    if (a==INT_TO_SR(0))
     659      return nrzCopy(b, R);
     660    unsigned long g = mpz_gcd_ui(NULL, (int_number)b, (unsigned long) ABS(SR_TO_INT(a)));
     661    return INT_TO_SR( g);
     662  }
     663  else if (n_Z_IS_SMALL(b))
     664  {
     665    if (b==INT_TO_SR(0))
     666      return nrzCopy(a, R);
     667    unsigned long g = mpz_gcd_ui(NULL, (int_number)a, (unsigned long) ABS(SR_TO_INT(b)));
     668    return INT_TO_SR(g);
     669  }
     670  else
     671  {
     672    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     673    mpz_init(erg);
     674    mpz_gcd(erg, (int_number) a, (int_number) b);
     675    return (number) erg;
     676  }
     677}
     678
     679/*
     680 * Give the largest non unit k, such that a = x * k, b = y * k has
     681 * a solution and r, s, s.t. k = s*a + t*b
     682 */
     683static int int_extgcd(int a, int b, int * u, int* x, int * v, int* y)
     684{
     685  int q, r;
     686  if (!a)
     687  {
     688    *u = 0;
     689    *v = 1;
     690    *x = -1;
     691    *y = 0;
     692    return b;
     693  }
     694  if (!b)
     695  {
     696    *u = 1;
     697    *v = 0;
     698    *x = 0;
     699    *y = 1;
     700    return a;
     701  }
     702  *u=1;
     703  *v=0;
     704  *x=0;
     705  *y=1;
     706  do
     707  {
     708    q = a/b;
     709    r = a%b;
     710    assume (q*b+r == a);
     711    a = b;
     712    b = r;
     713
     714    r = -(*v)*q+(*u);
     715    (*u) =(*v);
     716    (*v) = r;
     717
     718    r = -(*y)*q+(*x);
     719    (*x) = (*y);
     720    (*y) = r;
     721  } while (b);
     722
     723  return a;
     724}
     725
     726number  nrzExtGcd (number a, number b, number *s, number *t, const coeffs)
     727{
     728  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
     729  {
     730    int u, v, x, y;
     731    int g = int_extgcd(SR_TO_INT(a), SR_TO_INT(b), &u, &v, &x, &y);
     732    *s = INT_TO_SR(u);
     733    *t = INT_TO_SR(v);
     734    return INT_TO_SR(g);
     735  }
     736  else
     737  {
     738    mpz_t aa, bb;
     739    if (n_Z_IS_SMALL(a))
     740    {
     741      mpz_init_set_si(aa, SR_TO_INT(a));
     742    }
     743    else
     744    {
     745      mpz_init_set(aa, (int_number) a);
     746    }
     747    if (n_Z_IS_SMALL(b))
     748    {
     749      mpz_init_set_si(bb, SR_TO_INT(b));
     750    }
     751    else
     752    {
     753      mpz_init_set(bb, (int_number) b);
     754    }
     755    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     756    int_number bs = (int_number) omAllocBin(gmp_nrz_bin);
     757    int_number bt = (int_number) omAllocBin(gmp_nrz_bin);
     758    mpz_init(erg);
     759    mpz_init(bs);
     760    mpz_init(bt);
     761    mpz_gcdext(erg, bs, bt, aa, bb);
     762    *s = nrz_short((number) bs);
     763    *t = nrz_short((number) bt);
     764    mpz_clear(aa);
     765    mpz_clear(bb);
     766    return nrz_short((number) erg);
     767  }
     768}
     769#if CF_DEBUG
     770number _nrzXExtGcd(number, number, number *, number *, number *, number *, const coeffs);
     771number nrzXExtGcd(number a, number b, number *x, number * y, number * u, number * v, const coeffs R)
     772{
     773  char * s;
     774  StringSetS("XExtGcd: ");
     775  nrzWrite(a, R);
     776  StringAppendS(" by ");
     777  nrzWrite(b, R);
     778  number c = _nrzXExtGcd(a, b, x, y, u, v, R);
     779  StringAppendS(" is ");
     780  nrzWrite(c, R);
     781  StringAppendS("[[");
     782  nrzWrite(*x, R);
     783  StringAppendS(", ");
     784  nrzWrite(*y, R);
     785  StringAppendS("], ");
     786  nrzWrite(*u, R);
     787  StringAppendS(", ");
     788  nrzWrite(*v, R);
     789  s=StringEndS();
     790  Print("%s]]\n", s);
     791  omFree(s);
     792  return c;
     793}
     794number  _nrzXExtGcd (number a, number b, number *s, number *t, number *u, number *v, const coeffs )
     795#else
     796number  nrzXExtGcd (number a, number b, number *s, number *t, number *u, number *v, const coeffs )
     797#endif
     798{
     799  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
     800  {
     801    int uu, vv, x, y;
     802    int g = int_extgcd(SR_TO_INT(a), SR_TO_INT(b), &uu, &vv, &x, &y);
     803    *s = INT_TO_SR(uu);
     804    *t = INT_TO_SR(vv);
     805    *u = INT_TO_SR(x);
     806    *v = INT_TO_SR(y);
     807    return INT_TO_SR(g);
     808  }
     809  else
     810  {
     811    mpz_t aa, bb;
     812    if (n_Z_IS_SMALL(a))
     813    {
     814      mpz_init_set_si(aa, SR_TO_INT(a));
     815    }
     816    else
     817    {
     818      mpz_init_set(aa, (int_number) a);
     819    }
     820    if (n_Z_IS_SMALL(b))
     821    {
     822      mpz_init_set_si(bb, SR_TO_INT(b));
     823    }
     824    else
     825    {
     826      mpz_init_set(bb, (int_number) b);
     827    }
     828    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     829    int_number bs = (int_number) omAllocBin(gmp_nrz_bin);
     830    int_number bt = (int_number) omAllocBin(gmp_nrz_bin);
     831    mpz_init(erg);
     832    mpz_init(bs);
     833    mpz_init(bt);
     834
     835    mpz_gcdext(erg, bs, bt, aa, bb);
     836
     837    int_number bu = (int_number) omAllocBin(gmp_nrz_bin);
     838    int_number bv = (int_number) omAllocBin(gmp_nrz_bin);
     839
     840    mpz_init_set(bu, (int_number) bb);
     841    mpz_init_set(bv, (int_number) aa);
     842
     843    mpz_clear(aa);
     844    mpz_clear(bb);
     845    assume(mpz_cmp_si(erg, 0));
     846
     847    mpz_div(bu, bu, erg);
     848    mpz_div(bv, bv, erg);
     849
     850    mpz_mul_si(bu, bu, -1);
     851    *u = nrz_short((number) bu);
     852    *v = nrz_short((number) bv);
     853
     854    *s = nrz_short((number) bs);
     855    *t = nrz_short((number) bt);
     856    return nrz_short((number) erg);
     857  }
     858}
     859#if CF_DEBUG
     860number _nrzQuotRem(number, number, number *, const coeffs);
     861number nrzQuotRem(number a, number b, number * r, const coeffs R)
     862{
     863  StringSetS("QuotRem: ");
     864  nrzWrite(a, R);
     865  StringAppendS(" by ");
     866  nrzWrite(b, R);
     867  number c = _nrzQuotRem(a, b, r, R);
     868  StringAppendS(" is ");
     869  nrzWrite(c, R);
     870  if (r) {
     871    StringAppendS("+R(");
     872    nrzWrite(*r, R);
     873    StringAppendS(")");
     874  }
     875  char * s = StringEndS();
     876  Print("%s\n", s);
     877  omFree(s);
     878  return c;
     879}
     880number _nrzQuotRem (number a, number b, number * r, const coeffs )
     881#else
     882number nrzQuotRem (number a, number b, number * r, const coeffs )
     883#endif
     884{
     885  assume(SR_TO_INT(b));
     886  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
     887  {
     888    if (r)
     889      *r = INT_TO_SR(SR_TO_INT(a) % SR_TO_INT(b));
     890    return INT_TO_SR(SR_TO_INT(a)/SR_TO_INT(b));
     891  }
     892  else if (n_Z_IS_SMALL(a))
     893  {
     894    //a is small, b is not, so q=0, r=a
     895    if (r)
     896      *r = a;
     897    return INT_TO_SR(0);
     898  }
     899  else if (n_Z_IS_SMALL(b))
     900  {
     901    unsigned long rr;
     902    int_number qq = (int_number) omAllocBin(gmp_nrz_bin);
     903    mpz_init(qq);
     904    mpz_t rrr;
     905    mpz_init(rrr);
     906    rr = mpz_divmod_ui(qq, rrr, (int_number) a, (unsigned long)ABS(SR_TO_INT(b)));
     907    mpz_clear(rrr);
     908
     909    if (r)
     910      *r = INT_TO_SR(rr);
     911    if (SR_TO_INT(b)<0)
     912    {
     913      mpz_mul_si(qq, qq, -1);
     914    }
     915    return nrz_short((number)qq);
     916  }
     917  int_number qq = (int_number) omAllocBin(gmp_nrz_bin),
     918             rr = (int_number) omAllocBin(gmp_nrz_bin);
     919  mpz_init(qq);
     920  mpz_init(rr);
     921  mpz_divmod(qq, rr, (int_number)a, (int_number)b);
     922  if (r)
     923    *r = (number) rr;
     924  else
     925  {
     926    mpz_clear(rr);
     927  }
     928  nrzTest((number)qq);
     929  return (number) qq;
     930}
     931
     932
     933void nrzPower (number a, int i, number * result, const coeffs)
     934{
     935  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     936  mpz_init(erg);
     937  mpz_t aa;
     938  if (n_Z_IS_SMALL(a))
     939    mpz_init_set_si(aa, SR_TO_INT(a));
     940  else
     941    mpz_init_set(aa, (int_number) a);
     942  mpz_pow_ui(erg, aa, i);
     943  *result = nrz_short((number) erg);
     944}
     945
     946/*
     947 * create a number from int
     948 * TODO: do not create an mpz if not necessary
     949 */
     950number nrzInit (long i, const coeffs)
     951{
     952  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     953  mpz_init_set_si(erg, i);
     954  return nrz_short((number) erg);
     955}
     956
     957void nrzDelete(number *a, const coeffs)
     958{
     959  if (*a == NULL) return;
     960  if (n_Z_IS_SMALL(*a)==0)
     961  {
     962    mpz_clear((int_number) *a);
     963    omFreeBin((ADDRESS) *a, gmp_nrz_bin);
     964  }
     965  *a = NULL;
     966}
     967
     968number nrzCopy(number a, const coeffs)
     969{
     970  if (n_Z_IS_SMALL(a)) return a;
     971  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     972  mpz_init_set(erg, (int_number) a);
     973  return (number) erg;
     974}
     975
     976int nrzSize(number a, const coeffs)
     977{
     978  if (a == NULL) return 0;
     979  if (n_Z_IS_SMALL(a)) return 1;
     980  return mpz_size1((int_number)a)+1;
     981}
     982
     983/*
     984 * convert a number to int
     985 */
     986int nrzInt(number &n, const coeffs)
     987{
     988  if (n_Z_IS_SMALL(n)) return SR_TO_INT(n);
     989  return (int) mpz_get_si( (int_number)n);
     990}
     991#if CF_DEBUG
     992number _nrzAdd(number, number, const coeffs);
     993number nrzAdd(number a, number b, const coeffs R)
     994{
     995  StringSetS("Add: ");
     996  nrzWrite(a, R);
     997  StringAppendS(" to ");
     998  nrzWrite(b, R);
     999  number c = _nrzAdd(a, b, R);
     1000  StringAppendS(" is ");
     1001  nrzWrite(c, R);
     1002  char * s = StringEndS();
     1003  Print("%s\n", s);
     1004  omFree(s);
     1005  return c;
     1006}
     1007number _nrzAdd (number a, number b, const coeffs R)
     1008#else
     1009number nrzAdd (number a, number b, const coeffs R)
     1010#endif
     1011{
     1012  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
     1013  {
     1014    int c = SR_TO_INT(a) + SR_TO_INT(b);
     1015    if (INT_IS_SMALL(c))
     1016      return INT_TO_SR(c);
     1017    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1018    mpz_init_set_si(erg, c);
     1019
     1020    nrzTest((number)erg);
     1021    return (number) erg;
     1022  }
     1023  else if (n_Z_IS_SMALL(a))
     1024  {
     1025    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1026    mpz_init(erg);
     1027    if (SR_TO_INT(a)>0)
     1028      mpz_add_ui(erg, (int_number) b, (unsigned long)SR_TO_INT(a));
     1029    else
     1030      mpz_sub_ui(erg, (int_number) b, (unsigned long)-(SR_TO_INT(a)));
     1031    return nrz_short((number) erg);
     1032  }
     1033  else if (n_Z_IS_SMALL(b))
     1034  {
     1035    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1036    mpz_init(erg);
     1037    if (SR_TO_INT(b)>0)
     1038      mpz_add_ui(erg, (int_number) a, (unsigned long)SR_TO_INT(b));
     1039    else
     1040      mpz_sub_ui(erg, (int_number) a, (unsigned long)-(SR_TO_INT(b)));
     1041    return nrz_short((number) erg);
     1042  }
     1043  else
     1044  {
     1045    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1046    mpz_init(erg);
     1047    mpz_add(erg, (int_number) a, (int_number) b);
     1048    return nrz_short((number) erg);
     1049  }
     1050}
     1051
     1052number nrzSub (number a, number b, const coeffs)
     1053{
     1054  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
     1055  {
     1056    int c = SR_TO_INT(a) - SR_TO_INT(b);
     1057    if (INT_IS_SMALL(c))
     1058      return INT_TO_SR(c);
     1059    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1060    mpz_init_set_si(erg, c);
     1061    nrzTest((number)erg);
     1062    return (number) erg;
     1063  }
     1064  else if (n_Z_IS_SMALL(a))
     1065  {
     1066    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1067    mpz_init(erg);
     1068
     1069    if (SR_TO_INT(a)>0)
     1070      mpz_ui_sub(erg, (unsigned long)SR_TO_INT(a), (int_number) b);
     1071    else
     1072    {
     1073      mpz_add_ui(erg, (int_number) b, (unsigned long)-SR_TO_INT(a));
     1074      mpz_neg(erg, erg);
     1075    }
     1076    return nrz_short((number) erg);
     1077  }
     1078  else if (n_Z_IS_SMALL(b))
     1079  {
     1080    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1081    mpz_init(erg);
     1082    if (INT_TO_SR(b)>0)
     1083      mpz_sub_ui(erg, (int_number) a, (unsigned long)SR_TO_INT(b));
     1084    else
     1085      mpz_add_ui(erg, (int_number) a, (unsigned long)-SR_TO_INT(b));
     1086    return nrz_short((number) erg);
     1087  }
     1088  else
     1089  {
     1090    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1091    mpz_init(erg);
     1092    mpz_sub(erg, (int_number) a, (int_number) b);
     1093    return nrz_short((number) erg);
     1094  }
     1095}
     1096
     1097number  nrzGetUnit (number n, const coeffs r)
     1098{
     1099  //if (n_Z_IS_SMALL(n))
     1100  //{
     1101  //  if (SR_TO_INT(n)<0)
     1102  //    return INT_TO_SR(-1);
     1103  //  else
     1104  //    return INT_TO_SR(1);
     1105  //}
     1106  if (nrzGreaterZero(n, r))
     1107    return INT_TO_SR(1);
     1108  else
     1109    return INT_TO_SR(-1);
     1110}
     1111
     1112number nrzAnn(number n, const coeffs)
     1113{
     1114  if (SR_TO_INT(n))  // in Z: the annihilator of !=0 is 0
     1115    return INT_TO_SR(0);
     1116  else
     1117    return INT_TO_SR(1);
     1118}
     1119
     1120BOOLEAN nrzIsUnit (number a, const coeffs)
     1121{
     1122  return ABS(SR_TO_INT(a))==1;
     1123}
     1124
     1125BOOLEAN nrzIsZero (number  a, const coeffs)
     1126{
     1127  return a==INT_TO_SR(0);
     1128}
     1129
     1130BOOLEAN nrzIsOne (number a, const coeffs)
     1131{
     1132  return a==INT_TO_SR(1);
     1133}
     1134
     1135BOOLEAN nrzIsMOne (number a, const coeffs)
     1136{
     1137  return a==INT_TO_SR(-1);
     1138}
     1139
     1140BOOLEAN nrzEqual (number a,number b, const coeffs)
     1141{
     1142  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
     1143    return a==b;
     1144  else if (n_Z_IS_SMALL(a) || n_Z_IS_SMALL(b))
     1145    return FALSE;
     1146  else
     1147    return 0 == mpz_cmp((int_number) a, (int_number) b);
     1148}
     1149
     1150BOOLEAN nrzGreater (number a,number b, const coeffs)
     1151{
     1152  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
     1153    return ((long)a)>((long)b);
     1154  else if (n_Z_IS_SMALL(a))
     1155    return 0 > mpz_cmp_si((int_number)b,SR_TO_INT(a));
     1156  else if (n_Z_IS_SMALL(b))
     1157    return 0 < mpz_cmp_si((int_number)a,SR_TO_INT(b));
     1158  return 0 < mpz_cmp((int_number) a, (int_number) b);
     1159}
     1160
     1161BOOLEAN nrzGreaterZero (number k, const coeffs C)
     1162{
     1163  return nrzGreater(k, INT_TO_SR(0), C);
     1164}
     1165
     1166int nrzDivComp(number a, number b, const coeffs r)
     1167{
     1168  if (nrzDivBy(a, b, r))
     1169  {
     1170    if (nrzDivBy(b, a, r)) return 2;
     1171    return -1;
     1172  }
     1173  if (nrzDivBy(b, a, r)) return 1;
     1174  return 0;
     1175}
     1176
     1177BOOLEAN nrzDivBy (number a,number b, const coeffs)
     1178{
     1179  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
     1180  {
     1181    return SR_TO_INT(a) %SR_TO_INT(b) ==0;
     1182  }
     1183  else if (n_Z_IS_SMALL(a))
     1184  {
     1185    return a==INT_TO_SR(0);
     1186  }
     1187  else if (n_Z_IS_SMALL(b))
     1188  {
     1189    return mpz_divisible_ui_p((int_number)a, (unsigned long)ABS(SR_TO_INT(b))) != 0;
     1190  }
     1191  else
     1192    return mpz_divisible_p((int_number) a, (int_number) b) != 0;
     1193}
     1194
     1195number nrzDiv (number a,number b, const coeffs R)
     1196{
     1197  assume(SR_TO_INT(b));
     1198  if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b))
     1199  {
     1200    //if (SR_TO_INT(a) % SR_TO_INT(b))
     1201    //{
     1202    //  WerrorS("1:Division by non divisible element.");
     1203    //  WerrorS("Result is without remainder.");
     1204    //}
     1205    return INT_TO_SR(SR_TO_INT(a)/SR_TO_INT(b));
     1206  }
     1207  else if (n_Z_IS_SMALL(a))
     1208  {
     1209    //if (SR_TO_INT(a))
     1210    //{
     1211    //  WerrorS("2:Division by non divisible element.");
     1212    //  WerrorS("Result is without remainder.");
     1213    //}
     1214    return INT_TO_SR(0);
     1215  }
     1216  else if (n_Z_IS_SMALL(b))
     1217  {
     1218    int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1219    mpz_t r;
     1220    mpz_init(r);
     1221    mpz_init(erg);
     1222    if (mpz_divmod_ui(erg, r, (int_number) a, (unsigned long)ABS(SR_TO_INT(b)))) {
     1223    //  WerrorS("3:Division by non divisible element.");
     1224    //  WerrorS("Result is without remainder.");
     1225    }
     1226    mpz_clear(r);
     1227    if (SR_TO_INT(b)<0)
     1228      mpz_neg(erg, erg);
     1229    return nrz_short((number) erg);
     1230  }
     1231  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1232  mpz_init(erg);
     1233  mpz_t r;
     1234  mpz_init(r);
     1235  mpz_tdiv_qr(erg, r, (int_number) a, (int_number) b);
     1236#if CF_DEBUG
     1237  StringSetS("division of");
     1238  nrzWrite(a, R);
     1239  StringAppendS(" by ");
     1240  nrzWrite(b, R);
     1241  StringAppendS(" is ");
     1242  number du;
     1243  nrzWrite(du = (number)erg, R);
     1244  StringAppendS(" rest ");
     1245  nrzWrite(du = (number)r, R);
     1246  char * s = StringEndS();
     1247  Print("%s\n", s);
     1248  omFree(s);
     1249#endif
     1250
     1251  if (mpz_cmp_si(r, 0)!=0)
     1252  {
     1253    //WerrorS("4:Division by non divisible element.");
     1254    //WerrorS("Result is without remainder.");
     1255  }
     1256  mpz_clear(r);
     1257  return nrz_short((number) erg);
     1258}
     1259
     1260number nrzExactDiv (number a,number b, const coeffs)
     1261{
     1262  assume(SR_TO_INT(b));
     1263  mpz_t aa, bb;
     1264  if (n_Z_IS_SMALL(a))
     1265    mpz_init_set_si(aa, SR_TO_INT(a));
     1266  else
     1267    mpz_init_set(aa, (int_number) a);
     1268  if (n_Z_IS_SMALL(b))
     1269    mpz_init_set_si(bb, SR_TO_INT(b));
     1270  else
     1271    mpz_init_set(bb, (int_number) b);
     1272  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1273  mpz_init(erg);
     1274  mpz_tdiv_q(erg, (int_number) aa, (int_number) bb);
     1275  mpz_clear(aa);
     1276  mpz_clear(bb);
     1277  nrzTest((number)erg);
     1278  return (number) erg;
     1279}
     1280
     1281number nrzIntMod (number a,number b, const coeffs)
     1282{
     1283  mpz_t aa, bb;
     1284  assume(SR_TO_INT(b));
     1285  if (n_Z_IS_SMALL(a))
     1286    mpz_init_set_si(aa, SR_TO_INT(a));
     1287  else
     1288    mpz_init_set(aa, (int_number) a);
     1289  if (n_Z_IS_SMALL(b))
     1290    mpz_init_set_si(bb, SR_TO_INT(b));
     1291  else
     1292    mpz_init_set(bb, (int_number) b);
     1293
     1294  mpz_t erg;
     1295  mpz_init(erg);
     1296  int_number r = (int_number) omAllocBin(gmp_nrz_bin);
     1297  mpz_init(r);
     1298  mpz_tdiv_qr(erg, r, (int_number) aa, (int_number) bb);
     1299  mpz_clear(erg);
     1300  mpz_clear(aa);
     1301  mpz_clear(bb);
     1302 
     1303  return nrz_short((number) r);
     1304}
     1305
     1306number  nrzInvers (number c, const coeffs r)
     1307{
     1308  if (!nrzIsUnit((number) c, r))
     1309  {
     1310    WerrorS("Non invertible element.");
     1311    return (number)0; //TODO
     1312  }
     1313  return c; // has to be 1 or -1....
     1314}
     1315
     1316number nrzNeg (number c, const coeffs)
     1317{
     1318// nNeg inplace !!!
     1319  if (n_Z_IS_SMALL(c))
     1320    return INT_TO_SR(-SR_TO_INT(c));
     1321  mpz_mul_si((int_number) c, (int_number) c, -1);
     1322  return c;
     1323}
     1324
     1325static number nrzFarey(number r, number N, const coeffs R)
     1326{
     1327  number a0 = nrzCopy(N, R);
     1328  number b0 = nrzInit(0, R);
     1329  number a1 = nrzCopy(r, R);
     1330  number b1 = nrzInit(1, R);
     1331  number two = nrzInit(2, R);
     1332#if 0
     1333  Print("Farey start with ");
     1334  n_Print(r, R);
     1335  Print(" mod ");
     1336  n_Print(N, R);
     1337  Print("\n");
     1338#endif
     1339  while (1)
     1340  {
     1341    number as = nrzMult(a1, a1, R);
     1342    n_InpMult(as, two, R);
     1343    if (nrzGreater(N, as, R))
     1344    {
     1345      nrzDelete(&as, R);
     1346      break;
     1347    }
     1348    nrzDelete(&as, R);
     1349    number q = nrzDiv(a0, a1, R);
     1350    number t = nrzMult(a1, q, R),
     1351           s = nrzSub(a0, t, R);
     1352    nrzDelete(&a0, R);
     1353    a0 = a1;
     1354    a1 = s;
     1355    nrzDelete(&t, R);
     1356
     1357    t = nrzMult(b1, q, R);
     1358    s = nrzSub(b0, t, R);
     1359    nrzDelete(&b0, R);
     1360    b0 = b1;
     1361    b1 = s;
     1362    nrzDelete(&t, R);
     1363    nrzDelete(&q, R);
     1364  }
     1365  number as = nrzMult(b1, b1, R);
     1366  n_InpMult(as, two, R);
     1367  nrzDelete(&two, R);
     1368  if (nrzGreater(as, N, R))
     1369  {
     1370    nrzDelete(&a0, R);
     1371    nrzDelete(&a1, R);
     1372    nrzDelete(&b0, R);
     1373    nrzDelete(&b1, R);
     1374    nrzDelete(&as, R);
     1375    return NULL;
     1376  }
     1377  nrzDelete(&as, R);
     1378  nrzDelete(&a0, R);
     1379  nrzDelete(&b0, R);
     1380
     1381  number a, b, ab;
     1382  coeffs Q = nInitChar(n_Q, 0);
     1383  nMapFunc f = n_SetMap(R, Q);
     1384  a = f(a1, R, Q);
     1385  b = f(b1, R, Q);
     1386  ab = n_Div(a, b, Q);
     1387  n_Delete(&a, Q);
     1388  n_Delete(&b, Q);
     1389  nKillChar(Q);
     1390
     1391  nrzDelete(&a1, R);
     1392  nrzDelete(&b1, R);
     1393  return ab;
     1394}
     1395
     1396number nrzMapMachineInt(number from, const coeffs /*src*/, const coeffs /*dst*/)
     1397{
     1398  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1399  mpz_init_set_ui(erg, (NATNUMBER) from);
     1400  return nrz_short((number) erg);
     1401}
     1402
     1403number nrzMapZp(number from, const coeffs /*src*/, const coeffs /*dst*/)
     1404{
     1405  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1406  mpz_init_set_si(erg, (long) from);
     1407  return nrz_short((number) erg);
     1408}
     1409
     1410number nrzModNMap(number from, const coeffs src, const coeffs /*dst*/)
     1411{
     1412  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1413  mpz_init_set(erg, (int_number) from);
     1414  return nrz_short((number) erg);
     1415}
     1416
     1417number nrzMapQ(number from, const coeffs src, const coeffs dst)
     1418{
     1419  if (SR_HDL(from) & SR_INT)
     1420    return nrzInit(SR_TO_INT(from),dst);
     1421  if (from->s!=3)
     1422  {
     1423    WerrorS("rational in map to integer");
     1424    return NULL;
     1425  }
     1426  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
     1427  mpz_init_set(erg, from->z);
     1428  return nrz_short((number) erg);
     1429}
     1430
     1431nMapFunc nrzSetMap(const coeffs src, const coeffs /*dst*/)
     1432{
     1433  /* dst = rintegers */
     1434  if (src->rep==n_rep_gmp) //nCoeff_is_Ring_ModN(src) || nCoeff_is_Ring_PtoM(src))
     1435    return nrzModNMap;
     1436
     1437  if ((src->rep==n_rep_gap_gmp) && nCoeff_is_Ring_Z(src))
     1438  {
     1439    return ndCopyMap; //nrzCopyMap;
     1440  }
     1441  if (src->rep==n_rep_gap_rat) /*&& nCoeff_is_Ring_Z(src)) Q, bigint*/
     1442  {
     1443    return nrzMapQ;
     1444  }
     1445  if ((src->rep=n_rep_int) && nCoeff_is_Ring_2toM(src))
     1446  {
     1447    return nrzMapMachineInt;
     1448  }
     1449  if ((src->rep=n_rep_int) && nCoeff_is_Zp(src))
     1450  {
     1451    return nrzMapZp;
     1452  }
     1453  return NULL;      // default
     1454}
     1455
     1456
     1457/*
     1458 * set the exponent (allocate and init tables) (TODO)
     1459 */
     1460
     1461void nrzSetExp(int, coeffs)
     1462{
     1463}
     1464
     1465void nrzInitExp(int, coeffs)
     1466{
     1467}
     1468
     1469#ifdef LDEBUG
     1470BOOLEAN nrzDBTest (number x, const char *f, const int l, const coeffs)
     1471{
     1472  if (SR_HDL(x) & SR_INT) return TRUE;
     1473  if (mpz_cmp_ui((int_number) x,(long)0)==0)
     1474  {
     1475    Print("gmp-0 %s:%d\n",f,l);
     1476    return FALSE;
     1477  }
     1478  if (mpz_size1((int_number)x)<=MP_SMALL)
     1479  {
     1480    int ui=mpz_get_si((int_number)x);
     1481    if ((((ui<<3)>>3)==ui)
     1482    && (mpz_cmp_si((int_number)x,(long)ui)==0))
     1483    {
     1484      Print("gmp-small %s:%d\n",f,l);
     1485      return FALSE;
     1486    }
     1487  }
     1488  return TRUE;
     1489}
     1490#endif
     1491
     1492void nrzWrite (number &a, const coeffs)
     1493{
     1494  char *s,*z;
     1495  if (a==NULL)
     1496  {
     1497    StringAppendS("o");
     1498  }
     1499  else
     1500  {
     1501    if (n_Z_IS_SMALL(a))
     1502    {
     1503      StringAppend("%d", SR_TO_INT(a));
     1504    }
     1505    else
     1506    {
     1507      int l=mpz_sizeinbase((int_number) a, 10) + 2;
     1508      s=(char*)omAlloc(l);
     1509      z=mpz_get_str(s,10,(int_number) a);
     1510      StringAppendS(z);
     1511      omFreeSize((ADDRESS)s,l);
     1512    }
     1513  }
     1514}
     1515
     1516/*2
     1517* extracts a long integer from s, returns the rest    (COPY FROM longrat0.cc)
     1518*/
     1519static const char * nlEatLongC(char *s, mpz_ptr i)
     1520{
     1521  const char * start=s;
     1522
     1523  if (*s<'0' || *s>'9')
     1524  {
     1525    mpz_set_si(i,1);
     1526    return s;
     1527  }
     1528  while (*s >= '0' && *s <= '9') s++;
     1529  if (*s=='\0')
     1530  {
     1531    mpz_set_str(i,start,10);
     1532  }
     1533  else
     1534  {
     1535    char c=*s;
     1536    *s='\0';
     1537    mpz_set_str(i,start,10);
     1538    *s=c;
     1539  }
     1540  return s;
     1541}
     1542
     1543const char * nrzRead (const char *s, number *a, const coeffs)
     1544{
     1545  int_number z = (int_number) omAllocBin(gmp_nrz_bin);
     1546  {
     1547    mpz_init(z);
     1548    s = nlEatLongC((char *) s, z);
     1549  }
     1550  *a = nrz_short((number) z);
     1551  return s;
     1552}
     1553
     1554void    nrzCoeffWrite  (const coeffs, BOOLEAN /*details*/)
     1555{
     1556  //PrintS("// ZZ\n");
     1557  PrintS("//   coeff. ring is : Integers\n");
     1558}
     1559
     1560static char* nrzCoeffString(const coeffs)
     1561{
     1562  return omStrDup("integer");
     1563}
     1564
     1565static CanonicalForm nrzConvSingNFactoryN( number n, BOOLEAN setChar, const coeffs /*r*/ )
     1566{
     1567  if (setChar) setCharacteristic( 0 );
     1568
     1569  CanonicalForm term;
     1570  if ( n_Z_IS_SMALL(n))
     1571  {
     1572    term = SR_TO_INT(n);
     1573  }
     1574  else
     1575  {
     1576    mpz_t dummy;
     1577    mpz_init_set( dummy,n->z );
     1578    term = make_cf( dummy );
     1579  }
     1580  return term;
     1581}
     1582
     1583static number nrzConvFactoryNSingN( const CanonicalForm n, const coeffs r)
     1584{
     1585  if (n.isImm())
     1586  {
     1587    return nrzInit(n.intval(),r);
     1588  }
     1589  else
     1590  {
     1591    if ( !n.den().isOne() )
     1592    {
     1593     WerrorS("rational in conversion to integer");
     1594     return NULL;
     1595    }
     1596    int_number z = (int_number) omAlloc0Bin(gmp_nrz_bin);
     1597    gmp_numerator( n,z);
     1598    return nrz_short((number)z);
     1599  }
     1600}
     1601
     1602static void nrzMPZ(mpz_t res, number &a, const coeffs)
     1603{
     1604  if (n_Z_IS_SMALL(a))
     1605    mpz_init_set_si(res, SR_TO_INT(a));
     1606  else
     1607    mpz_init_set(res, (int_number) a);
     1608}
     1609
     1610coeffs nrzQuot1(number c, const coeffs r)
     1611{
     1612    int_number dummy;
     1613    dummy = (int_number) omAlloc(sizeof(mpz_t));
     1614    if(n_Z_IS_SMALL(c))
     1615    {
     1616      int ch = r->cfInt(c, r);
     1617      mpz_init_set_ui(dummy, ch);
     1618    }
     1619    else
     1620    {
     1621      mpz_init_set(dummy, (int_number)c);
     1622    }
     1623    ZnmInfo info;
     1624    info.base = dummy;
     1625    info.exp = (unsigned long) 1;
     1626    coeffs rr = nInitChar(n_Zn, (void*)&info);
     1627    return(rr);
     1628}
     1629
     1630BOOLEAN nrzInitChar(coeffs r,  void *)
     1631{
     1632  assume( getCoeffType(r) == ID );
     1633
     1634  r->is_field=FALSE;
     1635  r->is_domain=TRUE;
     1636  r->rep=n_rep_gap_gmp;
     1637
     1638  r->nCoeffIsEqual = ndCoeffIsEqual;
     1639  r->cfCoeffString = nrzCoeffString;
     1640  r->cfKillChar = ndKillChar;
     1641  r->cfMult  = nrzMult;
     1642  r->cfSub   = nrzSub;
     1643  r->cfAdd   = nrzAdd;
     1644  r->cfDiv   = nrzDiv;
     1645  r->cfIntMod= nrzIntMod;
     1646  r->cfExactDiv= nrzExactDiv;
     1647  r->cfInit = nrzInit;
     1648  r->cfSize  = nrzSize;
     1649  r->cfInt  = nrzInt;
     1650  //#ifdef HAVE_RINGS
     1651  r->cfDivComp = nrzDivComp; // only for ring stuff
     1652  r->cfIsUnit = nrzIsUnit; // only for ring stuff
     1653  r->cfGetUnit = nrzGetUnit; // only for ring stuff
     1654  r->cfAnn = nrzAnn;
     1655  r->cfExtGcd = nrzExtGcd; // only for ring stuff
     1656  r->cfXExtGcd = nrzXExtGcd; // only for ring stuff
     1657  r->cfQuotRem = nrzQuotRem;
     1658  r->cfDivBy = nrzDivBy; // only for ring stuff
     1659  //#endif
     1660  r->cfInpNeg   = nrzNeg;
     1661  r->cfInvers= nrzInvers;
     1662  r->cfCopy  = nrzCopy;
     1663  r->cfWriteLong = nrzWrite;
     1664  r->cfRead = nrzRead;
     1665  r->cfGreater = nrzGreater;
     1666  r->cfEqual = nrzEqual;
     1667  r->cfIsZero = nrzIsZero;
     1668  r->cfIsOne = nrzIsOne;
     1669  r->cfIsMOne = nrzIsMOne;
     1670  r->cfGreaterZero = nrzGreaterZero;
     1671  r->cfPower = nrzPower;
     1672  r->cfGcd  = nrzGcd;
     1673  //r->cfLcm  = nrzLcm;
     1674  r->cfDelete= nrzDelete;
     1675  r->cfSetMap = nrzSetMap;
     1676  r->cfCoeffWrite = nrzCoeffWrite;
     1677  r->convSingNFactoryN = nrzConvSingNFactoryN;
     1678  r->convFactoryNSingN = nrzConvFactoryNSingN;
     1679  r->cfMPZ = nrzMPZ;
     1680  r->cfFarey = nrzFarey;
     1681
     1682  r->cfQuot1 = nrzQuot1;
     1683  // debug stuff
     1684
     1685#ifdef LDEBUG
     1686  r->cfDBTest=nrzDBTest;
     1687#endif
     1688
     1689  r->nNULL = 0;
     1690  r->ch = 0;
     1691  r->has_simple_Alloc=FALSE;
     1692  r->has_simple_Inverse=FALSE;
     1693  return FALSE;
     1694}
     1695
     1696#else
     1697#error set SI_INTEGER_VARIANT
     1698#endif
     1699#endif
  • libpolys/coeffs/rmodulo2m.cc

    r653440 r6a1aa7  
    105105  r->is_field=FALSE;
    106106  r->is_domain=FALSE;
     107  r->rep=n_rep_int;
    107108
    108109  r->cfKillChar    = ndKillChar; /* dummy*/
     
    151152  r->cfName        = ndName;
    152153  r->cfCoeffWrite  = nr2mCoeffWrite;
    153   r->cfInit_bigint = nr2mMapQ;
    154154  r->cfQuot1       = nr2mQuot1;
    155155#ifdef LDEBUG
     
    682682}
    683683
     684number nr2mMapZ(number from, const coeffs src, const coeffs dst)
     685{
     686  if (SR_HDL(from) & SR_INT)
     687  {
     688    long f_i=SR_TO_INT(from);
     689    return nr2mInit(f_i,dst);
     690  }
     691  return nr2mMapGMP(from,src,dst);
     692}
     693
    684694nMapFunc nr2mSetMap(const coeffs src, const coeffs dst)
    685695{
    686   if (nCoeff_is_Ring_2toM(src)
     696  if ((src->rep==n_rep_int) && nCoeff_is_Ring_2toM(src)
    687697     && (src->mod2mMask == dst->mod2mMask))
    688698  {
    689699    return ndCopyMap;
    690700  }
    691   if (nCoeff_is_Ring_2toM(src)
     701  if ((src->rep==n_rep_int) && nCoeff_is_Ring_2toM(src)
    692702     && (src->mod2mMask < dst->mod2mMask))
    693703  { /* i.e. map an integer mod 2^s into Z mod 2^t, where t < s */
    694704    return nr2mMapMachineInt;
    695705  }
    696   if (nCoeff_is_Ring_2toM(src)
     706  if ((src->rep==n_rep_int) && nCoeff_is_Ring_2toM(src)
    697707     && (src->mod2mMask > dst->mod2mMask))
    698708  { /* i.e. map an integer mod 2^s into Z mod 2^t, where t > s */
     
    700710    return nr2mMapProject;
    701711  }
    702   if (nCoeff_is_Ring_Z(src))
     712  if ((src->rep==n_rep_gmp) && nCoeff_is_Ring_Z(src))
    703713  {
    704714    return nr2mMapGMP;
    705715  }
    706   if (nCoeff_is_Q(src))
     716  if ((src->rep==n_rep_gap_gmp) /*&& nCoeff_is_Ring_Z(src)*/)
     717  {
     718    return nr2mMapZ;
     719  }
     720  if ((src->rep==n_rep_gap_rat) && nCoeff_is_Q(src))
    707721  {
    708722    return nr2mMapQ;
    709723  }
    710   if (nCoeff_is_Zp(src) && (src->ch == 2))
     724  if ((src->rep=n_rep_int) && nCoeff_is_Zp(src) && (src->ch == 2))
    711725  {
    712726    return nr2mMapZp;
    713727  }
    714   if (nCoeff_is_Ring_PtoM(src) || nCoeff_is_Ring_ModN(src))
     728  if ((src->rep=n_rep_gmp) &&
     729  (nCoeff_is_Ring_PtoM(src) || nCoeff_is_Ring_ModN(src)))
    715730  {
    716731    if (mpz_divisible_2exp_p(src->modNumber,dst->modExponent))
  • libpolys/coeffs/rmodulon.cc

    r653440 r6a1aa7  
    120120  r->is_field=FALSE;
    121121  r->is_domain=FALSE;
     122  r->rep=n_rep_gmp;
    122123
    123124
     
    159160  r->cfCoeffWrite  = nrnCoeffWrite;
    160161  r->nCoeffIsEqual = nrnCoeffsEqual;
    161   r->cfInit_bigint = nrnMapQ;
    162162  r->cfKillChar    = ndKillChar;
    163163  r->cfQuot1       = nrnQuot1;
     
    554554}
    555555
     556number nrnMapZ(number from, const coeffs src, const coeffs dst)
     557{
     558  if (SR_HDL(from) & SR_INT)
     559  {
     560    long f_i=SR_TO_INT(from);
     561    return nrnInit(f_i,dst);
     562  }
     563  return nrnMapGMP(from,src,dst);
     564}
     565
    556566number nrnMapQ(number from, const coeffs src, const coeffs dst)
    557567{
     
    565575nMapFunc nrnSetMap(const coeffs src, const coeffs dst)
    566576{
    567   /* dst = currRing->cf */
    568   if (nCoeff_is_Ring_Z(src))
     577  /* dst = nrn */
     578  if ((src->rep==n_rep_gmp) && nCoeff_is_Ring_Z(src))
    569579  {
    570580    return nrnMapGMP;
    571581  }
    572   if (nCoeff_is_Q(src))
     582  if ((src->rep==n_rep_gap_gmp) /*&& nCoeff_is_Ring_Z(src)*/)
     583  {
     584    return nrnMapZ;
     585  }
     586  if ((src->rep==n_rep_gap_rat) && nCoeff_is_Q(src))
    573587  {
    574588    return nrnMapQ;
  • libpolys/coeffs/shortfl.cc

    r653440 r6a1aa7  
    430430
    431431  assume( getCoeffType(r) == ID );
    432   assume( getCoeffType(aRing) == n_Q );
     432  assume( aRing->rep == n_rep_gap_rat );
    433433
    434434  mpz_ptr z;
    435435  mpz_ptr zz=NULL;
    436   #if SIZEOF_LONG == 8
    437436  if (IS_IMM(from))
    438437  {
    439     int ui=SR_TO_INT(from);
    440      if ((long)ui==SR_TO_INT(from))
    441        return nf((float)ui).N();
    442438     zz=(mpz_ptr)omAlloc(sizeof(mpz_t));
    443439     mpz_init_set_si(zz,SR_TO_INT(from));
    444440     z=zz;
    445441  }
    446   #else
    447   if (IS_IMM(from))
    448     return nf((float)nlInt(from,aRing)).N();
    449   #endif
    450442  else
    451443  {
     
    461453  mpf_abs (e, e);
    462454
    463   #if SIZEOF_LONG == 8
    464455  if (zz!=NULL)
    465456  {
     
    467458    omFreeSize(zz,sizeof(mpz_t));
    468459  }
    469   #endif
    470460  /* if number was an integer, we are done*/
    471461  if(IS_IMM(from)|| IS_INT(from))
     
    509499  mpf_clear(d);
    510500  mpf_clear(q);
     501  return nf(f).N();
     502}
     503
     504number nrMapZ(number from, const coeffs aRing, const coeffs r)
     505{
     506  assume( getCoeffType(r) == ID );
     507  assume( aRing->rep == n_rep_gap_gmp );
     508
     509  mpz_ptr z;
     510  mpz_ptr zz=NULL;
     511  if (IS_IMM(from))
     512  {
     513     zz=(mpz_ptr)omAlloc(sizeof(mpz_t));
     514     mpz_init_set_si(zz,SR_TO_INT(from));
     515     z=zz;
     516  }
     517  else
     518  {
     519    /* read out the enumerator */
     520    z=(mpz_ptr)from;
     521  }
     522
     523  int i = mpz_size1(z);
     524  mpf_t e;
     525  mpf_init(e);
     526  mpf_set_z(e,z);
     527  int sign= mpf_sgn(e);
     528  mpf_abs (e, e);
     529
     530  if (zz!=NULL)
     531  {
     532    mpz_clear(zz);
     533    omFreeSize(zz,sizeof(mpz_t));
     534  }
     535  if(i>4)
     536  {
     537    WerrorS("float overflow");
     538    return nf(0.0).N();
     539  }
     540  double basis;
     541  signed long int exp;
     542  basis = mpf_get_d_2exp(&exp, e);
     543  float f= sign*ldexp(basis,exp);
     544  mpf_clear(e);
    511545  return nf(f).N();
    512546}
     
    631665  assume( getCoeffType(dst) == ID );
    632666
    633   if (nCoeff_is_Q(src))
     667  if (src->rep=n_rep_gap_rat) /*Q, Z */
    634668  {
    635669    return nrMapQ;
    636670  }
    637   if (nCoeff_is_long_R(src))
     671  if (src->rep=n_rep_gap_gmp) /*Q, Z */
     672  {
     673    return nrMapZ;
     674  }
     675  if ((src->rep==n_rep_gmp_float) && nCoeff_is_long_R(src))
    638676  {
    639677    return nrMapLongR;
    640678  }
    641   if (nCoeff_is_R(src))
     679  if ((src->rep==n_rep_float) && nCoeff_is_R(src))
    642680  {
    643681    return ndCopyMap;
    644682  }
    645   if(nCoeff_is_Zp(src))
     683  if ((src->rep==n_rep_int) && nCoeff_is_Zp(src))
    646684  {
    647685    return nrMapP;
    648686  }
    649   if (nCoeff_is_long_C(src))
     687  if ((src->rep==n_rep_gmp_complex) && nCoeff_is_long_C(src))
    650688  {
    651689    return nrMapC;
     
    667705  n->is_field=TRUE;
    668706  n->is_domain=TRUE;
     707  n->rep=n_rep_float;
    669708
    670709  n->cfKillChar = ndKillChar; /* dummy */
     
    693732  n->cfSetMap = nrSetMap;
    694733  n->cfCoeffWrite  = nrCoeffWrite;
    695   n->cfInit_bigint = nrMapQ;
    696734
    697735    /* nName= ndName; */
  • libpolys/misc/auxiliary.h.in

    r653440 r6a1aa7  
    5454#endif
    5555
    56 #ifdef HAVE_FACTORY
    57 
    5856#ifndef SINGULAR
    5957#undef SINGULAR
     
    6462#endif
    6563
    66 #endif
    67 // #ifdef HAVE_FACTORY
    68 
    6964// ----------------  end of parts/extensions
    7065
    7166// ---------------- Singular standard types etc.
    72 // BOOLEAN
     67/* SI_INTEGER_VARIANT: 1: from longrat.cc
     68 *                     2: GMP
     69 *                     3: rintegers.cc */
     70#define SI_INTEGER_VARIANT 2
     71
     72/* SI_BIGINT_VARIANT: 1: from longrat.cc
     73 *                    2: given by SI_INTEGER_VARIANT */
     74#define SI_BIGINT_VARIANT 1
     75
    7376#ifndef SIZEOF_LONG
    7477
  • libpolys/polys/ext_fields/algext.cc

    r653440 r6a1aa7  
    350350}
    351351
    352 number naInit_bigint(number longratBigIntNumber, const coeffs src, const coeffs cf)
    353 {
    354   assume( cf != NULL );
    355 
    356   const ring A = cf->extRing;
    357 
    358   assume( A != NULL );
    359 
    360   const coeffs C = A->cf;
    361 
    362   assume( C != NULL );
    363 
    364   number n = n_Init_bigint(longratBigIntNumber, src, C);
    365 
    366   if ( n_IsZero(n, C) )
    367   {
    368     n_Delete(&n, C);
    369     return NULL;
    370   }
    371 
    372   return (number)p_NSet(n, A);
    373 }
    374 
    375 
    376 
    377352number naInit(long i, const coeffs cf)
    378353{
     
    889864}
    890865
    891 /* assumes that src = Q, dst = Q(a) */
     866/* assumes that src = Q or Z, dst = Q(a) */
    892867number naMap00(number a, const coeffs src, const coeffs dst)
    893868{
    894869  if (n_IsZero(a, src)) return NULL;
    895   assume(src == dst->extRing->cf);
     870  assume(src->rep == dst->extRing->cf->rep);
    896871  poly result = p_One(dst->extRing);
    897872  p_SetCoeff(result, n_Copy(a, src), dst->extRing);
     873  return (number)result;
     874}
     875
     876/* assumes that src = Z, dst = K(a) */
     877number naMapZ0(number a, const coeffs src, const coeffs dst)
     878{
     879  if (n_IsZero(a, src)) return NULL;
     880  poly result = p_One(dst->extRing);
     881  nMapFunc nMap=n_SetMap(src,dst->extRing->cf);
     882  p_SetCoeff(result, nMap(a, src, dst->extRing->cf), dst->extRing);
     883  if (n_IsZero(pGetCoeff(result),dst->extRing->cf))
     884    p_Delete(&result,dst->extRing);
    898885  return (number)result;
    899886}
     
    10611048  if (h==0)
    10621049  {
    1063     if (nCoeff_is_Q(src) && nCoeff_is_Q(bDst))
    1064       return naMap00;                            /// Q     -->  Q(a)
     1050    if ((src->rep==n_rep_gap_rat) && nCoeff_is_Q(bDst))
     1051      return naMap00;                            /// Q or Z     -->  Q(a)
     1052    if ((src->rep==n_rep_gap_gmp) && nCoeff_is_Q(bDst))
     1053      return naMapZ0;                            /// Z     -->  Q(a)
    10651054    if (nCoeff_is_Zp(src) && nCoeff_is_Q(bDst))
    10661055      return naMapP0;                            /// Z/p   -->  Q(a)
    10671056    if (nCoeff_is_Q(src) && nCoeff_is_Zp(bDst))
    10681057      return naMap0P;                            /// Q      --> Z/p(a)
     1058    if ((src->rep==n_rep_gap_gmp) && nCoeff_is_Zp(bDst))
     1059      return naMapZ0;                            /// Z     -->  Z/p(a)
    10691060    if (nCoeff_is_Zp(src) && nCoeff_is_Zp(bDst))
    10701061    {
     
    14231414  cf->is_field=TRUE;
    14241415  cf->is_domain=TRUE;
     1416  cf->rep=n_rep_poly;
    14251417
    14261418  #ifdef LDEBUG
     
    14371429  cf->cfIsMOne       = naIsMOne;
    14381430  cf->cfInit         = naInit;
    1439   cf->cfInit_bigint  = naInit_bigint;
    14401431  cf->cfFarey        = naFarey;
    14411432  cf->cfChineseRemainder= naChineseRemainder;
     
    16171608  cf->cfIsMOne       = naIsMOne;
    16181609  cf->cfInit         = naInit;
    1619   cf->cfInit_bigint  = naInit_bigint;
    16201610  cf->cfFarey        = naFarey;
    16211611  cf->cfChineseRemainder= naChineseRemainder;
  • libpolys/polys/ext_fields/transext.cc

    r653440 r6a1aa7  
    565565}
    566566
    567 number ntInit_bigint(number longratBigIntNumber, const coeffs src, const coeffs cf)
    568 {
    569   assume( cf != NULL );
    570 
    571   const ring A = cf->extRing;
    572 
    573   assume( A != NULL );
    574 
    575   const coeffs C = A->cf;
    576 
    577   assume( C != NULL );
    578 
    579   number n = n_Init_bigint(longratBigIntNumber, src, C);
    580 
    581   if ( n_IsZero(n, C) )
    582   {
    583     n_Delete(&n, C);
    584     return NULL;
    585   }
    586 
    587   fraction result = (fraction)omAlloc0Bin(fractionObjectBin);
    588 
    589   number den = n_GetDenom(n, C);
    590 
    591   assume( n_GreaterZero(den, C) );
    592 
    593   if( n_IsOne(den, C) )
    594   {
    595      NUM(result) = p_NSet(n, A);
    596      //DEN(result) = NULL; // done by ..Alloc0..
    597      n_Delete(&den, C);
    598   }
    599   else
    600   {
    601      DEN(result) = p_NSet(den, A);
    602      NUM(result) = p_NSet(n_GetNumerator(n, C), A);
    603      n_Delete(&n, C);
    604   }
    605 
    606   //COM(result) = 0; // done by ..Alloc0..
    607 
    608   ntTest((number)result);
    609   //check_N((number)result,cf);
    610 
    611   return (number)result;
    612 }
    613 
    614 
    615567number ntInit(long i, const coeffs cf)
    616568{
     
    18041756}
    18051757
    1806 /* assumes that src = Q, dst = Q(t_1, ..., t_s) */
     1758/* assumes that src = Q or Z, dst = Q(t_1, ..., t_s) */
    18071759number ntMap00(number a, const coeffs src, const coeffs dst)
    18081760{
    18091761  if (n_IsZero(a, src)) return NULL;
    18101762  assume(n_Test(a, src));
    1811   assume(src == dst->extRing->cf);
     1763  assume(src->rep == dst->extRing->cf->rep);
    18121764  if ((SR_HDL(a) & SR_INT) || (a->s==3))
    18131765  {
     
    18251777  //check_N((number)ff,dst);
    18261778  return (number)ff;
     1779}
     1780
     1781number ntMapZ0(number a, const coeffs src, const coeffs dst)
     1782{
     1783  if (n_IsZero(a, src)) return NULL;
     1784  assume(n_Test(a, src));
     1785  nMapFunc nMap=n_SetMap(src,dst->extRing->cf);
     1786  poly p=p_NSet(nMap(a, src,dst->extRing->cf), dst->extRing);
     1787  if (n_IsZero(pGetCoeff(p),dst->extRing->cf))
     1788    p_Delete(&p,dst->extRing);
     1789  number res=ntInit(p, dst);
     1790  n_Test(res,dst);
     1791  return res;
    18271792}
    18281793
     
    19921957  if (h==0)
    19931958  {
    1994     if (nCoeff_is_Q(src) && nCoeff_is_Q(bDst))
    1995       return ntMap00;                                 /// Q       -->  Q(T)
     1959    if ((src->rep==n_rep_gap_rat) && nCoeff_is_Q(bDst))
     1960      return ntMap00;                                 /// Q or Z   -->  Q(T)
     1961    if (src->rep==n_rep_gap_gmp)
     1962      return ntMapZ0;                                 /// Z   -->  K(T)
    19961963    if (nCoeff_is_Zp(src) && nCoeff_is_Q(bDst))
    19971964      return ntMapP0;                                 /// Z/p     -->  Q(T)
     
    24312398  cf->is_field=TRUE;
    24322399  cf->is_domain=TRUE;
     2400  cf->rep=n_rep_rat_fct;
    24332401
    24342402  cf->factoryVarOffset = R->cf->factoryVarOffset + rVar(R);
     
    24432411  cf->cfIsMOne       = ntIsMOne;
    24442412  cf->cfInit         = ntInit;
    2445   cf->cfInit_bigint  = ntInit_bigint;
    24462413  cf->cfFarey        = ntFarey;
    24472414  cf->cfChineseRemainder = ntChineseRemainder;
Note: See TracChangeset for help on using the changeset viewer.