Changeset a3cc8cd in git


Ignore:
Timestamp:
Jul 7, 2015, 12:09:21 PM (8 years ago)
Author:
Adi Popescu <adi_popescum@…>
Branches:
(u'spielwiese', '8e0ad00ce244dfd0756200662572aef8402f13d5')
Children:
4d5a3e157624291163b8d41cd28737b69b220cd4
Parents:
ae0188e380f485df33ffbd07d75eaca52206add7
Message:
fix: preIntegerCheck memory leaks
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/GBEngine/kutil.cc

    rae0188 ra3cc8cd  
    87318731poly preIntegerCheck(ideal FOrig, ideal Q)
    87328732
     8733  assume(nCoeff_is_Ring_Z(currRing->cf));
     8734  if(!nCoeff_is_Ring_Z(currRing->cf))
     8735    return NULL;
    87338736  ideal F = idCopy(FOrig);
    87348737  idSkipZeroes(F);
    87358738  poly pmon;
    8736   if(nCoeff_is_Ring_Z(currRing->cf))
    8737   {
    8738     ring origR = currRing;
    8739     ideal monred = idInit(1,1);
    8740     for(int i=0; i<idElem(F); i++)
    8741     {
    8742       if(pNext(F->m[i]) == NULL)
    8743           idInsertPoly(monred, F->m[i]);
    8744     }
    8745     int posconst = idPosConstant(F);
    8746     if((posconst != -1) && (!nIsZero(F->m[posconst]->coef)))
    8747     {
    8748         pmon = pCopy(F->m[posconst]);
    8749         return pmon;
    8750     }
    8751     int idelemQ = 0;
    8752     if(Q!=NULL)
    8753     {
    8754         idelemQ = IDELEMS(Q);
    8755         for(int i=0; i<idelemQ; i++)
    8756         {
    8757           if(pNext(Q->m[i]) == NULL)
    8758               idInsertPoly(monred, Q->m[i]);
    8759         }
    8760         idSkipZeroes(monred);
    8761         posconst = idPosConstant(monred);
    8762         //the constant, if found, will be from Q
    8763         if((posconst != -1) && (!nIsZero(monred->m[posconst]->coef)))
    8764         {
    8765             pmon = pCopy(monred->m[posconst]);
    8766             return pmon;
    8767         }
    8768     }
    8769     ring QQ_ring = rCopy0(currRing,FALSE);
    8770     nKillChar(QQ_ring->cf);
    8771     QQ_ring->cf = nInitChar(n_Q, NULL);
    8772     rComplete(QQ_ring,1);
    8773     QQ_ring = rAssure_c_dp(QQ_ring);
    8774     rChangeCurrRing(QQ_ring);
    8775     nMapFunc nMap = n_SetMap(origR->cf, QQ_ring->cf);
    8776     ideal II = idInit(IDELEMS(F)+idelemQ+2,id_RankFreeModule(F, origR));
    8777     for(int i = 0, j = 0; i<IDELEMS(F); i++)
    8778         II->m[j++] = prMapR(F->m[i], nMap, origR, QQ_ring);
    8779     for(int i = 0, j = IDELEMS(F); i<idelemQ; i++)
    8780         II->m[j++] = prMapR(Q->m[i], nMap, origR, QQ_ring);
    8781     ideal one = kStd(II, NULL, isNotHomog, NULL);
    8782     idSkipZeroes(one);
    8783     if(idIsConstant(one))
    8784     {
    8785         //one should be <1>
    8786         for(int i = IDELEMS(II)-1; i>=0; i--)
    8787             if(II->m[i] != NULL)
    8788                 II->m[i+1] = II->m[i];
    8789         II->m[0] = pOne();
    8790         ideal syz = idSyzygies(II, isNotHomog, NULL);     
    8791         poly integer = NULL;
    8792         for(int i = IDELEMS(syz)-1;i>=0; i--)
    8793         {
    8794             if(pGetComp(syz->m[i]) == 1)
    8795             {
    8796                 if(pIsConstant(syz->m[i]))
    8797                 {
    8798                     integer = pHead(syz->m[i]);
    8799                     pSetComp(integer, 0);
    8800                     break;
    8801                 }
    8802             }
    8803         }
    8804         rChangeCurrRing(origR);
    8805         nMapFunc nMap2 = n_SetMap(QQ_ring->cf, origR->cf);
    8806         pmon = prMapR(integer, nMap2, QQ_ring, origR);
    8807         rDelete(QQ_ring);
    8808         return pmon;
     8739  ring origR = currRing;
     8740  ideal monred = idInit(1,1);
     8741  for(int i=0; i<idElem(F); i++)
     8742  {
     8743    if(pNext(F->m[i]) == NULL)
     8744        idInsertPoly(monred, F->m[i]);
     8745  }
     8746  int posconst = idPosConstant(F);
     8747  if((posconst != -1) && (!nIsZero(F->m[posconst]->coef)))
     8748  {
     8749      pmon = pCopy(F->m[posconst]);
     8750      idDelete(&F);
     8751      idDelete(&monred);
     8752      return pmon;
     8753  }
     8754  int idelemQ = 0;
     8755  if(Q!=NULL)
     8756  {
     8757      idelemQ = IDELEMS(Q);
     8758      for(int i=0; i<idelemQ; i++)
     8759      {
     8760        if(pNext(Q->m[i]) == NULL)
     8761            idInsertPoly(monred, Q->m[i]);
     8762      }
     8763      idSkipZeroes(monred);
     8764      posconst = idPosConstant(monred);
     8765      //the constant, if found, will be from Q
     8766      if((posconst != -1) && (!nIsZero(monred->m[posconst]->coef)))
     8767      {
     8768          pmon = pCopy(monred->m[posconst]);
     8769          idDelete(&F);
     8770          idDelete(&monred);
     8771          return pmon;
     8772      }
     8773  }
     8774  ring QQ_ring = rCopy0(currRing,FALSE);
     8775  nKillChar(QQ_ring->cf);
     8776  QQ_ring->cf = nInitChar(n_Q, NULL);
     8777  rComplete(QQ_ring,1);
     8778  QQ_ring = rAssure_c_dp(QQ_ring);
     8779  rChangeCurrRing(QQ_ring);
     8780  nMapFunc nMap = n_SetMap(origR->cf, QQ_ring->cf);
     8781  ideal II = idInit(IDELEMS(F)+idelemQ+2,id_RankFreeModule(F, origR));
     8782  for(int i = 0, j = 0; i<IDELEMS(F); i++)
     8783      II->m[j++] = prMapR(F->m[i], nMap, origR, QQ_ring);
     8784  for(int i = 0, j = IDELEMS(F); i<idelemQ; i++)
     8785      II->m[j++] = prMapR(Q->m[i], nMap, origR, QQ_ring);
     8786  ideal one = kStd(II, NULL, isNotHomog, NULL);
     8787  idSkipZeroes(one);
     8788  if(idIsConstant(one))
     8789  {
     8790      //one should be <1>
     8791      for(int i = IDELEMS(II)-1; i>=0; i--)
     8792          if(II->m[i] != NULL)
     8793              II->m[i+1] = II->m[i];
     8794      II->m[0] = pOne();
     8795      ideal syz = idSyzygies(II, isNotHomog, NULL);     
     8796      poly integer = NULL;
     8797      for(int i = IDELEMS(syz)-1;i>=0; i--)
     8798      {
     8799          if(pGetComp(syz->m[i]) == 1)
     8800          {
     8801              if(pIsConstant(syz->m[i]))
     8802              {
     8803                  integer = pHead(syz->m[i]);
     8804                  pSetComp(integer, 0);
     8805                  break;
     8806              }
     8807          }
     8808      }
     8809      rChangeCurrRing(origR);
     8810      nMapFunc nMap2 = n_SetMap(QQ_ring->cf, origR->cf);
     8811      pmon = prMapR(integer, nMap2, QQ_ring, origR);
     8812      idDelete(&F);
     8813      idDelete(&monred);
     8814      idDelete(&II);
     8815      idDelete(&one);
     8816      idDelete(&syz);
     8817      pDelete(&integer);
     8818      rDelete(QQ_ring);
     8819      return pmon;
     8820  }
     8821  else
     8822  {
     8823    if(idIs0(monred))
     8824    { 
     8825      poly mindegmon = NULL;
     8826      for(int i = 0; i<IDELEMS(one); i++)
     8827      {
     8828        if(pNext(one->m[i]) == NULL)
     8829        {
     8830          if(mindegmon == NULL)
     8831            mindegmon = one->m[i];
     8832          else
     8833          {
     8834            if(p_Deg(one->m[i], QQ_ring) < p_Deg(mindegmon, QQ_ring))
     8835              mindegmon = one->m[i];
     8836          }
     8837        }
     8838      }
     8839      if(mindegmon != NULL)
     8840      {
     8841          for(int i = IDELEMS(II)-1; i>=0; i--)
     8842              if(II->m[i] != NULL)
     8843                  II->m[i+1] = II->m[i];
     8844          II->m[0] = mindegmon;
     8845          ideal syz = idSyzygies(II, isNotHomog, NULL);
     8846          bool found = FALSE;
     8847          for(int i = IDELEMS(syz)-1;i>=0; i--)
     8848          {
     8849              if(pGetComp(syz->m[i]) == 1)
     8850              {
     8851                  if(pIsConstant(syz->m[i]))
     8852                  {
     8853                      pSetCoeff(mindegmon, syz->m[i]->coef);
     8854                      found = TRUE;
     8855                        break;
     8856                  }
     8857              }
     8858          }
     8859          idDelete(&syz);
     8860          if (found == FALSE)
     8861          {
     8862              rChangeCurrRing(origR);
     8863              idDelete(&F);
     8864              idDelete(&monred);
     8865              idDelete(&II);
     8866              idDelete(&one);
     8867              pDelete(&mindegmon);
     8868              pDelete(&pmon);
     8869              rDelete(QQ_ring);
     8870              return NULL;
     8871          }
     8872          rChangeCurrRing(origR);
     8873          nMapFunc nMap2 = n_SetMap(QQ_ring->cf, origR->cf);
     8874          pmon = prMapR(mindegmon, nMap2, QQ_ring, origR);
     8875          idDelete(&F);
     8876          idDelete(&monred);
     8877          idDelete(&II);
     8878          idDelete(&one);
     8879          idDelete(&syz);
     8880          pDelete(&mindegmon);
     8881          rDelete(QQ_ring);
     8882          return pmon;
     8883      }
     8884      else
     8885          rChangeCurrRing(origR);
     8886      pDelete(&mindegmon);
    88098887    }
    88108888    else
    8811     {
    8812       if(idIs0(monred))
    8813       { 
    8814         poly mindegmon = NULL;
    8815         for(int i = 0; i<IDELEMS(one); i++)
    8816         {
    8817           if(pNext(one->m[i]) == NULL)
    8818           {
    8819             if(mindegmon == NULL)
    8820               mindegmon = one->m[i];
    8821             else
    8822             {
    8823               if(p_Deg(one->m[i], QQ_ring) < p_Deg(mindegmon, QQ_ring))
    8824                 mindegmon = one->m[i];
    8825             }
    8826           }
    8827         }
    8828         if(mindegmon != NULL)
    8829         {
    8830             for(int i = IDELEMS(II)-1; i>=0; i--)
    8831                 if(II->m[i] != NULL)
    8832                     II->m[i+1] = II->m[i];
    8833             II->m[0] = mindegmon;
    8834             ideal syz = idSyzygies(II, isNotHomog, NULL);
    8835             bool found = FALSE;
    8836             for(int i = IDELEMS(syz)-1;i>=0; i--)
    8837             {
    8838                 if(pGetComp(syz->m[i]) == 1)
    8839                 {
    8840                     if(pIsConstant(syz->m[i]))
    8841                     {
    8842                         pSetCoeff(mindegmon, syz->m[i]->coef);
    8843                         found = TRUE;
    8844                         break;
    8845                     }
    8846                 }
    8847             }
    8848             if (found == FALSE)
    8849             {
    8850                 rChangeCurrRing(origR);
    8851                 rDelete(QQ_ring);
    8852                 return NULL;
    8853             }
    8854             rChangeCurrRing(origR);
    8855             nMapFunc nMap2 = n_SetMap(QQ_ring->cf, origR->cf);
    8856             pmon = prMapR(mindegmon, nMap2, QQ_ring, origR);
    8857             rDelete(QQ_ring);
    8858             return pmon;
    8859         }
    8860         else
    8861             rChangeCurrRing(origR);
    8862       }
    8863       else
    8864         rChangeCurrRing(origR);
    8865     }
    8866     rDelete(QQ_ring);
    8867     return NULL;
    8868   }
     8889      rChangeCurrRing(origR);
     8890  }
     8891  idDelete(&F);
     8892  idDelete(&monred);
     8893  idDelete(&II);
     8894  idDelete(&one);
     8895  pDelete(&pmon);
     8896  rDelete(QQ_ring);
     8897  return NULL;
    88698898}
    88708899/*!
Note: See TracChangeset for help on using the changeset viewer.