Changeset 7938a0f in git


Ignore:
Timestamp:
Jan 31, 2012, 6:42:26 PM (11 years ago)
Author:
Hans Schoenemann <hannes@…>
Branches:
(u'spielwiese', '0d6b7fcd9813a1ca1ed4220cfa2b104b97a0a003')
Children:
951db29edc9cda82b668de29b5733c1ca8ed44b6
Parents:
bd795d65c1de21a3593013aca57c80f6128ba318
Message:
add: n_Farey, n_ChineseRemainder (from master)
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • Singular/iparith.cc

    rbd795d r7938a0f  
    15901590        x[i]=nlInit(0);
    15911591    }
    1592     number n=nlChineseRemainder(x,q,rl);
     1592    number n=n_ChineseRemainder(x,q,rl,currRing->cf);
    15931593    for(i=rl-1;i>=0;i--)
    15941594    {
     
    16111611static BOOLEAN jjCHINREM_ID(leftv res, leftv u, leftv v)
    16121612{
    1613   if ((currRing==NULL) || rField_is_Q(currRing))
    1614   {
    1615     lists c=(lists)u->CopyD(); // list of ideal
    1616     lists pl=NULL;
    1617     intvec *p=NULL;
    1618     if (v->Typ()==LIST_CMD) pl=(lists)v->Data();
    1619     else                    p=(intvec*)v->Data();
    1620     int rl=c->nr+1;
    1621     ideal result;
    1622     ideal *x=(ideal *)omAlloc(rl*sizeof(ideal));
    1623     int i;
    1624     int return_type=c->m[0].Typ();
    1625     if ((return_type!=IDEAL_CMD)
    1626     && (return_type!=MODUL_CMD)
    1627     && (return_type!=MATRIX_CMD))
    1628     {
    1629       WerrorS("ideal/module/matrix expected");
     1613  lists c=(lists)u->CopyD(); // list of ideal
     1614  lists pl=NULL;
     1615  intvec *p=NULL;
     1616  if (v->Typ()==LIST_CMD) pl=(lists)v->Data();
     1617  else                    p=(intvec*)v->Data();
     1618  int rl=c->nr+1;
     1619  ideal result;
     1620  ideal *x=(ideal *)omAlloc(rl*sizeof(ideal));
     1621  int i;
     1622  int return_type=c->m[0].Typ();
     1623  if ((return_type!=IDEAL_CMD)
     1624  && (return_type!=MODUL_CMD)
     1625  && (return_type!=MATRIX_CMD))
     1626  {
     1627    WerrorS("ideal/module/matrix expected");
     1628    omFree(x); // delete c
     1629    return TRUE;
     1630  }
     1631  for(i=rl-1;i>=0;i--)
     1632  {
     1633    if (c->m[i].Typ()!=return_type)
     1634    {
     1635      Werror("%s expected at pos %d",Tok2Cmdname(return_type),i+1);
    16301636      omFree(x); // delete c
    16311637      return TRUE;
    16321638    }
     1639    x[i]=((ideal)c->m[i].Data());
     1640  }
     1641  number *q=(number *)omAlloc(rl*sizeof(number));
     1642  if (p!=NULL)
     1643  {
    16331644    for(i=rl-1;i>=0;i--)
    16341645    {
    1635       if (c->m[i].Typ()!=return_type)
    1636       {
    1637         Werror("%s expected at pos %d",Tok2Cmdname(return_type),i+1);
     1646      q[i]=n_Init((*p)[i], currRing->cf);
     1647    }
     1648  }
     1649  else
     1650  {
     1651    for(i=rl-1;i>=0;i--)
     1652    {
     1653      if (pl->m[i].Typ()==INT_CMD)
     1654      {
     1655        q[i]=n_Init((int)(long)pl->m[i].Data(),currRing->cf);
     1656      }
     1657      else if (pl->m[i].Typ()==BIGINT_CMD)
     1658      {
     1659        q[i]=n_Init_bigint((number)(pl->m[i].Data()),coeffs_BIGINT,currRing->cf);
     1660      }
     1661      else
     1662      {
     1663        Werror("bigint expected at pos %d",i+1);
     1664        for(i++;i<rl;i++)
     1665        {
     1666          n_Delete(&(q[i]),currRing->cf);
     1667        }
    16381668        omFree(x); // delete c
     1669        omFree(q); // delete pl
    16391670        return TRUE;
    16401671      }
    1641       x[i]=((ideal)c->m[i].Data());
    1642     }
    1643     number *q=(number *)omAlloc(rl*sizeof(number));
    1644     if (p!=NULL)
    1645     {
    1646       for(i=rl-1;i>=0;i--)
    1647       {
    1648         q[i]=n_Init((*p)[i], currRing->cf);
    1649       }
    1650     }
    1651     else
    1652     {
    1653       for(i=rl-1;i>=0;i--)
    1654       {
    1655         if (pl->m[i].Typ()==INT_CMD)
    1656         {
    1657           q[i]=n_Init((int)(long)pl->m[i].Data(),currRing->cf);
    1658         }
    1659         else if (pl->m[i].Typ()==BIGINT_CMD)
    1660         {
    1661           q[i]=n_Copy((number)(pl->m[i].Data()),coeffs_BIGINT);
    1662         }
    1663         else
    1664         {
    1665           Werror("bigint expected at pos %d",i+1);
    1666           for(i++;i<rl;i++)
    1667           {
    1668             n_Delete(&(q[i]),currRing->cf);
    1669           }
    1670           omFree(x); // delete c
    1671           omFree(q); // delete pl
    1672           return TRUE;
    1673         }
    1674       }
    1675     }
    1676     result=id_ChineseRemainder(x,q,rl,currRing);
    1677     for(i=rl-1;i>=0;i--)
    1678     {
    1679       n_Delete(&(q[i]),coeffs_BIGINT);
    1680     }
    1681     omFree(q);
    1682     res->data=(char *)result;
    1683     res->rtyp=return_type;
    1684     return FALSE;
    1685   }
    1686   else return TRUE;
     1672    }
     1673  }
     1674  result=id_ChineseRemainder(x,q,rl,currRing);
     1675  for(i=rl-1;i>=0;i--)
     1676  {
     1677    n_Delete(&(q[i]),currRing->cf);
     1678  }
     1679  omFree(q);
     1680  res->data=(char *)result;
     1681  res->rtyp=return_type;
     1682  return FALSE;
    16871683}
    16881684#endif
  • kernel/ideals.cc

    rbd795d r7938a0f  
    25932593      }
    25942594
    2595       number n=nChineseRemainder(x,q,rl, R->cf);
     2595      number n=n_ChineseRemainder(x,q,rl, R->cf);
    25962596
    25972597      for(j=rl-1;j>=0;j--)
  • libpolys/coeffs/coeffs.h

    rbd795d r7938a0f  
    163163   number  (*cfGcd)(number a, number b, const coeffs r);
    164164   number  (*cfLcm)(number a, number b, const coeffs r);
    165    number  (*cfChineseRemainder)(number *a, number *b, int rl, const coeffs r);
    166    number  (*cfFarey)(number a, number b, const coeffs r);
    167165   void    (*cfDelete)(number * a, const coeffs r);
    168166   nMapFunc (*cfSetMap)(const coeffs src, const coeffs dst);
     
    178176   /// TODO: to be exchanged with a map!!!
    179177   number  (*cfInit_bigint)(number i, const coeffs dummy, const coeffs dst);
     178
     179   /// rational reconstruction: best rational with mod p=n
     180   number  (*cfFarey)(number p, number n, const coeffs);
     181
     182   /// chinese remainder
     183   /// returns X with X mod q[i]=x[i], i=0..rl-1
     184   number  (*cfChineseRemainder)(number *x, number *q,int rl, const coeffs);
    180185
    181186#ifdef HAVE_FACTORY
     
    596601{
    597602  assume(r != NULL);
    598   assume(getCoeffType(r)==n_Q);
    599603  return r->cfChineseRemainder(a,b,rl,r);
    600604}
     
    603607{
    604608  assume(r != NULL);
    605   assume(getCoeffType(r)==n_Q);
    606609  return r->cfFarey(a,b,r);
    607610}
  • libpolys/coeffs/numbers.cc

    rbd795d r7938a0f  
    7676#endif
    7777
     78number ndFarey(number,number,const coeffs r)
     79{
     80  Werror("farey not implemented for (c=%d)",getCoeffType(r));
     81  return NULL;
     82}
     83number ndChineseRemainder(number *,number *,int,const coeffs r)
     84{
     85  Werror("ChineseRemainder not implemented for (c=%d)",getCoeffType(r));
     86  return n_Init(0,r);
     87}
     88
    7889
    7990BOOLEAN n_IsZeroDivisor( number a, const coeffs r)
     
    121132number nd_Copy(number a, const coeffs r) { return n_Copy(a, r); }
    122133
    123 number ndChineseRemainder(number *,number *,int,const coeffs r){ return n_Init(0,r); }
    124134#ifdef HAVE_RINGS
    125135BOOLEAN ndDivBy(number, number, const coeffs) { return TRUE; } // assume a,b !=0
     
    241251
    242252    n->cfChineseRemainder = ndChineseRemainder;
    243     n->cfFarey = ndGcd;
     253    n->cfFarey = ndFarey;
    244254
    245255#ifdef HAVE_RINGS
Note: See TracChangeset for help on using the changeset viewer.