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