Changeset 504141 in git


Ignore:
Timestamp:
Mar 8, 2021, 4:39:57 PM (3 years ago)
Author:
Hans Schoenemann <hannes@…>
Branches:
(u'fieker-DuVal', '117eb8c30fc9e991c4decca4832b1d19036c4c65')(u'spielwiese', 'd25190065115c859833252500a64cfb7b11e3a50')
Children:
4263291e5cc2308d87d770716602134c2f1f2ca4
Parents:
b67c34f3a45912b4e83b80a2c91585ff3cda8222
Message:
add idExtractG_T_S, use it in idLiftStd, idModulo
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/ideals.cc

    rb67c34f r504141  
    854854}
    855855
    856 /*
    857 *computes a standard basis for h1 and stores the transformation matrix
    858 * in ma
    859 */
    860 ideal idLiftStd (ideal  h1, matrix* ma, tHomog hi, ideal * syz, GbVariant alg,
    861   ideal h11)
    862 {
    863   int  i, j, t, inputIsIdeal=id_RankFreeModule(h1,currRing);
    864   long k;
    865   poly  p=NULL, q;
    866   intvec *w=NULL;
    867 
    868   idDelete((ideal*)ma);
    869   BOOLEAN lift3=FALSE;
    870   if (syz!=NULL) { lift3=TRUE; idDelete(syz); }
    871   if (idIs0(h1))
    872   {
    873     *ma=mpNew(1,0);
    874     if (lift3)
    875     {
    876       *syz=idFreeModule(IDELEMS(h1));
    877     }
    878     return idInit(1,h1->rank);
    879   }
    880 
    881   BITSET save2;
    882   SI_SAVE_OPT2(save2);
    883 
    884   k=si_max(1,inputIsIdeal);
    885 
    886   if ((!lift3)&&(!TEST_OPT_RETURN_SB)) si_opt_2 |=Sy_bit(V_IDLIFT);
    887 
    888   ring orig_ring = currRing;
    889   ring syz_ring = rAssure_SyzOrder(orig_ring,TRUE);
    890   rSetSyzComp(k,syz_ring);
    891   rChangeCurrRing(syz_ring);
    892 
    893   ideal s_h1=h1;
    894 
    895   if (orig_ring != syz_ring)
    896     s_h1 = idrCopyR_NoSort(h1,orig_ring,syz_ring);
    897   else
    898     s_h1 = h1;
    899   ideal s_h11=NULL;
    900   if (h11!=NULL)
    901   {
    902     s_h11=idrCopyR_NoSort(h11,orig_ring,syz_ring);
    903   }
    904 
    905 
    906   ideal s_h3=idPrepare(s_h1,s_h11,hi,k,&w,alg); // main (syz) GB computation
    907 
    908   ideal s_h2 = idInit(IDELEMS(s_h3), s_h3->rank);
    909 
    910   if (lift3) (*syz)=idInit(IDELEMS(s_h3),IDELEMS(h1));
    911 
    912   if (w!=NULL) delete w;
    913   i = 0;
    914 
     856ideal idExtractG_T_S(ideal s_h3,matrix *T,ideal *S,long syzComp,
     857    int h1_size,BOOLEAN inputIsIdeal,const ring oring, const ring sring)
     858{
    915859  // now sort the result, SB : leave in s_h3
    916   //                      T:  put in s_h2
    917   //                      syz: put in *syz
     860  //                      T:  put in s_h2 (*T as a matrix)
     861  //                      syz: put in *S
     862  ideal s_h2 = idInit(IDELEMS(s_h3), s_h3->rank); // will become T
     863
     864  int j, i=0;
    918865  for (j=0; j<IDELEMS(s_h3); j++)
    919866  {
    920867    if (s_h3->m[j] != NULL)
    921868    {
    922       //if (p_MinComp(s_h3->m[j],syz_ring) <= k)
    923       if (pGetComp(s_h3->m[j]) <= k) // syz_ring == currRing
     869      if (pGetComp(s_h3->m[j]) <= syzComp) // syz_ring == currRing
    924870      {
    925871        i++;
    926         q = s_h3->m[j];
     872        poly q = s_h3->m[j];
    927873        while (pNext(q) != NULL)
    928874        {
    929           if (pGetComp(pNext(q)) > k)
     875          if (pGetComp(pNext(q)) > syzComp)
    930876          {
    931877            s_h2->m[i-1] = pNext(q);
     
    942888      {
    943889        // we a syzygy here:
    944         if (lift3)
     890        if (S!=NULL)
    945891        {
    946           p_Shift(&s_h3->m[j], -k,currRing);
    947           (*syz)->m[j]=s_h3->m[j];
     892          p_Shift(&s_h3->m[j], -syzComp,currRing);
     893          (*S)->m[j]=s_h3->m[j];
    948894          s_h3->m[j]=NULL;
    949895        }
     
    962908  //PrintLn();
    963909
    964   if (lift3) idSkipZeroes(*syz);
    965 
    966   j = IDELEMS(s_h1);
    967 
    968 
     910  if (S!=NULL) idSkipZeroes(*S);
     911
     912  if (sring!=oring)
     913  {
     914    rChangeCurrRing(oring);
     915  }
     916
     917  if (T!=NULL)
     918  {
     919    *T = mpNew(h1_size,i);
     920
     921    for (j=0; j<i; j++)
     922    {
     923      if (s_h2->m[j] != NULL)
     924      {
     925        poly q = prMoveR( s_h2->m[j], sring,oring);
     926        s_h2->m[j] = NULL;
     927
     928        if (q!=NULL)
     929        {
     930          q=pReverse(q);
     931          while (q != NULL)
     932          {
     933            poly p = q;
     934            pIter(q);
     935            pNext(p) = NULL;
     936            int t=pGetComp(p);
     937            pSetComp(p,0);
     938            pSetmComp(p);
     939            MATELEM(*T,t-syzComp,j+1) = pAdd(MATELEM(*T,t-syzComp,j+1),p);
     940          }
     941        }
     942      }
     943    }
     944  }
     945  id_Delete(&s_h2,sring);
     946
     947  for (i=0; i<IDELEMS(s_h3); i++)
     948  {
     949    s_h3->m[i] = prMoveR_NoSort(s_h3->m[i], sring,oring);
     950  }
     951  if (S!=NULL)
     952  {
     953    for (i=0; i<IDELEMS(*S); i++)
     954    {
     955      (*S)->m[i] = prMoveR_NoSort((*S)->m[i], sring,oring);
     956    }
     957  }
     958  return s_h3;
     959}
     960
     961/*
     962*computes a standard basis for h1 and stores the transformation matrix
     963* in ma
     964*/
     965ideal idLiftStd (ideal  h1, matrix* T, tHomog hi, ideal * S, GbVariant alg,
     966  ideal h11)
     967{
     968  int  inputIsIdeal=id_RankFreeModule(h1,currRing);
     969  long k;
     970  intvec *w=NULL;
     971
     972  idDelete((ideal*)T);
     973  BOOLEAN lift3=FALSE;
     974  if (S!=NULL) { lift3=TRUE; idDelete(S); }
     975  if (idIs0(h1))
     976  {
     977    *T=mpNew(1,0);
     978    if (lift3)
     979    {
     980      *S=idFreeModule(IDELEMS(h1));
     981    }
     982    return idInit(1,h1->rank);
     983  }
     984
     985  BITSET save2;
     986  SI_SAVE_OPT2(save2);
     987
     988  k=si_max(1,inputIsIdeal);
     989
     990  if ((!lift3)&&(!TEST_OPT_RETURN_SB)) si_opt_2 |=Sy_bit(V_IDLIFT);
     991
     992  ring orig_ring = currRing;
     993  ring syz_ring = rAssure_SyzOrder(orig_ring,TRUE);
     994  rSetSyzComp(k,syz_ring);
     995  rChangeCurrRing(syz_ring);
     996
     997  ideal s_h1;
     998
     999  if (orig_ring != syz_ring)
     1000    s_h1 = idrCopyR_NoSort(h1,orig_ring,syz_ring);
     1001  else
     1002    s_h1 = h1;
     1003  ideal s_h11=NULL;
     1004  if (h11!=NULL)
     1005  {
     1006    s_h11=idrCopyR_NoSort(h11,orig_ring,syz_ring);
     1007  }
     1008
     1009
     1010  ideal s_h3=idPrepare(s_h1,s_h11,hi,k,&w,alg); // main (syz) GB computation
     1011
     1012
     1013  if (w!=NULL) delete w;
    9691014  if (syz_ring!=orig_ring)
    9701015  {
    9711016    idDelete(&s_h1);
    9721017    if (s_h11!=NULL) idDelete(&s_h11);
    973     rChangeCurrRing(orig_ring);
    974   }
    975 
    976   *ma = mpNew(j,i);
    977 
    978   for (j=0; j<i; j++)
    979   {
    980     if (s_h2->m[j] != NULL)
    981     {
    982       q = prMoveR( s_h2->m[j], syz_ring,orig_ring);
    983       s_h2->m[j] = NULL;
    984 
    985       if (q!=NULL)
    986       {
    987         q=pReverse(q);
    988         while (q != NULL)
    989         {
    990           p = q;
    991           pIter(q);
    992           pNext(p) = NULL;
    993           t=pGetComp(p);
    994           pSetComp(p,0);
    995           pSetmComp(p);
    996           MATELEM(*ma,t-k,j+1) = pAdd(MATELEM(*ma,t-k,j+1),p);
    997         }
    998       }
    999     }
    1000   }
    1001   idDelete(&s_h2);
    1002 
    1003   for (i=0; i<IDELEMS(s_h3); i++)
    1004   {
    1005     s_h3->m[i] = prMoveR_NoSort(s_h3->m[i], syz_ring,orig_ring);
    1006   }
    1007   if (lift3)
    1008   {
    1009     for (i=0; i<IDELEMS(*syz); i++)
    1010     {
    1011       (*syz)->m[i] = prMoveR_NoSort((*syz)->m[i], syz_ring,orig_ring);
    1012     }
    1013   }
     1018  }
     1019
     1020  if (S!=NULL) (*S)=idInit(IDELEMS(s_h3),IDELEMS(h1));
     1021
     1022  s_h3=idExtractG_T_S(s_h3,T,S,k,IDELEMS(h1),inputIsIdeal,orig_ring,syz_ring);
    10141023
    10151024  if (syz_ring!=orig_ring) rDelete(syz_ring);
     
    23922401  slength = id_RankFreeModule(h2,currRing);
    23932402  length  = si_max(flength,slength);
     2403  BOOLEAN inputIsIdeal=FALSE;
    23942404  if (length==0)
    23952405  {
    23962406    length = 1;
     2407    inputIsIdeal=TRUE;
    23972408  }
    23982409  ideal temp = idInit(IDELEMS(h2),length+IDELEMS(h2));
     
    25042515  if (wtmp!=NULL) delete wtmp;
    25052516
    2506   if (T==NULL)
    2507   {
    2508     for (i=0;i<IDELEMS(s_temp1);i++)
    2509     {
    2510       if (s_temp1->m[i]!=NULL)
    2511       {
    2512         if (((int)pGetComp(s_temp1->m[i]))<=length)
    2513         {
    2514           p_Delete(&(s_temp1->m[i]),currRing);
    2515         }
    2516         else
    2517         {
    2518           p_Shift(&(s_temp1->m[i]),-length,currRing);
    2519         }
    2520       }
    2521     }
    2522   }
    2523   else
    2524   {
    2525     int m=0;
    2526     for (i=0;i<IDELEMS(s_temp1);i++)
    2527     {
    2528       poly f=s_temp1->m[i];
    2529       if ((f!=NULL) && (((int)pGetComp(f))<=length)) m=i;
    2530     }
    2531     *T=mpNew(IDELEMS(h2),m+1);
    2532     for (i=0;i<IDELEMS(s_temp1);i++)
    2533     {
    2534       if (s_temp1->m[i]!=NULL)
    2535       {
    2536         if (((int)pGetComp(s_temp1->m[i]))<=length)
    2537         {
    2538           do
    2539           {
    2540             p_LmDelete(&(s_temp1->m[i]),currRing);
    2541           } while((int)pGetComp(s_temp1->m[i])<=length);
    2542           poly q = prMoveR( s_temp1->m[i], syz_ring,orig_ring);
    2543           s_temp1->m[i] = NULL;
    2544           if (q!=NULL)
    2545           {
    2546             q=pReverse(q);
    2547             do
    2548             {
    2549               poly p = q;
    2550               long t=p_GetComp(p,orig_ring);
    2551               pIter(q);
    2552               pNext(p) = NULL;
    2553               p_SetComp(p,0,orig_ring);
    2554               p_SetmComp(p,orig_ring);
    2555               p_Test(p,orig_ring);
    2556               MATELEM(*T,(int)t-length,i+1) = p_Add_q(MATELEM(*T,(int)t-length,i+1),p,orig_ring);
    2557             } while (q != NULL);
    2558           }
    2559         }
    2560         else
    2561         {
    2562           p_Shift(&(s_temp1->m[i]),-length,syz_ring);
    2563         }
    2564       }
    2565     }
    2566   }
    2567   s_temp1->rank = rk;
    2568   idSkipZeroes(s_temp1);
    2569 
     2517  ideal result=idInit(IDELEMS(s_temp1),IDELEMS(h2));
     2518  s_temp1=idExtractG_T_S(s_temp1,T,&result,length,IDELEMS(h2),inputIsIdeal,orig_ring,syz_ring);
     2519
     2520  idDelete(&s_temp1);
    25702521  if (syz_ring!=orig_ring)
    25712522  {
    2572     rChangeCurrRing(orig_ring);
    2573     s_temp1 = idrMoveR_NoSort(s_temp1, syz_ring, orig_ring);
    25742523    rDelete(syz_ring);
    2575     // Hmm ... here seems to be a memory leak
    2576     // However, simply deleting it causes memory trouble
    2577     // idDelete(&s_temp);
    2578   }
    2579   idTest(s_temp1);
     2524  }
    25802525  idTest(h2);
    25812526  idTest(h1);
     2527  idTest(result);
    25822528  if (T!=NULL) idTest((ideal)*T);
    2583   return s_temp1;
     2529  return result;
    25842530}
    25852531
Note: See TracChangeset for help on using the changeset viewer.