1 #ifndef MATPOL_H 2 #define MATPOL_H 3 /**************************************** 4 * Computer Algebra System SINGULAR * 5 ****************************************/ 6 /* 7 * ABSTRACT 8 */ 9 10 #include "polys/monomials/ring.h" 11 12 // THIS IS REALLY DIRTY: ip_smatrix HAS TO BE IDENTICAL TO ip_sideal 13 // SO, DON'T CHANGE THE DECLARATION OF ip_smatrix 14 class ip_smatrix 15 { 16 public: 17 18 poly *m; 19 long rank; 20 int nrows; 21 int ncols; 22 rows()23 inline int& rows() { return nrows; } cols()24 inline int& cols() { return ncols; } 25 26 #define MATROWS(i) ((i)->nrows) 27 #define MATCOLS(i) ((i)->ncols) 28 /// 1-based access to matrix 29 #define MATELEM(mat,i,j) ((mat)->m)[(long)MATCOLS((mat)) * (long)((i)-1) + (long)(j)-1] 30 /// 0-based access to matrix 31 #define MATELEM0(mat,i,j) ((mat)->m)[(long)MATCOLS((mat)) * (long)(i) + (long)(j)] 32 }; 33 34 enum DetVariant 35 { 36 DetDefault=0, 37 DetBareiss, 38 DetSBareiss, 39 DetMu, 40 DetFactory 41 }; 42 43 typedef ip_smatrix * matrix; 44 45 matrix mpNew(int r, int c); 46 #define mp_New(r,c,R) mpNew(r,c) 47 48 void mp_Delete(matrix* a, const ring r); 49 matrix mp_Copy(const matrix a, const ring rSrc, const ring rDst); 50 51 matrix mp_Copy(matrix a, const ring r); 52 53 matrix mp_InitP(int r, int c, poly p, const ring R); 54 matrix mp_InitI(int r, int c, int v, const ring R); 55 matrix mp_MultI(matrix a, int f, const ring r); 56 matrix mp_MultP(matrix a, poly p, const ring r); 57 matrix pMultMp(poly p, matrix a, const ring r); 58 matrix mp_Add(matrix a, matrix b, const ring r); 59 matrix mp_Sub(matrix a, matrix b, const ring r); 60 matrix mp_Mult(matrix a, matrix b, const ring r); 61 matrix mp_Transp(matrix a, const ring r); 62 BOOLEAN mp_Equal(matrix a, matrix b, const ring r); 63 poly mp_Trace ( matrix a, const ring r); 64 poly TraceOfProd ( matrix a, matrix b, int n, const ring r); 65 66 matrix mp_Wedge(matrix a, int ar, const ring r); 67 68 // BOOLEAN mpJacobi(leftv res,leftv a); 69 // BOOLEAN mpKoszul(leftv res,leftv b/*in*/, leftv c/*ip*/, leftv id=NULL); 70 71 poly mp_Det(matrix a, const ring r, DetVariant d=DetDefault); 72 poly mp_DetBareiss (matrix a, const ring r); 73 poly mp_DetMu(matrix A, const ring R); 74 75 76 //matrix mp_Homogen(matrix a, int v, const ring r); 77 78 void mp_Monomials(matrix c, int r, int var, matrix m, const ring R); 79 80 /// corresponds to Maple's coeffs: 81 /// var has to be the number of a variable 82 matrix mp_Coeffs(ideal I, int var, const ring r); 83 84 matrix mp_CoeffProc (poly f, poly vars, const ring r); 85 matrix mp_CoeffProcId (ideal I, poly vars, const ring R); 86 /// corresponds to Macauley's coef: 87 /// the exponent vector of vars has to contain the variables, eg 'xy'; 88 /// then the poly f is searched for monomials in x and y, these monimials 89 /// are written to the first row of the matrix co. 90 /// the second row of co contains the respective factors in f. 91 /// Thus f = sum co[1,i]*co[2,i], i = 1..cols, rows equals 2. 92 void mp_Coef2(poly v, poly vars, matrix *c, matrix *m, const ring r); 93 94 /// for minors with Bareiss 95 void mp_RecMin(int, ideal, int &, matrix, int, int, poly, ideal, const ring); 96 void mp_MinorToResult(ideal, int &, matrix, int, int, ideal, const ring); 97 98 BOOLEAN mp_IsDiagUnit(matrix U, const ring r); 99 100 /// set spaces to zero by default 101 void iiWriteMatrix(matrix im, const char *n, int dim, const ring r, int spaces); 102 103 char * iiStringMatrix(matrix im, int dim, const ring r, char ch=','); 104 105 EXTERN_VAR omBin ip_smatrix_bin; 106 107 int mp_Compare(matrix a, matrix b, const ring r); 108 109 // ------------------------------------------------------- 110 ideal sm_Add(ideal a, ideal b, const ring R); 111 ideal sm_Sub(ideal a, ideal b, const ring R); 112 ideal sm_Mult(ideal a, ideal b, const ring R); 113 ideal sm_Flatten(ideal a, const ring R); 114 ideal sm_UnFlatten(ideal a, int col, const ring R); 115 poly sm_Trace ( ideal a, const ring R); 116 int sm_Compare(ideal a, ideal b, const ring R); 117 BOOLEAN sm_Equal(ideal a, ideal b, const ring R); 118 ideal sm_Tensor(ideal A, ideal B, const ring r); 119 poly sm_Det(ideal I, const ring, DetVariant d=DetDefault); 120 DetVariant mp_GetAlgorithmDet(matrix m, const ring r); 121 DetVariant mp_GetAlgorithmDet(const char *s); 122 123 #define SMATELEM(A,i,j,R) p_Vec2Poly(A->m[j],i+1,R) 124 125 #endif/* MATPOL_H */ 126