Changeset 178bd3 in git for libpolys


Ignore:
Timestamp:
Dec 17, 2018, 7:56:25 AM (5 years ago)
Author:
Karim Abou Zeid <karim23697@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
c7231560b85e2e1683beb9629db0560ee8ca4255
Parents:
04d263ab0fcd4cc5a8215c12fdf4423b782d3283ee3e7cd650e2cf6d6e770d6b57b1681594c7cda7
Message:
Merge branch 'spielwiese' into christmas-release
Location:
libpolys/polys
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • libpolys/polys/matpol.cc

    r04d263 r178bd3  
    2323#include "matpol.h"
    2424#include "prCopy.h"
     25#include "clapsing.h"
    2526
    2627#include "sparsmat.h"
     
    20292030
    20302031//  mu-Matrix
    2031 static void mu(matrix A, matrix &X, const ring R)
     2032static matrix mu(matrix A, const ring R)
    20322033{
    20332034  int n=MATROWS(A);
     
    20442045
    20452046    // X als n*n Null-Matrix initalisieren
    2046     X=mpNew(n,n);
     2047    matrix X=mpNew(n,n);
    20472048
    20482049    //  Diagonaleintraege von X berrechnen
     
    20532054        sum=p_Sub(sum,p_Copy(MATELEM0(A,i,i),R),R);
    20542055    }
     2056    p_Delete(&sum,R);
    20552057
    20562058    //  Eintraege aus dem oberen Dreieck von A nach X uebertragen
    2057     for (int i = 0; i < n; i++)
     2059    for (int i = n-1; i >=0; i--)
    20582060    {
    20592061        for (int j = i+1; j < n; j++)
     
    20622064        }
    20632065    }
     2066    return X;
    20642067}
    20652068
     
    20802083
    20812084    //speichere A ab:
    2082     matrix B=mp_Copy(A,R);
    2083     A=mp_Copy(A,R);
     2085    matrix workA=mp_Copy(A,R);
    20842086
    20852087    // berechen X = mu(X)*A
    20862088    matrix X;
    2087     for (int i = 0; i < n-1; i++)
    2088     {
    2089         mu(A,X,R);
    2090         id_Delete((ideal*)&A,R);
    2091         A=mp_Mult(X,B,R);
     2089    for (int i = n-1; i >0; i--)
     2090    {
     2091        X=mu(workA,R);
     2092        id_Delete((ideal*)&workA,R);
     2093        workA=mp_Mult(X,A,R);
    20922094        id_Delete((ideal*)&X,R);
    20932095    }
     
    20972099    if (n%2 == 0)
    20982100    {
    2099         res=p_Neg(MATELEM0(A,0,0),R);
     2101        res=p_Neg(MATELEM0(workA,0,0),R);
    21002102    }
    21012103    else
    21022104    {
    2103         res=MATELEM0(A,0,0);
    2104     }
    2105     MATELEM0(A,0,0)=NULL;
    2106     id_Delete((ideal*)&A,R);
     2105        res=MATELEM0(workA,0,0);
     2106    }
     2107    MATELEM0(workA,0,0)=NULL;
     2108    id_Delete((ideal*)&workA,R);
    21072109    return res;
    21082110}
    21092111
     2112DetVariant mp_GetAlgorithmDet(matrix m, const ring r)
     2113{
     2114  if (MATROWS(m)+2*r->N>20+5*rField_is_Zp(r)) return DetMu;
     2115  if (MATROWS(m)<10+5*rField_is_Zp(r)) return DetSBareiss;
     2116  BOOLEAN isConst=TRUE;
     2117  int s=0;
     2118  for(int i=MATCOLS(m)*MATROWS(m)-1;i>=0;i--)
     2119  {
     2120    poly p=m->m[i];
     2121    if (p!=NULL)
     2122    {
     2123      if(!p_IsConstant(p,r)) isConst=FALSE;
     2124      s++;
     2125    }
     2126  }
     2127  if (isConst && rField_is_Q(r)) return DetFactory;
     2128  if (s*2<MATCOLS(m)*MATROWS(m)) // few entries
     2129    return DetSBareiss;
     2130  return DetMu;
     2131}
     2132DetVariant mp_GetAlgorithmDet(const char *s)
     2133{
     2134  if (strcmp(s,"Bareiss")==0) return DetBareiss;
     2135  if (strcmp(s,"SBareiss")==0) return DetSBareiss;
     2136  if (strcmp(s,"Mu")==0) return DetMu;
     2137  if (strcmp(s,"Factory")==0) return DetFactory;
     2138  WarnS("unknown method for det");
     2139  return DetDefault;
     2140}
     2141
     2142
     2143poly mp_Det(matrix a, const ring r, DetVariant d/*=DetDefault*/)
     2144{
     2145  if ((MATCOLS(a)==0)
     2146  && (MATROWS(a)==0))
     2147    return p_One(r);
     2148  if (d==DetDefault) d=mp_GetAlgorithmDet(a,r);
     2149  switch (d)
     2150  {
     2151    case DetBareiss: return mp_DetBareiss(a,r);
     2152    case DetMu: return mp_DetMu(a,r);
     2153    case DetFactory: return singclap_det(a,r);
     2154    case DetSBareiss:
     2155    {
     2156      ideal I=id_Matrix2Module(mp_Copy(a, r),r);
     2157      poly p=sm_CallDet(I, r);
     2158      id_Delete(&I, r);
     2159      return p;
     2160    }
     2161    default:
     2162      WerrorS("unknown algorith for det");
     2163  }
     2164}
     2165
     2166poly sm_Det(ideal a, const ring r, DetVariant d/*=DetDefault*/)
     2167{
     2168  if ((MATCOLS(a)==0)
     2169  && (MATROWS(a)==0))
     2170    return p_One(r);
     2171  if (d==DetDefault) d=mp_GetAlgorithmDet((matrix)a,r);
     2172  if (d==DetSBareiss) return sm_CallDet(a,r);
     2173  matrix m=id_Module2Matrix(id_Copy(a,r),r);
     2174  poly p=mp_Det(m,r,d);
     2175  id_Delete((ideal *)&m,r);
     2176  return p;
     2177}
  • libpolys/polys/matpol.h

    r04d263 r178bd3  
    3232};
    3333
     34enum DetVariant
     35{
     36  DetDefault=0,
     37  DetBareiss,
     38  DetSBareiss,
     39  DetMu,
     40  DetFactory
     41};
     42
    3443typedef ip_smatrix *       matrix;
    3544
     
    5968// BOOLEAN mpKoszul(leftv res,leftv b/*in*/, leftv c/*ip*/, leftv id=NULL);
    6069
     70poly mp_Det(matrix a, const ring r, DetVariant d=DetDefault);
    6171poly mp_DetBareiss (matrix a, const ring r);
    6272poly mp_DetMu(matrix A, const ring R);
     
    106116BOOLEAN sm_Equal(ideal a, ideal b, const ring R);
    107117ideal sm_Tensor(ideal A, ideal B, const ring r);
     118poly sm_Det(ideal I, const ring, DetVariant d=DetDefault);
     119DetVariant mp_GetAlgorithmDet(matrix m, const ring r);
     120DetVariant mp_GetAlgorithmDet(const char *s);
    108121
    109122#define SMATELEM(A,i,j,R) p_Vec2Poly(A->m[j],i+1,R)
  • libpolys/polys/shiftop.cc

    ree3e7cd r178bd3  
    368368  p_GetExpV(m,e,ri);
    369369
     370  if (p_mLastVblock(m, e, ri) + sh > ri->N/lV)
     371  {
     372    Werror("letterplace degree bound is %d, but at least %d is needed for this shift", ri->N/lV, p_mLastVblock(m, e, ri) + sh);
     373  }
    370374  for (int i = ri->N - sh*lV; i > 0; i--)
    371375  {
     
    506510  PrintLn(); WriteLPExpV(m2ExpV, ri);
    507511#endif
    508   if (m1Length + m2Length > ri->N)
    509   {
    510     WarnS("letterplace degree bound too low for this multiplication");
    511   }
    512   for (int i = 1 + m1Length; i < 1 + m1Length + m2Length; ++i)
     512  int last = m1Length + m2Length;
     513  if (last > ri->N)
     514  {
     515    Werror("letterplace degree bound is %d, but at least %d is needed for this multiplication", ri->N/ri->isLPring, last/ri->isLPring);
     516    last = ri->N;
     517  }
     518  for (int i = 1 + m1Length; i < 1 + last; ++i)
    513519  {
    514520    assume(m2ExpV[i - m1Length] <= 1);
     
    531537  PrintLn(); WriteLPExpV(m2ExpV, ri);
    532538#endif
    533   if (m1Length + m2Length > ri->N)
    534   {
    535     WarnS("letterplace degree bound too low for this multiplication");
     539  int last = m1Length + m2Length;
     540  if (last > ri->N)
     541  {
     542    Werror("letterplace degree bound is %d, but at least %d is needed for this multiplication", ri->N/ri->isLPring, last/ri->isLPring);
     543    last = ri->N;
    536544  }
    537545
    538546  // shift m1 by m2Length
    539   for (int i = m2Length + m1Length; i >= 1 + m2Length; --i)
     547  for (int i = last; i >= 1 + m2Length; --i)
    540548  {
    541549    m1ExpV[i] = m1ExpV[i - m2Length];
  • libpolys/polys/sparsmat.cc

    r04d263 r178bd3  
    295295}
    296296
    297 /*2
    298 * Bareiss or Chinese remainder ?
    299 * I is dXd
    300 * sw = TRUE  -> I Matrix
    301 *      FALSE -> I Module
    302 * return True  -> change Type
    303 *        FALSE -> same Type
    304 */
    305 BOOLEAN sm_CheckDet(ideal I, int d, BOOLEAN sw, const ring r)
    306 {
    307   int s,t,i;
    308   poly p;
    309 
    310   if (d>100)
    311     return TRUE;
    312   if (!rField_is_Q(r))
    313     return TRUE;
    314   s = t = 0;
    315   // now: field is Q, n<=100
    316   for(i=IDELEMS(I)-1;i>=0;i--)
    317   {
    318     p=I->m[i];
    319     if (p!=NULL)
    320     {
    321       if(!p_IsConstant(p,r))
    322         return TRUE;
    323       s++;
    324       t+=n_Size(pGetCoeff(p),r->cf);
    325     }
    326   }
    327   s*=15;
    328   if (t>s)
    329     return FALSE;// few large constanst entries
    330   else
    331     return TRUE; //many small entries
    332 }
    333 
    334297/* ----------------- basics (used from 'C') ------------------ */
    335298/*2
  • libpolys/polys/sparsmat.h

    r04d263 r178bd3  
    3232void sm_KillModifiedRing(ring r);
    3333long sm_ExpBound(ideal, int, int, int, const ring);
    34 BOOLEAN sm_CheckDet(ideal, int, BOOLEAN, const ring);
    3534#endif
Note: See TracChangeset for help on using the changeset viewer.