Changeset a800fe4 in git for kernel


Ignore:
Timestamp:
Mar 16, 2023, 1:41:20 PM (13 months ago)
Author:
Hans Schoenemann <hannes@…>
Branches:
(u'spielwiese', '4a9821a93ffdc22a6696668bd4f6b8c9de3e6c5f')
Children:
dbcb4e7cd1779980472be053ecb7907f93a90b6c
Parents:
f8b04d16808098323914dd4522d4be681409c179
Message:
4.3.2p1: add idDivRem
Location:
kernel
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • kernel/GBEngine/kLiftstd.cc

    rf8b04d ra800fe4  
    330330  }
    331331}
     332
     333//---------------------------------------------------------------------------
     334static void setUnit(int e, ideal *unit)
     335{
     336  if (unit!=NULL)
     337  {
     338    *unit=idInit(e,e);
     339    for(int i=e-1;i>=0;i--)
     340    {
     341      poly p=pOne();
     342      p_Shift(&p,i+1,currRing);
     343      (*unit)->m[i]=p;
     344    }
     345  }
     346}
     347ideal idDivRem(ideal A, ideal quot, ideal &factor,ideal *unit,int lazyReduce)
     348{
     349  /* special cases */
     350  if (idIs0(A) || idIs0(quot))
     351  {
     352    factor=idInit(1,IDELEMS(quot));
     353    setUnit(A->rank,unit);
     354    return idCopy(A);
     355  }
     356  /* ideal or module? */
     357  ring orig_ring=currRing;
     358  int k=id_RankFreeModule(quot,orig_ring);
     359  int lsmod=0;
     360  if (k==0) { lsmod=1;k=1;}  /*ideal*/
     361  /* new ring */
     362  ring syz_ring=rAssure_SyzOrder(orig_ring,TRUE);
     363  rSetSyzComp(1,syz_ring);
     364  rChangeCurrRing(syz_ring);
     365  /* move ideals to new ring */
     366  ideal s_quot;
     367  ideal s_A;
     368  if (orig_ring != syz_ring)
     369  {
     370    s_quot=idrCopyR_NoSort(quot,orig_ring,syz_ring);
     371    s_A=idrCopyR_NoSort(A,orig_ring,syz_ring);
     372  }
     373  else
     374  {
     375    s_quot=id_Copy(quot,syz_ring);
     376    s_A=id_Copy(A,syz_ring);
     377  }
     378  /* quot[i] -> quot[i]+e(k+i+1) */
     379  for(int i=0;i<IDELEMS(s_quot);i++)
     380  {
     381    p_Shift(&s_quot->m[i],lsmod,syz_ring);
     382    poly p=p_One(syz_ring);
     383    p_SetComp(p,k+i+2,syz_ring);
     384    p_Setm(p,syz_ring);
     385    s_quot->m[i]=p_Add_q(s_quot->m[i],p,syz_ring);
     386  }
     387  s_quot->rank=k+IDELEMS(quot)+1;
     388  /* A[i] -> A[i]*e(1) */
     389  if (lsmod==1)
     390  {
     391    for(int i=0;i<IDELEMS(s_A);i++)
     392    {
     393      p_Shift(&s_A->m[i],1,syz_ring);
     394    }
     395  }
     396  if (unit!=NULL)
     397  {
     398    int u_k=k+IDELEMS(quot)+2;
     399    for(int i=0;i<IDELEMS(s_A);i++)
     400    {
     401      poly p=p_One(syz_ring);
     402      p_SetComp(p,u_k+i,syz_ring);
     403      p_Setm(p,syz_ring);
     404      s_A->m[i]=p_Add_q(s_A->m[i],p,syz_ring);
     405    }
     406    s_A->rank=k+IDELEMS(quot)+IDELEMS(A)+1;
     407  }
     408  /* normalform */
     409  ideal rest=kNF(s_quot,syz_ring->qideal,s_A,0,lazyReduce);
     410  /* clean s_quot,s_A */
     411  id_Delete(&s_quot,syz_ring);
     412  id_Delete(&s_A,syz_ring);
     413  /* interpret rest: remainder */
     414  ideal result=idInit(IDELEMS(rest),1);
     415  for(int i=0;i<IDELEMS(rest);i++)
     416  {
     417    poly p=rest->m[i];
     418    poly d=NULL;
     419    while(p!=NULL)
     420    {
     421      poly q=p; pIter(p);
     422      pNext(q)=NULL;
     423      if (p_GetComp(q,syz_ring)<=k)
     424      {
     425        result->m[i]=p_Add_q(result->m[i],q,syz_ring);
     426      }
     427      else
     428      {
     429        d=p_Add_q(d,q,syz_ring);
     430      }
     431    }
     432    rest->m[i]=d;
     433    p_Shift(&result->m[i],-k-lsmod,syz_ring);
     434  }
     435  /* interpret rest: factors */
     436  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-1,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  {
     450    *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;
     453    for(int i=0;i<IDELEMS(rest);i++)
     454    {
     455      poly p=rest->m[i];
     456      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);
     476    }
     477  }
     478  id_Delete(&rest,syz_ring);
     479  if (orig_ring != syz_ring)
     480  {
     481    rChangeCurrRing(orig_ring);
     482    result=idrMoveR_NoSort(result, syz_ring, orig_ring);
     483    factor=idrMoveR(factor, syz_ring, orig_ring);
     484    if (unit!=NULL)
     485    {
     486      *unit=idrMoveR(*unit, syz_ring, orig_ring);
     487    }
     488    rDelete(syz_ring);
     489  }
     490  return result;
     491}
     492
  • kernel/GBEngine/kstd1.h

    rf8b04d ra800fe4  
    3030poly kNFBound (ideal F, ideal Q, poly p,int bound,int syzComp=0, int lazyReduce=0);
    3131ideal kNFBound (ideal F, ideal Q, ideal p,int bound,int syzComp=0, int lazyReduce=0);
     32ideal idDivRem(ideal A, ideal quot, ideal &factor,ideal *unit,int lazyReduce=0);
    3233
    3334/// NOTE: this is just a wrapper which sets currRing for the actual kNF call
  • kernel/mod2.h

    rf8b04d ra800fe4  
    2020#define SINGULAR_MINOR_VERSION 3
    2121#define SINGULAR_SUB_VERSION 2
    22 #define SINGULAR_PATCHLEVEL 0
     22#define SINGULAR_PATCHLEVEL 1
    2323#define S_ROOT_DIR ""
    2424
Note: See TracChangeset for help on using the changeset viewer.