Ignore:
Timestamp:
Jul 23, 2019, 4:33:05 PM (5 years ago)
Author:
Karim Abou Zeid <karim23697@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
9102bbc549613cd829348b8de22f634afde32b53
Parents:
dcddf9cfa6c64ce8c0dc05e26e136194af70b1e3
git-author:
Karim Abou Zeid <karim23697@gmail.com>2019-07-23 16:33:05+02:00
git-committer:
Karim Abou Zeid <karim23697@gmail.com>2019-07-24 14:54:41+02:00
Message:
Syzygies via LPncGenCount ring variable
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Singular/dyn_modules/freealgebra/freealgebra.cc

    rdcddf9c rf006a1  
    55{
    66  const short t1[]={2,RING_CMD,INT_CMD};
    7   if (iiCheckTypes(args,t1,1))
     7  const short t2[]={3,RING_CMD,INT_CMD,INT_CMD};
     8  if (iiCheckTypes(args, t2, 0) || iiCheckTypes(args, t1, 1))
    89  {
    910    ring r=(ring)args->Data();
     
    3233      return TRUE;
    3334    }
    34     ring R=freeAlgebra(r,d);
     35    int ncGenCount = 0;
     36    if (iiCheckTypes(args,t2,0))
     37      ncGenCount = (int)(long) args->next->next->Data();
     38    ring R=freeAlgebra(r,d,ncGenCount);
    3539    res->rtyp=RING_CMD;
    3640    res->data=R;
     
    124128  else return TRUE;
    125129}
    126 
    127 // copied from iparith.cc
    128 // NOTE: they do not set res->rtyp
    129 static BOOLEAN jjSYZYGY(leftv res, leftv v)
    130 {
    131   intvec *ww=(intvec *)atGet(v,"isHomog",INTVEC_CMD);
    132   intvec *w=NULL;
    133   ideal v_id=(ideal)v->Data();
    134   tHomog hom=testHomog;
    135   if (ww!=NULL)
    136   {
    137     if (idTestHomModule(v_id,currRing->qideal,ww))
    138     {
    139       w=ivCopy(ww);
    140       int add_row_shift=w->min_in();
    141       (*w)-=add_row_shift;
    142       hom=isHomog;
    143     }
    144     else
    145     {
    146       //WarnS("wrong weights");
    147       delete ww; ww=NULL;
    148       hom=testHomog;
    149     }
    150   }
    151   else
    152   {
    153     if (v->Typ()==IDEAL_CMD)
    154       if (idHomIdeal(v_id,currRing->qideal))
    155         hom=isHomog;
    156   }
    157   ideal S=idSyzygies(v_id,hom,&w);
    158   res->data = (char *)S;
    159   if (hom==isHomog)
    160   {
    161     int vl=S->rank;
    162     intvec *vv=new intvec(vl);
    163     if ((v->Typ()==IDEAL_CMD)||(ww==NULL))
    164     {
    165       for(int i=0;i<vl;i++)
    166       {
    167         if (v_id->m[i]!=NULL)
    168           (*vv)[i]=p_Deg(v_id->m[i],currRing);
    169       }
    170     }
    171     else
    172     {
    173       p_SetModDeg(ww, currRing);
    174       for(int i=0;i<vl;i++)
    175       {
    176         if (v_id->m[i]!=NULL)
    177           (*vv)[i]=currRing->pFDeg(v_id->m[i],currRing);
    178       }
    179       p_SetModDeg(NULL, currRing);
    180     }
    181     if (idTestHomModule(S,currRing->qideal,vv))
    182       atSet(res,omStrDup("isHomog"),vv,INTVEC_CMD);
    183     else
    184       delete vv;
    185   }
    186   if (w!=NULL) delete w;
    187   return FALSE;
    188 }
    189 
    190 static ring tagRing(ideal I)
    191 {
    192   ring tagRing = currRing;
    193   for (int i = 1; i <= IDELEMS(I); i++)
    194   {
    195     char *varname=(char *)omAlloc(256);
    196     sprintf(varname, "ncgen(%d)", i);
    197     tagRing = rPlusVar(tagRing, varname, 0);
    198     omFreeSize(varname, 256);
    199   }
    200   return tagRing;
    201 }
    202 
    203 static BOOLEAN lpSyzRing(leftv res, leftv v)
    204 {
    205   const short t1[]={1,IDEAL_CMD};
    206   const short t2[]={1,MODUL_CMD};
    207   if (iiCheckTypes(v,t1,1) || iiCheckTypes(v,t2,1))
    208   {
    209     ring origRing = currRing;
    210     currRing = tagRing((ideal)v->Data());
    211 
    212     BOOLEAN error = jjSYZYGY(res, v);
    213     if (error || errorreported) return TRUE;
    214 
    215     ideal syzygy = (ideal) res->data;
    216     for (int i = 0; i < IDELEMS(syzygy); i++)
    217     {
    218       pWrite(syzygy->m[i]);
    219     }
    220 
    221     res->rtyp = RING_CMD;
    222     res->data = currRing;
    223     currRing = origRing;
    224     return FALSE;
    225   }
    226   else return TRUE;
    227 }
    228 
    229 static BOOLEAN lpTagRing(leftv res, leftv v)
    230 {
    231   const short t[]={1,IDEAL_CMD};
    232   if (iiCheckTypes(v,t,1))
    233   {
    234     res->rtyp = RING_CMD;
    235     res->data = tagRing((ideal)v->Data());
    236     return FALSE;
    237   }
    238   else return TRUE;
    239 }
    240130#endif
    241131
     
    248138  p->iiAddCproc("freealgebra.so","lpLmDivides",FALSE,lpLmDivides);
    249139  p->iiAddCproc("freealgebra.so","lpVarAt",FALSE,lpVarAt);
    250   p->iiAddCproc("freealgebra.so","lpSyzRing",FALSE,lpSyzRing);
    251   p->iiAddCproc("freealgebra.so","lpTagRing",FALSE,lpTagRing);
    252140  p->iiAddCproc("freealgebra.so","stest",TRUE,stest);
    253141  p->iiAddCproc("freealgebra.so","btest",TRUE,btest);
Note: See TracChangeset for help on using the changeset viewer.