9 #ifndef realroot_univariate_hpp
10 #define realroot_univariate_hpp
16 # define TMPL template<class C>
17 # define TMPLX template<class C, class X>
18 # define Polynomial monomials<C>
23 #ifndef MMX_WITH_PLUS_SIGN
24 #define MMX_WITH_PLUS_SIGN
26 #endif //MMX_WITH_PLUS_SIGN
47 namespace univariate {
72 monomials(
const size_type& s,
const char* t);
90 const_reverse_iterator
rbegin()
const {
105 void resize(
const size_type& n);
110 Polynomial::monomials(
const Polynomial & v) : size_(v.size_), degree_(v.degree_) {
111 tab_ =
new C[v.size_];
116 Polynomial::monomials(
const C&
c): size_(1), degree_(0) {
121 Polynomial::monomials(
const C&
c, size_type l,
int v): size_(l+1), degree_(l) {
128 Polynomial::monomials(
const size_type& i,
C* t): size_(i), degree_(i-1) {
135 Polynomial::monomials(
C*
b,
C* e) {
137 for(p=b;p!=e;p++,size_++) ;
140 for(p=b; p!=e; p++,degree_++) {tab_[degree_]=(*p);}
146 Polynomial::monomials(
const size_type& l,
const char * nm) {
147 std::istringstream ins(nm);
150 for(size_type i=0; i< size_; i++) ins >>tab_[i];
156 Polynomial::resize(
const size_type & i) {
161 for(size_type j=0;j<
std::min(i,size_);j++) tab_[j]=tmp[j];
162 for(size_type j=
std::min(i,size_);j<i;j++) tab_[j]=value_type();
166 size_=i; tab_=
new C[i];
167 for(size_type j=0;j<size_;j++) tab_[j]=value_type();
175 if (size_ != v.size_) {
176 if (size_ !=0)
delete [] tab_;
177 tab_ =
new C[v.size_];
181 for(size_type i=0;i<size_;i++) tab_[i] = v[i];
188 return (this->
degree()<0);
190 return (this->
degree()==0 && tab_[0]== c);
197 while(i>-1 && p[i]==(
typename R::value_type)0) i--;
209 while(l >=0 && (a.tab_[l]==0)) {l--;}
321 for(
int i=0; i<d;i++)
322 r[i]= (
typename Polynomial::coeff_t)0;
323 for(
int i=0; i<=
degree(p);i++)
356 template<
class R >
inline typename R::value_type
362 template<
class R >
inline typename R::value_type
366 template <
class OSTREAM,
class C> OSTREAM&
375 template <
class OSTREAM,
class C,
class VAR>
inline OSTREAM&
378 typedef typename Polynomial::value_type coeff_t;
379 bool plus=
false, not_one;
383 for(
int i= 0; i<=
degree(p); i++)
385 if(p[i]!= (coeff_t)0)
387 not_one = (p[i] != (coeff_t)1);
411 template <
class OSTREAM,
class C>
inline OSTREAM&
413 return print(os,p,
"x");
417 template <
class R,
class C>
428 template <
class R,
class S>
429 inline void add_cst(R & r,
const S & c) { r[0]+=
c; }
431 template <
class R,
class S>
432 inline void sub_cst(R & r,
const S & c) { r[0]-=
c;}
439 for (i=0;i<=db;i++) {
440 if (b[i] == 0)
continue;
441 for (j=0;j<=da;j++) r[i+j] += a[j]*b[i];
445 template <
class R>
inline
448 typename R::const_iterator ia, ib;
449 typename R::iterator ir, it;
451 for (ib=b.begin();ib !=b.end()&& ir != r.end();++ib) {
452 typename R::value_type c = *ib;
454 if (c==0) {++ir;
continue;}
455 for (ia=a.begin();ia!=a.end();++ia,++it) {
462 template <
class R>
inline
463 void mul(R & a,
const R & b)
476 template <
class R>
inline
485 template <
class C,
class R>
491 typedef typename R::const_reverse_iterator const_reverse_iterator;
492 const_reverse_iterator it=p.rbegin();
495 for(; it !=p.rend(); ++it) {r=r*
c;
assign(cf,*it); r=r+cf;}
505 template <
class C,
class R>
511 for(
int i=d-1; i>-1; --i) {r*=
c; r+= p[i];}
519 template <
class C,
class R>
525 template <
class C,
class R>
531 typedef typename R::const_reverse_iterator const_reverse_iterator;
532 const_reverse_iterator it=p.rbegin();
535 for(; it !=p.rend(); ++it) {r*=a; y *=
b;
assign(cf,*it); r=r+cf*y;}
546 template<
typename POL,
typename X>
inline
563 typename R::value_type lb=b[db];
567 while(a[da]==0 && da>=db) da--;
569 R m( a[da]/lb, da-db );
582 while ( p[d] == 0 ) d--;
586 template <
class R>
inline R
diff(
const R & p);
588 template<
class R>
void reciprocal(R & w,
const R & p);
590 template<
class R>
void reverse(R & p,
typename R::size_type n)
593 for(
typename R::size_type i=0;i<n/2;i++)
598 typename R::value_type
derive(
const R p,
typename R::value_type x);
600 template<
class R>
void reduce(R & p,
const typename R::size_type & e);
602 template<
class R,
class C>
603 void scale(R & t,
const R & p,
const C & l);
607 template<
class R>
inline
612 for( i = 1; i < n+1; ++i) r[i-1] =p[i]*i;
629 template <
class R>
inline
662 typedef typename R::size_type size_type;
663 typedef typename R::value_type
C;
666 R w0(deg),v(deg),xp(p);
696 inline void reduce(T & p,
const typename T::size_type & e)
700 for (
typename T::size_type i = 0; i < e; i++) temp[i]=p[i];
703 for (
typename T::size_type i = 0; i < e; i++) p[i]=temp[i];
717 {
for (
int i = 0; i < n/2; i++ )
std::swap(p[i],p[n-i]) ; }
737 template<
class O,
class R,
class I>
inline
738 void eval( O& p, O& dp,
const R& Pol,
const I& x )
743 for (
int j = n-1; j >= 0; dp = dp*x + p, p =p*x + Pol[j], j-- ) ;
754 template <
class R>
inline
755 typename R::value_type
derive(
const R& Pol,
const typename R::value_type& x )
757 typename R::value_type p,res;
777 template<
class R,
class C>
781 for ( s = p.size(), j = 0; j <= s-2; j++ )
782 for( k = s-2; k >= j; p[k] += c*p[k+1], k-- ) ;
789 template<
class R,
class C>
790 void shift(R & r,
const R & p,
const C& x0)
811 template<
class R,
class C>
812 void scale(R & r,
const R & p,
const C & l)
816 for(
unsigned i=1; i< p.size();i++){
827 template<
class R,
class C>
834 typename R::value_type s=l;
835 for(
int i=sz-1; i>=0;i--){
846 template<
class T,
class P,
class C>
void
860 for(
unsigned j=1; j<
size; j++) {
861 dn *= (size-j); dn/= j;
864 for(
unsigned i=j+1; i<
size; i++) {
866 bz[i] += pps[j]*nm/dn;
874 for (
typename R::iterator i = r.begin(); i != r.end(); *i %= x, ++i ) ;
877 template<
class S,
class R>
880 typename S::value_type d=1;
881 for(
int i=0;i<
degree(f)+1;i++) {
884 for(
int i=0;i<
degree(f)+1;i++)
892 # define Polynomial univariate::monomials<C>
893 # define TMPL template<class C>
895 template<
class A,
class B>
struct use;
972 #endif // realroot_univariate_hpp
R::value_type tcoeff(const R &p)
Definition: univariate.hpp:363
void set_cst(V &a, const C &v)
Set all the entries of a to the values v.
Definition: array.hpp:99
bool operator==(const extended< NT > &lhs, const extended< NT > &rhs)
Definition: extended.hpp:88
C & operator[](size_type i)
Definition: univariate.hpp:99
C eval_homogeneous(const R &p, const C &a, const C &b)
Definition: univariate.hpp:526
T pow(const T &a, int i)
Definition: binomials.hpp:12
const C & b
Definition: Interval_glue.hpp:25
const_iterator begin() const
Definition: univariate.hpp:80
TMPL X
Definition: polynomial_operators.hpp:148
R::value_type lcoeff(const R &p)
Definition: univariate.hpp:357
C eval(const R &p, const C &c)
Definition: univariate.hpp:520
void div_rem(R &q, R &a, const R &b)
Definition: univariate.hpp:559
void mul_ext(V &a, const V &b, const W &c)
Scalar multiplication.
Definition: array.hpp:291
const Interval & I
Definition: Interval_glue.hpp:49
int degree(const R &p)
Definition: univariate.hpp:194
MP swap(const MP &P, int var_i, int var_j)
Definition: sparse_monomials.hpp:988
bool with_plus_sign(const ZZ &c)
Definition: GMP.hpp:62
static void sub(Polynomial &r, const Polynomial &a, const C &b)
Definition: univariate.hpp:929
unsigned size() const
Definition: univariate.hpp:94
TMPL void add(Polynomial &r, const Polynomial &a, const Polynomial &b)
Definition: univariate.hpp:216
monomials()
Definition: univariate.hpp:68
OSTREAM & print_as_coeff(OSTREAM &os, const C &c, bool plus)
Definition: univariate.hpp:367
static void add(Polynomial &r, const C &a, const Polynomial &b)
Definition: univariate.hpp:913
reverse_iterator rbegin()
Definition: univariate.hpp:87
R diff(const R &p)
Definition: univariate.hpp:630
C coeff_t
Definition: univariate.hpp:62
static void mul(Polynomial &r, const C &a, const Polynomial &b)
Definition: univariate.hpp:944
static void sub(Polynomial &r, const Polynomial &a, const Polynomial &b)
Definition: univariate.hpp:921
TMPL void shift(Polynomial &r, const Polynomial &p, int d, int v=0)
Definition: univariate.hpp:318
S numer(const R &f)
Definition: univariate.hpp:878
static void sub(Polynomial &r, const Polynomial &a)
Definition: univariate.hpp:917
C * tab_
Definition: univariate.hpp:64
static void sub(Polynomial &r, const C &a, const Polynomial &b)
Definition: univariate.hpp:925
void mul_index(R &r, const R &a, const R &b)
Definition: univariate.hpp:435
void reverse(R &p, typename R::size_type n)
Definition: univariate.hpp:590
static void div(Polynomial &r, const Polynomial &a, const C &b)
Definition: univariate.hpp:952
R::value_type derive(const R p, typename R::value_type x)
void set_monomial(R &x, const C &c, unsigned n)
Definition: univariate.hpp:418
void coeff_modulo(R &r, const typename R::value_type &x)
Definition: univariate.hpp:873
OSTREAM & print(OSTREAM &os, const Polynomial &p, const VAR &var)
Definition: univariate.hpp:376
static void div(Polynomial &a, const C &c)
Definition: univariate.hpp:956
void reduce(R &p, const typename R::size_type &e)
unsigned degree() const
Definition: univariate.hpp:95
polynomial< COEFF, with< MonomialTensor > > Polynomial
Definition: solver_mv_cf.cpp:23
TMPL void mul(Polynomial &r, const Polynomial &a, const Polynomial &b)
Definition: univariate.hpp:287
iterator end()
Definition: univariate.hpp:81
const_reverse_iterator rend() const
Definition: univariate.hpp:85
monomials & operator=(const monomials< C > &v)
static void add(Polynomial &r, const Polynomial &a, const C &b)
Definition: univariate.hpp:909
void assign(double &r, const scalar< MPF > &z)
Definition: scalar_floating.hpp:537
void sub_cst(R &r, const S &c)
Definition: univariate.hpp:432
ZZ numerator(const QQ &a)
Definition: GMPXX.hpp:95
void add_cst(R &r, const S &c)
Definition: univariate.hpp:429
void resize(const size_type &n)
TMPL void div(Polynomial &r, const Polynomial &a, const Polynomial &b)
Definition: univariate.hpp:330
#define min(a, b)
Definition: parser_def.c:475
size_type size_
Definition: univariate.hpp:65
void scale(R &t, const R &p, const C &l)
Definition: univariate.hpp:812
#define TMPLX
Definition: univariate.hpp:17
Definition: polynomial.hpp:37
static void mul(Polynomial &r, const Polynomial &a, const C &b)
Definition: univariate.hpp:941
ZZ size(const ZZ &z)
Definition: GMPXX.hpp:67
static void mul(Polynomial &r, const Polynomial &a, const Polynomial &b)
Definition: univariate.hpp:937
void sub(V &a, const W &b)
Substraction of two vectors.
Definition: array.hpp:221
TMPL POL
Definition: polynomial_dual.hpp:74
void mul_index_it(R &r, const R &a, const R &b)
Definition: univariate.hpp:446
const_reverse_iterator rbegin() const
Definition: univariate.hpp:90
reverse_iterator rend()
Definition: univariate.hpp:84
C eval_horner_idx(const R &p, const C &c)
Definition: univariate.hpp:506
void add(V &a, const W &b)
Addition of two vectors.
Definition: array.hpp:154
C * iterator
Definition: univariate.hpp:58
ZZ denominator(const QQ &a)
Definition: GMPXX.hpp:96
void reciprocal(R &w, const R &p)
Definition: univariate.hpp:660
int degree_
Definition: univariate.hpp:66
TMPL int check_degree(Polynomial &a)
Definition: univariate.hpp:207
Polynomial P
Definition: solver_mv_cf.cpp:24
unsigned int size_type
Definition: univariate.hpp:57
static void div(Polynomial &r, const Polynomial &a, const Polynomial &b)
Definition: univariate.hpp:948
void checkdegree(R &p)
Definition: univariate.hpp:579
bool operator==(const C &c) const
const C & c
Definition: Interval_glue.hpp:45
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition: univariate.hpp:60
static void mul(Polynomial &r, const Polynomial &a)
Definition: univariate.hpp:933
double C
Definition: solver_mv_fatarcs.cpp:16
~monomials()
Definition: univariate.hpp:77
int sign(const QQ &a)
Definition: GMP.hpp:60
void convertm2b(T &bz, const P &p, unsigned size, const C &a, const C &b)
Definition: univariate.hpp:847
int sign_at(const POL &p, const X &x)
Definition: univariate.hpp:547
iterator begin()
Definition: univariate.hpp:79
Definition: univariate.hpp:54
TMPL void sub(Polynomial &r, const Polynomial &a, const Polynomial &b)
Definition: univariate.hpp:250
static void add(Polynomial &r, const Polynomial &a, const Polynomial &b)
Definition: univariate.hpp:905
#define Polynomial
Definition: univariate.hpp:892
Interval< T, r > max(const Interval< T, r > &a, const Interval< T, r > &b)
Definition: Interval_fcts.hpp:135
const_iterator end() const
Definition: univariate.hpp:82
iterator const_iterator
Definition: univariate.hpp:59
C eval_horner(const R &p, const C &c)
Definition: univariate.hpp:486
size_t log(const scalar< MPF > &b)
Definition: scalar_floating.hpp:506
C value_type
Definition: univariate.hpp:56
static void add(Polynomial &r, const Polynomial &a)
Definition: univariate.hpp:901
void inv_scale(R &r, const R &p, const C &l)
Definition: univariate.hpp:828
#define TMPL
Definition: univariate.hpp:893
ZZ lcm(const ZZ &a, const ZZ &b)
Definition: GMPXX.hpp:58
std::reverse_iterator< iterator > reverse_iterator
Definition: univariate.hpp:61
void assign(Ra &a, const Rb &b)
Definition: array.hpp:425
#define assert(expr, msg)
Definition: shared_object.hpp:57
void div_ext(V &a, const V &b, const SC &sc)
Scalar division.
Definition: array.hpp:319