Changeset 417a91a in git


Ignore:
Timestamp:
Jul 3, 2018, 2:15:33 PM (5 years ago)
Author:
Hans Schoenemann <hannes@…>
Branches:
(u'spielwiese', '8e0ad00ce244dfd0756200662572aef8402f13d5')
Children:
54bb6bce24267ffeb1b32ce9abb95365d5aaa38d
Parents:
5ad0a80660fd3e252bf19ad5428baba460bdb54f
Message:
improvements for Z/n (esp. if n prime)
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • Singular/ipshell.cc

    r5ad0a8 r417a91a  
    15691569  ring r = IDRING(tmp) = (ring) omAlloc0Bin(sip_sring_bin);
    15701570
     1571  #ifndef TEST_ZN_AS_ZP
    15711572  r->cf = nInitChar(n_Zp, (void*)32003); //   r->cf->ch = 32003;
     1573  #else
     1574  mpz_t modBase;
     1575  mpz_init_set_ui(modBase, (long)32003);
     1576  ZnmInfo info;
     1577  info.base= modBase;
     1578  info.exp= 1;
     1579  r->cf=nInitChar(n_Zn,(void*) &info);
     1580  r->cf->is_field=1;
     1581  r->cf->is_domain=1;
     1582  r->cf->has_simple_Inverse=1;
     1583  #endif
    15721584  r->N      = 3;
    15731585  /*r->P     = 0; Alloc0 in idhdl::set, ipid.cc*/
     
    27872799        ch = l;
    27882800      }
     2801      #ifndef TEST_ZN_AS_ZP
    27892802      R->cf = nInitChar(n_Zp, (void*)(long)ch);
     2803      #else
     2804      mpz_t modBase;
     2805      mpz_init_set_ui(modBase,(long) ch);
     2806      ZnmInfo info;
     2807      info.base= modBase;
     2808      info.exp= 1;
     2809      R->cf=nInitChar(n_Zn,(void*) &info); //exponent is missing
     2810      R->cf->is_field=1;
     2811      R->cf->is_domain=1;
     2812      R->cf->has_simple_Inverse=1;
     2813      #endif
    27902814    }
    27912815  }
     
    29072931          if ( (rField_is_Q_a(orig_ring) &&  // Q(a..) -> Q(a..) || Q || Zp || Zp(a)
    29082932            (rField_is_Q(currRing) || rField_is_Q_a(currRing) ||
    2909              (rField_is_Zp(currRing) || rField_is_Zp_a(currRing))))
     2933             rField_is_Zp(currRing) || rField_is_Zp_a(currRing) ||
     2934             rField_is_Zn(currRing)))
    29102935           ||
    29112936           (rField_is_Zp_a(orig_ring) &&  // Zp(a..) -> Zp(a..) || Zp
     
    56135638          ch=32003;
    56145639        }
     5640        #ifndef TEST_ZN_AS_ZP
    56155641        cf = nInitChar(n_Zp, (void*)(long)ch);
     5642        #else
     5643        mpz_t modBase;
     5644        mpz_init_set_ui(modBase, (long)ch);
     5645        ZnmInfo info;
     5646        info.base= modBase;
     5647        info.exp= 1;
     5648        cf=nInitChar(n_Zn,(void*) &info);
     5649        cf->is_field=1;
     5650        cf->is_domain=1;
     5651        cf->has_simple_Inverse=1;
     5652        #endif
    56165653      }
    56175654      else
     
    57255762      {
    57265763        pnn=pnn->next;
    5727         mpz_set_ui(modBase, (int)(long) pnn->Data());
     5764        mpz_set_ui(modBase, (long) pnn->Data());
    57285765        if ((pnn->next!=NULL) && (pnn->next->Typ()==INT_CMD))
    57295766        {
  • Singular/number2.cc

    r5ad0a8 r417a91a  
    3636{
    3737  coeffs c1=(coeffs)a->Data();
    38   int    i2=(int)(long)b->Data();
     38  long   i2=(long)b->Data();
    3939  if (c1->type==n_Z)
    4040  {
    4141    if (i2==IsPrime(i2))
    4242    {
    43       res->data=(void *)nInitChar(n_Zp,(void*)(long)i2);
     43      #ifndef TEST_ZN_AS_ZP
     44      res->data=(void *)nInitChar(n_Zp,(void*)i2);
     45      #else
     46      ZnmInfo info;
     47      mpz_t modBase;
     48      mpz_init_set_ui(modBase,i2);
     49      info.base= modBase;
     50      info.exp= 1;
     51      res->data=(void *)nInitChar(n_Zn,&info);
     52      mpz_clear(modBase);
     53      #endif
    4454    }
    4555    else
     
    5767        {
    5868          mpz_clear(modBase);
    59           res->data=(void *) nInitChar(n_Z2m,(void*)(long)i2);
     69          res->data=(void *) nInitChar(n_Z2m,(void*)i2);
    6070          return FALSE;
    6171        }
  • libpolys/coeffs/rmodulon.cc

    r5ad0a8 r417a91a  
    99
    1010#include "misc/mylimits.h"
     11#include "misc/prime.h" // IsPrime
    1112#include "reporter/reporter.h"
    1213
     
    2425#ifdef HAVE_RINGS
    2526
    26 #if SI_INTEGER_VARIANT==2
    27 // FIXME? TODO? // extern void    nrzWrite       (number &a, const coeffs r); // FIXME
    28 # define  nrnWrite      nrzWrite
    29 #else
    3027void nrnWrite (number a, const coeffs);
    31 #endif
    3228#ifdef LDEBUG
    3329BOOLEAN nrnDBTest      (number a, const char *f, const int l, const coeffs r);
     
    4238  s= mpz_get_str (s, 10, r->modBase);
    4339
    44   if (nCoeff_is_Ring_ModN(r)) Print("ZZ/bigint(%s)", s);
    45   else if (nCoeff_is_Ring_PtoM(r)) Print("ZZ/(bigint(%s)^%lu)", s, r->modExponent);
     40  #ifdef TEST_ZN_AS_ZP
     41  if (l<10)
     42  {
     43    if (nCoeff_is_Ring_ModN(r)) Print("ZZ/%s", s);
     44    else if (nCoeff_is_Ring_PtoM(r)) Print("ZZ/(%s^%lu)", s, r->modExponent);
     45  }
     46  else
     47  #endif
     48  {
     49    if (nCoeff_is_Ring_ModN(r)) Print("ZZ/bigint(%s)", s);
     50    else if (nCoeff_is_Ring_PtoM(r)) Print("ZZ/(bigint(%s)^%lu)", s, r->modExponent);
     51  }
    4652
    4753  omFreeSize((ADDRESS)s, l);
     
    6571
    6672
    67 static BOOLEAN nrnCoeffsEqual(const coeffs r, n_coeffType n, void * parameter)
     73static BOOLEAN nrnCoeffIsEqual(const coeffs r, n_coeffType n, void * parameter)
    6874{
    6975  /* test, if r is an instance of nInitCoeffs(n,parameter) */
    70   return (n==n_Zn) && (mpz_cmp_ui(r->modNumber,(long)parameter)==0);
     76  ZnmInfo *info=(ZnmInfo*)parameter;
     77  return (n==r->type) && (r->modExponent==info->exp)
     78  && (mpz_cmp(r->modBase,info->base)==0);
    7179}
    7280
     
    165173{
    166174  if (a == NULL) return 0;
    167   return sizeof(mpz_t);
     175  mpz_ptr p=(mpz_ptr)a;
     176  int s=p->_mp_alloc;
     177  return s;
    168178}
    169179
     
    466476  if (a == NULL) return FALSE;
    467477#endif
    468   if(nrnIsOne(a,r)) return FALSE; // for char 2
     478  if((r->ch==2) && (nrnIsOne(a,r))) return FALSE;
    469479  mpz_t t; mpz_init_set(t, (mpz_ptr)a);
    470480  mpz_add_ui(t, t, 1);
     
    479489}
    480490
    481 static BOOLEAN nrnGreaterZero(number k, const coeffs)
    482 {
     491static BOOLEAN nrnGreaterZero(number k, const coeffs cf)
     492{
     493  if (cf->is_field)
     494  {
     495    if (mpz_cmp_ui(cf->modBase,2)==0)
     496    {
     497      return TRUE;
     498    }
     499    mpz_t ch2; mpz_init_set(ch2, cf->modBase);
     500    mpz_sub_ui(ch2,ch2,1);
     501    mpz_divexact_ui(ch2,ch2,2);
     502    if (mpz_cmp(ch2,(mpz_ptr)k)<0)
     503      return FALSE;
     504    mpz_clear(ch2);
     505  }
    483506  return 0 < mpz_sgn1((mpz_ptr)k);
    484507}
     
    529552static number nrnDiv(number a, number b, const coeffs r)
    530553{
     554  if (r->is_field)
     555  {
     556    number inv=nrnInvers(b,r);
     557    number erg=nrnMult(a,inv,r);
     558    nrnDelete(&inv,r);
     559    return erg;
     560  }
    531561  if (a == NULL) a = (number)r->modNumber;
    532562  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
     
    723753}
    724754#endif
    725 #if SI_INTEGER_VARIANT!=2
    726 void nrnWrite (number a, const coeffs)
     755void nrnWrite (number a, const coeffs cf)
    727756{
    728757  char *s,*z;
     
    735764    int l=mpz_sizeinbase((mpz_ptr) a, 10) + 2;
    736765    s=(char*)omAlloc(l);
    737     z=mpz_get_str(s,10,(mpz_ptr) a);
    738     StringAppendS(z);
     766    if (cf->is_field)
     767    {
     768      mpz_t ch2; mpz_init_set(ch2, cf->modBase);
     769      mpz_sub_ui(ch2,ch2,1);
     770      mpz_divexact_ui(ch2,ch2,2);
     771      if ((mpz_cmp_ui(cf->modBase,2)!=0) && (mpz_cmp(ch2,(mpz_ptr)a)<0))
     772      {
     773        mpz_sub(ch2,(mpz_ptr)a,cf->modBase);
     774        z=mpz_get_str(s,10,ch2);
     775        StringAppendS(z);
     776      }
     777      else
     778      {
     779        z=mpz_get_str(s,10,(mpz_ptr) a);
     780        StringAppendS(z);
     781      }
     782      mpz_clear(ch2);
     783    }
     784    else
     785    {
     786      z=mpz_get_str(s,10,(mpz_ptr) a);
     787      StringAppendS(z);
     788    }
    739789    omFreeSize((ADDRESS)s,l);
    740790  }
    741791}
    742 #endif
    743792
    744793nMapFunc nrnSetMap(const coeffs src, const coeffs dst)
     
    763812    if (   (!nCoeff_is_Zp(src))
    764813        && (mpz_cmp(src->modBase, dst->modBase) == 0)
    765         && (src->modExponent == dst->modExponent)) return nrnMapGMP;
     814        && (src->modExponent == dst->modExponent)) return ndCopyMap;
    766815    else
    767816    {
     
    896945  }
    897946  mpz_mod(z, z, r->modNumber);
    898   *a = (number) z;
     947  if ((*s)=='/')
     948  {
     949    mpz_ptr n = (mpz_ptr) omAllocBin(gmp_nrz_bin);
     950    s++;
     951    s=nlCPEatLongC((char*)s,n);
     952    if (!nrnIsOne((number)n,r))
     953    {
     954      *a=nrnDiv((number)z,(number)n,r);
     955      mpz_clear(z);
     956      omFreeBin((void *)z, gmp_nrz_bin);
     957      mpz_clear(n);
     958      omFreeBin((void *)n, gmp_nrz_bin);
     959    }
     960  }
     961  else
     962    *a = (number) z;
    899963  return s;
     964}
     965
     966static number nrnConvFactoryNSingN( const CanonicalForm n, const coeffs r)
     967{
     968  return nrnInit(n.intval(),r);
     969}
     970
     971static CanonicalForm nrnConvSingNFactoryN( number n, BOOLEAN setChar, const coeffs r )
     972{
     973  if (setChar) setCharacteristic( r->ch );
     974   return CanonicalForm(nrnInt( n,r ));
    900975}
    901976
     
    9581033  r->cfCoeffName   = nrnCoeffName;
    9591034  r->cfCoeffWrite  = nrnCoeffWrite;
    960   r->nCoeffIsEqual = nrnCoeffsEqual;
     1035  r->nCoeffIsEqual = nrnCoeffIsEqual;
    9611036  r->cfKillChar    = nrnKillChar;
    9621037  r->cfQuot1       = nrnQuot1;
     
    9641039  r->cfDBTest      = nrnDBTest;
    9651040#endif
     1041  if ((r->modExponent==1)&&(mpz_size1(r->modBase)==1))
     1042  {
     1043    long p=mpz_get_si(r->modBase);
     1044    if ((p<=536870909)&&(p==IsPrime(p))) /*factory limit: <2^29*/
     1045    {
     1046      r->convFactoryNSingN=nrnConvFactoryNSingN;
     1047      r->convSingNFactoryN=nrnConvSingNFactoryN;
     1048    }
     1049  }
    9661050  return FALSE;
    9671051}
  • libpolys/polys/clapsing.cc

    r5ad0a8 r417a91a  
    5858
    5959  Off(SW_RATIONAL);
    60   if (rField_is_Q(r) || rField_is_Zp(r) || rField_is_Ring_Z(r))
     60  if (rField_is_Q(r) || rField_is_Zp(r) || rField_is_Ring_Z(r)
     61  || (rField_is_Zn(r)&&(r->cf->convSingNFactoryN!=ndConvSingNFactoryN)))
    6162  {
    6263    setCharacteristic( rChar(r) );
     
    141142  Off(SW_RATIONAL);
    142143  CanonicalForm F,G,GCD;
    143   if (rField_is_Q(r) || (rField_is_Zp(r)))
     144  if (rField_is_Q(r) || (rField_is_Zp(r))
     145  || (rField_is_Zn(r)&&(r->cf->convSingNFactoryN!=ndConvSingNFactoryN)))
    144146  {
    145147    bool b1=isOn(SW_USE_EZGCD_P);
     
    287289  // for now there is only the possibility to handle polynomials over
    288290  // Q and Fp ...
    289   if (rField_is_Zp(r) || rField_is_Q(r))
     291  if (rField_is_Zp(r) || rField_is_Q(r)
     292  || (rField_is_Zn(r)&&(r->cf->convSingNFactoryN!=ndConvSingNFactoryN)))
    290293  {
    291294    Variable X(i);
     
    424427  res=NULL;pa=NULL;pb=NULL;
    425428  On(SW_SYMMETRIC_FF);
    426   if ( rField_is_Q(r) || rField_is_Zp(r) )
     429  if ( rField_is_Q(r) || rField_is_Zp(r)
     430  || (rField_is_Zn(r)&&(r->cf->convSingNFactoryN!=ndConvSingNFactoryN)))
    427431  {
    428432    setCharacteristic( rChar(r) );
     
    508512  poly res=NULL;
    509513  On(SW_RATIONAL);
    510   if (rField_is_Zp(r) || rField_is_Q(r))
     514  if (rField_is_Zp(r) || rField_is_Q(r)
     515  || (rField_is_Zn(r)&&(r->cf->convSingNFactoryN!=ndConvSingNFactoryN)))
    511516  {
    512517    setCharacteristic( rChar(r) );
     
    560565  poly res=NULL;
    561566  On(SW_RATIONAL);
    562   if (rField_is_Zp(r) || rField_is_Q(r))
     567  if (rField_is_Zp(r) || rField_is_Q(r)
     568  || (rField_is_Zn(r)&&(r->cf->convSingNFactoryN!=ndConvSingNFactoryN)))
    563569  {
    564570    setCharacteristic( rChar(r) );
     
    606612  poly res=NULL;
    607613  On(SW_RATIONAL);
    608   if (rField_is_Zp(r) || rField_is_Q(r))
     614  if (rField_is_Zp(r) || rField_is_Q(r)
     615  || (rField_is_Zn(r)&&(r->cf->convSingNFactoryN!=ndConvSingNFactoryN)))
    609616  {
    610617    setCharacteristic( rChar(r) );
     
    759766    CanonicalForm F, FAC,Q,R;
    760767    Variable a;
    761     if (rField_is_Zp(r) || rField_is_Q(r))
     768    if (rField_is_Zp(r) || rField_is_Q(r)
     769    || (rField_is_Zn(r)&&(r->cf->convSingNFactoryN!=ndConvSingNFactoryN)))
    762770    {
    763771      F=convSingPFactoryP( f,r );
     
    793801      if (R.isZero())
    794802      {
    795         if (rField_is_Zp(r) || rField_is_Q(r))
     803        if (rField_is_Zp(r) || rField_is_Q(r)
     804        || (rField_is_Zn(r)&&(r->cf->convSingNFactoryN!=ndConvSingNFactoryN)))
    796805        {
    797806          q = convFactoryPSingP( Q,r );
     
    915924
    916925  Variable a;
    917   if (!rField_is_Zp(r) && !rField_is_Zp_a(r) && !rField_is_Z(r)) /* Q, Q(a) */
     926  if (!rField_is_Zp(r) && !rField_is_Zp_a(r) && !rField_is_Z(r)
     927  && !(rField_is_Zn(r) && (r->cf->convSingNFactoryN!=ndConvSingNFactoryN))) /* Q, Q(a) */
    918928  {
    919929    //if (f!=NULL) // already tested at start of routine
     
    953963    }
    954964  }
    955   if (rField_is_Q(r) || rField_is_Zp(r) || (rField_is_Z(r)))
     965  if ((rField_is_Q(r) || rField_is_Zp(r) || (rField_is_Z(r)))
     966  || (rField_is_Zn(r)&&(r->cf->convSingNFactoryN!=ndConvSingNFactoryN)))
    956967  {
    957968    setCharacteristic( rChar(r) );
     
    960971  }
    961972  // and over Q(a) / Fp(a)
    962   else if (r->cf->extRing!=NULL)
     973  else if ((r->cf->extRing!=NULL)
     974  &&(r->cf->extRing->cf->convSingNFactoryN!=ndConvSingNFactoryN))
    963975  {
    964976    if (rField_is_Q_a (r)) setCharacteristic (0);
     
    10131025    {
    10141026      if (with_exps!=1) (**v)[j] = J.getItem().exp();
    1015       if (rField_is_Zp(r) || rField_is_Q(r)||  rField_is_Z(r))           /* Q, Fp, Z */
     1027      if (rField_is_Zp(r) || rField_is_Q(r)||  rField_is_Z(r)
     1028      || (rField_is_Zn(r) && r->cf->convSingNFactoryN!=ndConvSingNFactoryN))           /* Q, Fp, Z */
    10161029      {
    10171030        //count_Factors(res,*v,f, j, convFactoryPSingP( J.getItem().factor() );
     
    13131326    }
    13141327  }
    1315   if (rField_is_Q(r) || rField_is_Zp(r))
     1328  if (rField_is_Q(r) || rField_is_Zp(r)
     1329  || (rField_is_Zn(r)&&(r->cf->convSingNFactoryN!=ndConvSingNFactoryN)))
    13161330  {
    13171331    setCharacteristic( rChar(r) );
     
    13811395    {
    13821396      if (with_exps!=1 && with_exps!=3) (**v)[j] = J.getItem().exp();
    1383       if (rField_is_Zp(r) || rField_is_Q(r))
     1397      if (rField_is_Zp(r) || rField_is_Q(r)
     1398      || (rField_is_Zn(r)&&(r->cf->convSingNFactoryN!=ndConvSingNFactoryN)))
    13841399        res->m[j] = convFactoryPSingP( J.getItem().factor(),r );
    13851400      else if (r->cf->extRing!=NULL)     /* Q(a), Fp(a) */
     
    14471462  CFList L;
    14481463  ListCFList LL;
    1449   if (rField_is_Q(r) || rField_is_Zp(r))
     1464  if (rField_is_Q(r) || rField_is_Zp(r)
     1465  || (rField_is_Zn(r)&&(r->cf->convSingNFactoryN!=ndConvSingNFactoryN)))
    14501466  {
    14511467    setCharacteristic( rChar(r) );
     
    15161532    for (n=1, Li = LLi.getItem(); Li.hasItem(); Li++, n++)
    15171533    {
    1518       if (rField_is_Q(r) || rField_is_Zp(r))
     1534      if (rField_is_Q(r) || rField_is_Zp(r)
     1535      || (rField_is_Zn(r)&&(r->cf->convSingNFactoryN!=ndConvSingNFactoryN)))
    15191536        MATELEM(res,m,n)=convFactoryPSingP(Li.getItem(),r);
    15201537      else
     
    15321549  On(SW_SYMMETRIC_FF);
    15331550  CFList L;
    1534   if (rField_is_Q(r) || rField_is_Zp(r))
     1551  if (rField_is_Q(r) || rField_is_Zp(r)
     1552  || (rField_is_Zn(r)&&(r->cf->convSingNFactoryN!=ndConvSingNFactoryN)))
    15351553  {
    15361554    setCharacteristic( rChar(r) );
  • libpolys/polys/ext_fields/transext.cc

    r5ad0a8 r417a91a  
    21002100      if (src->ch == dst->ch) return ntMapPP;         /// Z/p     --> Z/p(T)
    21012101      else return ntMapUP;                            /// Z/u     --> Z/p(T)
     2102    }
     2103    if (nCoeff_is_Zn(src) && nCoeff_is_Zn(bDst))
     2104    {
     2105      if (mpz_cmp(src->modNumber,bDst->modNumber)==0) return ntMapPP;         /// Z/p     --> Z/p(T)
    21022106    }
    21032107  }
  • libpolys/polys/monomials/ring.cc

    r5ad0a8 r417a91a  
    751751      {
    752752        WerrorS("Z/p+...");
     753        return -1;
     754      }
     755    }
     756    else if ((getCoeffType(r1->cf)==n_Zn)||(getCoeffType(r1->cf)==n_Znm))
     757    {
     758      if (getCoeffType(r2->cf)==n_Q)
     759      {
     760        tmpR.cf=nCopyCoeff(r1->cf);
     761      }
     762      else if (nCoeff_is_Extension(r2->cf)
     763      && (mpz_cmp(r1->cf->modNumber,r2->cf->extRing->cf->modNumber)==0))
     764      { // covers transext.cc and algext.cc
     765        tmpR.cf=nCopyCoeff(r2->cf);
     766      }
     767      else
     768      {
     769        WerrorS("Z/n+...");
    753770        return -1;
    754771      }
Note: See TracChangeset for help on using the changeset viewer.