Borderbasix

Monom.hpp
Go to the documentation of this file.
1 /*********************************************************************
2 * This file is part of the source code of borderbasix *
3 * (C) B. Mourrain, Ph. Trebuchet *
4 **********************************************************************/
5 #ifndef _Monom_H_
6 #define _Monom_H_
7 
20 template <class C, class R>
21 struct Monom {
22 
23  // Type definitions
24  typedef int index_t;
25  typedef typename R::exponent_t exponent_t; //typename R::coeff_t exponent_t;
26  typedef C coeff_t;
27  typedef R rep_t;
28  //fields
29  C coeff;
30  R rep;
31  // Constructors
32  Monom():coeff(0),rep(){}
33  Monom(const C & c, const R & r):coeff(c),rep(r){}
34  Monom(const C & c):coeff(c),rep(){} // monome constant
35  Monom(int i):coeff(i){}
36  Monom(int i, int d):coeff(1){
37  rep.reserve(i+1);
38  for(int j=0;j<i;j++) rep.setExponent(j,0);
39  rep.setExponent(i,d);
40  }
41  // monome x_i^d
42  Monom(const C & c, int i, int d=1 ):coeff(c), rep(i){ // monome c*x_i^d
43  for(int j=0;j<i;j++)
44  rep.setExponent(j,0);
45  rep.setExponent(i,d);
46  }
47  Monom(const C & c, int s, int *t):coeff(c), rep(s){
48  for(int i=0;i<s;i++) rep.setExponent(i,t[i]);
49  }
50  Monom(const Monom & m):coeff(m.coeff),rep(m.rep){}
51  //cout <<" C[m]"<<m<<endl;} // copy constructor
52 
53  // Destructor
54  // not dynamic allocation at this level
55  // ~Monom<C,R> () {}
56  // affectation operator
58  //cout <<" =[m] "<<m<<endl;
59  //cout<<"coeff "<<coeff<<endl;
60  coeff = m.coeff;
61  rep = m.rep;
62  return *this;
63  }
64 
65  // Accessors
66  // int size() const {return rep.size;}
67  C GetCoeff () const { return coeff; }
68  void SetCoeff (const C & c) { coeff = c; }
69  int Lvar() const { return lvar(rep); }
70  exponent_t GetDegree () const { return Degree(rep);}
71  exponent_t operator[] (int i) const { return rep[i]; }
72  exponent_t GetDegree (int i) const { return rep[i]; }
73  void SetDegree (int i, int d) { SDegree(rep,i,d); }
74 
75  // boolean opeartors and functions
76  friend bool IsComparable (const Monom<C,R> & m1, const Monom<C,R> & m2){
77  return m1.rep == m2.rep;
78  }
79  bool operator == (const Monom<C,R> & m2) const {
80  return coeff == m2.coeff && rep == m2.rep;
81  }
82  bool operator != (const Monom<C,R> & m2) const {return !(m2==*this);}
83  // friend bool operator == (const Monom<C,R> & m1, const Monom<C,R> & m2) {
84  // return m1.coeff == m2.coeff && m1.rep == m2.rep;
85  // Comput operators
87  Monom<C,R> res((C)(-1)*coeff,rep);
88  return res;
89  }
93  Monom<C,R> & operator *= (const C &);
94 // friend Monom<C,R> & operator + <>(const Monom<C,R> &, const Monom<C,R> &);
95 // friend Monom<C,R> & operator - <>(const Monom<C,R> &, const Monom<C,R> &);
96 // friend Monom<C,R> & operator * <>(const Monom<C,R> &, const Monom<C,R> &);
97 // friend Monom<C,R> & operator * <>(const Monom<C,R> &, const coeff_t &);
98 
99  // Input/output operators
100  //friend ostream & operator << <>(ostream &, const Monom<C,R> &);
101 
102  //private:
103 
104 };
105 
106 //----------------------------------------------------------------------
107 // arithmetic operators
108 //----------------------------------------------------------------------
109 
110 template <class C, class R> inline
112  coeff += m.coeff;
113  if (coeff==(C)0) erase(rep);
114  return *this;
115 }
116 
117 template <class C, class R> inline
119  coeff -= m.coeff;
120  if (coeff==(C)0) erase(rep);
121  return *this;
122 }
123 
124 template <class C, class R> inline
125 Monom<C,R> operator + (const Monom<C,R> & m1, const Monom<C,R> & m2) {
126  Monom<C,R> res(m1);
127  res.coeff += m2.coeff;
128  return (*res);
129 }
130 
131 template <class C, class R> inline
132 Monom<C,R> operator - (const Monom<C,R> & m1, const Monom<C,R> & m2) {
133  Monom<C,R> res(m1);
134  res.coeff -= m2.coeff;
135  return (res);
136 }
137 
138 template <class C, class R> inline
140  coeff *= m.coeff;
141  if (coeff!=(C)0) rep+=m.rep;
142  else
143  erase(rep);
144  return *this;
145 }
146 
147 template <class C, class R> inline
149 {
150  Monom<C,R> res;
151  res.coeff = (m1.coeff*m2.coeff);
152  if (res.coeff !=(C)0)
153  add(res.rep,m1.rep,m2.rep);
154  else
155  erase(res.rep);
156  return res ;
157 }
158 
159 template <class C, class R> inline
161 {
162  coeff *= c;
163  if (coeff==(C)0) erase(rep);
164  return *this;
165 }
166 
167 template <class C, class R> inline
168 Monom<C,R> operator * (const Monom<C,R> & m1, const C & c2)
169 {
170  Monom<C,R> res(m1);
171  res.coeff *= c2;
172  if (res.coeff ==(C)0) erase(res.rep);
173  return (res);
174 }
175 
176 //----------------------------------------------------------------------
177 // operateurs d'entrees/sorties
178 //----------------------------------------------------------------------
179 template <class C, class R> inline
180 std::ostream & operator << (std::ostream & os, const Monom <C,R> & m)
181 {
182  if (m.coeff !=(C)0 ) os << m.coeff;
183  if (m.Lvar()>=0) os <<m.rep;
184  return os;
185 }
186 //----------------------------------------------------------------------
187 
188 template <class C, class R, class T>
190 {
191  Monom<C,R> result(m);
192  result.SetCoeff(pow(m.GetCoeff(),n));
193  for(int i=0; i<m.Lvar(); i++)
194  result.SetDegree(i,m[i]*n);
195  return result;
196 }
197 
198 //----------------------------------------------------------------------//
199 template <class C, class R>
200 typename R::degree_t Degree(const Monom<C,R> & m)
201 {
202  return Degree(m.rep);
203 }
204 
205 //----------------------------------------------------------------------//
206 template<class M>
207 M MGcd(const M & m1, const M & m2) {
208  int d = Gcd(m1.GetCoeff(),m2.GetCoeff());
209  M res(d);
210  int v = Min(m1.Lvar(),m2.Lvar());
211  for (int i = 0; i <= v; ++i)
212  res.SetDegree(i, Min(m1.GetDegree(i),m2.GetDegree(i)));
213  return res;
214 }
215 
216 template <class M>
217 M div(const M & m1, const M & m2) {
218  M res(1); res*=(m1.GetCoeff()/m2.GetCoeff());
219  for (int i = 0; i <= m1.Lvar(); ++i)
220  res.SetDegree(i,m1.GetDegree(i) - m2.GetDegree(i));
221  return res;
222 }
223 
224 #endif //
Monom(const Monom &m)
Definition: Monom.hpp:50
Monom(const C &c)
Definition: Monom.hpp:34
Monom< C, R > operator+(const Monom< C, R > &m1, const Monom< C, R > &m2)
Definition: Monom.hpp:125
Monom< C, R > & operator-=(const Monom< C, R > &)
Definition: Monom.hpp:118
int lvar(const dynamicexp< X, E > &A)
Definition: dynamicexp.hpp:178
M div(const M &m1, const M &m2)
Definition: Monom.hpp:217
C GetCoeff() const
Definition: Monom.hpp:67
friend bool IsComparable(const Monom< C, R > &m1, const Monom< C, R > &m2)
Definition: Monom.hpp:76
Monom< C, R > & operator+=(const Monom< C, R > &)
Definition: Monom.hpp:111
int Lvar() const
Definition: Monom.hpp:69
Monom< C, R > pow(Monom< C, R > &m, T n)
Definition: Monom.hpp:189
void add(dynamicexp< X, E > &r, const dynamicexp< X, E > &A, const dynamicexp< X, E > &B)
Definition: dynamicexp.hpp:213
exponent_t GetDegree(int i) const
Definition: Monom.hpp:72
if(!(yy_init))
Definition: lex.mpoly.c:689
MSKconetypee MSKrealt MSKint32t MSKint32t j
Definition: mosek.h:2421
Monom< C, R > operator-(const Monom< C, R > &m1, const Monom< C, R > &m2)
Definition: Monom.hpp:132
Monom< C, R > & operator=(const Monom< C, R > &m)
Definition: Monom.hpp:57
R::degree_t Degree(const Monom< C, R > &m)
Definition: Monom.hpp:200
R rep
Definition: Monom.hpp:30
C coeff_t
Definition: Monom.hpp:26
Monom()
Definition: Monom.hpp:32
C coeff
Definition: Monom.hpp:29
void SDegree(dynamicexp< X, E > &A, int i, int d)
Definition: dynamicexp.hpp:140
exponent_t operator[](int i) const
Definition: Monom.hpp:71
R rep_t
Definition: Monom.hpp:27
int index_t
Definition: Monom.hpp:24
exponent_t GetDegree() const
Definition: Monom.hpp:70
MSKrealt * c
Definition: mosek.h:2678
X Min(X a, X b)
Definition: MinMax.H:3
MSKint32t MSKint32t MSKint32t i
Definition: mosek.h:2278
Monom(int i)
Definition: Monom.hpp:35
Monom(const C &c, const R &r)
Definition: Monom.hpp:33
Monom< C, R > operator*(const Monom< C, R > &m1, const Monom< C, R > &m2)
Definition: Monom.hpp:148
MSKrescodee r
Definition: mosek.h:2321
Monom< C, R > & operator*=(const Monom< C, R > &)
Definition: Monom.hpp:139
bool operator==(const Monom< C, R > &m2) const
Definition: Monom.hpp:79
void SetDegree(int i, int d)
Definition: Monom.hpp:73
M MGcd(const M &m1, const M &m2)
Definition: Monom.hpp:207
Monom(const C &c, int s, int *t)
Definition: Monom.hpp:47
Monom(int i, int d)
Definition: Monom.hpp:36
R::exponent_t exponent_t
Definition: Monom.hpp:25
C Gcd(const C, const C)
void SetCoeff(const C &c)
Definition: Monom.hpp:68
Monom< C, R > operator-() const
Definition: Monom.hpp:86
Multivariate monomials.
Definition: Monom.hpp:21
bool operator!=(const Monom< C, R > &m2) const
Definition: Monom.hpp:82
void erase(dynamicexp< X, E > &A)
Definition: dynamicexp.hpp:183
Monom(const C &c, int i, int d=1)
Definition: Monom.hpp:42
Home  |  Download & InstallContributions