Changeset 78321f in git


Ignore:
Timestamp:
Sep 7, 2016, 1:48:32 PM (8 years ago)
Author:
Hans Schoenemann <hannes@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
5600a4f5be2705b151d6d42fac572d137ff0924baf7c4768f3e8796ec97be6a476aa97989adfb24be1ccd6716e34657f35d7ef3c0a08f29295742d93
Parents:
033ee4c3785984b97c01cc69a5a7ab06992d0c2d
Message:
recusive versions of chinrem and farey
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • Singular/iparith.cc

    r033ee4c r78321f  
    9595
    9696ring rCompose(const lists  L, const BOOLEAN check_comp=TRUE);
    97 
    9897
    9998// defaults for all commands: NO_PLURAL | NO_RING | ALLOW_ZERODIVISOR
     
    17641763  return FALSE;
    17651764}
    1766 static BOOLEAN jjCHINREM_ID(leftv res, leftv u, leftv v)
    1767 {
    1768   coeffs cf;
    1769   lists c=(lists)u->CopyD(); // list of ideal or bigint/int
    1770   lists pl=NULL;
    1771   intvec *p=NULL;
    1772   if (v->Typ()==LIST_CMD) pl=(lists)v->Data();
    1773   else                    p=(intvec*)v->Data();
    1774   int rl=c->nr+1;
    1775   ideal result;
    1776   ideal *x=(ideal *)omAlloc(rl*sizeof(ideal));
    1777   number *xx=NULL;
    1778   int i;
    1779   int return_type=c->m[0].Typ();
    1780   if ((return_type!=IDEAL_CMD)
    1781   && (return_type!=MODUL_CMD)
    1782   && (return_type!=MATRIX_CMD)
    1783   && (return_type!=POLY_CMD))
    1784   {
    1785     if((return_type!=BIGINT_CMD)&&(return_type!=INT_CMD))
    1786     {
    1787       WerrorS("poly/ideal/module/matrix expected");
    1788       omFree(x); // delete c
    1789       return TRUE;
    1790     }
    1791     else
    1792       return_type=BIGINT_CMD;
    1793   }
    1794   if (return_type==BIGINT_CMD)
    1795     cf=coeffs_BIGINT;
    1796   else
    1797   {
    1798     cf=currRing->cf;
    1799     if (nCoeff_is_Extension(cf) && (cf->extRing!=NULL))
    1800       cf=cf->extRing->cf;
    1801   }
    1802   nMapFunc nMap=n_SetMap(coeffs_BIGINT,cf);
    1803   if (return_type!=BIGINT_CMD)
    1804   {
    1805     for(i=rl-1;i>=0;i--)
    1806     {
    1807       if (c->m[i].Typ()!=return_type)
    1808       {
    1809         Werror("%s expected at pos %d",Tok2Cmdname(return_type),i+1);
    1810         omFree(x); // delete c
    1811         return TRUE;
    1812       }
    1813       if (return_type==POLY_CMD)
    1814       {
    1815         x[i]=idInit(1,1);
    1816         x[i]->m[0]=(poly)c->m[i].CopyD();
    1817       }
    1818       else
    1819       {
    1820         x[i]=(ideal)c->m[i].CopyD();
    1821       }
    1822       //c->m[i].Init();
    1823     }
    1824   }
    1825   else
    1826   {
    1827     if (nMap==NULL)
    1828     {
    1829       Werror("not implemented: map bigint -> %s", nCoeffString(cf));
    1830       return TRUE;
    1831     }
    1832     xx=(number *)omAlloc(rl*sizeof(number));
    1833     for(i=rl-1;i>=0;i--)
    1834     {
    1835       if (c->m[i].Typ()==INT_CMD)
    1836       {
    1837         xx[i]=n_Init(((int)(long)c->m[i].Data()),cf);
    1838       }
    1839       else if (c->m[i].Typ()==BIGINT_CMD)
    1840       {
    1841         xx[i]=nMap((number)c->m[i].Data(),coeffs_BIGINT,cf);
    1842       }
    1843       else
    1844       {
    1845         Werror("bigint expected at pos %d",i+1);
    1846         omFree(x); // delete c
    1847         omFree(xx); // delete c
    1848         return TRUE;
    1849       }
    1850     }
    1851   }
    1852   number *q=(number *)omAlloc(rl*sizeof(number));
    1853   if (p!=NULL)
    1854   {
    1855     for(i=rl-1;i>=0;i--)
    1856     {
    1857       q[i]=n_Init((*p)[i], cf);
    1858     }
    1859   }
    1860   else
    1861   {
    1862     for(i=rl-1;i>=0;i--)
    1863     {
    1864       if (pl->m[i].Typ()==INT_CMD)
    1865       {
    1866         q[i]=n_Init((int)(long)pl->m[i].Data(),cf);
    1867       }
    1868       else if (pl->m[i].Typ()==BIGINT_CMD)
    1869       {
    1870         q[i]=nMap((number)(pl->m[i].Data()),coeffs_BIGINT,cf);
    1871       }
    1872       else
    1873       {
    1874         Werror("bigint expected at pos %d",i+1);
    1875         for(i++;i<rl;i++)
    1876         {
    1877           n_Delete(&(q[i]),cf);
    1878         }
    1879         omFree(x); // delete c
    1880         omFree(q); // delete pl
    1881         if (xx!=NULL) omFree(xx); // delete c
    1882         return TRUE;
    1883       }
    1884     }
    1885   }
    1886   if (return_type==BIGINT_CMD)
    1887   {
    1888     CFArray i_v(rl);
    1889     number n=n_ChineseRemainderSym(xx,q,rl,TRUE,i_v,coeffs_BIGINT);
    1890     res->data=(char *)n;
    1891   }
    1892   else
    1893   {
    1894     result=id_ChineseRemainder(x,q,rl,currRing);
    1895     // deletes also x
    1896     c->Clean();
    1897     if ((return_type==POLY_CMD) &&(result!=NULL))
    1898     {
    1899       res->data=(char *)result->m[0];
    1900       result->m[0]=NULL;
    1901       idDelete(&result);
    1902     }
    1903     else
    1904       res->data=(char *)result;
    1905   }
    1906   for(i=rl-1;i>=0;i--)
    1907   {
    1908     n_Delete(&(q[i]),cf);
    1909   }
    1910   omFree(q);
    1911   res->rtyp=return_type;
    1912   return result==NULL;
    1913 }
     1765static BOOLEAN jjCHINREM_ID(leftv res, leftv u, leftv v);
    19141766static BOOLEAN jjCOEF(leftv res, leftv u, leftv v)
    19151767{
     
    22702122  return FALSE;
    22712123}
     2124static BOOLEAN jjFAREY_LI(leftv res, leftv u, leftv v);
    22722125static BOOLEAN jjFETCH(leftv res, leftv u, leftv v)
    22732126{
     
    92619114  return FALSE;
    92629115}
     9116// --------------------------------------------------------------------
     9117static BOOLEAN jjCHINREM_ID(leftv res, leftv u, leftv v)
     9118{
     9119  coeffs cf;
     9120  lists c=(lists)u->CopyD(); // list of ideal or bigint/int
     9121  int rl=c->nr+1;
     9122  int return_type=c->m[0].Typ();
     9123  if ((return_type!=IDEAL_CMD)
     9124  && (return_type!=MODUL_CMD)
     9125  && (return_type!=MATRIX_CMD)
     9126  && (return_type!=POLY_CMD))
     9127  {
     9128    if((return_type==BIGINT_CMD)
     9129    ||(return_type==INT_CMD))
     9130      return_type=BIGINT_CMD;
     9131    else if (return_type==LIST_CMD)
     9132    {
     9133      // create a tmp list of the correct size
     9134      lists res_l=(lists)omAllocBin(slists_bin);
     9135      res_l->Init(rl /*c->nr+1*/);
     9136      BOOLEAN bo=FALSE;
     9137      int tab_pos=iiTabIndex(dArithTab2,JJTAB2LEN,CHINREM_CMD);
     9138      for (unsigned i=0;i<=(unsigned)c->nr;i++)
     9139      {
     9140        sleftv tmp;
     9141        tmp.Copy(v);
     9142        bo=iiExprArith2TabIntern(&res_l->m[i],&c->m[i],CHINREM_CMD,&tmp,TRUE,dArith2+tab_pos,c->m[i].rtyp,tmp.rtyp,dConvertTypes);
     9143        tmp.CleanUp();
     9144        if (bo) { Werror("chinrem failed for list entry %d",i+1); break;}
     9145      }
     9146      c->Clean();
     9147      res->data=res_l;
     9148      res->rtyp=LIST_CMD;
     9149      return bo;
     9150    }
     9151    else
     9152    {
     9153      c->Clean();
     9154      WerrorS("poly/ideal/module/matrix/list expected");
     9155      return TRUE;
     9156    }
     9157  }
     9158  if (return_type==BIGINT_CMD)
     9159    cf=coeffs_BIGINT;
     9160  else
     9161  {
     9162    cf=currRing->cf;
     9163    if (nCoeff_is_Extension(cf) && (cf->extRing!=NULL))
     9164      cf=cf->extRing->cf;
     9165  }
     9166  lists pl=NULL;
     9167  intvec *p=NULL;
     9168  if (v->Typ()==LIST_CMD) pl=(lists)v->Data();
     9169  else                    p=(intvec*)v->Data();
     9170  ideal result;
     9171  ideal *x=(ideal *)omAlloc(rl*sizeof(ideal));
     9172  number *xx=NULL;
     9173  nMapFunc nMap=n_SetMap(coeffs_BIGINT,cf);
     9174  int i;
     9175  if (return_type!=BIGINT_CMD)
     9176  {
     9177    for(i=rl-1;i>=0;i--)
     9178    {
     9179      if (c->m[i].Typ()!=return_type)
     9180      {
     9181        Werror("%s expected at pos %d",Tok2Cmdname(return_type),i+1);
     9182        omFree(x); // delete c
     9183        return TRUE;
     9184      }
     9185      if (return_type==POLY_CMD)
     9186      {
     9187        x[i]=idInit(1,1);
     9188        x[i]->m[0]=(poly)c->m[i].CopyD();
     9189      }
     9190      else
     9191      {
     9192        x[i]=(ideal)c->m[i].CopyD();
     9193      }
     9194      //c->m[i].Init();
     9195    }
     9196  }
     9197  else
     9198  {
     9199    if (nMap==NULL)
     9200    {
     9201      Werror("not implemented: map bigint -> %s", nCoeffString(cf));
     9202      return TRUE;
     9203    }
     9204    xx=(number *)omAlloc(rl*sizeof(number));
     9205    for(i=rl-1;i>=0;i--)
     9206    {
     9207      if (c->m[i].Typ()==INT_CMD)
     9208      {
     9209        xx[i]=n_Init(((int)(long)c->m[i].Data()),cf);
     9210      }
     9211      else if (c->m[i].Typ()==BIGINT_CMD)
     9212      {
     9213        xx[i]=nMap((number)c->m[i].Data(),coeffs_BIGINT,cf);
     9214      }
     9215      else
     9216      {
     9217        Werror("bigint expected at pos %d",i+1);
     9218        omFree(x); // delete c
     9219        omFree(xx); // delete c
     9220        return TRUE;
     9221      }
     9222    }
     9223  }
     9224  number *q=(number *)omAlloc(rl*sizeof(number));
     9225  if (p!=NULL)
     9226  {
     9227    for(i=rl-1;i>=0;i--)
     9228    {
     9229      q[i]=n_Init((*p)[i], cf);
     9230    }
     9231  }
     9232  else
     9233  {
     9234    for(i=rl-1;i>=0;i--)
     9235    {
     9236      if (pl->m[i].Typ()==INT_CMD)
     9237      {
     9238        q[i]=n_Init((int)(long)pl->m[i].Data(),cf);
     9239      }
     9240      else if (pl->m[i].Typ()==BIGINT_CMD)
     9241      {
     9242        q[i]=nMap((number)(pl->m[i].Data()),coeffs_BIGINT,cf);
     9243      }
     9244      else
     9245      {
     9246        Werror("bigint expected at pos %d",i+1);
     9247        for(i++;i<rl;i++)
     9248        {
     9249          n_Delete(&(q[i]),cf);
     9250        }
     9251        omFree(x); // delete c
     9252        omFree(q); // delete pl
     9253        if (xx!=NULL) omFree(xx); // delete c
     9254        return TRUE;
     9255      }
     9256    }
     9257  }
     9258  if (return_type==BIGINT_CMD)
     9259  {
     9260    CFArray i_v(rl);
     9261    number n=n_ChineseRemainderSym(xx,q,rl,TRUE,i_v,coeffs_BIGINT);
     9262    res->data=(char *)n;
     9263  }
     9264  else
     9265  {
     9266    result=id_ChineseRemainder(x,q,rl,currRing); // deletes also x
     9267    c->Clean();
     9268    if ((return_type==POLY_CMD) &&(result!=NULL))
     9269    {
     9270      res->data=(char *)result->m[0];
     9271      result->m[0]=NULL;
     9272      idDelete(&result);
     9273    }
     9274    else
     9275      res->data=(char *)result;
     9276  }
     9277  for(i=rl-1;i>=0;i--)
     9278  {
     9279    n_Delete(&(q[i]),cf);
     9280  }
     9281  omFree(q);
     9282  res->rtyp=return_type;
     9283  return result==NULL;
     9284}
     9285static BOOLEAN jjFAREY_LI(leftv res, leftv u, leftv v)
     9286{
     9287  lists c=(lists)u->CopyD();
     9288  lists res_l=(lists)omAllocBin(slists_bin);
     9289  res_l->Init(c->nr+1);
     9290  BOOLEAN bo=FALSE;
     9291  int tab_pos=iiTabIndex(dArithTab2,JJTAB2LEN,FAREY_CMD);
     9292  for (unsigned i=0;i<=(unsigned)c->nr;i++)
     9293  {
     9294    sleftv tmp;
     9295    tmp.Copy(v);
     9296    bo=iiExprArith2TabIntern(&res_l->m[i],&c->m[i],FAREY_CMD,&tmp,TRUE,dArith2+tab_pos,c->m[i].rtyp,tmp.rtyp,dConvertTypes);
     9297    tmp.CleanUp();
     9298    if (bo) { Werror("farey failed for list entry %d",i+1); break;}
     9299  }
     9300  c->Clean();
     9301  res->data=res_l;
     9302  return bo;
     9303}
  • Singular/table.h

    r033ee4c r78321f  
    594594,{D(jjFAREY_ID),  FAREY_CMD,      MODUL_CMD,      MODUL_CMD,   BIGINT_CMD, ALLOW_PLURAL |NO_RING}
    595595,{D(jjFAREY_ID),  FAREY_CMD,      MATRIX_CMD,     MATRIX_CMD,  BIGINT_CMD, ALLOW_PLURAL |NO_RING}
     596,{D(jjFAREY_LI),  FAREY_CMD,      LIST_CMD,       LIST_CMD,    BIGINT_CMD, ALLOW_PLURAL |NO_RING}
    596597,{D(jjFETCH),     FETCH_CMD,      ANY_TYPE/*set by p*/,RING_CMD,  ANY_TYPE, ALLOW_PLURAL |ALLOW_RING}
    597598,{D(fglmProc),    FGLM_CMD,       IDEAL_CMD,      RING_CMD,   DEF_CMD, NO_PLURAL |NO_RING}
Note: See TracChangeset for help on using the changeset viewer.