7 #ifndef realroot_monomial_hpp
8 #define realroot_monomial_hpp
55 #define TMPL template<class C, class E>
56 #define Monomial monom<C,E>
61 template <
class C,
class E=dynamic_exp<
int> >
68 E &
rep() {
return (*_expt);}
69 const E &
rep()
const {
return (*_expt);}
70 typedef shared_object<E>
exp_t;
73 E &
rep() {
return (_expt);}
74 const E &
rep()
const {
return (_expt);}
95 monom(
const C &
c,
const exp_t & r):_coef(c), _expt(r){}
99 monom(
int i):_coef(i), _expt() {
107 monom(
const C &
c,
int d,
unsigned i);
108 monom(
const C &
c,
int s,
int *t):_coef(c), _expt(s){
109 for(
int i=0;i<s;i++)
rep()[i]= t[i];
135 unsigned size()
const {
return rep().size(); }
141 exponent_t
expt (size_type i)
const {
return rep()[i]; }
145 {
rep().set_expt(i,d);
return *
this; }
154 return m1._coef == m2._coef && m1.rep() == m2.rep();
164 return m1.rep() == m2.rep();
178 template<
class C,
class E> variables Monomial::var;
209 for (
int i = 0; i <= r.nvars(); ++i)
210 if(r[i]<0)
return false;
216 a.coeff() = (m1.coeff()*m2.coeff());
219 a.rep().reserve(
std::max(m1.rep().size(),m2.rep().size()));
230 a.coeff() = (m1.coeff()/m2.coeff());
233 a.rep().reserve(
std::max(m1.rep().size(),m2.rep().size()));
244 Monomial res(1); res*=(m1.coeff()/m2.coeff());
245 for (
int i = 0; i <= m1.nvars(); ++i)
246 res.set_expt(i,m1[i] - m2[i]);
252 Monomial res(1); res*=(m1.coeff()/m2.coeff());
253 for (
int i = 0; i <= m1.nvars(); ++i)
254 res.set_expt(i,m1[i] - m2[i]);
258 template <
class C,
class E>
inline
265 int d = Gcd(m1.coeff(),m2.coeff());
267 int v = Min(m1.nvars(),m2.nvars());
268 for (
int i = 0; i <= v; ++i)
269 res.set_expt(i, Min(m1[i],m2[i]));
277 for (
int i = 0; i <= m1.nvars(); ++i)
278 res.set_expt(i,m1[i]*n);
283 template <
class C,
class E>
284 Monomial::monom(
const std::string & s,
int d,
285 const variables& vars ):_coef(1) {
292 for(
int j=0;j<i;j++)
rep().set_expt(j,0);
298 template <
class C,
class E>
299 Monomial::monom(
const C &
c,
int d,
unsigned v):_coef(c) {
305 for(
unsigned j=0;j<v;j++)
rep().set_expt(j,0);
311 template <
class C,
class E>
312 Monomial::monom(
const char * s,
variables& vars ) {
314 if (s[n-1]==
'\n') {n--;}
340 else if (Ask ==
XID) {
341 char* p = strchr(
yylval,
'^');
359 template <
class C,
class E>
inline bool
366 template <
class C,
class E>
inline Monomial &
368 coeff() += m.coeff();
373 template <
class C,
class E>
inline Monomial &
375 coeff() -= m.coeff();
380 template <
class C,
class E>
inline Monomial
383 res.coeff() += m2.coeff();
387 template <
class C,
class E>
inline Monomial
390 res.coeff() -= m2.coeff();
394 template <
class C,
class E>
inline Monomial &
396 coeff() *= m.coeff();
404 template <
class C,
class E>
inline Monomial &
411 template <
class C,
class E>
inline Monomial &
419 template <
class C,
class E>
inline Monomial
423 if (res.coeff() ==0)
erase(res.rep());
426 template <
class C,
class E>
inline Monomial
431 template <
class C,
class E>
inline Monomial
435 if (res.coeff() ==0)
erase(res.rep());
444 for(
unsigned i=1; i<sm.str().length();i++)
445 if(sm.str()[i]==
'+' || (sm.str()[i]==
'-' && (i>0 && sm.str()[i-1]==
'e')))
return true;
450 template <
class OSTREAM,
class C,
class E>
inline OSTREAM &
453 if (m.coeff() ==
C(0) )
457 while(i> -1 && m[i]==0) i--;
461 if(m.coeff() != (
C)1) {
466 std::ostringstream sm;
469 if (is_pol) os <<
"+(";
471 if (is_pol) os <<
")";
482 template <
class C,
class E> std::string
486 for (
unsigned i = 0; i < (unsigned)m.rep().size(); i++) {
506 template <
class C,
class E>
inline std::string
509 if (m.coeff() ==
C(0) )
513 while(i> -1 && m[i]==0) i--;
517 if(m.coeff() != (
C)1) {
540 template <
class OSTREAM,
class C,
class E>
inline OSTREAM &
543 if (m.coeff() ==
C(0) )
547 while(i> -1 && m[i]==0) i--;
551 if(m.coeff() != (
C)1) {
556 std::ostringstream sm;
559 if (is_pol) os <<
"+(";
561 if (is_pol) os <<
")";
575 template <
class C,
class E>
inline
576 std::ostream & operator << (std::ostream & os, const monom <C,E> & m)
578 if (m.coeff() ==0 ) os<<
"(0)";
590 #endif // realroot_monom_hpp
extended< NT > & operator+=(extended< NT > &x, const extended< NT > &other)
Definition: extended.hpp:158
bool operator==(const extended< NT > &lhs, const extended< NT > &rhs)
Definition: extended.hpp:88
C Scalar
Definition: monomial.hpp:87
int lvar(const dynamic_exp< E > &A)
Definition: dynamicexp.hpp:262
T pow(const T &a, int i)
Definition: binomials.hpp:12
OSTREAM & print(OSTREAM &os, const Monomial &m, const variables &V)
Definition: monomial.hpp:451
std::string to_string_pp(const Monomial &m, const variables &V)
Definition: monomial.hpp:483
dynamic_exp< E >::degree_t degree(const dynamic_exp< E > &t)
Definition: dynamicexp.hpp:191
self_t & operator/=(const C &)
monom(const C &c, int s, int *t)
Definition: monomial.hpp:108
static variables var
Definition: monomial.hpp:78
monom(const C &c)
Definition: monomial.hpp:96
unsigned size() const
Definition: monomial.hpp:135
char * yylval
Definition: parser.hpp:31
E::exponent_t exponent_t
Definition: monomial.hpp:83
R & rep(R &r)
Definition: shared_object.hpp:180
extended< NT > operator/(const extended< NT > &lhs, const extended< NT > &rhs)
Definition: extended.hpp:111
int l_variable() const
Definition: monomial.hpp:137
self_t & set_expt(size_type i, exponent_t d)
Definition: monomial.hpp:144
#define Monomial
Definition: monomial.hpp:56
monom(const C &c, const exp_t &r)
Definition: monomial.hpp:95
self_t operator-() const
Definition: monomial.hpp:168
self_t & operator*=(const self_t &)
C coeff_t
Definition: monomial.hpp:86
self_t & operator=(const self_t &m)
Definition: monomial.hpp:120
#define COEF
Definition: parser.hpp:16
char * synaps_inputlim
Definition: parser.hpp:37
extended< NT > & operator/=(extended< NT > &x, const extended< NT > &other)
Definition: extended.hpp:179
bool is_polynomial(const std::ostringstream &sm)
Definition: monomial.hpp:443
void mul(Interval< C, r > &a, const C &x)
Definition: Interval_fcts.hpp:259
void set_coeff(const C &c)
Definition: monomial.hpp:130
self_t & operator-=(const self_t &)
Definition: shared_object.hpp:64
Monomial operator*(const C &c2, const Monomial &m1)
Definition: monomial.hpp:427
exponent_t exponent(size_type i) const
Definition: monomial.hpp:142
monom(const C &c, unsigned s, const AsSize &)
Definition: monomial.hpp:104
E _expt
Definition: monomial.hpp:72
char * synaps_input
Definition: parser.hpp:34
TMPL bool divide(const Monomial &m1, const Monomial &m2, Monomial &r)
Definition: monomial.hpp:207
E container_t
Definition: monomial.hpp:82
monom()
Definition: monomial.hpp:91
Monomial operator-(const Monomial &m1, const Monomial &m2)
Definition: monomial.hpp:388
TMPL Monomial div_quo(const Monomial &m1, const Monomial &m2)
Definition: monomial.hpp:251
Monomial operator/(const Monomial &m1, const C &c2)
Definition: monomial.hpp:432
extended< NT > & operator*=(extended< NT > &x, const extended< NT > &other)
Definition: extended.hpp:172
bool operator==(int n) const
monom(int i)
Definition: monomial.hpp:99
Definition: shared_object.hpp:61
monom(const monom &m)
Definition: monomial.hpp:114
friend bool IsComparable(const self_t &m1, const self_t &m2)
Definition: monomial.hpp:162
char * synaps_inputptr
Definition: monomial.hpp:310
Monomial operator+(const Monomial &m1, const Monomial &m2)
Definition: monomial.hpp:381
E exp_t
Definition: monomial.hpp:75
E & rep()
Definition: monomial.hpp:73
void sub(V &a, const W &b)
Substraction of two vectors.
Definition: array.hpp:221
int index_t
Definition: monomial.hpp:81
#define XID
Definition: parser.hpp:17
void add(V &a, const W &b)
Addition of two vectors.
Definition: array.hpp:154
exponent_t operator[](size_type i) const
Definition: monomial.hpp:140
int nvars() const
Definition: monomial.hpp:136
#define Scalar
Definition: polynomial_operators.hpp:12
const C & coeff() const
Definition: monomial.hpp:128
TMPL Monomial MGcd(const Monomial &m1, const Monomial &m2)
Definition: monomial.hpp:264
int * begin() const
Definition: monomial.hpp:133
std::string to_string(const Monomial &m, const variables &V)
Definition: monomial.hpp:507
const C & c
Definition: Interval_glue.hpp:45
#define TMPL
Definition: monomial.hpp:55
int * begin()
Definition: monomial.hpp:132
double C
Definition: solver_mv_fatarcs.cpp:16
Monomial self_t
Definition: monomial.hpp:88
OSTREAM & print_as_double(OSTREAM &os, const Monomial &m, const variables &V)
Definition: monomial.hpp:541
bool operator!=(int n) const
Definition: monomial.hpp:149
void assign(A &a, const B &b)
Generic definition of the assignement function.
Definition: assign.hpp:97
Monomial class.
Definition: monomial.hpp:62
const E & rep() const
Definition: monomial.hpp:74
E::size_type size_type
Definition: monomial.hpp:85
TMPL void assign(C &r, const Monomial &m)
Definition: monomial.hpp:187
C & coeff()
Definition: monomial.hpp:129
C _coef
Definition: monomial.hpp:65
exponent_t expt(size_type i) const
Definition: monomial.hpp:141
Interval< T, r > max(const Interval< T, r > &a, const Interval< T, r > &b)
Definition: Interval_fcts.hpp:135
void div(Interval< C, r > &a, const C &x)
Definition: Interval_fcts.hpp:430
Definition: variables.hpp:65
extended< NT > & operator-=(extended< NT > &x, const extended< NT > &other)
Definition: extended.hpp:165
extended< NT > operator*(const extended< NT > &lhs, const extended< NT > &rhs)
Definition: extended.hpp:101
unsigned nbvar() const
Definition: monomial.hpp:138
double as_double(const RR &a)
Definition: GMP.hpp:67
#define TERMINATE
Definition: parser.hpp:21
self_t & operator+=(const self_t &)
#define assert(expr, msg)
Definition: shared_object.hpp:57
void erase(dynamic_exp< E > &A)
Definition: dynamicexp.hpp:269