Changeset 3e31b2 in git


Ignore:
Timestamp:
Apr 17, 2014, 11:42:03 AM (10 years ago)
Author:
Adi Popescu <adi_popescum@…>
Branches:
(u'spielwiese', '6e5adcba05493683b94648c659a729c189812c77')
Children:
2f864fd4d49e100b0c0e759c51665fb14c67c55c
Parents:
4341170a137c82a30b8d5c6007a7c6797c5d3f19
git-author:
Adi Popescu <adi_popescum@yahoo.de>2014-04-17 11:42:03+02:00
git-committer:
Adi Popescu <adi_popescum@yahoo.de>2014-05-05 11:08:44+02:00
Message:
mv: moved the qring constant build into a function
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • Singular/ipassign.cc

    r4341170 r3e31b2  
    748748  ideal id=(ideal)a->CopyD(IDEAL_CMD);
    749749  if((rField_is_Ring(currRing)) && (idPosConstant(id) != -1))
    750   {
    751 // computing over Rings: handle constant generators of id properly
    752       if(nCoeff_is_Ring_ModN(currRing->cf) ||
    753          nCoeff_is_Ring_PtoM(currRing->cf) ||
    754          nCoeff_is_Ring_2toM(currRing->cf))
    755       {
    756       // already computing mod modNumber: use gcd(modNumber,constant entry of id)
    757         mpz_t gcd;
    758         mpz_t newConst;
    759         mpz_init(newConst);
    760         mpz_set_ui(newConst, currRing->cf->cfInt(p_GetCoeff(id->m[idPosConstant(id)], currRing),currRing->cf));
    761         mpz_init(gcd);
    762         mpz_gcd(gcd, currRing->cf->modNumber, newConst);
    763         if(mpz_cmp_ui(gcd, 1) == 0)
    764         {
    765             WerrorS("constant in q-ideal is coprime to modulus in ground ring");
    766             WerrorS("Unable to create qring!");
     750    {
     751        qr = updateQring(currRing, id, idPosConstant(id));
     752        if(qr == NULL)
    767753            return TRUE;
    768         }
    769         if(nCoeff_is_Ring_PtoM(currRing->cf) ||
    770            nCoeff_is_Ring_2toM(currRing->cf))
    771         {
    772         // modNumber is prime power: set modExponent appropriately
    773           int kNew = 1;
    774           mpz_t baseTokNew;
    775           mpz_init(baseTokNew);
    776           mpz_set(baseTokNew, currRing->cf->modBase);
    777           while(mpz_cmp(gcd, baseTokNew) > 0)
    778           {
    779             kNew++;
    780             mpz_mul(baseTokNew, baseTokNew, currRing->cf->modBase);
    781           }
    782           //To Do: currently we stay in case Z/p^n even for n=1
    783           //       for performance reasons passing to groundfield Z/p
    784           //       would be more suitable
    785           qr = rCopyNewCoeff(currRing, currRing->cf->modBase, kNew, currRing->cf->type);
    786           mpz_clear(baseTokNew);
    787         }
    788         else
    789         {
    790         // previously over modNumber, now over new modNumber
    791           qr = rCopyNewCoeff(currRing, gcd, 1, currRing->cf->type);
    792           //printf("\nAfter rCopyNewCoeff: \n");
    793           //rWrite(qr);
    794         }
    795         mpz_clear(gcd);
    796         //printf("\nAfter mpz_clear: \n");
    797         //rWrite(qr);
    798         mpz_clear(newConst);
    799       }
    800       else
    801       {
    802       // previously over Z, now over Z/m
    803         mpz_t newConst;
    804         mpz_init(newConst);
    805         mpz_set_ui(newConst, currRing->cf->cfInt(p_GetCoeff(id->m[idPosConstant(id)], currRing),currRing->cf));
    806         qr= rCopyNewCoeff( currRing, newConst, 1, n_Zn);
    807         mpz_clear(newConst);
    808       }
    809   }   
     754    }
    810755  else
    811756#endif
  • libpolys/polys/monomials/ring.cc

    r4341170 r3e31b2  
    16441644  //omFreeSize(dummy, sizeof(mpz_t));
    16451645  return res;
     1646}
     1647
     1648ring updateQring(ring r, ideal id, int pos)
     1649{
     1650    ring qr;
     1651    // computing over Rings: handle constant generators of id properly
     1652      if(nCoeff_is_Ring_ModN(r->cf) ||
     1653         nCoeff_is_Ring_PtoM(r->cf) ||
     1654         nCoeff_is_Ring_2toM(r->cf))
     1655      {
     1656      // already computing mod modNumber: use gcd(modNumber,constant entry of id)
     1657        mpz_t gcd;
     1658        mpz_t newConst;
     1659        mpz_init(newConst);
     1660        mpz_set_ui(newConst, r->cf->cfInt(p_GetCoeff(id->m[pos], r),r->cf));
     1661        mpz_init(gcd);
     1662        mpz_gcd(gcd, r->cf->modNumber, newConst);
     1663        if(mpz_cmp_ui(gcd, 1) == 0)
     1664        {
     1665            WerrorS("constant in q-ideal is coprime to modulus in ground ring");
     1666            WerrorS("Unable to create qring!");
     1667            return NULL;
     1668        }
     1669        if(nCoeff_is_Ring_PtoM(r->cf) ||
     1670           nCoeff_is_Ring_2toM(r->cf))
     1671        {
     1672        // modNumber is prime power: set modExponent appropriately
     1673          int kNew = 1;
     1674          mpz_t baseTokNew;
     1675          mpz_init(baseTokNew);
     1676          mpz_set(baseTokNew, r->cf->modBase);
     1677          while(mpz_cmp(gcd, baseTokNew) > 0)
     1678          {
     1679            kNew++;
     1680            mpz_mul(baseTokNew, baseTokNew, r->cf->modBase);
     1681          }
     1682          //To Do: currently we stay in case Z/p^n even for n=1
     1683          //       for performance reasons passing to groundfield Z/p
     1684          //       would be more suitable
     1685          qr = rCopyNewCoeff(r, r->cf->modBase, kNew, r->cf->type);
     1686          mpz_clear(baseTokNew);
     1687        }
     1688        else
     1689        {
     1690        // previously over modNumber, now over new modNumber
     1691          qr = rCopyNewCoeff(r, gcd, 1, r->cf->type);
     1692          //printf("\nAfter rCopyNewCoeff: \n");
     1693          //rWrite(qr);
     1694        }
     1695        mpz_clear(gcd);
     1696        //printf("\nAfter mpz_clear: \n");
     1697        //rWrite(qr);
     1698        mpz_clear(newConst);
     1699      }
     1700      else
     1701      {
     1702      // previously over Z, now over Z/m
     1703        mpz_t newConst;
     1704        mpz_init(newConst);
     1705        mpz_set_ui(newConst, r->cf->cfInt(p_GetCoeff(id->m[pos], r),r->cf));
     1706        qr= rCopyNewCoeff( r, newConst, 1, n_Zn);
     1707        mpz_clear(newConst);
     1708      }
     1709      return(qr); 
    16461710}
    16471711
  • libpolys/polys/monomials/ring.h

    r4341170 r3e31b2  
    347347ring   rCopy(ring r);
    348348ring   rCopyNewCoeff(ring r, mpz_t Base, int Exp, n_coeffType typ);
     349ring   updateQring(ring r, ideal id, int pos);
    349350ring   rCopy0(const ring r, BOOLEAN copy_qideal = TRUE, BOOLEAN copy_ordering = TRUE);
    350351ring rCopy0AndAddA(ring r, int64vec *wv64, BOOLEAN copy_qideal = TRUE,
Note: See TracChangeset for help on using the changeset viewer.