Changeset 2f5547 in git for libpolys/polys/simpleideals.cc


Ignore:
Timestamp:
Apr 14, 2011, 7:02:41 PM (13 years ago)
Author:
Hans Schoenemann <hannes@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
a2d9930b40d71c14be3fcc86d7741866ea06a6df
Parents:
a665ebdc0e6f023769cadc08a35bd0eb3f3ad935
git-author:
Hans Schoenemann <hannes@mathematik.uni-kl.de>2011-04-14 19:02:41+02:00
git-committer:
Mohamed Barakat <mohamed.barakat@rwth-aachen.de>2011-11-09 12:30:33+01:00
Message:
id_FreeModule
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libpolys/polys/simpleideals.cc

    ra665eb r2f5547  
    1616#include <misc/intvec.h>
    1717#include <polys/simpleideals.h>
     18
     19static poly * idpower;
     20/*collects the monomials in makemonoms, must be allocated befor*/
     21static int idpowerpoint;
     22/*index of the actual monomial in idpower*/
     23static poly * givenideal;
     24/*the ideal from which a power is computed*/
    1825
    1926/*2
     
    714721* return the maximal component number found in any polynomial in s
    715722*/
    716 long idRankFreeModule (ideal s, ring lmRing, ring tailRing)
     723long id_RankFreeModule (ideal s, ring lmRing, ring tailRing)
    717724{
    718725  if (s!=NULL)
     
    808815}
    809816
    810 /*3
    811 *multiplies p with t (!cas) or  (t-1)
    812 *the index of t is:1, so we have to shift all variables
    813 *p is NOT in the actual ring, it has no t
    814 */
    815 static poly p_MultWithT (poly p,BOOLEAN cas, const ring r)
    816 {
    817   /*qp is the working pointer in p*/
    818   /*result is the result, qresult is the working pointer*/
    819   /*pp is p in the actual ring(shifted), qpp the working pointer*/
    820   poly result,qp,pp;
    821   poly qresult=NULL;
    822   poly qpp=NULL;
    823   int  i,j,lex;
    824   number n;
    825 
    826   pp = NULL;
    827   result = NULL;
    828   qp = p;
    829   while (qp != NULL)
    830   {
    831     i = 0;
    832     if (result == NULL)
    833     {/*first monomial*/
    834       result = p_Init(r);
    835       qresult = result;
    836     }
    837     else
    838     {
    839       qresult->next = p_Init(r);
    840       pIter(qresult);
    841     }
    842     for (j=rVar(r)-1; j>0; j--)
    843     {
    844       lex = p_GetExp(qp,j,r);
    845       p_SetExp(qresult,j+1,lex,r);/*copy all variables*/
    846     }
    847     lex = p_GetComp(qp,r);
    848     p_SetComp(qresult,lex,r);
    849     n=n_Copy(pGetCoeff(qp),r->cf);
    850     pSetCoeff0(qresult,n);
    851     qresult->next = NULL;
    852     p_Setm(qresult,r);
    853     /*qresult is now qp brought into the actual ring*/
    854     if (cas)
    855     { /*case: mult with t-1*/
    856       p_SetExp(qresult,1,0,r);
    857       p_Setm(qresult,r);
    858       if (pp == NULL)
    859       { /*first monomial*/
    860         pp = p_Copy(qresult,r);
    861         qpp = pp;
    862       }
    863       else
    864       {
    865         qpp->next = p_Copy(qresult,r);
    866         pIter(qpp);
    867       }
    868       pGetCoeff(qpp)=n_Neg(pGetCoeff(qpp),r->cf);
    869       /*now qpp contains -1*qp*/
    870     }
    871     p_SetExp(qresult,1,1,r);/*this is mult. by t*/
    872     p_Setm(qresult,r);
    873     pIter(qp);
    874   }
    875   /*
    876   *now p is processed:
    877   *result contains t*p
    878   * if cas: pp contains -1*p (in the new ring)
    879   */
    880   if (cas)  qresult->next = pp;
    881   /*  else      qresult->next = NULL;*/
    882   return result;
    883 }
    884 
    885 /*2
    886 * verschiebt die Indizees der Modulerzeugenden um i
    887 */
    888 void pShift (poly * p,int i)
    889 {
    890   poly qp1 = *p,qp2 = *p;/*working pointers*/
    891   int     j = pMaxComp(*p),k = pMinComp(*p);
    892 
    893   if (j+i < 0) return ;
    894   while (qp1 != NULL)
    895   {
    896     if ((pGetComp(qp1)+i > 0) || ((j == -i) && (j == k)))
    897     {
    898       pAddComp(qp1,i);
    899       pSetmComp(qp1);
    900       qp2 = qp1;
    901       pIter(qp1);
    902     }
    903     else
    904     {
    905       if (qp2 == *p)
    906       {
    907         pIter(*p);
    908         pLmDelete(&qp2);
    909         qp2 = *p;
    910         qp1 = *p;
    911       }
    912       else
    913       {
    914         qp2->next = qp1->next;
    915         if (qp1!=NULL) pLmDelete(&qp1);
    916         qp1 = qp2->next;
    917       }
    918     }
    919   }
    920 }
    921 
    922817/*2
    923818*initialized a field with r numbers between beg and end for the
     
    1027922*the free module of rank i
    1028923*/
    1029 ideal idFreeModule (int i)
     924ideal id_FreeModule (int i, const ring r)
    1030925{
    1031926  int j;
     
    1036931  {
    1037932    h->m[j] = p_One(r);
    1038     pSetComp(h->m[j],j+1);
    1039     pSetmComp(h->m[j]);
     933    p_SetComp(h->m[j],j+1,r);
     934    p_SetmComp(h->m[j],r);
    1040935  }
    1041936  return h;
    1042 }
    1043 
    1044 ideal idSectWithElim (ideal h1,ideal h2)
    1045 // does not destroy h1,h2
    1046 {
    1047   if (TEST_OPT_PROT) PrintS("intersect by elimination method\n");
    1048   assume(!idIs0(h1));
    1049   assume(!idIs0(h2));
    1050   assume(IDELEMS(h1)<=IDELEMS(h2));
    1051   assume(idRankFreeModule(h1)==0);
    1052   assume(idRankFreeModule(h2)==0);
    1053   // add a new variable:
    1054   int j;
    1055   ring origRing=currRing;
    1056   ring r=rCopy0(origRing);
    1057   r->N++;
    1058   r->block0[0]=1;
    1059   r->block1[0]= r->N;
    1060   omFree(r->order);
    1061   r->order=(int*)omAlloc0(3*sizeof(int*));
    1062   r->order[0]=ringorder_dp;
    1063   r->order[1]=ringorder_C;
    1064   char **names=(char**)omAlloc0(rVar(r) * sizeof(char_ptr));
    1065   for (j=0;j<r->N-1;j++) names[j]=r->names[j];
    1066   names[r->N-1]=omStrDup("@");
    1067   omFree(r->names);
    1068   r->names=names;
    1069   rComplete(r,TRUE);
    1070   // fetch h1, h2
    1071   ideal h;
    1072   h1=idrCopyR(h1,origRing,r);
    1073   h2=idrCopyR(h2,origRing,r);
    1074   // switch to temp. ring r
    1075   rChangeCurrRing(r);
    1076   // create 1-t, t
    1077   poly omt=p_One(r);
    1078   pSetExp(omt,r->N,1);
    1079   poly t=pCopy(omt);
    1080   pSetm(omt);
    1081   omt=pNeg(omt);
    1082   omt=pAdd(omt,p_One(r));
    1083   // compute (1-t)*h1
    1084   h1=(ideal)mpMultP((matrix)h1,omt);
    1085   // compute t*h2
    1086   h2=(ideal)mpMultP((matrix)h2,pCopy(t));
    1087   // (1-t)h1 + t*h2
    1088   h=idInit(IDELEMS(h1)+IDELEMS(h2),1);
    1089   int l;
    1090   for (l=IDELEMS(h1)-1; l>=0; l--)
    1091   {
    1092     h->m[l] = h1->m[l];  h1->m[l]=NULL;
    1093   }
    1094   j=IDELEMS(h1);
    1095   for (l=IDELEMS(h2)-1; l>=0; l--)
    1096   {
    1097     h->m[l+j] = h2->m[l];  h2->m[l]=NULL;
    1098   }
    1099   idDelete(&h1);
    1100   idDelete(&h2);
    1101   // eliminate t:
    1102 
    1103   ideal res=idElimination(h,t);
    1104   // cleanup
    1105   idDelete(&h);
    1106   res=idrMoveR(res,r,origRing);
    1107   rChangeCurrRing(origRing);
    1108   rKill(r);
    1109   return res;
    1110937}
    1111938
     
    1122949*monomdeg is the actual degree of the monomial in consideration
    1123950*/
    1124 static void makemonoms(int vars,int actvar,int deg,int monomdeg)
     951static void makemonoms(int vars,int actvar,int deg,int monomdeg, const ring r)
    1125952{
    1126953  poly p;
     
    1136963    if (deg == monomdeg)
    1137964    {
    1138       pSetm(idpower[idpowerpoint]);
     965      p_Setm(idpower[idpowerpoint],r);
    1139966      idpowerpoint++;
    1140967      return;
     
    1142969    if (actvar == vars)
    1143970    {
    1144       pSetExp(idpower[idpowerpoint],actvar,deg-monomdeg);
    1145       pSetm(idpower[idpowerpoint]);
    1146       pTest(idpower[idpowerpoint]);
     971      p_SetExp(idpower[idpowerpoint],actvar,deg-monomdeg,r);
     972      p_Setm(idpower[idpowerpoint],r);
     973      p_Test(idpower[idpowerpoint],r);
    1147974      idpowerpoint++;
    1148975      return;
     
    1150977    else
    1151978    {
    1152       p = pCopy(idpower[idpowerpoint]);
    1153       makemonoms(vars,actvar+1,deg,monomdeg);
     979      p = p_Copy(idpower[idpowerpoint],r);
     980      makemonoms(vars,actvar+1,deg,monomdeg,r);
    1154981      idpower[idpowerpoint] = p;
    1155982    }
    1156983    monomdeg++;
    1157     pSetExp(idpower[idpowerpoint],actvar,pGetExp(idpower[idpowerpoint],actvar)+1);
    1158     pSetm(idpower[idpowerpoint]);
    1159     pTest(idpower[idpowerpoint]);
     984    p_SetExp(idpower[idpowerpoint],actvar,p_GetExp(idpower[idpowerpoint],actvar,r)+1,r);
     985    p_Setm(idpower[idpowerpoint],r);
     986    p_Test(idpower[idpowerpoint],r);
    1160987    i++;
    1161988  }
     
    11791006  if (deg == 1)
    11801007  {
    1181     return idMaxIdeal(r);
     1008    return id_MaxIdeal(r);
    11821009  }
    11831010
     
    11881015  idpower = id->m;
    11891016  idpowerpoint = 0;
    1190   makemonoms(vars,1,deg,0);
     1017  makemonoms(vars,1,deg,0,r);
    11911018  idpower = NULL;
    11921019  idpowerpoint = 0;
     
    12021029*gendeg is the actual degree of the generator in consideration
    12031030*/
    1204 static void makepotence(int elms,int actelm,int deg,int gendeg)
     1031static void makepotence(int elms,int actelm,int deg,int gendeg, const ring r)
    12051032{
    12061033  poly p;
     
    12211048    if (actelm == elms)
    12221049    {
    1223       p=pPower(pCopy(givenideal[actelm-1]),deg-gendeg);
    1224       idpower[idpowerpoint]=pMult(idpower[idpowerpoint],p);
     1050      p=p_Power(p_Copy(givenideal[actelm-1],r),deg-gendeg,r);
     1051      idpower[idpowerpoint]=p_Mult_q(idpower[idpowerpoint],p,r);
    12251052      idpowerpoint++;
    12261053      return;
     
    12281055    else
    12291056    {
    1230       p = pCopy(idpower[idpowerpoint]);
    1231       makepotence(elms,actelm+1,deg,gendeg);
     1057      p = p_Copy(idpower[idpowerpoint],r);
     1058      makepotence(elms,actelm+1,deg,gendeg,r);
    12321059      idpower[idpowerpoint] = p;
    12331060    }
    12341061    gendeg++;
    1235     idpower[idpowerpoint]=pMult(idpower[idpowerpoint],pCopy(givenideal[actelm-1]));
     1062    idpower[idpowerpoint]=p_Mult_q(idpower[idpowerpoint],p_Copy(givenideal[actelm-1],r),r);
    12361063    i++;
    12371064  }
Note: See TracChangeset for help on using the changeset viewer.