Changeset 8ca38a7 in git


Ignore:
Timestamp:
Mar 10, 2014, 5:32:27 PM (10 years ago)
Author:
Adi Popescu <adi_popescum@…>
Branches:
(u'spielwiese', '8e0ad00ce244dfd0756200662572aef8402f13d5')
Children:
8f47949874e10c5d14cca8f14dd3bb2c3fe95b05
Parents:
ab8e53db4813d82dce3f72da11ab590ecce8a4e7
git-author:
Adi Popescu <adi_popescum@yahoo.de>2014-03-10 17:32:27+01:00
git-committer:
Adi Popescu <adi_popescum@yahoo.de>2014-05-05 11:08:44+02:00
Message:
Added qrings feature for constant in ideal
Files:
18 added
5 edited

Legend:

Unmodified
Added
Removed
  • Singular/ipassign.cc

    rab8e53d r8ca38a7  
    3636#include <polys/nc/nc.h>
    3737#include <polys/nc/sca.h>
     38#include <polys/prCopy.h>
    3839
    3940#include <kernel/polys.h>
     
    738739  }
    739740
    740   ring qr;
     741  ring qr,origr;
    741742  //qr=(ring)res->Data();
    742743  //if (qr!=NULL) omFreeBin((ADDRESS)qr, ip_sring_bin);
    743744  assume(res->Data()==NULL);
    744   qr=rCopy(currRing);
    745                  // we have to fill it, but the copy also allocates space
    746   idhdl h=(idhdl)res->data; // we have res->rtyp==IDHDL
    747   IDRING(h)=qr;
    748 
     745  origr = rCopy(currRing);
     746
     747#ifdef HAVE_RINGS
    749748  ideal id=(ideal)a->CopyD(IDEAL_CMD);
    750 
    751   if ((idElem(id)>1) || rIsSCA(currRing) || (currRing->qideal!=NULL))
    752     assumeStdFlag(a);
    753 
    754 #ifdef HAVE_RINGS
    755   if (rField_is_Ring(currRing))
     749  if((rField_is_Ring(currRing)) && (idPosConstant(id) != -1))
    756750  {
    757751// computing over Rings: handle constant generators of id properly
    758     if (idPosConstant(id) != -1)
    759     {
    760       mpz_t gcd;
    761752      if(nCoeff_is_Ring_ModN(currRing->cf) ||
    762753         nCoeff_is_Ring_PtoM(currRing->cf) ||
     
    764755      {
    765756      // already computing mod modNumber: use gcd(modNumber,constant entry of id)
     757        mpz_t gcd;
    766758        mpz_t newConst;
    767759        mpz_init(newConst);
     
    788780            mpz_mul(baseTokNew, baseTokNew, currRing->cf->modBase);
    789781          }
    790           currRing->cf->modExponent = kNew;
    791           mpz_set(currRing->cf->modNumber, gcd);
    792           mpz_sub_ui(baseTokNew, baseTokNew, 1);
    793           mpz_t dummy;
    794           mpz_init(dummy);
    795           mpz_set_si(dummy, sizeof(unsigned long));
    796           printf("\nmod2mMask = %i \n", currRing->cf->mod2mMask);
    797           #if 0
    798           if(nCoeff_is_Ring_2toM(currRing->cf))
    799           {
    800           // handle shortcut for 2^m appropriately
    801             if(mpz_cmp(dummy, baseTokNew) > 0)
    802             {
    803               idPrint(id);
    804               currRing->cf->mod2mMask = mpz_get_ui(baseTokNew);
    805               idPrint(id);
    806             }
    807           }
    808           #endif
    809           mpz_clear(dummy);
     782          qr = rCopyNewCoeff(currRing, currRing->cf->modBase, kNew, currRing->cf->type);
    810783          mpz_clear(baseTokNew);
    811784        }
     
    813786        {
    814787        // previously over modNumber, now over new modNumber
    815           mpz_set(currRing->cf->modBase, gcd);
    816           mpz_set(currRing->cf->modNumber, gcd);
    817         }
    818         currRing->cf->ch = mpz_get_ui(gcd);
     788          qr = rCopyNewCoeff(currRing, gcd, 1, currRing->cf->type);
     789          //printf("\nAfter rCopyNewCoeff: \n");
     790          //rWrite(qr);
     791        }
    819792        mpz_clear(gcd);
     793        //printf("\nAfter mpz_clear: \n");
     794        //rWrite(qr);
    820795        mpz_clear(newConst);
    821796      }
     
    825800        mpz_t newConst;
    826801        mpz_init(newConst);
    827         mpz_set_ui(newConst, currRing->cf->cfInt(p_GetCoeff(id->m[idPosConstant(id)], currRing), currRing->cf));
    828         currRing->cf->modExponent = 1;
    829         mpz_set(currRing->cf->modBase, newConst);
    830         mpz_set(currRing->cf->modNumber, newConst);
    831         currRing->cf->ch = mpz_get_ui(newConst);
     802        mpz_set_ui(newConst, currRing->cf->cfInt(p_GetCoeff(id->m[idPosConstant(id)], currRing),currRing->cf));
     803        qr= rCopyNewCoeff( currRing, newConst, 1, n_Zn);
    832804        mpz_clear(newConst);
    833         currRing->cf->type = n_Zn;
    834       }
    835     }
    836   }
     805      }
     806  }   
     807  else
    837808#endif
    838  
     809    qr=rCopy(currRing);
     810   
     811                 // we have to fill it, but the copy also allocates space
     812  idhdl h=(idhdl)res->data; // we have res->rtyp==IDHDL
     813  IDRING(h)=qr;
     814  ideal qid;
     815  //rWrite(qr);
     816  //printf("\norigr\n");
     817  //rWrite(origr);
     818  //  printf("\nqr\n");
     819  //rWrite(qr);
     820  //  printf("\ncurrRing\n");
     821  //rWrite(currRing);
     822#ifdef HAVE_RINGS
     823  if((rField_is_Ring(currRing)) && (idPosConstant(id) != -1))
     824    {
     825      //rChangeCurrRing(qr);
     826      //rWrite(qr);
     827      int *perm=NULL;
     828      int i;
     829      perm=(int *)omAlloc0((qr->N+1)*sizeof(int));
     830      for(i=qr->N;i>0;i--)
     831      {
     832        perm[i]=i;
     833      }
     834      nMapFunc nMap = NULL;
     835      nMap = n_SetMap(origr->cf, qr->cf);
     836     
     837      qid = idInit(IDELEMS(id),1);
     838      for(i = 0; i<IDELEMS(id); i++)
     839      {
     840        qid->m[i] = p_PermPoly(id->m[i], perm, origr, qr, nMap, NULL, 0);
     841       
     842      }
     843    }
     844    else
     845#endif
     846      qid = idrCopyR(id,currRing,qr);
     847  idSkipZeroes(qid);
     848  //idPrint(qid);
     849  if ((idElem(qid)>1) || rIsSCA(currRing) || (currRing->qideal!=NULL))
     850    assumeStdFlag(a);
     851
    839852  if (currRing->qideal!=NULL) /* we are already in a qring! */
    840853  {
    841     ideal tmp=idSimpleAdd(id,currRing->qideal);
     854    ideal tmp=idSimpleAdd(qid,currRing->qideal);
    842855    // both ideals should be GB, so dSimpleAdd is sufficient
    843     idDelete(&id);
    844     id=tmp;
     856    idDelete(&qid);
     857    qid=tmp;
    845858    // delete the qr copy of quotient ideal!!!
    846859    idDelete(&qr->qideal);
    847860  }
    848   if (idElem(id)==0)
     861  if (idElem(qid)==0)
    849862  {
    850863    qr->qideal = NULL;
    851     id_Delete(&id,currRing);
     864    id_Delete(&qid,currRing);
    852865    IDTYP(h)=RING_CMD;
    853866  }
    854867  else
    855     qr->qideal = id;
     868    qr->qideal = qid;
    856869
    857870  // qr is a copy of currRing with the new qideal!
     
    870883  }
    871884  #endif
     885  //rWrite(qr);
    872886  rSetHdl((idhdl)res->data);
    873887  return FALSE;
  • Tst/New.lst

    rab8e53d r8ca38a7  
    4444New/bug_541_interred.tst
    4545New/mstd_integer.tst
     46New/bug_std_qring_559.tst
     47New/qring_with_constant.tst
     48New/qring_2tom.tst
     49New/qring_ntom.tst
     50New/qring_ZmtoZmn.tst
     51New/qring_ZmtoZmn_errorCoprime.tst
     52New/qring_ZtoZm.tst
  • libpolys/coeffs/rmodulo2m.cc

    rab8e53d r8ca38a7  
    563563}
    564564
     565number nr2mMapProject(number from, const coeffs /*src*/, const coeffs dst)
     566{
     567  NATNUMBER i = ((NATNUMBER)from) % (dst->mod2mMask + 1);
     568  return (number)i;
     569}
     570
    565571number nr2mMapZp(number from, const coeffs /*src*/, const coeffs dst)
    566572{
     
    623629  { /* i.e. map an integer mod 2^s into Z mod 2^t, where t > s */
    624630    // to be done
     631    return nr2mMapProject;
    625632  }
    626633  if (nCoeff_is_Ring_Z(src))
  • libpolys/polys/monomials/ring.cc

    rab8e53d r8ca38a7  
    2222#include <coeffs/numbers.h>
    2323#include <coeffs/coeffs.h>
     24#include <coeffs/rmodulon.h>
    2425
    2526#include <polys/monomials/p_polys.h>
     
    16001601#endif
    16011602
     1603  return res;
     1604}
     1605
     1606/*
     1607 * create a copy of the ring r, which must be equivalent to currRing
     1608 * used for qring definition, but allows change of coefficients to
     1609 * new modulus, e.g. Z to Z/m or Z/n to Z/gcd(m,n)
     1610 * otherwise identical to rCopy
     1611 */
     1612ring rCopyNewCoeff(ring r, mpz_t Base, int Exp, n_coeffType typ)
     1613{
     1614  if (r == NULL) return NULL;
     1615  ring res=rCopy0(r,FALSE,TRUE);
     1616  int_number dummy;
     1617  dummy = (int_number) omAlloc(sizeof(mpz_t));
     1618  mpz_init_set(dummy, Base);
     1619  ZnmInfo info;
     1620  info.base = dummy;
     1621  info.exp = (unsigned long) Exp;
     1622  nKillChar(res->cf);
     1623  coeffs cf;
     1624  if(typ == n_Zn)
     1625  {
     1626    cf = nInitChar(n_Zn,(void*) &info);
     1627  }
     1628  if(typ == n_Znm)
     1629  {
     1630    cf = nInitChar(n_Znm,(void*) &info);
     1631  }
     1632  if(typ == n_Z2m)
     1633  {
     1634    cf = nInitChar(n_Z2m,(void*)(long)Exp);
     1635  }
     1636  res->cf = cf;
     1637  rComplete(res, 1); // res is purely commutative so far
     1638  if (r->qideal!=NULL) res->qideal=idrCopyR_NoSort(r->qideal, r, res);
     1639
     1640#ifdef HAVE_PLURAL
     1641  if (rIsPluralRing(r))
     1642    if( nc_rCopy(res, r, true) ) {}
     1643#endif
     1644  //omFreeSize(dummy, sizeof(mpz_t));
    16021645  return res;
    16031646}
  • libpolys/polys/monomials/ring.h

    rab8e53d r8ca38a7  
    346346void   rWrite(ring r, BOOLEAN details = FALSE);
    347347ring   rCopy(ring r);
     348ring   rCopyNewCoeff(ring r, mpz_t Base, int Exp, n_coeffType typ);
    348349ring   rCopy0(const ring r, BOOLEAN copy_qideal = TRUE, BOOLEAN copy_ordering = TRUE);
    349350ring rCopy0AndAddA(ring r, int64vec *wv64, BOOLEAN copy_qideal = TRUE,
Note: See TracChangeset for help on using the changeset viewer.