Changeset 2444c0 in git


Ignore:
Timestamp:
Feb 12, 2024, 2:40:23 PM (3 months ago)
Author:
Hans Schoenemann <hannes@…>
Branches:
(u'spielwiese', 'b4f17ed1d25f93d46dbe29e4b499baecc2fd51bb')
Children:
cd08f3e3253ab5f83a88042c54606fd8b38c5ed9
Parents:
ce021493acdc6628babc8fe3d1200d5096a9607f
Message:
idDivRem for modules
Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/GBEngine/kLiftstd.cc

    rce0214 r2444c0  
    359359  int lsmod=0;
    360360  if (k==0) { lsmod=1;k=1;}  /*ideal*/
     361  else { k=A->rank;}
     362  /* NF(A 0 E,quot E 0)
     363   * A,quot: 1..k, 0,E: k+1..k+IDELEMS(quot),
     364   * E,0: k+IDELEMS(quot)..k+IDELEMS(quot)+IDELEMS(A) */
    361365  /* new ring */
    362366  ring syz_ring=rAssure_SyzOrder(orig_ring,TRUE);
     
    379383  for(int i=0;i<IDELEMS(s_quot);i++)
    380384  {
    381     p_Shift(&s_quot->m[i],lsmod,syz_ring);
    382385    poly p=p_One(syz_ring);
    383     p_SetComp(p,k+i+2,syz_ring);
     386    p_SetComp(p,k+i+1,syz_ring);
    384387    p_Setm(p,syz_ring);
     388    if (lsmod==1) p_Shift(&(s_quot->m[i]),1,syz_ring);
    385389    s_quot->m[i]=p_Add_q(s_quot->m[i],p,syz_ring);
    386390  }
     
    407411  }
    408412  /* normalform */
     413  #if 0
     414  PrintS("to reduce:\n");
     415  {
     416    void ipPrint_MA0(matrix m, const char *name);
     417    matrix m = id_Module2Matrix(id_Copy(s_A,currRing),currRing);
     418    ipPrint_MA0(m, "A");
     419    id_Delete((ideal *) &m,currRing);
     420  }
     421  PrintS("with:\n");
     422  {
     423    void ipPrint_MA0(matrix m, const char *name);
     424    matrix m = id_Module2Matrix(id_Copy(s_quot,currRing),currRing);
     425    ipPrint_MA0(m, "B");
     426    id_Delete((ideal *) &m,currRing);
     427  }
     428  #endif
    409429  ideal rest=kNF(s_quot,syz_ring->qideal,s_A,0,lazyReduce);
     430  #if 0
     431  PrintS("result NF:\n");
     432  {
     433    void ipPrint_MA0(matrix m, const char *name);
     434    matrix m = id_Module2Matrix(id_Copy(rest,currRing),currRing);
     435    ipPrint_MA0(m, "A");
     436    id_Delete((ideal *) &m,currRing);
     437  }
     438  #endif
    410439  /* clean s_quot,s_A */
    411440  id_Delete(&s_quot,syz_ring);
     
    430459      }
    431460    }
     461    p_Shift(&d,-k,syz_ring);
    432462    rest->m[i]=d;
    433     p_Shift(&result->m[i],-lsmod,syz_ring);
    434   }
     463  }
     464  rest->rank-=k;
     465  #if 0
     466  PrintS("rest:\n");
     467  {
     468    void ipPrint_MA0(matrix m, const char *name);
     469    matrix m = id_Module2Matrix(id_Copy(result,currRing),currRing);
     470    ipPrint_MA0(m, "_");
     471    id_Delete((ideal *) &m,currRing);
     472  }
     473  PrintS("factor+unit:\n");
     474  {
     475    void ipPrint_MA0(matrix m, const char *name);
     476    matrix m = id_Module2Matrix(id_Copy(rest,currRing),currRing);
     477    ipPrint_MA0(m, "_");
     478    id_Delete((ideal *) &m,currRing);
     479  }
     480  #endif
    435481  /* interpret rest: factors */
    436482  factor=idInit(IDELEMS(rest),IDELEMS(quot));
    437   if (unit==NULL)
    438   {
    439     for(int i=0;i<IDELEMS(rest);i++)
    440     {
    441       poly p=rest->m[i];
    442       p_Shift(&p,-k-lsmod,syz_ring);
    443       factor->m[i]=p;
    444       factor->m[i]=p_Neg(factor->m[i],syz_ring);
    445       rest->m[i]=NULL;
    446     }
    447   }
    448   else
    449   {
     483  int uk=IDELEMS(quot);
     484  for(int i=0;i<IDELEMS(rest);i++)
     485  {
     486    poly d=NULL;
     487    poly p=rest->m[i];
     488    while(p!=NULL)
     489    {
     490      poly q=p; pIter(p);
     491      pNext(q)=NULL;
     492      if (p_GetComp(q,syz_ring)<=uk)
     493      {
     494        factor->m[i]=p_Add_q(factor->m[i],q,syz_ring);
     495      }
     496      else
     497      {
     498        d=p_Add_q(d,q,syz_ring);
     499      }
     500    }
     501    p_Shift(&d,-uk-1,syz_ring);
     502    rest->m[i]=d;
     503    factor->m[i]=p_Neg(factor->m[i],syz_ring);
     504  }
     505  if (unit!=NULL)
     506  {
     507  #if 0
     508  PrintS("unit:\n");
     509  {
     510    void ipPrint_MA0(matrix m, const char *name);
     511    matrix m = id_Module2Matrix(id_Copy(rest,currRing),currRing);
     512    ipPrint_MA0(m, "_");
     513    id_Delete((ideal *) &m,currRing);
     514  }
     515  #endif
    450516    *unit=idInit(IDELEMS(A),IDELEMS(A));
    451     /* comp k+1..u_k-1 -> rest, u_k.. -> unit*/
    452     int u_k=k+IDELEMS(quot)+2;
    453517    for(int i=0;i<IDELEMS(rest);i++)
    454518    {
    455519      poly p=rest->m[i];
    456520      rest->m[i]=NULL;
    457       poly d=NULL;
    458       while(p!=NULL)
    459       {
    460         poly q=p; pIter(p);
    461         pNext(q)=NULL;
    462         if(p_GetComp(q,syz_ring)<u_k)
    463         {
    464           p_Shift(&q,-k-1,syz_ring);
    465           factor->m[i]=p_Add_q(factor->m[i],q,syz_ring);
    466         }
    467         else
    468         {
    469           d=p_Add_q(d,q,syz_ring);
    470         }
    471       }
    472       (*unit)->m[i]=d;
    473       /*fix sign:*/
    474       factor->m[i]=p_Neg(factor->m[i],syz_ring);
    475       p_Shift(&(*unit)->m[i],-(IDELEMS(quot)+k+1),syz_ring);
     521      (*unit)->m[i]=p;
    476522    }
    477523  }
Note: See TracChangeset for help on using the changeset viewer.