6 #ifndef realroot_sparse_dual_hpp
7 #define realroot_sparse_dual_hpp
17 struct dual:
public monomial_seq<C,O> {
21 typedef monomial_seq<C,O>
R;
36 dual(
const coeff_t &
c): poly_t(c) {}
37 dual(
const coeff_t &
c,
int d,
int v): poly_t(c,-d,v) {}
41 dual(
const self_t &
P): poly_t(P){}
58 this->base_t::operator=(x);
return *
this;
69 template<
class C,
class O>
73 for(iterator it=p.begin();it != p.end();it++)
75 for(
int j=0;j<(it->nvars()+1);j++)
77 it->set_expt(j,-(*it)[j]);
86 template<
class C,
class O>
89 monomial_seq<C,O> t= ((monomial_seq<C,O>)(*
this))*p;
90 typedef typename monomial_seq<C,O>::reverse_iterator
iterator;
92 for(it=t.rbegin(); it != t.rend();it++)
95 for(
unsigned j=0;j<(it->nvars()+1) && nul;j++)
97 if((*it)[j]!=0) nul=
false;
99 if(nul)
return it->coeff();
104 template<
class C,
class O>
inline void
106 add((monomial_seq<C,O>&)res,(
const monomial_seq<C,O>&)a,(
const monomial_seq<C,O>&)b);
109 template<
class C,
class O>
inline void
111 add((monomial_seq<C,O>&)res,(
const monomial_seq<C,O>&)a,b);
114 template<
class C,
class O>
inline void
116 add((monomial_seq<C,O>&)res,(
const monomial_seq<C,O>&)a,b);
119 template<
class C,
class O>
inline void
121 sub((monomial_seq<C,O>&)res,(
const monomial_seq<C,O>&)a,(
const monomial_seq<C,O>&)b);
124 template<
class C,
class O>
inline void
126 sub((monomial_seq<C,O>&)res,(
const monomial_seq<C,O>&)a,b);
129 template<
class C,
class O>
inline void
131 sub((monomial_seq<C,O>&)res,a,(
const monomial_seq<C,O>&)b);
134 template<
class C,
class O>
inline void
136 mul((monomial_seq<C,O>&)res,(
const monomial_seq<C,O>&)a,(
const monomial_seq<C,O>&)b);
139 template<
class C,
class O>
inline void
141 mul((monomial_seq<C,O>&)res,(
const monomial_seq<C,O>&)a,b);
144 template<
class C,
class O>
inline void
146 mul((monomial_seq<C,O>&)res,(
const monomial_seq<C,O>&)a,b);
154 template<
class C,
class O>
void
157 mul(t,p,(monomial_seq<C,O>)l);
159 for(iterator it=t.begin();it != t.end();it++)
162 for(
unsigned j=0;j<it->size() &&
neg;j++) {
163 if((*it)[j]>0) neg=
false;
165 if(neg) res.push_back(*it);
188 template<
class C,
class O>
void
189 mul(monomial_seq<C,O>& res,
const dual<C,O>& l,
const monomial_seq<C,O>& p) {
191 mul(t,(monomial_seq<C,O>)l,p);
193 for(iterator it=t.begin();it != t.end();it++)
196 for(
unsigned j=0;j<it->size() && pos;j++) {
197 if((*it)[j]<0) pos=
false;
199 if(pos) res.push_back(*it);
204 template<
class C,
class O>
inline void
211 template<
class C,
class O>
void
217 #ifndef MMX_WITH_PLUS_SIGN
218 #define MMX_WITH_PLUS_SIGN
220 #endif //MMX_WITH_PLUS_SIGN
222 template <
class OSTREAM,
class C>
inline OSTREAM &
224 if (m.
coeff() ==0 ) {
228 while(i> -1 && m[i]==0) i--;
236 os << m.
coeff(); os <<
"*";
241 for (
unsigned i = 0; i < m.
size(); ++i) {
259 template <
class OSTREAM,
class C,
class O> OSTREAM &
261 if ( P.begin() == P.end() ) {
266 while ( i != P.end() ) {
277 # define Polynomial sparse::dual<C,O>
278 # define TMPL template<class C, class O>
280 template<
class A,
class B>
struct use;
349 #endif // realroot_sparse_dual_hpp
void sub(dual< C, O > &res, const dual< C, O > &a, const dual< C, O > &b)
Definition: sparse_dual.hpp:120
void mul(dual< C, O > &res, const dual< C, O > &a, const dual< C, O > &b)
Definition: sparse_dual.hpp:135
void neg(Interval< C, r > &a)
Definition: Interval_fcts.hpp:200
const C & b
Definition: Interval_glue.hpp:25
dual(const char *s, const variables &vars)
Definition: sparse_dual.hpp:44
TMPL X
Definition: polynomial_operators.hpp:148
R::iterator iterator
Definition: sparse_dual.hpp:27
C coeff_t
Definition: sparse_dual.hpp:25
dual(const char *s, variables &vars)
Definition: sparse_dual.hpp:42
unsigned size() const
Definition: monomial.hpp:135
Definition: sparse_dual.hpp:17
self_t & operator=(const self_t &x)
Definition: sparse_dual.hpp:56
Degree Reverse Lexicographic monomial ordering.
Definition: monomial_ordering.hpp:38
static void sub(Polynomial &r, const Polynomial &a, const C &b)
Definition: sparse_dual.hpp:314
R::reverse_iterator reverse_iterator
Definition: sparse_dual.hpp:29
bool with_plus_sign(const X &x)
Definition: sparse_dual.hpp:219
static void add(Polynomial &r, const C &a, const Polynomial &b)
Definition: sparse_dual.hpp:298
monomial_seq< C, O > R
Definition: sparse_dual.hpp:21
dual(const monom_t &m)
Definition: sparse_dual.hpp:38
static void mul(Polynomial &r, const C &a, const Polynomial &b)
Definition: sparse_dual.hpp:329
void add(dual< C, O > &res, const dual< C, O > &a, const dual< C, O > &b)
Definition: sparse_dual.hpp:105
static void sub(Polynomial &r, const Polynomial &a, const Polynomial &b)
Definition: sparse_dual.hpp:306
static void sub(Polynomial &r, const Polynomial &a)
Definition: sparse_dual.hpp:302
dual(const coeff_t &c)
Definition: sparse_dual.hpp:36
O order_t
Definition: sparse_dual.hpp:26
dual()
Definition: sparse_dual.hpp:35
dual(const coeff_t &c, int d, int v)
Definition: sparse_dual.hpp:37
static void sub(Polynomial &r, const C &a, const Polynomial &b)
Definition: sparse_dual.hpp:310
static void div(Polynomial &r, const Polynomial &a, const C &b)
Definition: sparse_dual.hpp:337
void neg_exponent(dual< C, O > &p)
Definition: sparse_dual.hpp:70
TMPL void rem(Polynomial &r, const Polynomial &a, const Polynomial &b)
Definition: sparse_monomials.hpp:446
static void add(Polynomial &r, const Polynomial &a, const C &b)
Definition: sparse_dual.hpp:294
Definition: polynomial.hpp:34
OSTREAM & print_dual(OSTREAM &os, const monom< C > &m, const variables &V)
Definition: sparse_dual.hpp:223
Definition: polynomial.hpp:37
static void mul(Polynomial &r, const Polynomial &a, const C &b)
Definition: sparse_dual.hpp:326
static void mul(Polynomial &r, const Polynomial &a, const Polynomial &b)
Definition: sparse_dual.hpp:322
R::const_reverse_iterator const_reverse_iterator
Definition: sparse_dual.hpp:30
#define TMPL
Definition: sparse_dual.hpp:278
monomial_seq< C, O > poly_t
Definition: sparse_dual.hpp:31
const C & coeff() const
Definition: monomial.hpp:128
void div(dual< C, O > &f, const C &c)
Definition: sparse_dual.hpp:205
static void div(Polynomial &r, const Polynomial &a, const Polynomial &b)
Definition: sparse_dual.hpp:333
const C & c
Definition: Interval_glue.hpp:45
dual(const dual< C, Q > &p)
Definition: sparse_dual.hpp:48
static void mul(Polynomial &r, const Polynomial &a)
Definition: sparse_dual.hpp:318
static void rem(Polynomial &r, const Polynomial &a, const Polynomial &b)
Definition: sparse_dual.hpp:341
Definition: polynomial_operators.hpp:77
double C
Definition: solver_mv_fatarcs.cpp:16
monomial_seq< C, O > base_t
Definition: sparse_dual.hpp:22
OSTREAM & print(OSTREAM &os, const dual< C, O > &P, const variables &V)
Output operator.
Definition: sparse_dual.hpp:260
C operator()(const poly_t &p)
Definition: sparse_dual.hpp:87
Monomial class.
Definition: monomial.hpp:62
static void add(Polynomial &r, const Polynomial &a, const Polynomial &b)
Definition: sparse_dual.hpp:290
Definition: variables.hpp:65
R::const_iterator const_iterator
Definition: sparse_dual.hpp:28
dual< C, O > self_t
Definition: sparse_dual.hpp:32
R::monom_t monom_t
Definition: sparse_dual.hpp:24
static void add(Polynomial &r, const Polynomial &a)
Definition: sparse_dual.hpp:286
dual(const self_t &P)
Definition: sparse_dual.hpp:41